При работе с маркируемыми товарами в 1С:Управление нашей фирмой (УНФ) 3.0 часто возникает задача создания кастомизированной печатной формы, в которую необходимо вывести не просто серийный номер изделия, а полный код маркировки (КИЗ) вместе с «криптохвостом». Стандартно в табличных частях документов, таких как Расходная накладная, в справочнике ШтрихкодыУпаковок данные хранятся в усеченном виде: (01)GTIN(21)СерийныйНомер. Этого достаточно для электронного документооборота (ЭДО), но недостаточно для повторной печати валидного DataMatrix-кода.
В данной статье мы разберем, где именно система скрывает полные данные маркировки, как их извлечь программно и как правильно сформировать изображение штрихкода, чтобы оно успешно считывалось мобильным приложением «Честный знак».
Для начала проанализируем структуру хранения данных. Если ваша организация является импортером или производителем, то коды маркировки эмитируются (заказываются) непосредственно из вашей базы 1С через СУЗ (Станцию управления заказами), что требует обновления токенов Честного Знака. В этом случае полные коды с криптохвостами сохраняются в специализированном регистре.
Основным местом хранения является Регистр сведений «Пул кодов маркировки СУЗ». Именно здесь 1С осуществляет сохранение полных кодов маркировки и хранит соответствие между коротким кодом (который мы видим в документах) и полной строкой, полученной от ГИС МТ.
Важный нюанс: По умолчанию система может очищать этот регистр после ввода кодов в оборот или печати этикеток для экономии места. Однако в большинстве случаев данные остаются там до момента окончательной реализации или архивации. Если вы просто сканируете «чужие» коды (как оптовик), ситуация сложнее: криптохвосты могут не сохраняться в базе на постоянной основе, так как они не требуются для передачи по ЭДО.
Рассмотрим ситуацию, когда нам нужно получить полные коды для товаров, указанных в документе Расходная накладная. Нам необходимо сопоставить значения из табличной части ШтрихкодыУпаковок документа с данными регистра ПулКодовМаркировкиСУЗ.
Проанализируем пример запроса, который позволяет собрать необходимые данные:
Функция ПолучитьТаблицуКИЗов(СсылкаНаДокумент)
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ДокШтрихкоды.ШтрихкодУпаковки КАК ШтрихкодУпаковки
|ПОМЕСТИТЬ ВТ_ШтрихкодыДокумента
|ИЗ
| Документ.РасходнаяНакладная.ШтрихкодыУпаковок КАК ДокШтрихкоды
|ГДЕ
| ДокШтрихкоды.Ссылка = &Ссылка
|;
|
|ВЫБРАТЬ
| ПулСУЗ.КодМаркировки КАК КодМаркировки,
| ПулСУЗ.GTIN КАК GTIN,
| ПулСУЗ.ПолныйКодМаркировки КАК ПолныйКодМаркировкиBase64
|ИЗ
| РегистрСведений.ПулКодовМаркировкиСУЗ КАК ПулСУЗ
|ГДЕ
| ПулСУЗ.КодМаркировки В
| (ВЫБРАТЬ
| ВТ.ШтрихкодУпаковки.ЗначениеШтрихкода
| ИЗ
| ВТ_ШтрихкодыДокумента КАК ВТ)";
Запрос.УстановитьПараметр("Ссылка", СсылкаНаДокумент);
Возврат Запрос.Выполнить().Выгрузить();
КонецФункции
Обратите внимание: в поле ПолныйКодМаркировки данные хранятся в формате Base64. Это сделано для того, чтобы избежать проблем с хранением спецсимволов (таких как разделитель GS1), которые могут некорректно обрабатываться XML-парсерами или текстовыми полями.
После того как мы получили таблицу с данными, нам нужно преобразовать Base64 в обычную строку. Выясним, как это сделать правильно, используя встроенные механизмы платформы 1С.
Функция ПреобразоватьBase64ВСтроку(СтрокаBase64) Экспорт
// Получаем двоичные данные из строки Base64
ДвоичныеДанные = ПолучитьДвоичныеДанныеИзBase64Строки(СтрокаBase64);
// Преобразуем двоичные данные в строку UTF-8
Результат = ПолучитьСтрокуИзДвоичныхДанных(ДвоичныеДанные, КодировкаТекста.UTF8);
Возврат Результат;
КонецФункции
Совет: В старых версиях БСП или при специфических настройках кодировки иногда используют временные файлы для записи двоичных данных и последующего чтения через ТекстовыйДокумент, но современные методы ПолучитьСтрокуИзДвоичныхДанных работают быстрее и надежнее.
Полный код маркировки содержит служебные символы. Важнейшим из них является разделитель GS1 (Group Separator, ASCII 29). При печати через стандартную компоненту 1С важно понимать, в каком виде она принимает данные.
Рассмотрим алгоритм подготовки строки и вывода в макет печатной формы:
// Пример подготовки данных для вывода
ПолныйКод = ПреобразоватьBase64ВСтроку(СтрокаИзПула.ПолныйКодМаркировкиBase64);
// Для отображения текста без "кракозябр" разделителей
ТекстДляПечати = СтрЗаменить(ПолныйКод, Символ(29), "");
// Настройка параметров штрихкода
ПараметрыШтрихкода = Новый Структура;
ПараметрыШтрихкода.Вставить("Ширина", 200);
ПараметрыШтрихкода.Вставить("Высота", 200);
ПараметрыШтрихкода.Вставить("ТипКода", 24); // Тип 24 соответствует GS1 DataMatrix
ПараметрыШтрихкода.Вставить("Штрихкод", ПолныйКод);
ПараметрыШтрихкода.Вставить("ОтображатьТекст", Ложь);
// Генерация изображения через стандартную компоненту БПО
РезультатГенерации = ГенерацияШтрихкода.ИзображениеШтрихкода(ПараметрыШтрихкода);
Если РезультатГенерации.Картинка <> Неопределено Тогда
ОбластьМакета.Рисунки.DMatrix.Картинка = РезультатГенерации.Картинка;
КонецЕсли;
Многие разработчики совершают ошибку, передавая в генератор только «короткий» код. В этом случае приложение «Честный знак» при сканировании выдаст ошибку или не найдет информацию о криптографической проверке кода. Использование ТипКода = 24 сообщает компоненте 1С:Печать штрихкодов, что необходимо применить стандарт GS1, автоматически вставив префикс FNC1, что делает марку легитимной.
Проанализировав ситуацию, мы пришли к следующим выводам:
РегистреСведений.ПулКодовМаркировкиСУЗ.Base64 в строку, сохраняя символ GS1 (ASCII 29) для генератора.24 (DataMatrix GS1) в параметрах генерации.Соблюдение этих шагов позволит вам создавать профессиональные формы этикеток и сопроводительных документов, полностью соответствующих требованиям законодательства по маркировке товаров.