Как сохранить полные коды маркировки DataMatrix в 1С для их последующей печати?

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

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

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

Анализ проблемы: Почему код сохраняется не полностью?

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

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

Способ 1. Использование расширения для табличной части документа

Самый быстрый способ, предложенный в обсуждении, — это добавление строкового реквизита непосредственно в документ «Приобретение товаров и услуг» (ПТУ). Проанализируем этот путь шаг за шагом:

  1. Создадим расширение для вашей конфигурации.
  2. Добавим в расширение табличную часть документа (например, Товары или специализированную ТЧ для маркировки, в зависимости от версии конфигурации).
  3. Создадим новый реквизит ПолныйКодМаркировки с типом Строка (длина 150-200 символов, чтобы точно уместить весь код с запасом).
  4. На форму документа этот реквизит выводить не обязательно, чтобы не перегружать интерфейс пользователя.

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

Пример логики перехвата данных:


&После("ОбработатьСканированиеШтрихкода")
Процедура СохранитьПолныйКод(Штрихкод, ПараметрыСканирования)
    // Штрихкод — это и есть наша "сырая" строка с криптохвостом
    // Находим нужную строку в табличной части документа
    ТекущаяСтрока = Объект.Товары.НайтиСтроку(...); 
    Если ТекущаяСтрока <> Неопределено Тогда
        ТекущаяСтрока.ПолныйКодМаркировки = Штрихкод;
    КонецЕсли;
КонецПроцедуры

Важно: Этот метод прост, но имеет существенный минус. При большом товарообороте (тысячи позиций в одном документе) размер документа ПТУ сильно вырастет, что может привести к замедлению открытия формы и записи объекта.

Способ 2. Создание «Архива кодов» в отдельном регистре

Более профессиональный и архитектурно правильный подход — вынос хранения кодов в отдельный Регистр сведений. Это позволит не нагружать документы и организовать удобный поиск кода по GTIN и серийному номеру.

Разберем структуру такого регистра:

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

Программная реализация записи в регистр

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


// В расширении для модуля МенеджерОборудованияВызовСервера или 
// в модуле обработки проверки маркировки
&После("ЗафиксироватьРезультатПроверкиКода")
Процедура ЗаписатьВАрхивКодов(ДанныеКода, ДокументОснование)
    
    МенеджерЗаписи = РегистрыСведений.АрхивКодовМаркировки.СоздатьМенеджерЗаписи();
    МенеджерЗаписи.Номенклатура = ДанныеКода.Номенклатура;
    МенеджерЗаписи.СерийныйНомер = ДанныеКода.СерийныйНомер;
    
    // Получаем именно ту строку, которая пришла со сканера до парсинга
    МенеджерЗаписи.ПолныйКод = ДанныеКода.ИсходнаяСтрока; 
    МенеджерЗаписи.ДатаПолучения = ТекущаяДата();
    
    МенеджерЗаписи.Записать();
    
КонецПроцедуры

Как обеспечить корректную печать?

Проанализируем процесс генерации этикетки. Просто вывести сохраненную строку ПолныйКод в текстовое поле нельзя — принтер напечатает текст, а не квадратный код. Нам необходимо использовать компоненту печати штрихкодов, которая входит в состав БСП (Библиотеки стандартных подсистем).

При формировании табличного документа для печати, мы должны передать нашу строку в параметр типа Штрихкод и обязательно указать тип кода — DataMatrix. Рассмотрим ключевые моменты:

  1. Используйте функцию МенеджерОборудованияВызовСервера.ПолучитьКартинкуШтрихкода().
  2. Передавайте в нее сохраненную строку с криптохвостом.
  3. Убедитесь, что в параметрах печати не стоит «очистка» спецсимволов (GS1 разделителей), иначе код не будет валидным.

Риски и юридические нюансы

Посмотрим на ситуацию со стороны безопасности. Хранение криптохвостов в открытом виде в базе данных технически не запрещено для внутреннего использования компании. Однако стоит учитывать следующие риски:

Резюме

Подведем итог нашему исследованию. Для реализации задачи автора сообщения необходимо:

  1. Выбрать место хранения (лучше — отдельный регистр сведений).
  2. Найти в коде 1С точку входа, где данные штрихкода еще не очищены от криптохвоста (процедуры обработки сканирования в модулях маркировки).
  3. Реализовать запись «сырой» строки в хранилище.
  4. Разработать внешнюю печатную форму, которая будет брать данные не из стандартных реквизитов маркировки 1С, а из вашего нового хранилища.

Таким образом, задача решается через небольшое расширение конфигурации, которое позволяет обойти стандартное ограничение 1С на хранение только идентификаторов продукции.

← На главную