При разработке и доработке механизмов взаимодействия с контрольно-кассовой техникой (ККТ) по современным стандартам БПО часто возникает задача напечатать дополнительный произвольный текст: рекламное сообщение, данные карты лояльности, информацию об акции или сервисные сведения. Однако при формировании пакета CheckPackage разработчики нередко сталкиваются с ситуацией, когда добавленный текст игнорируется драйвером кассы и не появляется на чековой ленте. Разберем по шагам, почему это происходит и как правильно передавать текстовые строки в XML-пакете чека.
Проанализируем стандартную структуру XML-документа, передаваемого в драйвер ККТ для фискализации чека. В соответствии с XSD-схемой стандарта БПО пакет содержит строго определенные узлы:
Parameters) — общие свойства документа (системы налогообложения, признак расчета, электронная почта или телефон покупателя, кассир).Positions) — перечень фискальных позиций (FiscalString), текстовых строк (TextString) и штрихкодов (Barcode).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>
Выясним причину, почему добавленный текст может не выводиться на печать. Чаще всего разработчики допускают две критические ошибки при программном формировании XML:
TextString в корень документа после блока Payments. Тег TextString допустим исключительно внутри родительского узла Positions. Расположение его вне этого блока нарушает схему данных, и драйвер просто игнорирует некорректный тег.<TextString>ТЕСТ</TextString>) вместо атрибута. Согласно спецификации, значение передается строго через атрибут Text (<TextString Text="ТЕСТ"/>).Рассмотрим, как правильно реализовать программную генерацию пакета на встроенном языке 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.Закрыть();
Рассмотрим подробнее важные нюансы работы с нефискальным текстом на кассовых аппаратах:
Positions выводятся строго в порядке их передачи в XML. Если поместить TextString в конец списка позиций, текст будет напечатан перед расчетом итогов и фискальным признаком, но не после него. В стандарте фискального чека БПО нет отдельной секции для произвольного подвала чека.ПечатьТекста БПО) вне рамок фискализации продажи.