Как преобразовать сокращенный КИЗ из XML-файла в штрихкод DataMatrix для печати в 1С?

Программист 1С v8.3 (Управляемые формы) Управленческий учет Торговля и дистрибуция
← На главную

При работе с электронным документооборотом (ЭДО) и системой маркировки «Честный ЗНАК» программисты часто сталкиваются с ситуацией, когда в пришедшем XML-файле накладной (УПД) присутствует только сокращенный код идентификации (КИЗ), а полный код маркировки с криптохвостом отсутствует. Это создает сложности, если необходимо распечатать этикетку для внутреннего учета или восстановления поврежденного штрихкода. В данной статье мы разберем, как программно извлечь данные из такого КИЗ и сформировать на их основе штрихкод формата DataMatrix, пригодный для сканирования в среде 1С. Для решения смежных задач по обмену документами с маркетплейсами также может пригодиться обработка для автоматического формирования УПД в формате XML с проверкой кодов «Честного знака».

Разбор ситуации: почему в XML нет полного кода?

Прежде всего, проанализируем структуру данных. В файлах обмена ЭДО, согласно формату ФНС, передаются именно коды идентификации. Код идентификации включает в себя GTIN (идентификатор товара, 14 цифр) и серийный номер. Полный код маркировки, который мы видим на упаковке, содержит дополнительные данные — ключ проверки и код проверки (так называемый «криптохвост»).

Криптохвост не передается в УПД, так как он предназначен для проверки подлинности товара в момент выбытия или смены собственника через систему ИС МП, а не для хранения в учетных системах контрагентов. Однако для целей внутренней идентификации (например, чтобы при сканировании в 1С нашелся конкретный оприходованный экземпляр) нам достаточно сформировать штрихкод на основе имеющихся GTIN и серийного номера.

Шаг 1: Получение данных из XML и их разбор

Рассмотрим пример строки КИЗ из XML-файла: 010880856348734221QC/?QJAE:ZRG6. Здесь первые две цифры 01 — это идентификатор применения (AI) для GTIN, а 21 — идентификатор применения для серийного номера. Нам необходимо корректно «разобрать» эту строку на составляющие.

Для этого в типовых конфигурациях 1С используется метод МенеджерОборудованияМаркировкаВызовСервера.РазобратьШтриховойКодТовара(). Разберем пример кода для обработки этой строки:


// ЭлементКИЗ.Значение — это строка вида "010880856348734221QC/?QJAE:ZRG6"
РазборШК = МенеджерОборудованияМаркировкаВызовСервера.РазобратьШтриховойКодТовара(ЭлементКИЗ.Значение);

Если НЕ РазборШК.ОписаниеОшибки = Неопределено Тогда
    Сообщить("Ошибка разбора кода: " + РазборШК.ОписаниеОшибки);
    Возврат;
КонецЕсли;

// Получаем необходимые части
ТоварныйGTIN = РазборШК.GTIN;
СерийныйНомер = РазборШК.СерийныйНомер;

После выполнения этого кода в структуре РазборШК мы получим чистые значения GTIN и серийного номера, которые система 1С хранит в регистрах сведений для маркируемой продукции.

Шаг 2: Формирование строки для печати штрихкода

Выясним причину, по которой простая печать строки 01...21... может не сработать. Для того чтобы сканер распознал DataMatrix именно как код маркировки стандарта GS1, в структуре штрихкода должны присутствовать спецсимволы-разделители (FNC1). Если мы просто передаем строку в генератор штрихкода, он может создать обычный текстовый DataMatrix (ECC200), который 1С при сканировании воспримет как обычный текст, а не как объект маркировки.

Однако, как показывает практика, для внутреннего поиска товара в базе 1С достаточно собрать строку, используя идентификаторы применения. Посмотрим на пример формирования параметров для печати:


ПараметрыШтрихкода = Новый Структура;
// Собираем строку в формате GS1 (без криптохвоста)
СтрокаДляПечати = "01" + РазборШК.GTIN + "21" + РазборШК.СерийныйНомер;

// Преобразуем строку в Base64, если этого требует используемая компонента печати
РезBase64 = ШтрихкодированиеИСКлиентСервер.ШтрихкодВBase64(СтрокаДляПечати);

ПараметрыШтрихкода.Вставить("Штрихкод", РезBase64);
ПараметрыШтрихкода.Вставить("ТипШтрихкода", "DataMatrix"); // Важно указать тип

Шаг 3: Вывод штрихкода в табличный документ

Рассмотрим подробнее процесс формирования картинки штрихкода и вывода её на печать. Мы будем использовать стандартные механизмы БСП (Библиотеки стандартных подсистем) для получения картинки.


// Получаем картинку через менеджер оборудования
КартинкаШтрихкода = МенеджерОборудованияВызовСервера.ПолучитьКартинкуШтрихкода(ПараметрыШтрихкода);

ТД = Новый ТабличныйДокумент;
Макет = ОбработкаОбъект.ПолучитьМакет("Макет");
Область = Макет.ПолучитьОбласть("Заголовок");

// Добавляем рисунок в область макета
Рис = Область.Рисунки.Добавить(ТипРисункаТабличногоДокумента.Картинка);
Рис.Верх = 2;
Рис.Лево = 2;
Рис.Высота = 30; // Размер в мм или пикселях в зависимости от настроек
Рис.Ширина = 30;
Рис.РазмерКартинки = РазмерКартинки.РеальныйРазмер;
Рис.Картинка = КартинкаШтрихкода;

ТД.Вывести(Область);
ТД.Показать();

Важные технические нюансы

Проанализируем несколько критических моментов, которые обеспечат корректную работу решения:

  1. Символ FNC1: Профессиональные компоненты печати штрихкодов в 1С (например, 1С:Печать штрихкодов) автоматически добавляют префикс FNC1, если распознают структуру GS1 (наличие идентификаторов 01 и 21).
  2. Синтетический штрихкод: Полученный нами код будет визуально отличаться от оригинального (он будет менее плотным, так как в нем меньше данных), но 1С успешно распознает его при сканировании, так как поиск в базе идет именно по паре GTIN + Серийный номер.
  3. Режим сканера: Для того чтобы спецсимволы-разделители корректно передавались в 1С, сканер должен быть настроен в режиме эмуляции COM-порта (Native API).

Ограничения и юридические риски

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

Если оригинальная этикетка утеряна, правильным решением будет процедура перемаркировки через личный кабинет «Честного ЗНАКа». В этом случае вы заказываете новый полный код маркировки, списывая старый. Описанный же выше метод подходит исключительно для складских нужд: инвентаризации, перемещения или идентификации товара внутри компании.

Таким образом, мы разобрали, как с помощью встроенных функций 1С РазобратьШтриховойКодТовара и ПолучитьКартинкуШтрихкода восстановить работоспособность складских процессов, даже если у вас на руках есть только данные из XML-файла ЭДО.

← На главную