При внедрении обязательной маркировки молочной продукции предприятия, до сих пор использующие проверенную временем платформу 1С 7.7, сталкиваются с трудностями при доработке процедур печати чеков. Если правила передачи кодов для табака или обуви уже давно известны, то интеграция с новыми форматами фискальных документов (ФФД 1.2) и спецификой учета молочной продукции вызывает много вопросов. Давайте подробно разберем, как правильно организовать передачу тегов маркировки в драйвер оборудования Штрих-М.
Ранее, при использовании формата фискальных данных 1.05, разработчикам приходилось самостоятельно заниматься "нарезкой" считанного сканером кода маркировки (DataMatrix). Требовалось вручную искать спецсимвол разделителя GS (код ASCII 29), выделять глобальный идентификатор торговой единицы (GTIN) и уникальный серийный номер товара, чтобы затем передать их в драйвер отдельными параметрами для формирования тега 1162.
Однако, с переходом на ФФД 1.2 логика работы драйверов Штрих-М и самих контрольно-кассовых машин (ККТ) кардинально изменилась. Посмотрим, что именно поменялось:
0x1D и формируют корректную посылку в информационную систему маркировки (ОИСМ).[М+] если проверка пройдена успешно).Чтобы обеспечить универсальную работу алгоритма (например, если в компании используются разные кассы на разных версиях ФФД), логично предусмотреть в коде ветвление. Разберем по шагам готовый фрагмент кода, который обрабатывает передачу маркировки.
Если ПустоеЗначение(ОбрДок.КТН) = 0 Тогда
Если ОбрДок.Касса.ФФД_ККТ = Перечисление.ФФД_ККТ.ФФД1_2 Тогда
// Для касс с ФФД 1.2 передаем весь считанный код целиком
ФискальныйРегистратор.BarCode = СокрЛП(ОбрДок.КТН);
Рез = ФискальныйРегистратор.FNSendItemBarcode();
Иначе
// Для касс с ФФД 1.05 (или старых прошивок) разбираем код маркировки
GTIN = Сред(КТН, 3, 14);
SerialNumber = Сред(КТН, 19, 13);
// Передаем тип маркировки товара (17485 соответствует "444D")
ФискальныйРегистратор.MarkingType = 17485;
ФискальныйРегистратор.GTIN = GTIN;
ФискальныйРегистратор.SerialNumber = SerialNumber;
// Вызываем метод отправки тега маркировки
Рез = ФискальныйРегистратор.FNSendItemCodeData();
КонецЕсли;
КонецЕсли;
В данном примере мы анализируем реквизит кассы ФФД_ККТ. Если используется современный формат, мы применяем свойство драйвера BarCode и метод FNSendItemBarcode(), передавая считанный код без каких-либо изменений. Если же используется старый формат, применяется классический метод FNSendItemCodeData(), для работы которого мы предварительно извлекаем переменные GTIN и SerialNumber.
Рассмотрим подробнее специфику именно молочной категории. В отличие от табачных изделий или обуви, коды маркировки молочной продукции не подлежат обязательной локальной криптографической проверке внутри самого фискального накопителя. Их валидация зависит в первую очередь от ответа сервера (через ОФД).
Если касса работает в автономном режиме (без доступа к интернету) или связь с сервером временно потеряна, онлайн-проверка не будет пройдена. В таких случаях касса может напечатать на чеке статус [М-] (не прошел проверку) или [М] (проверка не проводилась). Это нормальное поведение, учитывающее специфику криптохвостов молочных марок.
Часто возникает потребность продать партию "молочки" мелким оптом за наличный расчет с указанием ИНН покупателя в чеке. Для таких ситуаций законодательством предусмотрен так называемый Объемно-сортовой учет (ОСУ).
Разберем, как это работает и какие теги необходимо заполнять:
GTIN (глобальный идентификатор товара, который часто совпадает с обычным штрихкодом EAN-13, но дополняется ведущими нулями до 14 символов) и количество продаваемых единиц.1163 (код товара).industryDetails со значением crpt=mrk.При использовании ОСУ касса формирует уведомление о реализации, которое корректно спишет указанный объем продукции с баланса продавца в системе Честный ЗНАК без детальной поштучной прослеживаемости.
Проанализируем ситуацию, когда расчет происходит между двумя юридическими лицами или ИП (B2B продажи). Если в чек передаются реквизиты покупателя (тег 1227 "Наименование покупателя" и тег 1228 "ИНН покупателя"), система маркировки понимает, что это не продажа конечному потребителю.
В таком случае автоматическое выбытие (списание) кода маркировки из оборота не происходит. Чек служит лишь подтверждением факта финансовых расчетов. Переход права собственности на саму продукцию оформляется отдельно с помощью электронного документооборота (ЭДО) путем передачи Универсального передаточного документа (УПД).
Важный совет: Чтобы избежать логических коллизий в системах учета, для таких чеков часто используют признак способа расчета "Оплата кредита". Выбытие кодов в системе ОИСМ жестко привязано к чекам, имеющим признак "Полный расчет" или "Частичный расчет и кредит". Применение "Оплаты кредита" гарантирует, что кассовый чек не повлияет на движение марок, и вся логика учета останется на стороне ЭДО.
И в завершение выясним причину распространенной аппаратной ошибки, с которой сталкиваются системные администраторы. Поскольку в ФФД 1.2 код маркировки передается "как есть", сканер штрихкодов должен считывать и передавать в 1С абсолютно все спецсимволы, заложенные в DataMatrix.
Самым важным из них является невидимый символ <GS> (шестнадцатеричный код 0x1D или ASCII 29). Многие дешевые или неправильно настроенные сканеры "вырезают" этот символ из строки при считывании, так как воспринимают его как служебный мусор. Если в драйвер Штрих-М попадет обрезанная строка без разделителя 0x1D, фискальный накопитель не сможет разобрать блоки данных внутри DataMatrix и немедленно вернет ошибку проверки марки. Обязательно переводите сканеры в режим эмуляции COM-порта и проверяйте правильность передачи спецсимволов специальными утилитами.