При интеграции систем учета 1С с государственной информационной системой маркировки товаров (ГИС МТ «Честный Знак») разработчики часто сталкиваются с типовой проблемой. При обычном запросе сведений о кодах маркировки система возвращает только усеченный код идентификации (КИ), состоящий из 31 символа (первые три группы данных: GTIN, серийный номер и ключ проверки). Однако для печати полноценной этикетки стандарта DataMatrix необходим полный код маркировки (КМ), содержащий четвертую группу символов — так называемый криптохвост (код проверки из 88 или 44 символов).
В этой статье мы подробно разберем архитектуру взаимодействия с Честным Знаком, выясним причины такого поведения системы, рассмотрим работу с API СУЗ (Станции управления заказами) и научимся извлекать полные коды маркировки как программно через HTTP-запросы, так и с помощью встроенных механизмов современных конфигураций 1С.
Для начала проанализируем архитектуру ГИС МТ. Система разделена на два независимых контура, каждый из которых имеет собственное API:
Важное ограничение: получить полный код с криптохвостом из СУЗ можно только один раз при его эмиссии. В системе Честный Знак действует строгое правило безопасности: скачать коды с криптохвостом повторно через API или личный кабинет можно только в течение 48 часов с момента их генерации. По истечении этого времени СУЗ безвозвратно удаляет криптохвосты из своего буфера. Если попытаться выгрузить коды позже, система отдаст файл, содержащий только усеченные КИ, из которых напечатать DataMatrix уже невозможно.
Если мы разрабатываем собственное решение или внешнюю обработку (например, для старых версий конфигураций вроде УТ 11.4 или самописных баз), нам необходимо напрямую обратиться к API СУЗ. Для получения массива кодов маркировки из созданного и утвержденного заказа используется метод GET /api/v2/{extension}/codes.
Разберем структуру этого HTTP-запроса подробнее. В параметре URL {extension} необходимо указать идентификатор товарной группы (например, shoes для обуви, clothes для легкой промышленности и т.д.).
Для выполнения запроса нам потребуются следующие параметры:
Рассмотрим пример программной реализации этого запроса на языке 1С:
&НаСервере
Функция ПолучитьКодыМаркировкиИзСУЗ(ПараметрыПодключения, ИДЗаказа, GTIN, Количество) Экспорт
Результат = Новый Массив;
// Формируем адрес ресурса
ШаблонРесурса = "/api/v2/%1/codes?omsId=%2&orderId=%3>in=%4&quantity=%5";
Ресурс = СтроковыеФункции.НСтрШаблон(ШаблонРесурса,
ПараметрыПодключения.ТоварнаяГруппа, // например, "shoes"
ПараметрыПодключения.OMSID,
ИДЗаказа,
GTIN,
Формат(Количество, "ЧГ=0")
);
// Создаем HTTP-соединение
НТТРСоединение = Новый HTTPСоединение(
ПараметрыПодключения.АдресСервераСУЗ,
ПараметрыПодключения.Порт,
,,,
Новый ЗащищенноеСоединениеOpenSSL()
);
// Настраиваем HTTP-запрос
Запрос = Новый HTTPЗапрос(Ресурс);
Запрос.Заголовки.Вставить("clientToken", ПараметрыПодключения.ТокенКлиента);
Запрос.Заголовки.Вставить("Accept", "application/json");
Попытка
Ответ = НТТРСоединение.Получить(Запрос);
Если Ответ.КодСостояния = 200 Тогда
// Читаем тело ответа (JSON)
ЧтениеJSON = Новый ЧтениеJSON;
ЧтениеJSON.УстановитьСтроку(Ответ.ПолучитьТелоКакСтроку());
ДанныеОтвета = ПрочитатьJSON(ЧтениеJSON);
ЧтениеJSON.Закрыть();
// Извлекаем массив кодов маркировки с криптохвостами
Если ДанныеОтвета.Свойство("codes") Тогда
Результат = ДанныеОтвета.codes; // Массив полных строк КМ
КонецЕсли;
Иначе
ВызватьИсключение "Ошибка СУЗ: " + Ответ.ПолучитьТелоКакСтроку();
КонецЕсли;
Исключение
ЗаписьЖурналаРегистрации("ИнтеграцияСУЗ", УровеньЖурналаРегистрации.Ошибка,,, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
ВызватьИсключение "Не удалось получить коды из СУЗ. Обратитесь к администратору.";
КонецПопытки;
Возврат Результат;
КонецФункции
В результате успешного выполнения этого метода мы получаем массив строк, каждая из которых представляет собой полный код маркировки со всеми группами данных и криптохвостом. Именно эти строки необходимо передавать в генератор штрихкода (компоненту печати) для формирования корректного двумерного кода DataMatrix GS1.
Если мы работаем в актуальной типовой конфигурации 1С (например, 1С:Управление торговлей, ред. 11.5, 1С:Розница или 1С:ERP), нам нет необходимости писать низкоуровневые HTTP-запросы вручную. Разработчики фирмы «1С» уже реализовали мощную подсистему интеграции с ИС МП.
Рассмотрим, где искать нужные функции. В конфигурации присутствует общий модуль ИнтерфейсСУЗ (или аналогичный специализированный модуль интеграции ИС МП). В нем объявлены готовые функции для взаимодействия со Станцией управления заказами.
Например, функция ЗапроситьКодыМаркировкиИзБизнесЗаказа_V2 берет на себя всю рутину по формированию заголовков, авторизации по токену и разбору JSON-структур. Нам достаточно передать в нее параметры подключения и идентификаторы заказа.
Посмотрим, как в типовых конфигурациях организовано хранение этих данных. Это критически важно для понимания логики работы системы:
РегистрСведений.ПулКодовМаркировкиСУЗ: именно здесь временно сохраняются полные коды маркировки вместе с криптохвостом сразу после их загрузки из Честного Знака. Данные в ресурсах этого регистра часто сжимаются или кодируются в формат Base64 для экономии места.ШтрихкодыУпаковокТоваров: сюда записывается только очищенный код идентификации (КИ) без криптохвоста. Он используется для складского учета, подбора в документы и проверок. Напечатать этикетку из него невозможно.Для того чтобы получить полный код из базы 1С для собственной печатной формы, мы должны обратиться запросом к регистру сведений ПулКодовМаркировкиСУЗ. Делать это нужно до того, как коды будут введены в оборот или отправлен отчет о нанесении.
Проанализируем пример запроса для получения полного кода маркировки из пула СУЗ по коду идентификации:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ПулКодов.КодМаркировки КАК ПолныйКодBase64
|ИЗ
| РегистрСведений.ПулКодовМаркировкиСУЗ КАК ПулКодов
|ГДЕ
| ПулКодов.КодИдентификации = &КодИдентификации";
Запрос.УстановитьПараметр("КодИдентификации", ИскомыйКИ);
РезультатЗапроса = Запрос.Выполнить();
Если Не РезультатЗапроса.Пустой() Тогда
Выборка = РезультатЗапроса.Выбрать();
Выборка.Следующий();
// Декодируем строку из формата Base64, если это требуется в вашей версии БСП
ДвоичныеДанныеКода = ПолучитьДвоичныеДанныеИзСтрокиВФорматеBase64(Выборка.ПолныйКодBase64);
ПолныйКодМаркировки = ПолучитьСтрокуИзДвоичныхДанных(ДвоичныеДанныеКода);
// Теперь ПолныйКодМаркировки содержит криптохвост и готов к печати
КонецЕсли;
По регламенту ЦРПТ (оператора маркировки), бессрочное хранение криптохвостов в локальных базах данных участников оборота не рекомендуется из соображений безопасности. В связи с этим в 1С реализованы механизмы автоматической очистки пула:
ПулКодовМаркировкиСУЗ сразу после успешной фиксации документов «Маркировка товаров ИС МП» или отправки «Отчета о нанесении».Практический совет для разработчиков (лайфхак): Если бизнес-процесс вашего предприятия (например, при импорте товаров) требует возможности повторной печати утерянных этикеток через продолжительное время, стандартное поведение системы можно изменить. Для этого создается расширение конфигурации, в котором переопределяется процедура очистки пула (например, метод ОчисткаПулаКодовМаркировкиПоОтчетуОНанесении в модуле менеджера соответствующего регистра). Блокируя очистку, вы сохраните криптохвосты в базе 1С навсегда, что позволит беспрепятственно перепечатывать этикетки в любой момент.
Если 48 часов с момента эмиссии в СУЗ прошли, а в базе 1С пул уже очистился, восстановить криптохвост из систем Честного Знака программным путем невозможно. В такой ситуации у вас есть только два выхода: