Рассмотрим достаточно распространенную и сложную задачу, с которой сталкиваются программисты 1С при поддержке устаревших конфигураций. Суть проблемы заключается в следующем: имеется система на базе «Альфа-Авто» редакции 4.1 и кассовый аппарат АТОЛ (например, АТОЛ 55Ф). Данная редакция конфигурации умеет работать только с драйверами торгового оборудования 8-й версии (ДТО 8). Обновлений под актуальный ДТО 10 разработчиком не предусмотрено.
При попытке пробить маркированные шины (или другие товары, подлежащие обязательной маркировке, такие как обувь, одежда, парфюмерия), система должна передать данные в онлайн-кассу. Программисты часто пытаются передать тег 1162 напрямую в устройство через метод WriteAttribute, предварительно переведя код маркировки (GTIN и серийный номер) в 16-ричный формат. Однако при выполнении команды возникает ошибка -3895 (Неверная длина).
Давайте проанализируем ситуацию и выясним причину, по которой старый код отказывается работать. Посмотрим на пример кода, который часто пытаются использовать для решения этой задачи в ДТО 8:
Устройство.BeginItem;
Устройство.ItemType=1;
Если ЗначениеЗаполнено(ТипМаркировки) И ТипМаркировки <> -1 Тогда
ДанныеМарки = Новый Структура;
ДанныеМарки.Вставить("ГТИН",GTINМаркировки);
ДанныеМарки.Вставить("СЕРИЯ",СерийныйНомерМаркировки);
СтрокаМаркировки = ПолучитьКодДляПередачиТега1162_010320(ДанныеМарки);
Устройство.StreamFormat = 5;
Устройство.AttrNumber = 1162;
Устройство.AttrValue = СокрЛП(СтрокаМаркировки);
Устройство.WriteAttribute; // Здесь возникает ошибка -3895
КонецЕсли;
Устройство.Name = стрНаименование;
Устройство.Price = Цена;
Устройство.Quantity = Количество;
Устройство.Department = Отдел;
Устройство.Summ = Сумма;
Устройство.TaxTypeNumber = НомерНалога;
Устройство.EndItem;
На первый взгляд, переменная СтрокаМаркировки формируется верно (в 16-ричном формате). Однако ошибка -3895 напрямую связана с переходом кассовых аппаратов на Формат Фискальных Документов (ФФД) 1.2.
В старых форматах (ФФД 1.05 и 1.1) действительно использовался тег 1162, в который можно было передать HEX-строку. Но в актуальном ФФД 1.2 логика работы кардинально изменилась: на смену пришел тег 1163. Оборудование стало строго проверять длину и формат передаваемого кода. ДТО 8 официально снят с поддержки и технически несовместим с ФФД 1.2. Он просто не умеет корректно обрабатывать полный код DataMatrix с криптохвостом, а в самом драйвере отсутствуют API-методы для локальной и онлайн-проверки валидности кода в системе «Честный ЗНАК» через ФН-М до момента пробития чека. Таким образом, любые попытки прямой записи тега через устаревший драйвер будут отклоняться прошивкой кассы.
Чтобы пробитие чеков с маркировкой работало без ошибок, разберем по шагам, что необходимо сделать.
Рассмотрим подробнее процесс переноса подсистемы маркировки. Вам не обязательно переносить абсолютно все документы. Достаточно адаптировать маркировку в следующих объектах:
ПоступлениеТоваровРеализацияТоваровЧекККМ (и фронт кассира)ЗаказНаряд (если маркировка учитывается при перемещении товаров в производство)Документы типа «Ввод в оборот кодов маркировки» или «Заказ кодов маркировки» можно не переносить, если вы не являетесь производителем, а занимаетесь только розничной продажей. Учет поступлений кодов (УПД) целесообразно вести через системы ЭДО (например, СБИС), а в 1С заносить уже подтвержденные документы с последующим сканированием марок при продаже.
Если же вы все-таки решили перенести документы ввода в оборот, вы можете столкнуться с тем, что их процедуры зашиты в защищенные модули. Посмотрим на пример того, как можно обойти проверку защищенных функций для таких документов:
// Функция помещается в общий модуль ЗфЗащищенныеФункции
Функция зфФормаДокументаПриОткрытии(ЭтаФорма, ПовторноеОткрытие = Ложь) Экспорт
ОбработкаЗащиты = Неопределено;
Если Не зфПроверкаЗащиты(ОбработкаЗащиты) Тогда
Возврат Ложь;
КонецЕсли;
пЭтаФорма = ЭтаФорма;
пПовторноеОткрытие = ПовторноеОткрытие;
Если ТипЗНЧ(ЭтаФорма.Ссылка) = Тип("ДокументСсылка.ЗаказКодовМаркировки") Тогда
Рез = Истина;
ИначеЕсли ТипЗНЧ(ЭтаФорма.Ссылка) = Тип("ДокументСсылка.ВводВОборотКодовМаркировки") Тогда
Рез = Истина;
Иначе
Рез = ОбработкаЗащиты.Компонента.дкФормаПриОткрытии(пЭтаФорма, пПовторноеОткрытие);
КонецЕсли;
ЭтаФорма.Модифицированность = Ложь;
Возврат Рез;
КонецФункции
Важное замечание: При таком обходе вам придется самостоятельно дописывать логику заполнения реквизитов по умолчанию (Организация, Подразделение, Автор и т.д.), так как штатный защищенный модуль перестанет их инициализировать.
Подведем итоги. Пытаться передать данные маркировки через устаревший ДТО 8 в современных реалиях бессмысленно — касса вернет ошибку из-за несоответствия формату ФФД 1.2. Оптимальным решением является использование внешних решений для интеграции ДТО 10 в устаревшую «Альфа-Авто 4» и аккуратный перенос алгоритмов работы с DataMatrix из 5-й редакции. В новом алгоритме (через ДТО 10) касса требует передачи сырого кода DataMatrix, самостоятельно проверяет его через ФН-М и ОФД, и только после успешной валидации пробивает чек по всем правилам закона.