При работе с маркируемой продукцией в 1С:УНФ 3.0 разработчики часто сталкиваются с задачей вывода полных кодов маркировки (КИЗ) в кастомизированные печатные формы. Проблема заключается в том, что в стандартных табличных частях документов, таких как Расходная накладная, полные коды с криптохвостами (группы 91 и 92) обычно не отображаются. Вместо этого в табличной части ШтрихкодыУпаковок хранится лишь идентификационная часть (GTIN + серийный номер), например: (01)04603744326014(21)5O3dLBfJaDIZ8.
В этой статье мы подробно разберем, где именно система скрывает полные данные, как их извлечь программно и что делать, если кода нет в стандартных регистрах.
Прежде всего, проанализируем ситуацию с точки зрения логики подсистемы ИС МП (Честный ЗНАК). В 1С существует два принципиально разных сценария появления кодов в базе:
Рассмотрим подробнее первый случай. Когда 1С заказывает коды, она сохраняет их в специализированных служебных регистрах. Основным местом хранения является регистр сведений ПулКодовМаркировкиСУЗ. Именно здесь данные хранятся в максимально полном виде, но в зашифрованном (бинарном) формате Base64.
Важно понимать: согласно регламентам ЦРПТ, длительное хранение криптохвостов пользователем не приветствуется, поэтому 1С может очищать эти данные после того, как код был успешно нанесен и введен в оборот. Однако для целей печати в момент отгрузки эти данные зачастую еще доступны.
Выясним, как программно добраться до этих данных. Для этого нам понадобится связать штрихкоды из документа Расходная накладная с записями в регистре. Посмотрим на пример запроса, который позволяет выгрузить таблицу соответствий:
Функция ПолучитьТаблицуШтрихкодов(Ссылка)
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ШтрихкодыУпаковок.ШтрихкодУпаковки КАК ШтрихкодУпаковки
|ПОМЕСТИТЬ ВТ_ШтрихкодыУпаковок
|ИЗ
| Документ.РасходнаяНакладная.ШтрихкодыУпаковок КАК ШтрихкодыУпаковок
|ГДЕ
| ШтрихкодыУпаковок.Ссылка = &Ссылка
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| ПулКодовМаркировкиСУЗ.КодМаркировки КАК КодМаркировки,
| ПулКодовМаркировкиСУЗ.GTIN КАК GTIN,
| ПулКодовМаркировкиСУЗ.ПолныйКодМаркировки КАК ПолныйКодМаркировкиbase64
|ИЗ
| РегистрСведений.ПулКодовМаркировкиСУЗ КАК ПулКодовМаркировкиСУЗ
|ГДЕ
| ПулКодовМаркировкиСУЗ.КодМаркировки В
| (ВЫБРАТЬ
| ВТ_ШтрихкодыУпаковок.ШтрихкодУпаковки.ЗначениеШтрихкода
| ИЗ
| ВТ_ШтрихкодыУпаковок КАК ВТ_ШтрихкодыУпаковок)";
Запрос.УстановитьПараметр("Ссылка", Ссылка);
Возврат Запрос.Выполнить().Выгрузить();
КонецФункции
В результате выполнения этого запроса в колонке ПолныйКодМаркировкиbase64 мы получим строку в формате Base64, содержащую искомую информацию с криптохвостом.
Проанализируем ситуацию далее. Полученная строка Base64 — это еще не готовый код для печати. Нам нужно преобразовать ее в обычную строку и корректно обработать спецсимволы. В кодах DataMatrix для разделения групп данных используется невидимый символ GS (Group Separator), имеющий ASCII-код 29.
Рассмотрим пример обработки полученной строки на сервере:
// Предположим, мы итерируем таблицу результатов запроса
Для Каждого Стр Из ТаблицаКодов Цикл
// Декодируем из Base64 в обычную строку
КИЗ_с_Криптохвостом = ПреобразоватьBase64ВСтроку(Стр.ПолныйКодМаркировкиbase64);
// В некоторых случаях 1С хранит разделители в своем внутреннем формате.
// Если вы планируете передавать строку в компоненту печати штрихкодов,
// убедитесь, что спецсимвол GS (ASCII 29) присутствует на нужных позициях.
// Часто используется функция из БПО:
КИЗ_с_Криптохвостом = СтрЗаменить(КИЗ_с_Криптохвостом,
ОбщегоНазначенияБПОКлиентСервер.РазделительGS1(),
Символ(29));
КонецЦикла;
Важный момент: если вы используете стандартную компоненту 1С:Печать штрихкодов, она умеет корректно интерпретировать строку как DataMatrix, если в настройках указать правильный тип кода. Однако без наличия криптохвоста в этой строке приложение «Честный ЗНАК» не признает такой код валидным при сканировании с бумажного носителя.
Разберем случай, когда вы сканируете товар, полученный от стороннего поставщика. В этом случае в регистре ПулКодовМаркировкиСУЗ записи не будет, так как ваша база не является инициатором эмиссии. При обычном сканировании в документ 1С «отрезает» криптохвост, оставляя только (01) + GTIN + (21) + Серийный номер.
Если вам критически важно сохранять полные коды для последующего вывода в свои печатные формы, придется прибегнуть к доработке конфигурации:
ШтрихкодыУпаковок (через расширение).до того, как стандартные механизмы БИГС (Библиотеки интеграции с госсистемами) преобразуют ее в ссылку на справочник и очистят хвост.Посмотрим, как это может выглядеть схематично:
// В модуле формы документа при обработке оповещения от сканера
Процедура ОбработатьШтрихкод(ДанныеШтрихкода)
// ДанныеШтрихкода.Штрихкод содержит полную строку с криптохвостом
ПолныйКод = ДанныеШтрихкода.Штрихкод;
// Записываем в свой регистр или доп. реквизит ТЧ
// ... логика сохранения ...
// Вызываем стандартную процедуру обработки маркировки
ИнтеграцияИСМП.ОбработатьСканирование(ЭтотОбъект, ДанныеШтрихкода);
КонецПроцедуры
Когда вы успешно извлекли или сохранили полный код, остается вопрос его визуализации. Рассмотрим основные правила:
1С:Печать штрихкодов. Она гарантирует соблюдение стандарта ECC200.DataMatrix и формат данных соответствует GS1.(01) в коде может отсутствовать, а вместо него в начале строки данных идет управляющий символ. Приложение «Честный ЗНАК» очень чувствительно к корректности этих разделителей.Таким образом, мы выяснили, что 1С:УНФ 3.0 хранит полные коды только для собственного производства в регистре ПулКодовМаркировкиСУЗ. Для всех остальных случаев требуется либо интеграция с ЭДО (где криптохвосты могут передаваться в составе пакета данных, но также редко сохраняются в БД), либо разработка собственного механизма логирования входящих данных от сканера.