Рекомендации по алгоритму работы программы с учетом возможных сценариев
Этап 1. Команда FNCheckItemBarcode
Первая рекомендация - чек должен формироваться только после того, как кассир нажал кнопку "Закрыть чек", а не при сканировании товаров. Это необходимо для учета ситуаций, о которых будет написано далее.
Кассир сканирует товары. Программа добавляет их в свой буфер, чтобы при закрытии чека послать команду на формировании чека.
При добавления в чек маркированного товара должна проходить проверка онлайн-кассой до открытия чека через команду "Проверка маркированного товара" FNCheckItemBarcode
В коде маркировки, кроме регламентированных блоков данных, присутствует символ-разделитель GS. Символ-разделитель является служебным и сканер может обрабатывать его различными способами. Самые распространенные способы трансляции символа-разделителя через F8 и через Alt-последовательность. Реже встречаются варианты через Ctrl-последовательность, а также кодирование простым текстом [GS] или <GS>. Проблем с корректной обработкой символа-разделителя не возникает, если сканер настроен на работу в режиме сом-порта, так как в этом режиме символ передается всегда в одном и том же формате, но в силу архаичности сом-порта данный способ встречается все реже и пользователь предпочитает использовать сканеры, работающие в режиме эмуляции клавиатуры.
В целях унификации рекомендуется, чтобы кассовая программа принимала от сканера символ GS как нажатие F8 и как комбинацию клавиш ALT + 029. Подробно об этом написано по ссылке.
Верхом мастерства написания кода будет вариант при котором кассовая программа будет самостоятельно добавлять символ GS в нужную позицию, в целях совместимости с бюджетными моделями сканеров,не имеющих опций форматирования кода. Для одной выбранной категории маркированной продукции данные символы присутствуют в одном и том же месте, перед символами "91" , "92" , "93", "94". Но необходимо учесть,что символы встречаются и в GTIN и в криптохвосте. Посмотреть примеры кодов можно в инструкции.
Как обработать символ GS разобрались, теперь необходимо его передать в хост.
Его невозможно передать в хост ,используя свойство "Barcode", так как данный символ служебный и не имеет графического представления. Поэтому необходимо использовать свойство "BarcodeHex". Считанную марку необходимо преобразовать в HEX и передать. Символ GS будет передаваться как "1D".
Теперь необходимо оградить кассовую программу от обработки некорректно сформированных марок и "цифрового мусора". Поэтому на этапе отладки программы рассмотрим несколько возможных сценариев.
Сценарий 1: Длинная марка и ненастроенный сканер

В этой длинной марке не зашифрован в принципе символ GSНапример, новый сканер с заводскими настройками, который не настроен на передачу GS или настроен, но не в том формате, при котором кассовая программа может корректно его обработать
Если в таблице 17 значение поля 41 установлено "0" , то ККТ возвращает ошибку 211 D3 (код товара не распознан)
Алгоритмов поведения программы два. Первый:
1) После считывании кода сканером не сразу передавать его в ККТ, а форматировать, добавив символы GS:
010123456789012321&dAIMqnpEQnQ!!910058921gx+7D2jIWGSo6LLr1FMGiETo7Ez6k4fr9D8FZwEmJqIWtivlAGjqEP8OspoVeIKiP4OkzmSCzRXmEUygvkKQw==
Без обработки при конвертации в HEX будет
30 31 30 32 39 30 30 30 30 30 30 30 37 37 36 35 32 31 26 64 3E 56 29 30 53 3E 38 66 71 44 74 39 31 38 30 32 33 39 32 48 55 77 4C 37 5A 52 65 37 39 69 55 31 75 44 57 32 39 6F 77 51 44 37 56 6C 44 4A 61 33 59 35 6B 44 77 45 4F 77 6F 44 35 36 63 4C 47 44 4D 70 59 71 6A 64 49 44 31 64 6A 2B 43 43 53 6D 63 72 4B 4C 63 6E 44 6C 4E 44 62 4D 4F 34 5A 51 4C 4F 54 77 54 50 61 45 67 3D 3D
Но если добавить "1D" перед "91" (39 31) и перед 92 (39 32):
30 31 30 32 39 30 30 30 30 30 30 30 37 37 36 35 32 31 26 64 3E 56 29 30 53 3E 38 66 71 44 74 1D 39 31 38 30 32 33 1D 39 32 48 55 77 4C 37 5A 52 65 37 39 69 55 31 75 44 57 32 39 6F 77 51 44 37 56 6C 44 4A 61 33 59 35 6B 44 77 45 4F 77 6F 44 35 36 63 4C 47 44 4D 70 59 71 6A 64 49 44 31 64 6A 2B 43 43 53 6D 63 72 4B 4C 63 6E 44 6C 4E 44 62 4D 4F 34 5A 51 4C 4F 54 77 54 50 61 45 67 3D 3D
То вся обработка кода маркировка будет выполнена корректно. Учитывая,что кодирование символа GS могло быть выполнено некорректно (не соответствует методическим рекомендациям ЦРПТ) прорабатываем вариант 2:
2) Если код не форматировать, то имеем:
Set_CheckItemMode: 0
Set_BarcodeHex: 30 31 30 32 39 30 30 30 30 30 30 30 37 37 36 35 32 31 26 64 3E 56 29 30 53 3E 38 66 71 44 74 39 31 38 30 32 33 39 32 48 55 77 4C 37 5A 52 65 37 39 69 55 31 75 44 57 32 39 6F 77 51 44 37 56 6C 44 4A 61 33 59 35 6B 44 77 45 4F 77 6F 44 35 36 63 4C 47 44 4D 70 59 71 6A 64 49 44 31 64 6A 2B 43 43 53 6D 63 72 4B 4C 63 6E 44 6C 4E 44 62 4D 4F 34 5A 51 4C 4F 54 77 54 50 61 45 67 3D 3D
FNCheckItemBarcode: 211
ККТ возвращает ошибку 211 (D3h) "Код товара не распознан". Рекомендуется выводить в графическом интерфейсе программы следующее сообщение: "Код товара не распознан. Попробуйте еще раз. Если это не поможет, то обратитесь в техническую поддержку".
Проблема в том, что возникновение ошибки D3h (211) может иметь несколько причин, поэтому одним сообщением не описать все возможные варианты. Пользователю необходимо обратиться в техподдержку программы за решением. Возможные причины и способы устранения будут описаны ниже.
Сценарий 2: Длинная марка и ненастроенный сканер + отключена проверка марки-в Таблице 17 поле 41 значение "1" для игнорирования ошибки 211 (D3h), (разрешить принимать "мусор")

В этой длинной марке не зашифрован в принципе символ GSМарка прежняя, но теперь установим в таблице 17 поле 41 значение 1
Кассовая программа должна прочитать ответ:
Set_CheckItemMode: 0
Set_BarcodeHex: 30 31 30 32 39 30 30 30 30 30 30 30 37 37 36 35 32 31 26 64 3E 56 29 30 53 3E 38 66 71 44 74 39 31 38 30 32 33 39 32 48 55 77 4C 37 5A 52 65 37 39 69 55 31 75 44 57 32 39 6F 77 51 44 37 56 6C 44 4A 61 33 59 35 6B 44 77 45 4F 77 6F 44 35 36 63 4C 47 44 4D 70 59 71 6A 64 49 44 31 64 6A 2B 43 43 53 6D 63 72 4B 4C 63 6E 44 6C 4E 44 62 4D 4F 34 5A 51 4C 4F 54 77 54 50 61 45 67 3D 3D
FNCheckItemBarcode: 0
Get_MarkingType2: 0
Если Get_MarkingType2: 0 , сигнализирует о том, что это неустановленный тип маркировки. Дальше можно не продолжать получать результат проверки и выводить сообщение на экран:
"Код товара не распознан. Попробуйте еще раз. Если это не поможет, то обратитесь в техническую поддержку".
Ð

