Где хранятся КИЗы с криптохвостами в 1С:УНФ 3.0 и как вывести их в печатную форму?

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

При работе с маркируемыми товарами в 1С:Управление нашей фирмой (УНФ) 3.0 часто возникает задача создания кастомизированной печатной формы, в которую необходимо вывести не просто серийный номер изделия, а полный код маркировки (КИЗ) вместе с «криптохвостом». Стандартно в табличных частях документов, таких как Расходная накладная, в справочнике ШтрихкодыУпаковок данные хранятся в усеченном виде: (01)GTIN(21)СерийныйНомер. Этого достаточно для электронного документооборота (ЭДО), но недостаточно для повторной печати валидного DataMatrix-кода.

В данной статье мы разберем, где именно система скрывает полные данные маркировки, как их извлечь программно и как правильно сформировать изображение штрихкода, чтобы оно успешно считывалось мобильным приложением «Честный знак».

Где искать полные коды маркировки?

Для начала проанализируем структуру хранения данных. Если ваша организация является импортером или производителем, то коды маркировки эмитируются (заказываются) непосредственно из вашей базы 1С через СУЗ (Станцию управления заказами), что требует обновления токенов Честного Знака. В этом случае полные коды с криптохвостами сохраняются в специализированном регистре.

Основным местом хранения является Регистр сведений «Пул кодов маркировки СУЗ». Именно здесь 1С осуществляет сохранение полных кодов маркировки и хранит соответствие между коротким кодом (который мы видим в документах) и полной строкой, полученной от ГИС МТ.

Важный нюанс: По умолчанию система может очищать этот регистр после ввода кодов в оборот или печати этикеток для экономии места. Однако в большинстве случаев данные остаются там до момента окончательной реализации или архивации. Если вы просто сканируете «чужие» коды (как оптовик), ситуация сложнее: криптохвосты могут не сохраняться в базе на постоянной основе, так как они не требуются для передачи по ЭДО.

Шаг 1: Извлечение данных из регистра

Рассмотрим ситуацию, когда нам нужно получить полные коды для товаров, указанных в документе Расходная накладная. Нам необходимо сопоставить значения из табличной части ШтрихкодыУпаковок документа с данными регистра ПулКодовМаркировкиСУЗ.

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


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

Обратите внимание: в поле ПолныйКодМаркировки данные хранятся в формате Base64. Это сделано для того, чтобы избежать проблем с хранением спецсимволов (таких как разделитель GS1), которые могут некорректно обрабатываться XML-парсерами или текстовыми полями.

Шаг 2: Декодирование кода из Base64

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


Функция ПреобразоватьBase64ВСтроку(СтрокаBase64) Экспорт
    
    // Получаем двоичные данные из строки Base64
    ДвоичныеДанные = ПолучитьДвоичныеДанныеИзBase64Строки(СтрокаBase64);
    
    // Преобразуем двоичные данные в строку UTF-8
    Результат = ПолучитьСтрокуИзДвоичныхДанных(ДвоичныеДанные, КодировкаТекста.UTF8);
    
    Возврат Результат;
    
КонецФункции

Совет: В старых версиях БСП или при специфических настройках кодировки иногда используют временные файлы для записи двоичных данных и последующего чтения через ТекстовыйДокумент, но современные методы ПолучитьСтрокуИзДвоичныхДанных работают быстрее и надежнее.

Шаг 3: Подготовка строки для генератора штрихкодов

Полный код маркировки содержит служебные символы. Важнейшим из них является разделитель GS1 (Group Separator, ASCII 29). При печати через стандартную компоненту 1С важно понимать, в каком виде она принимает данные.

Рассмотрим алгоритм подготовки строки и вывода в макет печатной формы:

  1. Получаем исходную строку с криптохвостом.
  2. Если нужно вывести текстовое представление под кодом (для визуальной проверки), очищаем строку от спецсимволов.
  3. Для генерации самой картинки используем исходную строку с разделителями.

// Пример подготовки данных для вывода
ПолныйКод = ПреобразоватьBase64ВСтроку(СтрокаИзПула.ПолныйКодМаркировкиBase64);

// Для отображения текста без "кракозябр" разделителей
ТекстДляПечати = СтрЗаменить(ПолныйКод, Символ(29), ""); 

// Настройка параметров штрихкода
ПараметрыШтрихкода = Новый Структура;
ПараметрыШтрихкода.Вставить("Ширина", 200);
ПараметрыШтрихкода.Вставить("Высота", 200);
ПараметрыШтрихкода.Вставить("ТипКода", 24); // Тип 24 соответствует GS1 DataMatrix
ПараметрыШтрихкода.Вставить("Штрихкод", ПолныйКод);
ПараметрыШтрихкода.Вставить("ОтображатьТекст", Ложь);

// Генерация изображения через стандартную компоненту БПО
РезультатГенерации = ГенерацияШтрихкода.ИзображениеШтрихкода(ПараметрыШтрихкода);

Если РезультатГенерации.Картинка <> Неопределено Тогда
    ОбластьМакета.Рисунки.DMatrix.Картинка = РезультатГенерации.Картинка;
КонецЕсли;

Почему это важно?

Многие разработчики совершают ошибку, передавая в генератор только «короткий» код. В этом случае приложение «Честный знак» при сканировании выдаст ошибку или не найдет информацию о криптографической проверке кода. Использование ТипКода = 24 сообщает компоненте 1С:Печать штрихкодов, что необходимо применить стандарт GS1, автоматически вставив префикс FNC1, что делает марку легитимной.

Резюме для практического применения

Проанализировав ситуацию, мы пришли к следующим выводам:

Соблюдение этих шагов позволит вам создавать профессиональные формы этикеток и сопроводительных документов, полностью соответствующих требованиям законодательства по маркировке товаров.

← На главную