В процессе автоматизации розничной торговли часто возникает необходимость дополнить стандартный кассовый чек дополнительной информацией. Это могут быть данные о накопленных бонусах, маркетинговые акции, ФИО кассира в особом формате или расширенное описание товара. В системе 1С:Управление торговлей 11 (особенно в ранних редакциях, таких как 11.1) логика формирования чека скрыта глубоко в программных модулях Библиотеки подключаемого оборудования (БПО). В этой статье мы разберем, как найти нужные точки входа в код и корректно модифицировать структуру чека.
Прежде чем приступать к правке кода, давайте разберем общую схему. В современных версиях 1С взаимодействие с кассовым аппаратом (ККТ) происходит не напрямую, а через формирование специального XML-пакета. Этот пакет содержит в себе все реквизиты чека: товары, цены, налоги и дополнительные текстовые поля. Процесс выглядит так:
ЧекККМ) собирает данные из своей табличной части.Поэтому, чтобы добавить свою строку, нам нужно вмешаться в процесс формирования этого XML-пакета.
Рассмотрим ситуацию, описанную в теме. Основным местом, где происходит «сборка» чека в УТ 11.1, является общий модуль МенеджерОборудованияВызовСервера. В нем нас интересует функция ПолучитьXMLПакетДляФискализацияЧека. Именно здесь данные превращаются в итоговую структуру, отправляемую на кассу.
Проанализируем программный код в этом модуле. Нам нужно найти цикл, который обходит позиции чека и заполняет параметры каждой строки. Для добавления своих данных в конкретную позицию товара часто используется структура, возвращаемая методом МенеджерОборудованияКлиентСервер.ПараметрыФискальнойСтрокиЧека().
Пример модификации наименования позиции может выглядеть так:
// В цикле формирования позиций чека
СтрокаПозицииЧека = МенеджерОборудованияКлиентСервер.ПараметрыФискальнойСтрокиЧека();
СтрокаПозицииЧека.Наименование = "Мой префикс: " + ТекущаяСтрока.Номенклатура.Наименование;
СтрокаПозицииЧека.Количество = ТекущаяСтрока.Количество;
СтрокаПозицииЧека.ЦенаСКидками = ТекущаяСтрока.Цена;
// Далее по тексту заполняются остальные параметры
Если наша задача — не изменить название товара, а добавить произвольный текст (например, «Спасибо за покупку!» или данные о бонусах) в конец или начало чека, нам нужно работать с тегом TextString в XML-структуре.
Выясним причину, почему простым добавлением в ПараметрыФискальнойСтрокиЧека не всегда удается обойтись: драйвер ККТ ожидает, что каждая фискальная строка имеет цену и количество. Если мы добавим «пустую» строку в массив позиций, касса может выдать ошибку «Неверный формат данных».
Для добавления текстовых сообщений проанализируем, как формируется XML. В структуре XML-пакета допускаются блоки описания текста. Посмотрим на пример формирования такого блока:
// Пример добавления нефискальной строки в XML-пакет
ЗаписьXML.ЗаписатьНачалоЭлемента("TextString");
ЗаписьXML.ЗаписатьАтрибут("Text", "Ваша персональная скидка: 5%");
ЗаписьXML.ЗаписатьКонецЭлемента(); // TextString
Обычно это делается в общем модуле, который отвечает за преобразование структуры данных чека в XML (например, МенеджерОборудованияВызовСервера.СформироватьXMLДляФискализации). Для детального разбора реализации можно использовать пример внедрения произвольной текстовой строки в чек по стандарту БПО.
В конфигурации УТ 11 существует встроенная обработка ПредпросмотрЧека. Это отличный инструмент для анализа того, как 1С «видит» ваш чек перед отправкой на устройство. Рассмотрим подробнее, как её использовать:
ДанныеЧека.При добавлении своих данных необходимо учитывать несколько критических факторов:
1. Версия ФФД (Формат фискальных данных). На сегодняшний день ККТ работают по стандартам ФФД 1.05, 1.1 или 1.2. Каждый стандарт предъявляет свои требования к реквизитам. Добавление произвольного текста не должно нарушать логику обязательных тегов, иначе чек не будет пробит.
2. Ширина ленты. Перед программным выводом строки важно выяснить ширину ленты кассы. Обычно это 32, 40 или 48 символов. Если ваша строка будет длиннее, драйвер либо обрежет её, либо перенесет на новую строку, что может испортить визуальное восприятие чека. Рекомендуем использовать функцию Лев() или логику разбиения строк:
ДлинаСтрокиКассы = 32;
ТекстДляПечати = "Очень длинное сообщение для покупателя, которое не влезет";
Пока СтрДлина(ТекстДляПечати) > 0 Цикл
ПечатаемаяЧасть = Лев(ТекстДляПечати, ДлинаСтрокиКассы);
// Код добавления ПечатаемаяЧасть в XML
ТекстДляПечати = Сред(ТекстДляПечати, ДлинаСтрокиКассы + 1);
КонецЦикла;
3. Различие между фискальными и информационными строками. Помните, что фискальные данные уходят в ОФД и проверяются налоговой. Информационные строки (нефискальные) печатаются только на бумаге. Старайтесь добавлять маркетинговую информацию именно как нефискальные строки в «подвал» (Footer) чека. При необходимости отправить нефискальное сообщение на устройство можно использовать внешнюю обработку для печати текста на ККМ в УТ.
Для реализации задачи по добавлению данных в чек УТ 11.1 нам потребовалось:
МенеджерОборудованияВызовСервера.ПолучитьXMLПакетДляФискализацияЧека.ПараметрыФискальнойСтрокиЧека для изменения товарных позиций.TextString для вставки произвольного текста в XML.Проанализировав ситуацию, мы выяснили, что наиболее «чистым» способом является модификация функции СформироватьДанныеЧека в модуле самого документа (Чек ККМ или ПКО). Там данные подготавливаются в виде массива структур, который в дальнейшем корректно обрабатывается всеми стандартными механизмами 1С, что гарантирует стабильную работу при смене модели кассового аппарата.