Рассмотрим достаточно распространенную задачу: необходимость интегрировать отправку кодов маркировки в систему "Честный ЗНАК" через онлайн-кассу при использовании устаревшей, но все еще популярной платформы 1С:Предприятие 7.7. Разберем по шагам, как устроены штрихкоды формата Data Matrix, как корректно передать их в драйвер контрольно-кассовой техники (на примере ККТ "Штрих-М") и какие нюансы нужно учитывать при работе со сканерами штрихкодов. Также проанализируем современные требования Формата Фискальных Документов (ФФД 1.2), которые кардинально изменили подход к работе с маркировкой.
Прежде чем отправлять данные в кассу, выясним причину частых ошибок — неправильное понимание структуры самого кода маркировки. То, что мы считываем с упаковки (например, обуви, парфюмерии или сигарет), это не просто случайный набор символов. Код состоит из нескольких блоков (идентификаторов применения):
01) — всегда состоит из 14 символов. Это глобальный номер предмета торговли.21) — уникальный номер конкретного экземпляра товара (от 7 до 13 символов).91 и 92) — используется для проверки легальности кода. В старых системах этот "хвост" часто называли "мусором" и отбрасывали, но сейчас он критически важен.Посмотрим на пример "сырого" кода, считанного сканером:
010333143897980221Ef5X9BYN:bfhZ91EE0692Ea7dSjZPJs2VlNozIpwx...
Здесь:
01 — маркер начала GTIN. Сам GTIN: 03331438979802.21 — маркер начала серийного номера. Сам Serial: Ef5X9BYN:bfhZ.91 и 92 с криптохвостом.При работе в 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.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 с кодом) или в личном кабинете "Честного ЗНАКА", где статус товара должен был смениться на "Выведен из оборота".
Сегодня описанный выше метод с обрезанием кода и использованием FNSendItemCodeData() устарел и не соответствует законодательству для большинства товаров. Введено новое понятие разрешительного режима и Формат Фискальных Документов 1.2. Проанализируем ситуацию в новых реалиях.
<GS>). Фискальный накопитель (ФН-М) сам разбирает его на части.В современных драйверах (например, Штрих-М версии 5.16+) для этого используются новые методы:
FNCheckItemBarcode() — отправка кода на проверку в ФН и на сервер.FNAcceptMarkingCode() — подтверждение продажи маркированного товара.Благодаря ФФД 1.2 вам больше не нужно гадать, "съела" ли касса код. Результат проверки печатается прямо на кассовом чеке рядом с наименованием товара в виде литеры:
Несмотря на то, что 1С 7.7 является старой платформой, с помощью современных внешних компонент и актуальных драйверов ККТ вполне реально реализовать работу по ФФД 1.2, передавая полные коды и обрабатывая результаты проверки сервера.