При работе с маркированной продукцией (вода, молоко, легпром и др.) программисты 1С часто сталкиваются с техническими сложностями при попытке записать или прочитать код маркировки напрямую. Основная проблема заключается в структуре самого кода DataMatrix GS1, который содержит непечатные управляющие символы, и в логике типовых конфигураций, которые экономят ресурсы базы данных. Разберем подробно, как устроено хранение в «1С:Розница 2.3» и как правильно передавать данные на кассовое оборудование.
Проанализируем структуру справочника ШтрихкодыУпаковокТоваров. Многие разработчики ожидают увидеть там полную строку кода, считанную сканером (вместе с криптохвостом), но на практике поле ЗначениеШтрихкода содержит лишь часть данных.
Важный нюанс: 1С не хранит полный код маркировки (с крипточастью) в этом справочнике на постоянной основе. Это связано с требованиями безопасности системы «Честный Знак» и особенностями архитектуры. В поле ЗначениеШтрихкода записывается так называемый «очищенный» или упрощенный состав кода:
Разделители групп данных (AI — Application Identifiers) и символы GS (ASCII 29) при сохранении в базу могут вырезаться или преобразовываться. Рассмотрим ситуацию: если вы попробуете записать код маркировки «как есть» в текстовое поле, платформа 1С может выдать ошибку сериализации или «встать на раскоряку», так как символ с кодом 29 является непечатным и не может быть корректно представлен в обычном XML-потоке без дополнительной обработки.
Символ Group Separator (GS) стоит в коде маркировки на 32-й позиции (для воды и молочки) или используется для разделения блоков данных в других типах маркировки. Выясним, почему запись этого символа напрямую — плохая идея.
Для передачи кодов маркировки между клиентом и сервером или при записи в БД, где требуется XML-сериализация, 1С использует кодирование Base64. Если вам необходимо сохранить «сырой» код со всеми спецсимволами, используйте функции преобразования. Посмотрим на пример кода для перевода строки в Base64:
// Пример получения Base64 из строки со спецсимволами
ДвоичныеДанныеКода = ПолучитьДвоичныеДанныеИзСтроки(ПолныйКодМаркировки, КодировкаТекста.UTF8);
СтрокаBase64 = Base64Строка(ДвоичныеДанныеКода);
Однако в типовой «Рознице» этот путь обычно не используется для справочника штрихкодов. Система предпочитает хранить идентификаторы, по которым можно однозначно найти марку, а полный код запрашивается у пользователя (сканированием) непосредственно в момент продажи. Для предварительного сопоставления считанных марок с товарами до реализации подойдёт обработка для сканирования и привязки марок к номенклатуре.
Когда товар добавляется в чек, кассовый модуль должен передать в драйвер ККТ информацию для формирования тега 1162 (или новых тегов для ФФД 1.2). Рассмотрим, как «1С:Розница» собирает эти данные из GTIN и серийного номера, если полной строки нет в базе.
Для этого в конфигурации предусмотрены специальные функции в общем модуле МенеджерОборудованияМаркировкаКлиентСервер. Одной из ключевых является СформироватьКодТовараДляDataMatrixGS1. Проанализируем её работу:
// Вызов функции формирования кода для передачи в драйвер
ДанныеКодаТовара = МенеджерОборудованияМаркировкаКлиентСервер.СформироватьКодТовараДляDataMatrixGS1(GTIN, СерийныйНомер);
// В результате мы получаем структуру, где:
// ДанныеКодаТовара.РеквизитКодаТовара - содержит значение в формате Base64
// ДанныеКодаТовара.РеквизитКодаТовараHEX - содержит значение в формате HEX
Этот метод программно «склеивает» идентификаторы применения (01 для GTIN и 21 для серийного номера) и упаковывает их в формат, понятный фискальному накопителю. Именно это значение (в Base64) уходит в XML-пакет драйвера кассы.
Разберем по шагам, как происходит запись данных в чек. В типовом механизме формирования XML для драйвера (метод ЗаписатьДанныеКодаТоварнойНоменклатуры) система проверяет версию ФФД и ревизию интерфейса драйвера. Если используется современный драйвер (версия 3.2 и выше), данные передаются следующим образом:
// Фрагмент формирования XML для ККТ
ЗаписьXML.ЗаписатьНачалоЭлемента("GoodCodeData");
ЗаписьXML.ЗаписатьАтрибут("MarkingCode", XMLСтрока(РеквизитКодаТовара));
ЗаписьXML.ЗаписатьКонецЭлемента();
Здесь MarkingCode — это та самая строка Base64, которую мы получили ранее. Обратите внимание, что для ФФД 1.05 и 1.1 этого достаточно. Однако для ФФД 1.2 ситуация сложнее: касса должна выполнить проверку кода через ФН-М, и для этого ей требуется полный код, включая криптохвост. Именно поэтому в новых версиях «1С:Розница» при пробитии чека система часто просит сканировать марку повторно, если она не была сохранена во временном кэше документа.
Если вы реализовали свою запись кодов, но проверка средствами 1С или ЦРПТ выдает ошибку, проанализируем возможные причины:
ШтрихкодыУпаковокТоваров есть поле ХешСуммаЗначенияШтрихкода. 1С использует MD5-хеш для быстрого поиска марки. Если вы программно добавляете запись, но не рассчитываете хеш, система «не увидит» марку при сканировании.Символ(29). Помним, что визуально в отладчике он может не отображаться или выглядеть как пустой квадрат.Если перед вами стоит задача автоматизированной загрузки марок (например, из внешнего файла), следуйте алгоритму, который использует типовая конфигурация:
1. Парсинг: Сначала разберите входящую строку на составляющие (GTIN, Серия, Криптохвост). Для этого используйте метод МенеджерОборудованияМаркировкаКлиентСервер.РазобратьШтриховойКодТовара().
2. Хранение: Записывайте в справочник ШтрихкодыУпаковокТоваров только значимые части. Если вам крайне необходимо хранить полную строку для онлайн-продаж, создайте дополнительный реквизит с типом Строка (неограниченной длины) и сохраняйте туда данные, предварительно обернув их в Base64Строка.
3. Поиск: Всегда ищите существующие марки по хеш-сумме, а не прямым сравнением строк. Это гарантирует стабильную работу при наличии спецсимволов.
Таким образом, «1С:Розница 2.3» придерживается стратегии «минимально достаточного хранения». Система хранит ключи (GTIN + Серия), а всю тяжелую работу по формированию пакетов для ОФД и Честного Знака берет на себя программный код общих модулей в момент совершения операции. При необходимости первичного заполнения товаров и GTIN можно воспользоваться внешней обработкой для загрузки номенклатуры из выгрузки Честного знака.