ATOL драйвер 10.x

Сканеры, кассы, ККТ и т.д.
Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 5650
Зарегистрирован: 07 Июль 2005, 9:19
Откуда: г. Ростов-на-ДоМу

ATOL драйвер 10.x

Сообщение Игорь Столяров »

gromov писал(а): 17 Март 2021, 11:08 А можно без вот этого, а по-человечески
А это не ответ на Ваш вопрос. Просто сегодня получил письмо от АТОЛ и выложил ссылку в раздел АТОЛ. ;)
Как я понимаю, скучать не придётся. :)

Что касается эмулятора ФН, то цена очень хорошая. Но как-то смущает, что они предлагают фиксированные
настройки для тестового ОФД. Поддерживается ли работа со сторонними ОФД ? Непонятно ...
Там ведь вопрос с шифрованием данных при обмене с ОФД и наличия сертификата в ФН выданного ФНС.
«V» значит Вендетта !
gromov
Старожил
Сообщения: 243
Зарегистрирован: 11 Февраль 2009, 8:41
Откуда: г. Анапа

ATOL драйвер 10.x

Сообщение gromov »

Поскольку у меня нет опыта работы с ккм вообще, хочется просто "поиграться". Понять, что и как. Получить наконец полноценный чек. Разобраться короче. А связь с ОФД это потом.
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 5650
Зарегистрирован: 07 Июль 2005, 9:19
Откуда: г. Ростов-на-ДоМу

ATOL драйвер 10.x

Сообщение Игорь Столяров »

gromov писал(а): 17 Март 2021, 11:36 Получить наконец полноценный чек
Скажу про себя. Я полтора года назад выскулил полноценный МГМ: https://online-kassa.ru/kupit/mgm-fn-1.1/
Вставил его в ФР ... и с тех пор он там и воткнут непонятно зачем. Я его не фискализировал, работать это не мешает.
Как-то в переписке с тех. поддержкой АТОЛ они вскользь упомянули, что без фикализации ФН мне будут недоступны
какие-то функции (наверно запросы по данным собственно ФН) - но я пока с такими не сталкивался.
«V» значит Вендетта !
gromov
Старожил
Сообщения: 243
Зарегистрирован: 11 Февраль 2009, 8:41
Откуда: г. Анапа

ATOL драйвер 10.x

Сообщение gromov »

Хорошо, подумаю.
gromov
Старожил
Сообщения: 243
Зарегистрирован: 11 Февраль 2009, 8:41
Откуда: г. Анапа

ATOL драйвер 10.x

Сообщение gromov »

Привет, коллеги. Вопрос по касс. чеку.
Клиент оплачивает услугу, кот. состоит из нескольких позиций. Все они ясное дело должны быть отражены в чеке. Но есть одно НО. Услуга может быть оплачена неполностью.
Например: услуга=2650, оплата = 500.
По совету ГУРУ умножаю каждую позицию на соотношение 500/2650. Логично.
Однако эта сволочь (Атол) все правильно считает и в итоге чека имеем 500.01. Некрасиво.
Покорежил слегка класс Admin-а. Добавил функцию регистрации итога и кой-чего в метод PrintCheck. Стало только хуже))). Из доки понял, что округлять можно копейки в меньшую сторону . Теперь в некоторых случаях имею так: в программе оплата 800, а в чеке 799. Я,как клиент, на это забил бы, но случаются персонажи, которые мозг из-за двух копеек вынесут. Подскажите, что сделать. Оставить эту копейку и хрен бы с ней ?
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 5650
Зарегистрирован: 07 Июль 2005, 9:19
Откуда: г. Ростов-на-ДоМу

ATOL драйвер 10.x

Сообщение Игорь Столяров »

gromov писал(а): 07 Апрель 2021, 16:43 Однако эта сволочь (Атол) все правильно считает и в итоге чека имеем 500.01. Некрасиво.
Вы ведь сделали всё правильно, просто не поняли смысл использования LIBFPTR_PARAM_SUM (отброс копеек). ;)
Что бы его применять нужно умножать сумму строки на коэффициент и не тупо округлять математически,
а всегда в большую сторону. Т.е. RoundHigh(12.0143) = 12.02 и т.д.
И потом эти копейки (включающие в себя в т.ч. и погрешность округления) отбросить. Вот и всё. :)
«V» значит Вендетта !
gromov
Старожил
Сообщения: 243
Зарегистрирован: 11 Февраль 2009, 8:41
Откуда: г. Анапа

ATOL драйвер 10.x

Сообщение gromov »

Спасибо, попробую.
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 5650
Зарегистрирован: 07 Июль 2005, 9:19
Откуда: г. Ростов-на-ДоМу

ATOL драйвер 10.x

Сообщение Игорь Столяров »

Часто бывает нужно получить какой-то параметр чека из ФН по его номеру.
Например, текущее законодательство не требует печатать в чеке СНО предприятия.

Предложу, в прекрасный класс Admin'а метод, который решает такую задачу.

Код: Выделить всё

! --- Получить из ФН ККТ параметр по номеру чека / тега
Atol10.GetCheckTag  Procedure(Long xCheckNumber_, String xTag_)  !,String

MyJSon         JSONDataClass
Loc:RetValue   CString(256)
Loc:TheRequest CString(256)

Loc:DocTLV   Group
documentTLV    Group
TheValue         CString(256)
               end
             end
  Code

  If Self.FlagLoaded and (xCheckNumber_ > 0)
  
     ! Формируем запрос на получение данных чека по номеру из ФН ККТ
     Loc:TheRequest = '{{"type":"getFnDocument","fiscalDocumentNumber":' & Clip(Left(xCheckNumber_)) & '}'
     
     Self.SetParamStr(LIBFPTR_PARAM_JSON_DATA, Loc:TheRequest)
     If libfptr_validate_json(Self.fptr) = 0  ! Проверка корректности запроса
     
        Self.SetParamStr(LIBFPTR_PARAM_JSON_DATA, Loc:TheRequest)  ! Надо повторно указывать запрос
        If libfptr_process_json(Self.fptr) = 0  ! Есть положительный ответ из ФН на Ваш запрос

           MyJSon.SetExternalName('TheValue',xTag_)  ! Указать какой тег из ответа хотим получить
           MyJSon.FromJSON(Self.GetParamStr(LIBFPTR_PARAM_JSON_DATA),Loc:DocTLV)
           
           ! Собственно отжимаем из ответа значение нужного тега
           Loc:RetValue = MyJSon.UnEscapeString(Loc:DocTLV.documentTLV.TheValue)
           
        end  ! If libfptr_process_json(Self.fptr)
     end  ! If libfptr_validate_json(Self.fptr)
  end  ! If xCheckNumber_ > 0
  
  Return Loc:RetValue
Теперь, например, можно получить реальный СНО чека после его печати:

Код: Выделить всё

  CheckNomer = MyAtol.GetLastCheck()  ! Номер последнего чека из ФН

  Case Int(MyAtol.GetCheckTag(CheckNomer,'1055'))  ! Тег 1055 - это СНО чека
  Of LIBFPTR_TT_OSN                ! 1. Общая СНО
     TaxType = 1
  Of LIBFPTR_TT_USN_INCOME         ! 2. Упрощенная Доход
     TaxType = 2
  Of LIBFPTR_TT_USN_INCOME_OUTCOME ! 3. Упрощенная Доход минус Расход
     TaxType = 3
  Of LIBFPTR_TT_ENVD               ! 4. ЕНВД
     TaxType = 4
  Of LIBFPTR_TT_ESN                ! 5. Единый сельскохозяйственный налог
     TaxType = 5
  Of LIBFPTR_TT_PATENT             ! 6. Патентная СНО
     TaxType = 6
  Else
     TaxType = 0              ! ХЗ
  end
«V» значит Вендетта !
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 5650
Зарегистрирован: 07 Июль 2005, 9:19
Откуда: г. Ростов-на-ДоМу

ATOL драйвер 10.x

Сообщение Игорь Столяров »

Пример метода в класс ATOL10 для печати штрих-кода (с текстовым названием):

Код: Выделить всё

Atol10.PrintBarCode  Procedure(String xStrText_,String xStrSCod_, Byte xVidCode_)
  Code                            
  If (Self.FlagLoaded = True) and (Clip(Left(xStrSCod_)) <> '')  ! Если есть штрих-код

     Self.SetParamStr( LIBFPTR_PARAM_BARCODE,   xStrSCod_)                ! Данные штрихкода
     Self.SetParamInt( LIBFPTR_PARAM_ALIGNMENT, LIBFPTR_ALIGNMENT_CENTER)  ! Выравнивание: по центру

     Case xVidCode_
     Of 2 OrOf 4  ! EAN13

        Self.SetParamInt( LIBFPTR_PARAM_BARCODE_TYPE,       LIBFPTR_BT_EAN_13)  ! Тип штрихкода: EAN13
        Self.SetParamBool(LIBFPTR_PARAM_BARCODE_PRINT_TEXT, True)               ! Печать текста

     Of 3 OrOf 5  ! QRCode

        Self.SetParamInt( LIBFPTR_PARAM_BARCODE_TYPE,       LIBFPTR_BT_QR)      ! Тип штрихкода: QRCode
        Self.SetParamInt( LIBFPTR_PARAM_SCALE,              6)                  ! Масштаб
     end

     If libfptr_print_barcode(Self.fptr) = LIBFPTR_OK
        Self.LastSeparator = False
        If InRange(xVidCode_,2,3)
           Self.SetParamInt(LIBFPTR_PARAM_ALIGNMENT, LIBFPTR_ALIGNMENT_CENTER)  ! Выравнивание ТЕКСТА
           Self.PrintText(xStrText_,LIBFPTR_TW_NONE,0)
        end
     else
        Self.ErrorMessage('libfptr_print_barcode')
     end
  end

«V» значит Вендетта !
Аватара пользователя
Admin
Администратор
Сообщения: 3700
Зарегистрирован: 05 Июль 2005, 14:59
Откуда: Хабаровск
Контактная информация:

ATOL драйвер 10.x

Сообщение Admin »

Приветствую всех.
Понадобилось добавить маркировку к молочке и воде. Ну и соответственно встали вопросы.

Товар с маркировкой по одной штуке в чек отдается?
Т.е. купили 10 пакетом молока, я должен их по одному каждый со свое маркировкой отдать в ККТ и на чеке 10 позиций будет?

Игорь Столяров, к тебе вопрос. Подсмотрел твой код:

Код: Выделить всё

If Clip(QSpisok.Dump) <> '' then Self.SetParamBiteArray(LIBFPTR_PARAM_MARKING_CODE,Self.RecodeMarking(QSpisok.Dump)).
Это рабочий код? Т.е. строку со сканера ты просто в Dump кидаешь?
А что за копирование делает метод RecodeMarking?
И где вызывается метод ParseMarkingCode с функцией libfptr_parse_marking_code - непонятно.

Можно мне как то расписать что делать? :)

Ну и коды у меня (со сканера) какие то коротенькие... типа

Код: Выделить всё

0104607004890062215KXIXZ^93Z/9z сыр
0104607091303254215oG3Fk^93U+m+ молоко
Там где ^ = CHR(29)
Рай совершает ошибки ничуть не реже чем ад. Просто у него хорошая пресса
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 5650
Зарегистрирован: 07 Июль 2005, 9:19
Откуда: г. Ростов-на-ДоМу

ATOL драйвер 10.x

Сообщение Игорь Столяров »

Admin писал(а): 29 Ноябрь 2021, 7:28 И где вызывается метод ParseMarkingCode с функцией libfptr_parse_marking_code - непонятно.
У меня метода ParseMarkingCode() добавляет в код маркировки коды <29>, которые съел сканер.
Если у Вас сканер возвращает марку с служебными кодами -> Вы сразу её передаёте в КММ в том
виде как получили со сканера:

Код: Выделить всё

  Self.SetParamInt(      LIBFPTR_PARAM_MARKING_CODE_TYPE, LIBFPTR_MCT_OTHER)  ! Для ФФД 1.1 тип марки
  Self.SetParamBiteArray(LIBFPTR_PARAM_MARKING_CODE, QSpisok.Dump).
Admin писал(а): 29 Ноябрь 2021, 7:28 Товар с маркировкой по одной штуке в чек отдается?
Т.е. купили 10 пакетом молока, я должен их по одному каждый со свое маркировкой отдать в ККТ и на чеке 10 позиций будет?
Абсолютно верно. То же самое и давно, если покупать 10 бутылок водки или пар кроссовок ...
«V» значит Вендетта !
Аватара пользователя
Admin
Администратор
Сообщения: 3700
Зарегистрирован: 05 Июль 2005, 14:59
Откуда: Хабаровск
Контактная информация:

ATOL драйвер 10.x

Сообщение Admin »

Admin писал(а): 29 Ноябрь 2021, 7:28 А что за копирование делает метод RecodeMarking?
И где вызывается метод ParseMarkingCode с функцией libfptr_parse_marking_code - непонятно.
Такс давай уточним все таки. По RecodeMarking я все понял. У нас сканер не сжирает код. Нам это похоже не нужно.
А дальше ты передал код в АТОЛ но не вижу вызова libfptr_parse_marking_code
Я вот про этот код как на картинке. Типа если ты средствами ККТ декодируешь код то потом должен сам его в 1162 записать.
И вот этого я у тебя и не вижу. Может ты уже чего нового написал? :)
2021-11-29_15-41-20.png
Рай совершает ошибки ничуть не реже чем ад. Просто у него хорошая пресса
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 5650
Зарегистрирован: 07 Июль 2005, 9:19
Откуда: г. Ростов-на-ДоМу

ATOL драйвер 10.x

Сообщение Игорь Столяров »

Admin писал(а): 29 Ноябрь 2021, 8:44 Может ты уже чего нового написал
Нет. Просто Вы пытаетесь смотреть сериал с 4-ой серии 3-го сезона. :)
Действительно, вначале марку нужно было разбирать, и каждый компонент записывать в свой тег.
Если Вам так в жизни повезло, то сейчас всё упростилось - просто передаём марку как массив байт
(единственная засада - но она легко обходится) и дальше добрый драйвер всё сделает сам ... см. рисунок.

1.jpg
«V» значит Вендетта !
Аватара пользователя
Admin
Администратор
Сообщения: 3700
Зарегистрирован: 05 Июль 2005, 14:59
Откуда: Хабаровск
Контактная информация:

ATOL драйвер 10.x

Сообщение Admin »

Игорь Столяров писал(а): 29 Ноябрь 2021, 8:53 Если Вам так в жизни повезло
:ty:
Рай совершает ошибки ничуть не реже чем ад. Просто у него хорошая пресса
Аватара пользователя
Admin
Администратор
Сообщения: 3700
Зарегистрирован: 05 Июль 2005, 14:59
Откуда: Хабаровск
Контактная информация:

ATOL драйвер 10.x

Сообщение Admin »

Дело за малым, прошить тестовый ККТ до ФФД 1.2
А то на текущей версии не работает маркировка.
Рай совершает ошибки ничуть не реже чем ад. Просто у него хорошая пресса
Ответить