При работе с торговым оборудованием в среде 1С программисты часто сталкиваются с ситуацией, когда текстовые строки и фискальные данные печатаются на чековой ленте без проблем, но попытка вывести графический штрихкод (или QR-код) заканчивается неудачей. При этом кассовый аппарат не выдает никаких ошибок выполнения, а просто игнорирует команду печати штрихкода. Особо остро эта проблема проявляется на стыке версий платформ 1С (например, 8.1 или 8.2 на обычных формах) и современных драйверов онлайн-касс под требования 54-ФЗ.
В этой статье мы подробно разберем, почему возникает данная проблема, проанализируем внутренние механизмы взаимодействия 1С с ККТ через XML-пакеты и найдем гарантированное практическое решение.
Если контрольно-кассовая техника (ККТ) успешно печатает штрихкоды при тестировании непосредственно из утилиты драйвера (например, «Тест драйвера ККТ АТОЛ» или «Тест драйвера Штрих-М»), но отказывается делать это из 1С, проблема кроется исключительно в программной прослойке. Рассмотрим основные причины такого поведения:
BarcodeType в XML-схемах ККТ часто является строго типизированным. Передача текстового значения типа «EAN13» вместо его числового аналога (например, «1») — классическая ошибка, приводящая к игнорированию команды драйвером.Давайте пошагово разберем методы решения этой проблемы, начиная с самого надежного и корректного способа интеграции.
Самый надежный способ вывести штрихкод товара на современных онлайн-кассах (например, АТОЛ 30Ф, 11Ф, 22Ф, 55Ф и др.) — не пытаться самостоятельно формировать сложные XML-документы через метод НапечататьТекстовыйДокумент, а передать параметры штрихкода напрямую в структуру фискализации чека.
Для реализации этого метода нам потребуется модифицировать процедуру подготовки данных. Разберем этот процесс на примере конфигурации «1С:Розница».
Найдем в общем модуле или модуле объекта обработок обслуживания процедуру ПодготовитьДанныеДляФискализацииЧека (или аналогичную функцию формирования структуры параметров чека). Нам необходимо внедрить свойства штрихкода непосредственно в коллекцию позиций чека. Посмотрим на практический пример реализации:
// В процедуре ПодготовитьДанныеДляФискализацииЧека
// Находим цикл формирования позиций чека и добавляем параметры штрихкода
Для Каждого ТекущаяПозиция Из ПозицииЧекаТабличнаяЧасть Цикл
// Инициализируем структуру позиции товара
СтрокаШК = Новый Структура;
СтрокаШК.Вставить("Наименование", ТекущаяПозиция.Номенклатура.Наименование);
СтрокаШК.Вставить("Количество", ТекущаяПозиция.Количество);
СтрокаШК.Вставить("Цена", ТекущаяПозиция.Цена);
СтрокаШК.Вставить("Сумма", ТекущаяПозиция.Сумма);
СтрокаШК.Вставить("СтавкаНДС", ТекущаяПозиция.СтавкаНДС);
// Добавляем штрихкод товара
// Если штрихкод задан для номенклатуры, передаем его ККТ
Если ЗначениеЗаполнено(ТекущаяПозиция.Штрихкод) Тогда
СтрокаШК.Вставить("ШтрихКод", СокрЛП(ТекущаяПозиция.Штрихкод));
// ВАЖНО: Определяем тип штрихкода.
// Для EAN-13 обычно используется строка "EAN13" или числовой код, в зависимости от драйвера
СтрокаШК.Вставить("ТипШтрихкода", "EAN13");
КонецЕсли;
// Добавляем подготовленную структуру в общую коллекцию позиций
ОбщиеПараметры.ПозицииЧека.Добавить(СтрокаШК);
КонецДля;
При таком подходе БСП (Библиотека стандартных подсистем) или интеграционная обработка 1С самостоятельно преобразует эти параметры в валидный 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». Проанализируем стандартную таблицу соответствий типов штрихкодов числовым идентификаторам для ККТ марок АТОЛ и Штрих-М:
0 или EAN81 или EAN132410 или Code12814 или QRПрактический совет: Если при передаче строкового параметра штрихкод не печатается, попробуйте передать в атрибут BarcodeType его числовое значение. Это решает проблему совместимости со старыми парсерами драйверов в 90% случаев.
В случаях, когда интеграционная библиотека 1С устарела и ее доработка невозможна или нецелесообразна, мы можем прибегнуть к прямому вызову методов низкоуровневого драйвера ККТ через OLE/COM-объект. Этот способ позволяет обойти любые ограничения логики XML-схем платформы 1С.
Проанализируем пример прямого управления объектом драйвера для вывода штрихкода на печать:
// Получаем прямой доступ к драйверу ККТ
ОбработкаТО = Неопределено;
ОбъектДрайвера = Неопределено;
РезультатПодключения = СерверТО.ПолучитьОбъектДрайвера(ФР, ОбработкаТО, ОбъектДрайвера);
Если НЕ ЗначениеЗаполнено(РезультатПодключения) Тогда
Драйвер = ОбъектДрайвера.Драйвер;
// Входим в режим нефискальной печати (или печати графики)
// Устанавливаем свойства штрихкода напрямую в память драйвера
Драйвер.Barcode = "2000021262157"; // Сам штрихкод
Драйвер.BarcodeType = 1; // Тип штрихкода (EAN13)
Драйвер.Height = 60; // Высота штрихкода
Драйвер.Scale = 2; // Масштаб (ширина линий)
// Вызываем команду непосредственной печати штрихкода
РезультатПечати = Драйвер.PrintBarcode();
Если РезультатПечати <> 0 Тогда
ОписаниеОшибки = "";
Драйвер.ПолучитьОшибку(ОписаниеОшибки);
Предупреждение("Не удалось напечатать штрихкод ККТ: " + ОписаниеОшибки);
КонецЕсли;
КонецЕсли;
Обратите внимание, что прямой вызов методов драйвера жестко привязывает ваш код к конкретному производителю ККТ (в данном примере рассмотрен синтаксис драйверов АТОЛ). Если на торговой точке планируется смена кассового оборудования (например, переход на Штрих-М), код прямой печати придется переписывать под другое API.
Если программный код написан верно, но принтер кассы по-прежнему выдает пустое место вместо штрихкода, необходимо проверить аппаратные настройки самого фискального регистратора:
Применяя данные подходы и учитывая аппаратные ограничения оборудования, вы сможете легко решить проблему с печатью штрихкодов и обеспечить стабильную работу кассового узла.