При работе с электронным документооборотом (ЭДО) и системой маркировки «Честный ЗНАК» программисты часто сталкиваются с ситуацией, когда в пришедшем XML-файле накладной (УПД) присутствует только сокращенный код идентификации (КИЗ), а полный код маркировки с криптохвостом отсутствует. Это создает сложности, если необходимо распечатать этикетку для внутреннего учета или восстановления поврежденного штрихкода. В данной статье мы разберем, как программно извлечь данные из такого КИЗ и сформировать на их основе штрихкод формата DataMatrix, пригодный для сканирования в среде 1С. Для решения смежных задач по обмену документами с маркетплейсами также может пригодиться обработка для автоматического формирования УПД в формате XML с проверкой кодов «Честного знака».
Прежде всего, проанализируем структуру данных. В файлах обмена ЭДО, согласно формату ФНС, передаются именно коды идентификации. Код идентификации включает в себя GTIN (идентификатор товара, 14 цифр) и серийный номер. Полный код маркировки, который мы видим на упаковке, содержит дополнительные данные — ключ проверки и код проверки (так называемый «криптохвост»).
Криптохвост не передается в УПД, так как он предназначен для проверки подлинности товара в момент выбытия или смены собственника через систему ИС МП, а не для хранения в учетных системах контрагентов. Однако для целей внутренней идентификации (например, чтобы при сканировании в 1С нашелся конкретный оприходованный экземпляр) нам достаточно сформировать штрихкод на основе имеющихся GTIN и серийного номера.
Рассмотрим пример строки КИЗ из XML-файла: 010880856348734221QC/?QJAE:ZRG6. Здесь первые две цифры 01 — это идентификатор применения (AI) для GTIN, а 21 — идентификатор применения для серийного номера. Нам необходимо корректно «разобрать» эту строку на составляющие.
Для этого в типовых конфигурациях 1С используется метод МенеджерОборудованияМаркировкаВызовСервера.РазобратьШтриховойКодТовара(). Разберем пример кода для обработки этой строки:
// ЭлементКИЗ.Значение — это строка вида "010880856348734221QC/?QJAE:ZRG6"
РазборШК = МенеджерОборудованияМаркировкаВызовСервера.РазобратьШтриховойКодТовара(ЭлементКИЗ.Значение);
Если НЕ РазборШК.ОписаниеОшибки = Неопределено Тогда
Сообщить("Ошибка разбора кода: " + РазборШК.ОписаниеОшибки);
Возврат;
КонецЕсли;
// Получаем необходимые части
ТоварныйGTIN = РазборШК.GTIN;
СерийныйНомер = РазборШК.СерийныйНомер;
После выполнения этого кода в структуре РазборШК мы получим чистые значения GTIN и серийного номера, которые система 1С хранит в регистрах сведений для маркируемой продукции.
Выясним причину, по которой простая печать строки 01...21... может не сработать. Для того чтобы сканер распознал DataMatrix именно как код маркировки стандарта GS1, в структуре штрихкода должны присутствовать спецсимволы-разделители (FNC1). Если мы просто передаем строку в генератор штрихкода, он может создать обычный текстовый DataMatrix (ECC200), который 1С при сканировании воспримет как обычный текст, а не как объект маркировки.
Однако, как показывает практика, для внутреннего поиска товара в базе 1С достаточно собрать строку, используя идентификаторы применения. Посмотрим на пример формирования параметров для печати:
ПараметрыШтрихкода = Новый Структура;
// Собираем строку в формате GS1 (без криптохвоста)
СтрокаДляПечати = "01" + РазборШК.GTIN + "21" + РазборШК.СерийныйНомер;
// Преобразуем строку в Base64, если этого требует используемая компонента печати
РезBase64 = ШтрихкодированиеИСКлиентСервер.ШтрихкодВBase64(СтрокаДляПечати);
ПараметрыШтрихкода.Вставить("Штрихкод", РезBase64);
ПараметрыШтрихкода.Вставить("ТипШтрихкода", "DataMatrix"); // Важно указать тип
Рассмотрим подробнее процесс формирования картинки штрихкода и вывода её на печать. Мы будем использовать стандартные механизмы БСП (Библиотеки стандартных подсистем) для получения картинки.
// Получаем картинку через менеджер оборудования
КартинкаШтрихкода = МенеджерОборудованияВызовСервера.ПолучитьКартинкуШтрихкода(ПараметрыШтрихкода);
ТД = Новый ТабличныйДокумент;
Макет = ОбработкаОбъект.ПолучитьМакет("Макет");
Область = Макет.ПолучитьОбласть("Заголовок");
// Добавляем рисунок в область макета
Рис = Область.Рисунки.Добавить(ТипРисункаТабличногоДокумента.Картинка);
Рис.Верх = 2;
Рис.Лево = 2;
Рис.Высота = 30; // Размер в мм или пикселях в зависимости от настроек
Рис.Ширина = 30;
Рис.РазмерКартинки = РазмерКартинки.РеальныйРазмер;
Рис.Картинка = КартинкаШтрихкода;
ТД.Вывести(Область);
ТД.Показать();
Проанализируем несколько критических моментов, которые обеспечат корректную работу решения:
Важно помнить: сформированный таким образом штрихкод (без криптохвоста) является «техническим». Его категорически нельзя использовать для продажи товара конечному потребителю через ККТ. Согласно правилам маркировки, при продаже на кассе код должен проходить проверку подлинности (через фискальный накопитель 1.2). Штрихкод без крипточасти не пройдет эту проверку, и такая продажа будет заблокирована или признана незаконной.
Если оригинальная этикетка утеряна, правильным решением будет процедура перемаркировки через личный кабинет «Честного ЗНАКа». В этом случае вы заказываете новый полный код маркировки, списывая старый. Описанный же выше метод подходит исключительно для складских нужд: инвентаризации, перемещения или идентификации товара внутри компании.
Таким образом, мы разобрали, как с помощью встроенных функций 1С РазобратьШтриховойКодТовара и ПолучитьКартинкуШтрихкода восстановить работоспособность складских процессов, даже если у вас на руках есть только данные из XML-файла ЭДО.