Почему ККТ с функцией передачи данных в ОФД не печатает штрихкод из 1С и как это исправить?

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

При работе с торговым оборудованием в среде 1С программисты часто сталкиваются с ситуацией, когда текстовые строки и фискальные данные печатаются на чековой ленте без проблем, но попытка вывести графический штрихкод (или QR-код) заканчивается неудачей. При этом кассовый аппарат не выдает никаких ошибок выполнения, а просто игнорирует команду печати штрихкода. Особо остро эта проблема проявляется на стыке версий платформ 1С (например, 8.1 или 8.2 на обычных формах) и современных драйверов онлайн-касс под требования 54-ФЗ.

В этой статье мы подробно разберем, почему возникает данная проблема, проанализируем внутренние механизмы взаимодействия 1С с ККТ через XML-пакеты и найдем гарантированное практическое решение.

Выясняем причины: почему ККТ «молчит» при отправке штрихкода?

Если контрольно-кассовая техника (ККТ) успешно печатает штрихкоды при тестировании непосредственно из утилиты драйвера (например, «Тест драйвера ККТ АТОЛ» или «Тест драйвера Штрих-М»), но отказывается делать это из 1С, проблема кроется исключительно в программной прослойке. Рассмотрим основные причины такого поведения:

  1. Несоответствие версий XML-схем стандарта «1С:Совместимо». Драйверы касс обновляются регулярно, в то время как конфигурация 1С может годами не получать обновлений интеграционной библиотеки. Если старый код 1С формирует теги XML-пакета, которые современный драйвер больше не поддерживает или ожидает в другом формате, драйвер просто пропустит некорректный узел XML без генерации системной ошибки.
  2. Передача строковых названий типов штрихкодов вместо числовых идентификаторов. Атрибут BarcodeType в XML-схемах ККТ часто является строго типизированным. Передача текстового значения типа «EAN13» вместо его числового аналога (например, «1») — классическая ошибка, приводящая к игнорированию команды драйвером.
  3. Конфликт очередей команд в фискальном режиме. Попытка напечатать произвольный штрихкод внутри фискального чека методами прямой печати текста может блокироваться логикой работы ККТ. В современных онлайн-кассах печать нефискальной графики строго регламентирована: она должна происходить либо до открытия чека, либо в процессе фискализации как свойство позиции товара, либо после закрытия чека.
  4. Физические ограничения ширины чековой ленты. Если геометрия штрихкода (высота, ширина, масштаб) превышает физические размеры области печати вашей ленты (например, популярной узкой ленты 57 мм), ККТ может молча отменить печать этого графического элемента для предотвращения порчи чека.

Давайте пошагово разберем методы решения этой проблемы, начиная с самого надежного и корректного способа интеграции.

Решение 1. Передача данных штрихкода через структуру фискализации чека

Самый надежный способ вывести штрихкод товара на современных онлайн-кассах (например, АТОЛ 30Ф, 11Ф, 22Ф, 55Ф и др.) — не пытаться самостоятельно формировать сложные XML-документы через метод НапечататьТекстовыйДокумент, а передать параметры штрихкода напрямую в структуру фискализации чека.

Для реализации этого метода нам потребуется модифицировать процедуру подготовки данных. Разберем этот процесс на примере конфигурации «1С:Розница».

Найдем в общем модуле или модуле объекта обработок обслуживания процедуру ПодготовитьДанныеДляФискализацииЧека (или аналогичную функцию формирования структуры параметров чека). Нам необходимо внедрить свойства штрихкода непосредственно в коллекцию позиций чека. Посмотрим на практический пример реализации:


// В процедуре ПодготовитьДанныеДляФискализацииЧека
// Находим цикл формирования позиций чека и добавляем параметры штрихкода

Для Каждого ТекущаяПозиция Из ПозицииЧекаТабличнаяЧасть Цикл

    // Инициализируем структуру позиции товара
    СтрокаШК = Новый Структура;
    СтрокаШК.Вставить("Наименование", ТекущаяПозиция.Номенклатура.Наименование);
    СтрокаШК.Вставить("Количество", ТекущаяПозиция.Количество);
    СтрокаШК.Вставить("Цена", ТекущаяПозиция.Цена);
    СтрокаШК.Вставить("Сумма", ТекущаяПозиция.Сумма);
    СтрокаШК.Вставить("СтавкаНДС", ТекущаяПозиция.СтавкаНДС);

    // Добавляем штрихкод товара
    // Если штрихкод задан для номенклатуры, передаем его ККТ
    Если ЗначениеЗаполнено(ТекущаяПозиция.Штрихкод) Тогда
        СтрокаШК.Вставить("ШтрихКод", СокрЛП(ТекущаяПозиция.Штрихкод));
        
        // ВАЖНО: Определяем тип штрихкода. 
        // Для EAN-13 обычно используется строка "EAN13" или числовой код, в зависимости от драйвера
        СтрокаШК.Вставить("ТипШтрихкода", "EAN13"); 
    КонецЕсли;

    // Добавляем подготовленную структуру в общую коллекцию позиций
    ОбщиеПараметры.ПозицииЧека.Добавить(СтрокаШК);

КонецДля;

При таком подходе БСП (Библиотека стандартных подсистем) или интеграционная обработка 1С самостоятельно преобразует эти параметры в валидный XML-пакет, который гарантированно распознается сервером торгового оборудования ККТ и выведется на печать под наименованием соответствующего товара.

Решение 2. Корректное формирование структуры XML-пакета вручную

Если вам требуется напечатать произвольный штрихкод (например, купон на скидку в подвале чека или нефискальный документ), и вы вынуждены использовать метод драйвера НапечататьТекстовыйДокумент, необходимо строго соблюдать стандарты разметки XML XML-схем ККТ.

Рассмотрим пример правильного формирования XML-структуры текстового документа, содержащего штрихкод. Вместо записи пустых строк или некорректных элементов, мы будем использовать строго типизированные теги Barcode внутри контейнера Positions.


ЗаписьXML = Новый ЗаписьXML;
ЗаписьXML.УстановитьСтроку("UTF-8");
ЗаписьXML.ЗаписатьОбъявлениеXML();

// Открываем корневой элемент документа
ЗаписьXML.ЗаписатьНачалоЭлемента("Document");
ЗаписьXML.ЗаписатьНачалоЭлемента("Positions");

// Формируем блок печати штрихкода
ЗаписьXML.ЗаписатьНачалоЭлемента("Barcode");

// Тип штрихкода может требовать числовой идентификатор
// Ниже приведена таблица соответствия для большинства современных ККТ
ТипШК = XMLСтрока(ТекущаяПозиция.ТипШтрихкода); // Например, "EAN13" или "1"
ЗначениеШК = XMLСтрока(ТекущаяПозиция.ШтрихКод);

ЗаписьXML.ЗаписатьАтрибут("BarcodeType", ТипШК);
ЗаписьXML.ЗаписатьАтрибут("Barcode", ЗначениеШК);

// Дополнительные параметры масштабирования (если поддерживаются драйвером)
ЗаписьXML.ЗаписатьАтрибут("Height", "50"); // Высота штрихкода в пикселях
ЗаписьXML.ЗаписатьАтрибут("Scale", "2");    // Коэффициент масштабирования ширины линий

ЗаписьXML.ЗаписатьКонецЭлемента(); // Barcode

// Если требуется напечатать сопроводительный текст под штрихкодом
ЗаписьXML.ЗаписатьНачалоЭлемента("TextString");
ЗаписьXML.ЗаписатьАтрибут("Text", "Спасибо за покупку! Ждем вас снова.");
ЗаписьXML.ЗаписатьКонецЭлемента(); // TextString

ЗаписьXML.ЗаписатьКонецЭлемента(); // Positions
ЗаписьXML.ЗаписатьКонецЭлемента(); // Document

РезультатXML = ЗаписьXML.Закрыть();

// Отправляем сформированный XML-пакет на печать через объект драйвера
Драйвер.НапечататьТекстовыйДокумент(ФР, РезультатXML);

Таблица маппинга типов штрихкодов для драйверов ККТ

Очень часто драйвер ККТ игнорирует строковые обозначения типов штрихкодов вроде «EAN13» или «Code128». Проанализируем стандартную таблицу соответствий типов штрихкодов числовым идентификаторам для ККТ марок АТОЛ и Штрих-М:

  1. EAN8 — Числовой идентификатор: 0 или EAN8
  2. EAN13 — Числовой идентификатор: 1 или EAN13
  3. UPCA — Числовой идентификатор: 2
  4. Code39 — Числовой идентификатор: 4
  5. Code128 — Числовой идентификатор: 10 или Code128
  6. QR-код (DataMatrix) — Числовой идентификатор: 14 или QR

Практический совет: Если при передаче строкового параметра штрихкод не печатается, попробуйте передать в атрибут BarcodeType его числовое значение. Это решает проблему совместимости со старыми парсерами драйверов в 90% случаев.

Решение 3. Прямой вызов API драйвера (минуя XML)

В случаях, когда интеграционная библиотека 1С устарела и ее доработка невозможна или нецелесообразна, мы можем прибегнуть к прямому вызову методов низкоуровневого драйвера ККТ через OLE/COM-объект. Этот способ позволяет обойти любые ограничения логики XML-схем платформы 1С.

Проанализируем пример прямого управления объектом драйвера для вывода штрихкода на печать:


// Получаем прямой доступ к драйверу ККТ
ОбработкаТО = Неопределено;
ОбъектДрайвера = Неопределено;

РезультатПодключения = СерверТО.ПолучитьОбъектДрайвера(ФР, ОбработкаТО, ОбъектДрайвера);

Если НЕ ЗначениеЗаполнено(РезультатПодключения) Тогда
    Драйвер = ОбъектДрайвера.Драйвер;
    
    // Входим в режим нефискальной печати (или печати графики)
    // Устанавливаем свойства штрихкода напрямую в память драйвера
    Драйвер.Barcode = "2000021262157"; // Сам штрихкод
    Драйвер.BarcodeType = 1;           // Тип штрихкода (EAN13)
    Драйвер.Height = 60;               // Высота штрихкода
    Драйвер.Scale = 2;                 // Масштаб (ширина линий)
    
    // Вызываем команду непосредственной печати штрихкода
    РезультатПечати = Драйвер.PrintBarcode();
    
    Если РезультатПечати <> 0 Тогда
        ОписаниеОшибки = "";
        Драйвер.ПолучитьОшибку(ОписаниеОшибки);
        Предупреждение("Не удалось напечатать штрихкод ККТ: " + ОписаниеОшибки);
    КонецЕсли;
КонецЕсли;

Обратите внимание, что прямой вызов методов драйвера жестко привязывает ваш код к конкретному производителю ККТ (в данном примере рассмотрен синтаксис драйверов АТОЛ). Если на торговой точке планируется смена кассового оборудования (например, переход на Штрих-М), код прямой печати придется переписывать под другое API.

Важные настройки драйвера и ККТ, влияющие на печать графики

Если программный код написан верно, но принтер кассы по-прежнему выдает пустое место вместо штрихкода, необходимо проверить аппаратные настройки самого фискального регистратора:

  1. Разрешение печати в таблицах параметров ККТ. В некоторых моделях (особенно Штрих-М) в системных таблицах параметров есть флаг «Разрешить печать графики / штрихкодов». Если этот флаг снят, устройство будет игнорировать любые графические команды для экономии ресурса термоголовки и бумаги. Установите этот флаг через сервисную утилиту ККТ.
  2. Версия прошивки (Платформа ККТ). На современных аппаратах АТОЛ (Платформа 5.0) существенно изменилась внутренняя логика обработки графики. Старые методы отправки произвольных бинарных данных могут блокироваться прошивкой внутри открытого фискального чека. В таких условиях печать штрихкодов должна осуществляться исключительно в рамках шаблонов чеков, настраиваемых непосредственно в памяти ККТ.

Применяя данные подходы и учитывая аппаратные ограничения оборудования, вы сможете легко решить проблему с печатью штрихкодов и обеспечить стабильную работу кассового узла.

← На главную