Как реализовать пробитие чеков с маркировкой и символом [М] на ККТ Штрих-М в 1С

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

При внедрении маркировки товаров (обувь, одежда, табак и др.) в старых или сильно кастомизированных конфигурациях 1С, таких как «Розница 2.2», программисты часто сталкиваются с проблемой: данные маркировки передаются в драйвер ККТ, но в печатной форме чека отсутствует заветный символ [М], а в личном кабинете ОФД не отображаются теги маркировки (например, тег 1162). Рассмотрим подробно, как решить эту проблему, проанализируем структуру передаваемых данных и выясним основную причину сбоя.

Разбор основной причины: версии интерфейса драйвера

Главная причина, по которой ККТ «игнорирует» переданные данные о маркировке, часто кроется не в коде прошивки или ошибке в XML, а в использовании устаревшего программного интерфейса взаимодействия между 1С и драйвером. В системе 1С за подключение оборудования отвечает справочник «Драйверы оборудования». Для каждого драйвера (в частности, для «Штрих-М») указан Идентификатор объекта (ProgID).

Проанализируем ситуацию: если в поле «Идентификатор объекта» указано значение AddIn.SMDrvFR1C20, то используется интерфейс версии 2001. Этот интерфейс был разработан до массового внедрения маркировки и попросту «не умеет» обрабатывать и передавать в кассу теги, связанные с кодами идентификации (GoodCodeData). Как только мы меняем идентификатор на AddIn.SMDrvFR1C22 (интерфейс версии 2005), компонента начинает распознавать структуру маркировки и корректно транслирует её в фискальный накопитель.

Для исправления ситуации выполним следующие шаги:

  1. Перейдем в справочник Драйверы оборудования.
  2. Найдем предопределенный или созданный элемент для ККТ Штрих-М (например, «Штрих-М:ККТ с передачей данных в ОФД (54-ФЗ)»).
  3. Изменим Идентификатор объекта с AddIn.SMDrvFR1C20 на AddIn.SMDrvFR1C22.
  4. Убедимся, что в общий макет или в папку установки драйвера загружена актуальная версия компоненты (например, из комплекта драйвера версии 4.15 или выше).

Подготовка XML-пакета данных для чека

После смены интерфейса на версию 2005 необходимо убедиться, что формируемый XML-пакет (CheckPackage) содержит структуру GoodCodeData внутри позиции FiscalString. Посмотрим на правильный пример формирования структуры позиции для маркированного товара:



    
        
    

Разберем атрибуты узла GoodCodeData:

Функции для обработки спецсимволов и подготовки данных

Коды маркировки часто содержат спецсимволы (например, символ GS — ASCII 29), которые при передаче в XML могут вызвать ошибки парсинга. Проанализируем функцию маскирования, которая поможет избежать проблем при формировании строки для ККТ:


Функция МаскированиеСимволов(ТекЗначение)
    Результат = ТекЗначение;
    
    // Маскирование служебных символов JSON/XML
    Результат = СтрЗаменить(Результат, "\", "\\");
    Результат = СтрЗаменить(Результат, "/", "\/");
    Результат = СтрЗаменить(Результат, Символ(8),  "\b");
    Результат = СтрЗаменить(Результат, Символы.Таб, "\t");
    Результат = СтрЗаменить(Результат, Символы.ПС,  "\n");
    Результат = СтрЗаменить(Результат, Символы.ПФ,  "\f");
    Результат = СтрЗаменить(Результат, Символы.ВК,  "\r");
    Результат = СтрЗаменить(Результат, """",      "\""");
    
    // Дополнительное маскирование управляющих символов (u0000 - u001f)
    Для НомерСимвола = 0 По 31 Цикл
        Если НомерСимвола = 8 Или НомерСимвола = 9 Или НомерСимвола = 10 
            Или НомерСимвола = 12 Или НомерСимвола = 13 Тогда
            Продолжить;
        КонецЕсли;
        Результат = СтрЗаменить(Результат, Символ(НомерСимвола), "\u00" + Прав("0" + DekToHex(НомерСимвола), 2));
    КонецЦикла;
    
    Возврат Результат;
КонецФункции

Также рассмотрим пример формирования MarkingCode для передачи в Base64. Это требуется для некоторых реализаций драйверов, чтобы ККТ сама могла распознать тип товара:


Процедура ПодготовитьДанныеМаркировки(GTIN, СерийныйНомер)
    // Пример формирования двоичных данных
    Поток = Новый ПотокВПамяти();
    Запись = Новый ЗаписьДанных(Поток);
    
    // Записываем префикс типа (например, для обуви)
    Запись.ЗаписатьЦелое16(4413, ПорядокБайтов.BigEndian); 
    
    // Записываем GTIN и Серийник
    Запись.ЗаписатьСимволы(GTIN);
    Запись.ЗаписатьСимволы(СерийныйНомер);
    
    Запись.Закрыть();
    ДвоичныеДанные = Поток.ЗакрытьИПолучитьДвоичныеДанные();
    Base64Код = Base64Строка(ДвоичныеДанные);
    // Теперь Base64Код можно подставить в атрибут MarkingCode
КонецПроцедуры

Проверка результата через «Тест драйвера»

Если после всех программных правок символ [М] всё равно не печатается, проверим состояние фискального накопителя и корректность записи тегов вручную. Это поможет выяснить, на чьей стороне проблема: 1С или прошивка кассы.

  1. Запустим утилиту «Тест драйвера ФР».
  2. Перейдем в раздел ФН -> Данные.
  3. Выберем тип документа «Фискальный документ» и укажем номер последнего пробитого чека.
  4. Установим галочку «Показать номера тегов» и нажмем «Прочитать фискальный документ».
  5. В структуре Тег 1059 (Предмет расчета) найдем Тег 1162.

Если тег 1162 присутствует и содержит данные (например, KT: 44 4D 00...), значит, 1С и драйвер работают корректно. Отсутствие символа [М] в таком случае может быть связано с тем, что в настройках таблиц ККТ отключена печать признака маркировки или версия прошивки кассы слишком старая (для ФФД 1.05 требуется прошивка не старше начала 2020 года).

Важное примечание по ФФД 1.2: Если вы переходите на формат 1.2, символы в чеке изменятся. Вместо единого [М] появятся [М+] (проверка успешна), [М-] (ошибка проверки) или [М] (проверка невозможна). Для работы с ФФД 1.2 в 1С потребуется использовать интерфейс драйвера версии 3000 (AddIn.SMDrvFR1C30) и выше.

Итоги

Мы выяснили, что основной "маленькой проблемой" при реализации маркировки в старых конфигурациях 1С является несоответствие версии интерфейса AddIn. Переключение на версию интерфейса 2005 (или выше) позволяет активировать передачу данных маркировки без необходимости полного обновления конфигурации до актуальных релизов. Не забывайте также проверять настройки сканера штрихкодов: он должен передавать символ-разделитель GS, иначе код маркировки будет считаться невалидным еще на этапе подбора в документ 1С.

← На главную