При работе с системой маркировки «Честный ЗНАК» пользователи часто сталкиваются с необходимостью повторной печати этикеток. Типовые конфигурации 1С (УТ 11, ERP, КА 2) спроектированы таким образом, что после успешной проверки кода маркировки (DataMatrix) в документе «Приобретение товаров и услуг» (или при загрузке КИЗ из XML), система сохраняет в базе только его идентификаторы — GTIN и серийный номер. Однако для печати полноценного кода требуется полная строка, включающая так называемый «криптохвост» (ключ проверки и код проверки), который иногда требуется для выгрузки полных кодов во внешние системы.
В этой статье мы подробно разберем, почему 1С отсекает лишние данные, где именно в программном коде происходит этот процесс и как реализовать механизм сохранения полной строки сканирования для последующего восстановления этикетки.
Рассмотрим стандартную логику работы системы. Полный код DataMatrix может содержать более 80 символов. Для целей учета и сопоставления с накладной (ЭДО) платформе 1С достаточно знать, какой именно экземпляр товара пришел. Криптохвост же нужен только для проверки подлинности в ГИС МТ (также полезно организовать контроль заполнения полей маркировки в карточке товара). После того как статус кода подтвержден, 1С удаляет «лишнюю» информацию, чтобы не раздувать размер базы данных. Если мы попытаемся распечатать код из типового регистра ШтрихкодыУпаковок, мы получим невалидный DataMatrix, который не будет считываться сканерами на кассе или в приложении «Честный ЗНАК».
Выясним причину необходимости кастомизации: если на складе этикетка была повреждена («оторвали и выкинули»), без заранее сохраненного криптохвоста восстановить ее невозможно. В этом случае законным путем является только процедура перемаркировки, что требует времени и затрат на заказ новых кодов. Сохранение исходного кода — это «лайфхак», упрощающий жизнь складу.
Самый быстрый способ, предложенный в обсуждении, — это добавление строкового реквизита непосредственно в документ «Приобретение товаров и услуг» (ПТУ). Проанализируем этот путь шаг за шагом:
Товары или специализированную ТЧ для маркировки, в зависимости от версии конфигурации).ПолныйКодМаркировки с типом Строка (длина 150-200 символов, чтобы точно уместить весь код с запасом).Теперь нам нужно перехватить данные в момент сканирования. Разберем программный код. Основная логика обработки кодов сосредоточена в обработке ПроверкаИПодборМаркируемойПродукции. Нам необходимо найти процедуру, которая вызывается после успешного сканирования штрихкода. Обычно это обработчик оповещения или метод, принимающий данные от сканера.
Пример логики перехвата данных:
&После("ОбработатьСканированиеШтрихкода")
Процедура СохранитьПолныйКод(Штрихкод, ПараметрыСканирования)
// Штрихкод — это и есть наша "сырая" строка с криптохвостом
// Находим нужную строку в табличной части документа
ТекущаяСтрока = Объект.Товары.НайтиСтроку(...);
Если ТекущаяСтрока <> Неопределено Тогда
ТекущаяСтрока.ПолныйКодМаркировки = Штрихкод;
КонецЕсли;
КонецПроцедуры
Важно: Этот метод прост, но имеет существенный минус. При большом товарообороте (тысячи позиций в одном документе) размер документа ПТУ сильно вырастет, что может привести к замедлению открытия формы и записи объекта.
Более профессиональный и архитектурно правильный подход — вынос хранения кодов в отдельный Регистр сведений. Это позволит не нагружать документы и организовать удобный поиск кода по GTIN и серийному номеру.
Разберем структуру такого регистра:
Номенклатура (СправочникСсылка.Номенклатура)СерийныйНомер (Строка)ПолныйКод (Строка)ДатаПолучения (Дата)При таком подходе, когда кладовщик сканирует товар, мы записываем полную строку в этот регистр. Если через месяц этикетка на коробке сотрется, мы всегда сможем программно найти в регистре нужную запись по серийному номеру, который обычно печатается под кодом читаемыми цифрами, и вывести ее на печать.
Рассмотрим пример кода, который необходимо поместить в модуль обработки маркировки. Мы будем использовать перехват события добавления нового штрихкода в систему:
// В расширении для модуля МенеджерОборудованияВызовСервера или
// в модуле обработки проверки маркировки
&После("ЗафиксироватьРезультатПроверкиКода")
Процедура ЗаписатьВАрхивКодов(ДанныеКода, ДокументОснование)
МенеджерЗаписи = РегистрыСведений.АрхивКодовМаркировки.СоздатьМенеджерЗаписи();
МенеджерЗаписи.Номенклатура = ДанныеКода.Номенклатура;
МенеджерЗаписи.СерийныйНомер = ДанныеКода.СерийныйНомер;
// Получаем именно ту строку, которая пришла со сканера до парсинга
МенеджерЗаписи.ПолныйКод = ДанныеКода.ИсходнаяСтрока;
МенеджерЗаписи.ДатаПолучения = ТекущаяДата();
МенеджерЗаписи.Записать();
КонецПроцедуры
Проанализируем процесс генерации этикетки. Просто вывести сохраненную строку ПолныйКод в текстовое поле нельзя — принтер напечатает текст, а не квадратный код. Нам необходимо использовать компоненту печати штрихкодов, которая входит в состав БСП (Библиотеки стандартных подсистем).
При формировании табличного документа для печати, мы должны передать нашу строку в параметр типа Штрихкод и обязательно указать тип кода — DataMatrix. Рассмотрим ключевые моменты:
МенеджерОборудованияВызовСервера.ПолучитьКартинкуШтрихкода().Посмотрим на ситуацию со стороны безопасности. Хранение криптохвостов в открытом виде в базе данных технически не запрещено для внутреннего использования компании. Однако стоит учитывать следующие риски:
Подведем итог нашему исследованию. Для реализации задачи автора сообщения необходимо:
Таким образом, задача решается через небольшое расширение конфигурации, которое позволяет обойти стандартное ограничение 1С на хранение только идентификаторов продукции.