Как отправить код маркировки "Честный ЗНАК" через ККТ из 1С 7.7 и проверить его статус?

Программист 1С v7.7 Торговля и дистрибуция
← На главную

Рассмотрим достаточно распространенную задачу: необходимость интегрировать отправку кодов маркировки в систему "Честный ЗНАК" через онлайн-кассу при использовании устаревшей, но все еще популярной платформы 1С:Предприятие 7.7. Разберем по шагам, как устроены штрихкоды формата Data Matrix, как корректно передать их в драйвер контрольно-кассовой техники (на примере ККТ "Штрих-М") и какие нюансы нужно учитывать при работе со сканерами штрихкодов. Также проанализируем современные требования Формата Фискальных Документов (ФФД 1.2), которые кардинально изменили подход к работе с маркировкой.

Структура кода маркировки (Data Matrix)

Прежде чем отправлять данные в кассу, выясним причину частых ошибок — неправильное понимание структуры самого кода маркировки. То, что мы считываем с упаковки (например, обуви, парфюмерии или сигарет), это не просто случайный набор символов. Код состоит из нескольких блоков (идентификаторов применения):

  1. GTIN (идентификатор 01) — всегда состоит из 14 символов. Это глобальный номер предмета торговли.
  2. Серийный номер (идентификатор 21) — уникальный номер конкретного экземпляра товара (от 7 до 13 символов).
  3. Код проверки (криптохвост) (идентификаторы 91 и 92) — используется для проверки легальности кода. В старых системах этот "хвост" часто называли "мусором" и отбрасывали, но сейчас он критически важен.

Посмотрим на пример "сырого" кода, считанного сканером:

010333143897980221Ef5X9BYN:bfhZ91EE0692Ea7dSjZPJs2VlNozIpwx...

Здесь:

Подключение сканера штрихкодов: COM-эмуляция против клавиатурного режима

При работе в 1С 7.7 программисты часто сталкиваются с тем, что сканер считывает "абракадабру": меняется регистр букв, вставляются случайные символы, сказывается текущая языковая раскладка клавиатуры (русская/английская). Некоторые пытаются решить это сложными скриптами для автоматического переключения языка или обработки строк, например так:


Если Найти("АБВГ...", Сред(СокрЛП(КодМаркировки), А, 1)) <> 0 Тогда
    WshShell = СоздатьОбъект("WScript.Shell");
    WshShell.SendKeys("%+"); // Попытка переключить раскладку
КонецЕсли;

Это в корне неверный подход! Клавиатурный режим (Keyboard Wedge) категорически не подходит для работы с кодами Data Matrix. Внутри правильного кода маркировки находится специальный непечатный символ <GS> (Group Separator, ASCII код 29). Он сообщает системе, где заканчивается один блок данных (например, серийный номер) и начинается следующий. Клавиатурные сканеры этот символ просто "съедают", из-за чего драйвер кассы не может правильно разобрать код.

Решение: Обязательно переводите сканер в режим эмуляции COM-порта (Virtual COM). В этом режиме сканер передает данные напрямую в порт как поток байтов, игнорируя раскладку клавиатуры и сохраняя все спецсимволы. В 1С 7.7, если используется стандартная библиотека `ScanOpos`, учитывайте, что она поддерживает порты только до COM9. Если драйвер установил сканер на COM15, измените номер порта в диспетчере устройств Windows.

Отправка кода в ККТ Штрих-М (Старый метод для ФФД 1.05 / 1.1)

До внедрения ФФД 1.2 драйверы касс требовали передавать в тег 1162 обрезанный код (только GTIN и Серийный номер). Криптохвост отбрасывался. Разберем по шагам, как это реализовывалось в 1С 7.7 при работе через OLE-объект драйвера Штрих-М:

Сначала из считанного кода вырезались нужные части (предполагая жесткую структуру, что не всегда безопасно, но работало для стандартных кодов):


// Откусываем лишнее (пример для обуви/одежды)
GTIN = Сред(КодМаркировки, 3, 14);
SerialNumber = Сред(КодМаркировки, 19, 13);

Затем эти данные отправлялись в кассу перед закрытием чека:


// Объект - это инициализированный OLE-объект драйвера Штрих-М
Объект.Пароль = ПарольКассира;  
// Тип маркировки (17485 - это hex 444D, общий для большинства маркировок)
Объект.MarkingType = 17485;    
Объект.GTIN = GTIN;
Объект.SerialNumber = SerialNumber;
Объект.FNSendItemCodeData(); // Отправка тега маркировки

После этого печаталась строка чека, и в ОФД уходил тег 1162. Успешность отправки можно было проверить только в личном кабинете ОФД (там появлялся тег 1162 с кодом) или в личном кабинете "Честного ЗНАКА", где статус товара должен был смениться на "Выведен из оборота".

Актуальные требования: Работа по ФФД 1.2

Сегодня описанный выше метод с обрезанием кода и использованием FNSendItemCodeData() устарел и не соответствует законодательству для большинства товаров. Введено новое понятие разрешительного режима и Формат Фискальных Документов 1.2. Проанализируем ситуацию в новых реалиях.

  1. Тег 1162 отменен: Ему на смену пришел составной тег 1163, внутри которого передается тег 2106 ("Код маркировки").
  2. Полный код: Больше не нужно "откусывать" GTIN и серийный номер. В драйвер ККТ передается полная строка кода Data Matrix (включая криптохвост и спецсимволы <GS>). Фискальный накопитель (ФН-М) сам разбирает его на части.
  3. Онлайн-проверка перед пробитием: Касса теперь не просто фиксирует продажу, а до пробития чека связывается с сервером "Честного ЗНАКА" через ОФД для проверки валидности кода.

В современных драйверах (например, Штрих-М версии 5.16+) для этого используются новые методы:

Как убедиться, что код ушел и проверен?

Благодаря ФФД 1.2 вам больше не нужно гадать, "съела" ли касса код. Результат проверки печатается прямо на кассовом чеке рядом с наименованием товара в виде литеры:

Несмотря на то, что 1С 7.7 является старой платформой, с помощью современных внешних компонент и актуальных драйверов ККТ вполне реально реализовать работу по ФФД 1.2, передавая полные коды и обрабатывая результаты проверки сервера.

← На главную