Рекомендации при разработке программ для работы с маркированными товарами
Рекомендации по алгоритму работы программы с учетом возможных сценариев
Этап 1. Команда FNCheckItemBarcode
Первая рекомендация - чек должен формироваться только после того, как кассир нажал кнопку "Закрыть чек", а не при сканировании товаров. Это необходимо для учета ситуаций, о которых будет написано далее.
Кассир сканирует товары. Программа добавляет их в свой буфер, чтобы при закрытии чека послать команду на формировании чека.
При добавления в чек маркированного товара должна проходить проверка онлайн-кассой до открытия чека через команду "Проверка маркированного товара" FNCheckItemBarcode
В коде маркировки, кроме регламентированных блоков данных, присутствует символ-разделитель GS. Символ-разделитель является служебным и сканер может обрабатывать его различными способами. Самые распространенные способы трансляции символа-разделителя через F8 и через Alt-последовательность. Реже встречаются варианты через Ctrl-последовательность, а также кодирование простым текстом [GS] или <GS>. Проблем с корректной обработкой символа-разделителя не возникает, если сканер настроен на работу в режиме сом-порта, так как в этом режиме символ передается всегда в одном и том же формате, но в силу архаичности сом-порта данный способ встречается все реже и пользователь предпочитает использовать сканеры, работающие в режиме эмуляции клавиатуры.
В целях унификации рекомендуется, чтобы кассовая программа принимала от сканера символ GS как нажатие F8 и как комбинацию клавиш ALT + 029. Подробно об этом написано по ссылке.
Верхом мастерства написания кода будет вариант при котором кассовая программа будет самостоятельно добавлять символ GS в нужную позицию, в целях совместимости с бюджетными моделями сканеров,не имеющих опций форматирования кода. Для одной выбранной категории маркированной продукции данные символы присутствуют в одном и том же месте, перед символами "91" , "92" , "94". Но необходимо учесть,что символы встречаются и в GTIN и в криптохвосте. Посмотреть примеры кодов можно в инструкции.
Как обработать символ GS разобрались, теперь необходимо его передать в хост.
Его невозможно передать в хост ,используя свойство "Barcode", так как данный символ служебный и не имеет графического представления. Поэтому необходимо использовать свойство "BarcodeHex". Считанную марку необходимо преобразовать в HEX и передать. Символ GS будет передаваться как "1D".
Теперь необходимо оградить кассовую программу от обработки некорректно сформированных марок и "цифрового мусора". Поэтому на этапе отладки программы рассмотрим несколько возможных сценариев.
Сценарий 1: Длинная марка и ненастроенный сканер
Например, новый сканер с заводскими настройками, который не настроен на передачу 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), (разрешить принимать "мусор")
Марка прежняя, но теперь установим в таблице 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 , сигнализирует о том, что это неустановленный тип маркировки. Дальше можно не продолжать получать результат проверки и выводить сообщение на экран:
"Код товара не распознан. Попробуйте еще раз. Если это не поможет, то обратитесь в техническую поддержку".
Для контроля проверяем статус:
[М-] товар прошел проверку в ГИС МТ с отрицательным результатом.
В коде программы должно быть учтено:
Если Get_KMServerCheckingStatus: 5, то выводить сообщение "Код товара прошел онлайн-проверку с отрицательным результатом. Попробуйте еще раз. Если ошибка повторится, то отложите товар в сторону и обратитесь в техническую поддержку."
Причин в случае [М-] тоже несколько. Сканер мог ошибочно считать символы и повторное считывание решит проблему. Ошибка при формировании печатной формы кода маркировки могла возникнуть на производстве и марка "сломалась". Да, бывает и такое.
Сценарий 3: Короткая марка и ненастроенный сканер
Если с длинными кодами возникает ошибка 211, так как они без GS не подходят ни по какому формату, то короткие марки подходят под формат GS1.0, который также существует и ошибка 211 не возникнет. Но так как это не GS1.M, то это не код маркировки. Уведомления об ошибке не будет, что в нашем случае нежелательно.
Новый сканер, который не настроен на передачу GS или настроен, но не в том формате, в котором его может корректно обработать программа + короткая марка.
Варианта поведения программы два. Первый:
0104603934000748215rRFTn7CqRO6f93AZub
Без обработки при преобразовании в HEX будет
30 31 30 34 36 30 33 39 33 34 30 30 30 37 34 38 32 31 35 72 52 46 54 6E 37 43 71 52 4F 36 66 39 33 41 5A 75 62
Set_CheckItemMode: 0
Set_BarcodeHex: 30 31 30 34 36 30 33 39 33 34 30 30 30 37 34 38 32 31 35 72 52 46 54 6E 37 43 71 52 4F 36 66 39 33 41 5A 75 62
FNCheckItemBarcode: 0
Get_MarkingType2: 255
Если Get_MarkingType2: 255 , 0 или 255 - это код, в котором отсутствовал или не был передан символ GS. Дальше можно не продолжать получать результат проверки и выводить сообщение на экран:
"Сканер не настроен. Обратитесь в техническую поддержку"
2) Второй вариант поведения - добавить символ GS. Добавляем "1D" перед "93" (39 33):
30 31 30 34 36 30 33 39 33 34 30 30 30 37 34 38 32 31 35 72 52 46 54 6E 37 43 71 52 4F 36 66 1D 39 33 41 5A 75 62
То все обрабатывается корректно. На этом вариации не заканчиваются.
Варианта поведения программы два. Первый:
0104603745968015215YJF"Z93NGv1
Без обработки при преобразовании в HEX будет
30 31 30 34 36 30 33 37 34 35 39 36 38 30 31 35 32 31 35 59 4A 46 22 5A 39 33 4E 47 76 31
Set_CheckItemMode: 0
Set_BarcodeHex: 30 31 30 34 36 30 33 37 34 35 39 36 38 30 31 35 32 31 35 59 4A 46 22 5A 39 33 4E 47 76 31
FNCheckItemBarcode: 0
Get_MarkingType2: 255
Если Get_MarkingType2: 255 , 0 или 255 - это марка, в которой отсутствует или не был передан символ GS. Дальше можно не продолжать получать результат проверки и выводить сообщение на экран:
"Сканер не настроен. Обратитесь в техническую поддержку"
2) Второй вариант поведения - добавить символ GS. Добавляем "1D" перед "93" (39 33):
30 31 30 34 36 30 33 37 34 35 39 36 38 30 31 35 32 31 35 59 4A 46 22 5A 1D 39 33 4E 47 76 31
То все обрабатывается корректно. На этом вариации не заканчиваются.
Ошибка в коде маркировки
Если заменить хотя бы одну цифру в криптохвосте, то марку невозможно будет списать,что абсолютно логично. Например:
Set_CheckItemMode: 0
Set_BarcodeHex: 30 31 30 32 39 30 30 30 30 30 30 35 37 33 37 31 32 31 6F 55 62 4E 70 34 49 6D 47 37 27 33 78 61 2E 52 27 58 3A 57 1D 39 31 54 45 53 54 1D 39 32 64 47 56 7A 64 4F 6D 4D 65 62 50 4B 5A 69 37 59 76 51 68 53 5A 6E 4E 75 7A 34 70 62 56 6D 6C 4D 77 2F 76 6B 6B 33 54 6B 74 6F 41 3D
FNCheckItemBarcode: 0
Get_MarkingType2: 3 //Получили 3. Значения: 1, 2, 3, 4 и 5 - допустимые. 0 и 255 - не допустимые. Если 0 или 255 , то писать ошибку на экране, это было описано выше. Если 1, 2, 3, 4 или 5, то продолжать:
Get_KMServerErrorCode: 0 //связь с сервером КМ есть
Get_KMServerCheckingStatus: 5
[М-] результат проверки кода маркировки в ГИС МТ отрицательный.
В коде программу должно быть учтено:
Если Get_KMServerCheckingStatus: 5, то выводить ошибку "Код товара прошел онлайн-проверку с отрицательным результатом. Попробуйте еще раз. Если ошибка повторится, то отложите товар в сторону и обратитесь в техническую поддержку."
Причин в случае [М-] тоже несколько. Сканер мог ошибочно считать символы и повторное считывание решит проблему. Ошибка при формировании печатной формы кода маркировки могла возникнуть на производстве и марка "сломалась".
ККТ не имеет доступа к сети Интернет
Используем валидную марку, выведенную из оборота:
Установим в таблице 19 поле 8 значение "0", то есть отключаем онлайн-проверку, эмулируя отсутствие Интернета и,как следствие, связи с сервером ГИС МТ:
Set_CheckItemMode: 0
Set_BarcodeHex: 30 31 30 34 36 30 33 39 38 38 30 30 39 30 31 38 32 31 41 36 30 37 48 46 48 32 46 38 41 37 32 1D 39 31 45 45 30 36 1D 39 32 36 4A 41 37 53 75 66 4D 6A 36 45 31 6F 37 50 39 39 45 5A 6B 46 78 5A 63 34 58 52 56 38 4C 77 4B 35 50 38 77 37 56 36 30 47 63 41 3D
FNCheckItemBarcode: 0
Get_MarkingType2: 3
Get_KMServerErrorCode: -1
-1 - нет связи с сервером проверки маркировки или проверка отключена.
В общем случае, если проверка разрешительным онлайн-режимом пройдет успешно (Интернет есть и запросы проходят), то товар с такой маркой можно продавать. Уведомление будет сформировано.
Если проверка разрешительным онлайн-режимом пройдет, то вывести сообщение:
"Проблема со связью ККТ с сервером проверки КМ. Возможно временный сбой. Обратитесь в техническую поддержку после обслуживания клиента." И варианты ответа: "ОК" и "Не напоминать 15 минут".
Техническая поддержка должна выяснить причину отсутствия связи с сервером Честного Знака.
Если проверка Разрешительным онлайн-режимом не пройдет, то смотрим, установлен ли локальный модуль Честного Знака. (ЛМ ЧЗ)
Если ЛМ ЧЗ не установлен, то продажа запрещена по требованиям действующего законодательства. Необходимо ее запретить и технически:
"Проблема с интернетом или со связью с сервером Честного Знака. Продажа маркированной продукции без проверки на данной торговой точке запрещена. Обратитесь в техническую поддержку"
Техническая поддержка должна будет выяснить причину отсутствия связи и предупредить пользователя об ответственности за продажу маркированных товаров в разрешительном режиме без онлайн/офлайн проверки.
Если локальный модуль установлен и работоспособен, то передать сообщение:
"Проблема с интернетом или со связью с сервером Честного Знака. Обратитесь в техническую поддержку после обслуживания клиента." И варианты ответа: "ОК" и "Не напоминать 15 минут".
Техническая поддержка должна будет выяснить причину отсутствия связи ККТ и/или компьютера с сервером Честного Знака.
Этап 2. FNAcceptMarkingCode
Онлайн-проверка выполнена. Теперь необходимо сохранить результат проверки. При формировании чека марка не будет повторно проверяться онлайн, если результат проверки сохранить командой FNAcceptMarkingCode. Но и тут есть нюанс:
Баг ФН
Существует баг ФН, который подробно описан в данной статье.
Крайне рекомендуется учесть этот нюанс в программе, иначе уведомление не будет сформировано.
Чтобы избежать бага ФН и отделить его от других 7 причин ошибки D3h, отключаем ошибку 211 (D3h) по причине бага ФН. Устанавливаем в таблице 17 поле 61 значение 0.
Проверяем, что результат проверки записался:
Set_CheckItemMode: 0
Set_BarcodeHex: 30 31 30 34 36 37 30 30 30 38 31 36 33 36 38 35 32 31 62 76 53 71 6B 43 73 75 6F 41 79 52 35 1D 39 31 45 45 30 39 1D 39 32 62 69 6C 31 6D 34 4C 33 69 2B 4C 77 55 35 45 57 78 6C 34 51 73 43 72 55 44 37 39 68 58 52 71 72 47 33 6A 4E 6E 6E 66 6F 44 76 63 3D
FNCheckItemBarcode: 0
Get_MarkingType2: 3 // 0, 255 - плохая марка. 1, 2, 3, 4, 5 - хорошая
Get_KMServerErrorCode: 0 //связь с сервером проверки КМ есть
Get_KMServerCheckingStatus: 15 // 5 - [M-] это плохо. 15 - [M+] это хорошо
FNAcceptMakringCode: 0 //Записываем результат проверки
FNGetMarkingCodeWorkStatus: 0 //запрашиваем статус по работе с КМ после каждой марки
Get_MCCheckResultSavedCount: 1 // Количество сохраненных результатов проверки КМ: 1. Значит, результат сохранился, это хорошо.
Set_CheckItemMode: 0
Set_BarcodeHex: 30 31 30 34 36 34 30 32 30 33 38 32 30 30 31 30 32 31 31 30 30 30 30 30 30 31 31 39 38 31 38 1D 39 31 45 45 30 38 1D 39 32 53 53 58 36 6C 4C 70 57 36 4E 31 5A 37 2F 4A 69 77 78 52 53 66 45 78 55 6B 59 51 74 35 34 35 51 6E 58 68 39 7A 6F 79 6D 5A 4A 6F 3D
FNCheckItemBarcode: 0
Get_MarkingType2: 3 // 0, 255 - плохая марка. 1, 2, 3, 4, 5 - хорошая
Get_KMServerErrorCode: 0 //связь с сервером проверки КМ есть
Get_KMServerCheckingStatus: 15 // 5 - [M-] это плохо. 15 - [M+] это хорошо
FNAcceptMakringCode: 0 //Записываем результат проверки
FNGetMarkingCodeWorkStatus: 0 //запрашиваем статус по работе с КМ после каждой марки
Get_MCCheckResultSavedCount: 1 // Количество сохраненных результатов проверки КМ: 1. Как было 1, так и осталось 1. Нужно заложить в алгоритм программы, что если количество сохраненных результатов проверки КМ после сохранения новой марки не изменилось, то выводить сообщение:
"Продажа данного товара в одном чеке с предыдущими товарами невозможна. Замените этот товар другим или пробейте другим чеком".
Соответственно, в чек этот товар не добавлять.
Много марок
В памяти ФН нельзя сохранить более 128 результатов проверки марок. Поэтому, когда при очередной проверки марки Get_MCCheckResultSavedCount станет 128:
Set_CheckItemMode: 0
Set_BarcodeHex: 30 31 30 34 36 34 30 32 30 33 38 32 30 30 31 30 32 31 31 30 30 30 30 30 30 31 31 39 38 31 38 1D 39 31 45 45 30 38 1D 39 32 53 53 58 36 6C 4C 70 57 36 4E 31 5A 37 2F 4A 69 77 78 52 53 66 45 78 55 6B 59 51 74 35 34 35 51 6E 58 68 39 7A 6F 79 6D 5A 4A 6F 3D
FNCheckItemBarcode: 0
Get_MarkingType2: 3
Get_KMServerErrorCode: 0
Get_KMServerCheckingStatus: 15
FNAcceptMakringCode: 0
FNGetMarkingCodeWorkStatus: 0 //запрашиваем статус по работе с КМ после каждой марки
Get_MCCheckResultSavedCount: 128
"Достигнут максимум по добавлению маркированных позиций в чек, составляющий 128 маркированных позиций! Можно продолжать добавлять в данный чек только немаркированные позиции! Для добавления большего количества маркированных позиций закройте данный чек и сформируйте новый."
При попытке сканировать марку повторно выводить данное сообщение.
Одинаковые марки
Когда марок много, то пользователь может ошибочно добавить одну и ту же марку дважды. В этом случае возникнет ошибка 211 (D3h) по причине дублирования марок в чеке. Поэтому крайне целесообразно, чтобы кассовая программа перед отправкой марки в ККТ контролировала такие коллизии и выдавала сообщение:
"Данный экземпляр маркированного товара уже добавлен в чек"
Этап 3. Разрешительный режим.
Разрешительный режим проверки установлен для отдельных категорий маркированных товаров.
О том, что это такое подробно описано в данной статье.
Там же можно найти методические указания.
При использовании разрешительного режима мы получаем результат проверки, в виде уникального идентификатора (UUID) и времени проверки (TimeStamp),которые записываем в тег 1265 "значение отраслевого реквизита" (входит в тег 1262) Также необходимо перед этим добавить значения тегов 1262, 1263, 1264, значения которых статичны и обозначают :
1262 -"Идентификатор ФОИВ": 030
1263-"дата докумнта основания": 21.11.2023
1264-"номер документа основания": 1944
Как было описано ранее, если проверка через ККТ и по Разрешительному онлайн-режиму прошла, то всё хорошо.
Если по ККТ проверка прошла, а Разрешительному онлайн-режиму не прошла, то проверяем наличие и работоспособность локального модуля (ЛМ ЧЗ).
Если ЛМ ЧЗ не обнаружен, то продажа запрещена согласнотребованиям действующего законодательства. Необходимо ее запретить и технически:
"Проблема связи ПК с интернетом или со связью с сервером Честного Знака. Продажа маркированной продукции без интернета на данной торговой точке запрещена. Обратитесь в техническую поддержку"
Техническая поддержка должна будет выяснить причину отсутствия связи и предупредить пользователя об ответственности за продажу маркированных товаров в разрешительном режиме без онлайн/офлайн проверки.
Если ЛМ ЧЗ установлен и работоспособен, то выдать сообщение:
"Проблема связи ПК с интернетом или со связью с сервером Честного Знака. Обратитесь в техническую поддержку после обслуживания клиента." И варианты ответа: "ОК" и "Не напоминать 15 минут".
Техническая поддержка должна будет выяснить причину отсутствия связи и предупредить пользователя об ответственности за продажу маркированных товаров в разрешительном режиме без онлайн/офлайн проверки.
Этап 4. Формирование Чека
Финальная стадия. При формировании чека никаких дополнительных проблем с маркировкой не должно быть, так как всё проверялось до формирования чека.
Без комментариев
Set_CheckItemMode: 0
Set_BarcodeHex: 30 31 30 34 36 37 30 30 30 38 31 36 33 36 38 35 32 31 62 76 53 71 6B 43 73 75 6F 41 79 52 35 1D 39 31 45 45 30 39 1D 39 32 62 69 6C 31 6D 34 4C 33 69 2B 4C 77 55 35 45 57 78 6C 34 51 73 43 72 55 44 37 39 68 58 52 71 72 47 33 6A 4E 6E 6E 66 6F 44 76 63 3D
FNCheckItemBarcode: 0
Get_MarkingType2: 3
Get_KMServerErrorCode: 0
Get_KMServerCheckingStatus: 15
FNAcceptMakringCode: 0
FNGetMarkingCodeWorkStatus: 0
Get_MCCheckResultSavedCount: 1
Set_CheckItemMode: 0
Set_BarcodeHex: 30 31 30 34 36 34 30 32 30 33 38 32 30 30 31 30 32 31 31 30 30 30 30 30 30 31 31 39 38 31 38 1D 39 31 45 45 30 38 1D 39 32 53 53 58 36 6C 4C 70 57 36 4E 31 5A 37 2F 4A 69 77 78 52 53 66 45 78 55 6B 59 51 74 35 34 35 51 6E 58 68 39 7A 6F 79 6D 5A 4A 6F 3D
FNCheckItemBarcode: 0
Get_MarkingType2: 3
Get_KMServerErrorCode: 0
Get_KMServerCheckingStatus: 15
FNAcceptMakringCode: 0
FNGetMarkingCodeWorkStatus: 0
Get_MCCheckResultSavedCount: 2
Set_CheckType: 1
Set_Tax1: 4
Set_PaymentTypeSign: 4
Set_PaymentItemSign: 33
Set_Price: 100
Set_Quantity: 1
Set_StringForPrinting: Инъектран
FNOperation: 0
Set_TagNumber: 1262
Set_TagType: 7
Set_TagValueStr: 030
FNSendTagOperation: 0
Set_TagNumber: 1263
Set_TagType: 7
Set_TagValueStr: 21.11.2023
FNSendTagOperation: 0
Set_TagNumber: 1264
Set_TagType: 7
Set_TagValueStr: 1944
FNSendTagOperation: 0
Set_TagNumber: 1265
Set_TagType: 7
Set_TagValueStr: UUID=1e87c58a-2934-40f5-80cb-6cc319f6487a&Time=1737344126424
FNSendTagOperation: 0
Set_BarcodeHex: 30 31 30 34 36 34 30 32 30 33 38 32 30 30 31 30 32 31 31 30 30 30 30 30 30 31 31 39 38 31 38 1D 39 31 45 45 30 38 1D 39 32 53 53 58 36 6C 4C 70 57 36 4E 31 5A 37 2F 4A 69 77 78 52 53 66 45 78 55 6B 59 51 74 35 34 35 51 6E 58 68 39 7A 6F 79 6D 5A 4A 6F 3D
FNSendItemBarcode: 0
Set_CheckType: 1
Set_Tax1: 4
Set_PaymentTypeSign: 4
Set_PaymentItemSign: 33
Set_Price: 100
Set_Quantity: 1
Set_StringForPrinting: Мерсилон
FNOperation: 0
Set_BarcodeHex: 30 31 30 34 36 37 30 30 30 38 31 36 33 36 38 35 32 31 62 76 53 71 6B 43 73 75 6F 41 79 52 35 1D 39 31 45 45 30 39 1D 39 32 62 69 6C 31 6D 34 4C 33 69 2B 4C 77 55 35 45 57 78 6C 34 51 73 43 72 55 44 37 39 68 58 52 71 72 47 33 6A 4E 6E 6E 66 6F 44 76 63 3D
FNSendItemBarcode: 0
Set_TagNumber: 1262
Set_TagType: 7
Set_TagValueStr: 030
FNSendTagOperation: 0
Set_TagNumber: 1263
Set_TagType: 7
Set_TagValueStr: 21.11.2023
FNSendTagOperation: 0
Set_TagNumber: 1264
Set_TagType: 7
Set_TagValueStr: 1944
FNSendTagOperation: 0
Set_TagNumber: 1265
Set_TagType: 7
Set_TagValueStr: UUID=11c7824b-b8b7-41c3-87ba-f94f5417a127&Time=1741083256444
FNSendTagOperation: 0
Set_Summ2: 200
Set_TaxType: 2
FNCloseCheckEx: 0
С комментариями
Set_CheckItemMode: 0 //переходим в режим проверки. Если ошибка, то скорее всего, не открыта смена. Открыть смену и выполнить команду еще раз.
Set_BarcodeHex: 30 31 30 34 36 37 30 30 30 38 31 36 33 36 38 35 32 31 62 76 53 71 6B 43 73 75 6F 41 79 52 35 1D 39 31 45 45 30 39 1D 39 32 62 69 6C 31 6D 34 4C 33 69 2B 4C 77 55 35 45 57 78 6C 34 51 73 43 72 55 44 37 39 68 58 52 71 72 47 33 6A 4E 6E 6E 66 6F 44 76 63 3D //указываем первую марку которую нужно проверить
FNCheckItemBarcode: 0 //проверяем. Ошибки нет. Если ошибка D3h.
Get_MarkingType2: 3 // Если 0 или 255 - это . Только значения - 1, 2, 3, 4 или 5 - это хорошо.
Get_KMServerErrorCode: 0 //Связь с сервером КМ есть. Если связи нет.
Get_KMServerCheckingStatus: 15 // 5 - это [М-]. Это плохо. 15 - это [M+]. Это хорошо.
FNAcceptMakringCode: 0 //Тут ошибки быть не может, только если не было проигнорировано, что MarkingType2: 255
FNGetMarkingCodeWorkStatus: 0 //запрашиваем статус по работе с КМ после каждой марки
Get_MCCheckResultSavedCount: 1 // Количество сохраненных результатов проверки КМ: 1. Значит, результат сохранилсяв память, это хорошо. Кстати, что делать когда количество станет 128.
Set_CheckItemMode: 0 //снова переходим в режим проверки.
Set_BarcodeHex: 30 31 30 34 36 34 30 32 30 33 38 32 30 30 31 30 32 31 31 30 30 30 30 30 30 31 31 39 38 31 38 1D 39 31 45 45 30 38 1D 39 32 53 53 58 36 6C 4C 70 57 36 4E 31 5A 37 2F 4A 69 77 78 52 53 66 45 78 55 6B 59 51 74 35 34 35 51 6E 58 68 39 7A 6F 79 6D 5A 4A 6F 3D //добавляем новую марку
FNCheckItemBarcode: 0 //проверяем. Ошибки нет. Если ошибка D3h.
Get_MarkingType2: 3 Если 0 или 255, то это плохо. Только значения - 1, 2, 3, 4 или 5 - это хорошо.
Get_KMServerErrorCode: 0 //Связь с сервером КМ есть. Если связи нет.
Get_KMServerCheckingStatus: 15 // 5 - это [М-]. Это плохо. 15 - это [M+]. Это хорошо.
FNAcceptMakringCode: 0 //Здесь ошибки быть не может, только если не было проигнорировано, что MarkingType2: 255
FNGetMarkingCodeWorkStatus: 0 //запрашиваем статус по работе с КМ после каждой марки
Get_MCCheckResultSavedCount: 2 // Количество сохраненных результатов проверки КМ: 2. Стал на 1 больше, значит, результат сохранился в память, это хорошо. Что делать, если не изменился после сохранения предыдущего. Кстати, что делать когда количество станет 128.
Set_CheckType: 1 //приход
Set_Tax1: 4 //БЕЗ НДС
Set_PaymentTypeSign: 4 //Полный расчет
Set_PaymentItemSign: 33 //Маркированный товар.
Set_Price: 100 //цена
Set_Quantity: 1 //количество
Set_StringForPrinting: Инъектран //наименование
FNOperation: 0 //добавляем позицию.
Set_TagNumber: 1262 //добавляем тег 1262, 1263, 1264 и 1265 для разрешительного режима
Set_TagType: 7
Set_TagValueStr: 030
FNSendTagOperation: 0
Set_TagNumber: 1263
Set_TagType: 7
Set_TagValueStr: 21.11.2023
FNSendTagOperation: 0
Set_TagNumber: 1264
Set_TagType: 7
Set_TagValueStr: 1944
FNSendTagOperation: 0
Set_TagNumber: 1265
Set_TagType: 7
Set_TagValueStr: UUID=1e87c58a-2934-40f5-80cb-6cc319f6487a&Time=1737344126424
FNSendTagOperation: 0
Set_BarcodeHex: 30 31 30 34 36 34 30 32 30 33 38 32 30 30 31 30 32 31 31 30 30 30 30 30 30 31 31 39 38 31 38 1D 39 31 45 45 30 38 1D 39 32 53 53 58 36 6C 4C 70 57 36 4E 31 5A 37 2F 4A 69 77 78 52 53 66 45 78 55 6B 59 51 74 35 34 35 51 6E 58 68 39 7A 6F 79 6D 5A 4A 6F 3D
FNSendItemBarcode: 0 //Привязываем марку к чеку
Set_CheckType: 1 //добавляем вторую позицю
Set_Tax1: 4
Set_PaymentTypeSign: 4
Set_PaymentItemSign: 33
Set_Price: 100
Set_Quantity: 1
Set_StringForPrinting: Мерсилон
FNOperation: 0
Set_BarcodeHex: 30 31 30 34 36 37 30 30 30 38 31 36 33 36 38 35 32 31 62 76 53 71 6B 43 73 75 6F 41 79 52 35 1D 39 31 45 45 30 39 1D 39 32 62 69 6C 31 6D 34 4C 33 69 2B 4C 77 55 35 45 57 78 6C 34 51 73 43 72 55 44 37 39 68 58 52 71 72 47 33 6A 4E 6E 6E 66 6F 44 76 63 3D
FNSendItemBarcode: 0 //Привязываем марку к чеку. Не может быть ошибки.
Set_TagNumber: 1262 //добавляем тег 1262, 1263, 1264 и 1265 для разрешительного режима
Set_TagType: 7
Set_TagValueStr: 030
FNSendTagOperation: 0
Set_TagNumber: 1263
Set_TagType: 7
Set_TagValueStr: 21.11.2023
FNSendTagOperation: 0
Set_TagNumber: 1264
Set_TagType: 7
Set_TagValueStr: 1944
FNSendTagOperation: 0
Set_TagNumber: 1265
Set_TagType: 7
Set_TagValueStr: UUID=11c7824b-b8b7-41c3-87ba-f94f5417a127&Time=1741083256444
FNSendTagOperation: 0
Set_Summ2: 200 //200 рублей безналом
Set_TaxType: 2 //УСН
FNCloseCheckEx: 0 //Закрываем чек
Частые вопросы
Почему нет команды FNDeclineMarkingCode?
Избыточная. Ее использование ничего не меняет.
Почему нет запроса локальной проверки Get_CheckItemLocalResult?
Вкратце: необязательная и используется только у марок с 88-значным криптохвостом, то есть,в настоящий момент только на обувной продукции.
Полный ответ: С самого начала была идея загружать в ФН ключ, с помощью которого можно проверять контрольную сумму марки в оффлайн режиме без доступа в Интернет.. Но идея не получила дальнейшего развития.
Ключ загружается по сети Интернет в ФН и марка проверяется на корректность структуры даже когда интернет отсутствует.
1) Марки с короткими криптохвостами не проверяются. Только 88-значные, которые встречаются только у обуви.
2) Результат такой проверки не является обязательным.
Set_BarcodeHex: 30 31 30 31 32 33 34 35 36 37 38 39 30 31 32 33 32 31 73 6F 54 72 39 2C 72 21 2F 62 4D 63 33 72 1D 39 31 30 30 35 38 1D 39 32 70 52 4A 72 63 59 5A 6A 6B 69 34 58 49 43 30 74 73 37 4D 4D 41 45 34 78 73 31 38 72 6C 46 44 48 4C 57 79 70 4E 2F 54 61 54 63 6B 4C 62 7A 39 31 39 67 71 48 54 6C 49 71 69 2B 4F 4E 45 49 4F 77 78 53 52 6A 42 70 6C 56 50 66 7A 49 67 34 64 50 76 46 52 78 52 67 3D 3D
Get_MarkingType2: 2 //только при значении 2 можно сделать локальную проверку. У остальных типов кодов маркировки локальной проверки нет и производить ее не нужно
Get_CheckItemLocalError: 0 //0 – КМ успешно проверен в ФН; 1 – КМ данного типа не подлежит проверки в ФН, если MarkingType не равен 2 и все же решили проверить; 2 – ФН не содержит ключ проверки кода проверки этого КМ. Такое часто бывает. Нецелесообразно запрещать продажу по причине невозможности осуществления необязательной проверки.
Get_CheckItemLocalResult: 3 // 0 – проверка не проводилась. Если MarkingType не равен 2 и все же решили проверить или нет ключа для проверки; 1 - код маркировки проверен, недостоверный. Если подменить хотя бы один символ в криптохвосте, то будет такой результат. Предпочтительно, только в данном случае вывести сообщение:
"Запрещено продавать товар с данным кодом маркировки без доступа в интернет."
; 3 – код маркировки проверен, достоверный.
Почему нет команды OpenCheck в примере?
Команда FNOperation автоматически открывает чек и команда OpenCheck стала лишней, если не требуется дополнительных текстовых строк на печать перед позициями.