Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
Класс работы с драйвером ККТ АТОЛ 10 на основе JSON заданий.
(форк класса ADMIN'а 2019 г.)
Класс рабочий, в комплекте примеры использования. Любые замечания и дополнения - приветствуются.
В FTP разделе форума создана папка: /_Books/Atol.KKT со всей сопутствующей документацией.
ВНИМАНИЕ !
Для работы с КМ (кодами маркировки) через JSON задания требуется прошивка ККТ 5.12 и выше (двухлетней давности).
На старых прошивках будет ошибка: Объекту 0x05C1E828 присвоен код ошибки 148 [Ошибка программирования реквизита 1023]
А кто-нибудь пробовал qr код печатать в нефискальном документе? Обновили прошивку до актуальной, qr не печатается. Ни в дто10, ни в дто8. На втором фискальнике на той же кассе, где прошивку не обновляли, из дто8 печатается, как и раньше.
Подключение к кассе только удаленное, и на ней работают. Как оказалось, из дто8 все таки куэр печатается. Проблема с печатью из дто10. Очень сложно в таких условиях проверять. Когда у меня был нефискализирлванный ккм, я не мог не проверить печать куэр, все было нормально. Что-то изменилось после обновления драйвера или прошивки.
В общем, добрался айтишник до кассы, выяснили, в чем проблема. В ДТО8 и ДТО10 по разному задается коэффициент масштабирования qr кода. В ДТО8 обычный и егаисный qr имели коэффициенты 300 и 400, а в ДТО10 надо ставить 5 и 6 соответственно.
А у кого-нибудь статистика работы через дто10 набралась? Пожаловались, что кассовая программа после переключения на ДТО 10 пару раз вылетала с системной ошибкой типа "windows завершила работу этой программы". Удаленно наблюдаю, пока не повторяется. На этой кассе 2 фискальника, один на дто8, второй на дто10. Вроде работает такое сочетание.
Во всяком случае, что надо печатает, в офд чеки корректно отображаются.
finsoftrz писал(а): 15 Апрель 2020, 17:54
вылетала с системной ошибкой типа "windows завершила работу этой программы".
Для АТОЛ ДКК10 есть рекомендации, что нужно подгружать драйвер на всё время работы программы и
далее просто обращаться к существующему экземпляру. Это хорошо, но для монопольных программ.
Не знаю как реализована работа с драйвером у Вас, но если выполнять полную инициализацию в каждом
MDI окне, то действительно, рано или поздно начинаются вылеты (могут предположить, что из проблем с выделением памяти).
У меня кассовая программа однопоточная. Класс инициализируется при запуске программы и его адрес сохраняется в глобальной переменной. Затем в нескольких местах (разных диалогах) есть вызовы методов этого класса.
Тогда уже проще. Нужно понять вылет происходит в Вашем коде или в DLL драйвера.
А насчёт двух драйверов на одном компьютере - это обсуждалось на форуме АТОЛ.
Они по сути разные и в принципе не мешают друг другу.
Я у себя ДТО8 удалил, только по тому, что бы не отвечать на вопросы.
Насколько я понял, вылетало совсем не при обращении к драйверу. Например, при обновлении справочников из бэка. Но без дто10 такого не было. Хотя, может совпало. Сегодня больше не писали, но и чеков на этом ккм было всего штук 10 после переключения. На этом ккм один алкоголь, и кассовых прохода два. Продавцы после вылета могли на другую кассу народ с алкоголем посылать.
А кто-нибудь пробовал маркировку выводить по новой схеме? Я пробую, такая конструкцию валит программу в gpf. Причем валит именно на SELF.SetParamByteArray.
!===================================================================================
! Тестирование
!
FsKKMAtol.MyTest PROCEDURE
CODE
if SELF.Active = 0
return
end
if SELF.CheckOpened()=1 !Анулирование предыдущего чека если он не закрыт!
if libfptr_cancel_receipt(SELF.fptr) = LIBFPTR_ERROR
SELF.GetError
return
end
end
SELF.OpenShift() !Открытие смены если нужно
SELF.SetSotr !установить кассира
SELF.SetParamInt(LIBFPTR_PARAM_RECEIPT_TYPE, LIBFPTR_RT_SELL) !тип чека
if libfptr_open_receipt(SELF.fptr) = LIBFPTR_ERROR !открытие чека
SELF.GetError
return
end
SELF.SetParamStr(LIBFPTR_PARAM_COMMODITY_NAME, 'Сигареты Next Blue Edition ФМ')
SELF.SetParamDouble(LIBFPTR_PARAM_PRICE, 90)
SELF.SetParamDouble(LIBFPTR_PARAM_QUANTITY, 1)
SELF.SetParamInt(LIBFPTR_PARAM_TAX_TYPE, LIBFPTR_TAX_NO)
SELF.SetParamInt(LIBFPTR_PARAM_DEPARTMENT, 1)
SELF.SetParamInt(LIBFPTR_PARAM_TAX_MODE, LIBFPTR_TM_POSITION)
SELF.SetParamInt(1212, 1)
SELF.SetParamInt(1214, 4)
SELF.SetParamInt(LIBFPTR_PARAM_MARKING_CODE_TYPE, LIBFPTR_MCT_OTHER)
SELF.SetParamByteArray(LIBFPTR_PARAM_MARKING_CODE,clip(SELF.AtolStrToByte('00000046088710KY4mjNZAB=U/FkO')))
if libfptr_registration(SELF.fptr) = LIBFPTR_ERROR
SELF.GetError
end
SELF.CancelCheck !аннулировать чек
stop('Тест прошел!')
Atol10.SetParamBiteArray PROCEDURE(LONG lParam, STRING sValue)
Code
If Self.FlagLoaded = True
! передаем так же строку
libfptr_set_param_bytearray(SELF.fptr, lParam, ADDRESS(sValue), Size(sValue)) ! Заменил Len(sValue)
end
Вот это - надо только при ручном формировании тега маркировки (убрать)
Разбор строки - сам определит тип маркировки по её длине и содержанию - см. справку.