Где в 1С:УНФ 3.0 найти полные коды маркировки с криптохвостами для печатных форм?

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

При работе с маркируемой продукцией в 1С:УНФ 3.0 разработчики часто сталкиваются с задачей вывода полных кодов маркировки (КИЗ) в кастомизированные печатные формы. Проблема заключается в том, что в стандартных табличных частях документов, таких как Расходная накладная, полные коды с криптохвостами (группы 91 и 92) обычно не отображаются. Вместо этого в табличной части ШтрихкодыУпаковок хранится лишь идентификационная часть (GTIN + серийный номер), например: (01)04603744326014(21)5O3dLBfJaDIZ8.

В этой статье мы подробно разберем, где именно система скрывает полные данные, как их извлечь программно и что делать, если кода нет в стандартных регистрах.

Архитектура хранения кодов маркировки в 1С

Прежде всего, проанализируем ситуацию с точки зрения логики подсистемы ИС МП (Честный ЗНАК). В 1С существует два принципиально разных сценария появления кодов в базе:

  1. Коды эмитированы вами: Если вы сами заказывали коды через СУЗ (Станцию управления заказами) непосредственно из этой базы 1С.
  2. Коды получены от поставщика: Если товар пришел по ЭДО или был просто отсканирован в документ.

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

Важно понимать: согласно регламентам ЦРПТ, длительное хранение криптохвостов пользователем не приветствуется, поэтому 1С может очищать эти данные после того, как код был успешно нанесен и введен в оборот. Однако для целей печати в момент отгрузки эти данные зачастую еще доступны.

Извлечение кодов из регистра «Пул кодов маркировки СУЗ»

Выясним, как программно добраться до этих данных. Для этого нам понадобится связать штрихкоды из документа Расходная накладная с записями в регистре. Посмотрим на пример запроса, который позволяет выгрузить таблицу соответствий:


Функция ПолучитьТаблицуШтрихкодов(Ссылка)
    Запрос = Новый Запрос;
    Запрос.Текст = 
    "ВЫБРАТЬ
    |	ШтрихкодыУпаковок.ШтрихкодУпаковки КАК ШтрихкодУпаковки
    |ПОМЕСТИТЬ ВТ_ШтрихкодыУпаковок
    |ИЗ
    |	Документ.РасходнаяНакладная.ШтрихкодыУпаковок КАК ШтрихкодыУпаковок
    |ГДЕ
    |	ШтрихкодыУпаковок.Ссылка = &Ссылка
    |;
    |
    |////////////////////////////////////////////////////////////////////////////////
    |ВЫБРАТЬ
    |	ПулКодовМаркировкиСУЗ.КодМаркировки КАК КодМаркировки,
    |	ПулКодовМаркировкиСУЗ.GTIN КАК GTIN,
    |	ПулКодовМаркировкиСУЗ.ПолныйКодМаркировки КАК ПолныйКодМаркировкиbase64
    |ИЗ
    |	РегистрСведений.ПулКодовМаркировкиСУЗ КАК ПулКодовМаркировкиСУЗ
    |ГДЕ
    |	ПулКодовМаркировкиСУЗ.КодМаркировки В
    |			(ВЫБРАТЬ
    |				ВТ_ШтрихкодыУпаковок.ШтрихкодУпаковки.ЗначениеШтрихкода
    |			ИЗ
    |				ВТ_ШтрихкодыУпаковок КАК ВТ_ШтрихкодыУпаковок)";
    
    Запрос.УстановитьПараметр("Ссылка", Ссылка);
    Возврат Запрос.Выполнить().Выгрузить();
КонецФункции

В результате выполнения этого запроса в колонке ПолныйКодМаркировкиbase64 мы получим строку в формате Base64, содержащую искомую информацию с криптохвостом.

Декодирование данных и обработка GS1-разделителей

Проанализируем ситуацию далее. Полученная строка Base64 — это еще не готовый код для печати. Нам нужно преобразовать ее в обычную строку и корректно обработать спецсимволы. В кодах DataMatrix для разделения групп данных используется невидимый символ GS (Group Separator), имеющий ASCII-код 29.

Рассмотрим пример обработки полученной строки на сервере:


// Предположим, мы итерируем таблицу результатов запроса
Для Каждого Стр Из ТаблицаКодов Цикл
    // Декодируем из Base64 в обычную строку
    КИЗ_с_Криптохвостом = ПреобразоватьBase64ВСтроку(Стр.ПолныйКодМаркировкиbase64);
    
    // В некоторых случаях 1С хранит разделители в своем внутреннем формате.
    // Если вы планируете передавать строку в компоненту печати штрихкодов, 
    // убедитесь, что спецсимвол GS (ASCII 29) присутствует на нужных позициях.
    // Часто используется функция из БПО:
    КИЗ_с_Криптохвостом = СтрЗаменить(КИЗ_с_Криптохвостом, 
                                     ОбщегоНазначенияБПОКлиентСервер.РазделительGS1(), 
                                     Символ(29));
КонецЦикла;

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

Что делать, если кода нет в «Пуле кодов маркировки»?

Разберем случай, когда вы сканируете товар, полученный от стороннего поставщика. В этом случае в регистре ПулКодовМаркировкиСУЗ записи не будет, так как ваша база не является инициатором эмиссии. При обычном сканировании в документ 1С «отрезает» криптохвост, оставляя только (01) + GTIN + (21) + Серийный номер.

Если вам критически важно сохранять полные коды для последующего вывода в свои печатные формы, придется прибегнуть к доработке конфигурации:

  1. Перехват события сканирования: Необходимо модифицировать обработку внешнего события от сканера в форме документа. В момент сканирования в переменную попадает полная «сырая» строка прямо из порта сканера.
  2. Создание собственного хранилища: Создайте дополнительный регистр сведений или добавьте текстовый реквизит неограниченной длины в табличную часть ШтрихкодыУпаковок (через расширение).
  3. Запись «первозданного» вида: Записывайте полную строку до того, как стандартные механизмы БИГС (Библиотеки интеграции с госсистемами) преобразуют ее в ссылку на справочник и очистят хвост.

Посмотрим, как это может выглядеть схематично:


// В модуле формы документа при обработке оповещения от сканера
Процедура ОбработатьШтрихкод(ДанныеШтрихкода)
    // ДанныеШтрихкода.Штрихкод содержит полную строку с криптохвостом
    ПолныйКод = ДанныеШтрихкода.Штрихкод;
    
    // Записываем в свой регистр или доп. реквизит ТЧ
    // ... логика сохранения ...
    
    // Вызываем стандартную процедуру обработки маркировки
    ИнтеграцияИСМП.ОбработатьСканирование(ЭтотОбъект, ДанныеШтрихкода);
КонецПроцедуры

Рекомендации по выводу в макет печатной формы

Когда вы успешно извлекли или сохранили полный код, остается вопрос его визуализации. Рассмотрим основные правила:

Таким образом, мы выяснили, что 1С:УНФ 3.0 хранит полные коды только для собственного производства в регистре ПулКодовМаркировкиСУЗ. Для всех остальных случаев требуется либо интеграция с ЭДО (где криптохвосты могут передаваться в составе пакета данных, но также редко сохраняются в БД), либо разработка собственного механизма логирования входящих данных от сканера.

← На главную