Как вывести произвольный текст и клише в чеке на фискальном регистраторе через XML-пакет 1С?

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

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

Анализ структуры XML-пакета CheckPackage

Проанализируем стандартную структуру XML-документа, передаваемого в драйвер ККТ для фискализации чека. В соответствии с XSD-схемой стандарта БПО пакет содержит строго определенные узлы:

  1. Параметры чека (Parameters) — общие свойства документа (системы налогообложения, признак расчета, электронная почта или телефон покупателя, кассир).
  2. Позиции чека (Positions) — перечень фискальных позиций (FiscalString), текстовых строк (TextString) и штрихкодов (Barcode).
  3. Оплаты (Payments) — перечисление сумм по видам оплат (наличные, безналичные).

Посмотрим на типовой корректный пример XML-пакета чека:


<?xml version="1.0" encoding="UTF-8"?>
<CheckPackage>
    <Parameters PaymentType="1" SenderEmail="info@1c.ru" CustomerEmail="alex2000@mail.ru"/>
    <Positions>
        <FiscalString Name="Макароны" Quantity="1" Price="16.75" Amount="16.75" Tax="10"/>
        <FiscalString Name="Томатный сок" Quantity="1" Price="200" Amount="200" Tax="18"/>
        <TextString Text="Дисконтная карта: 00002345"/>
        <Barcode BarcodeType="EAN13" Barcode="2000021262157"/>
    </Positions>
    <Payments Cash="216.75" CashLessType1="0"/>
</CheckPackage>

Типовые ошибки при формировании тега TextString

Выясним причину, почему добавленный текст может не выводиться на печать. Чаще всего разработчики допускают две критические ошибки при программном формировании XML:

  1. Неверное расположение узла: попытка вставить TextString в корень документа после блока Payments. Тег TextString допустим исключительно внутри родительского узла Positions. Расположение его вне этого блока нарушает схему данных, и драйвер просто игнорирует некорректный тег.
  2. Неверный синтаксис значения: попытка передать текст в виде значения элемента (<TextString>ТЕСТ</TextString>) вместо атрибута. Согласно спецификации, значение передается строго через атрибут Text (<TextString Text="ТЕСТ"/>).

Правильное формирование XML с помощью объекта ЗаписьXML

Рассмотрим, как правильно реализовать программную генерацию пакета на встроенном языке 1С с использованием объекта ЗаписьXML. Текстовая строка должна записываться до закрытия элемента Positions:


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

ЗаписьXML.ЗаписатьНачалоЭлемента("CheckPackage");

// 1. Параметры
ЗаписьXML.ЗаписатьНачалоЭлемента("Parameters");
ЗаписьXML.ЗаписатьАтрибут("PaymentType", XMLСтрока(1));
ЗаписьXML.ЗаписатьАтрибут("TaxVariant", XMLСтрока(0));
ЗаписьXML.ЗаписатьКонецЭлемента(); // Parameters

// 2. Позиции чека
ЗаписьXML.ЗаписатьНачалоЭлемента("Positions");

// Фискальная строка товара
ЗаписьXML.ЗаписатьНачалоЭлемента("FiscalString");
ЗаписьXML.ЗаписатьАтрибут("Name", XMLСтрока("ТОВАР"));
ЗаписьXML.ЗаписатьАтрибут("Quantity", XMLСтрока(1));
ЗаписьXML.ЗаписатьАтрибут("Price", XMLСтрока(1000));
ЗаписьXML.ЗаписатьАтрибут("Amount", XMLСтрока(1000));
ЗаписьXML.ЗаписатьАтрибут("Department", XMLСтрока(0));
ЗаписьXML.ЗаписатьАтрибут("Tax", XMLСтрока(0));
ЗаписьXML.ЗаписатьКонецЭлемента(); // FiscalString

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

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

// 3. Оплаты
ЗаписьXML.ЗаписатьНачалоЭлемента("Payments");
ЗаписьXML.ЗаписатьАтрибут("Cash", XMLСтрока(1000));
ЗаписьXML.ЗаписатьКонецЭлемента(); // Payments

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

СтрокаXML = ЗаписьXML.Закрыть();

Особенности и альтернативные варианты вывода текста

Рассмотрим подробнее важные нюансы работы с нефискальным текстом на кассовых аппаратах:

  1. Позиционирование строк: строки внутри Positions выводятся строго в порядке их передачи в XML. Если поместить TextString в конец списка позиций, текст будет напечатан перед расчетом итогов и фискальным признаком, но не после него. В стандарте фискального чека БПО нет отдельной секции для произвольного подвала чека.
  2. Ширина чековой ленты: длина текста ограничена количеством символов в строке для конкретной модели ККТ и выбранного шрифта (обычно от 32 до 48 символов). Если строка длиннее, драйвер может обрезать ее, если в прошивке не включен автоматический перенос.
  3. Электронные чеки: если чек отправляется покупателю в электронном виде (SMS или E-mail) без физической печати, нефискальные строки не передаются в ОФД, так как они не входят в состав реквизитов форматов фискальных документов (ФФД).
  4. Настройка клише в памяти ККТ: постоянную шапку чека (клише) и подвал (например, «Спасибо за покупку!») рекомендуется настраивать непосредственно в таблицах/параметрах фискального регистратора через сервисную утилиту драйвера ККТ. В этом случае касса будет автоматически добавлять клише и подвал к каждому чеку без необходимости передавать их из 1С.
  5. Печать нефискального документа: если требуется напечатать отдельный информационный талон (слип-чек эквайринга, сервисный купон), следует использовать отдельную операцию печати нефискального текста (метод ПечатьТекста БПО) вне рамок фискализации продажи.
← На главную