В современных релизах конфигурации 1С:Управление торговлей (начиная с 11.5.12 и выше), использующих библиотеку подключаемого оборудования (БПО) версии 3.1, процесс формирования фискального чека стал многослойным. Если раньше код был сосредоточен в одном модуле, то теперь данные проходят через цепочку преобразований. Разберем подробно, где именно искать алгоритмы формирования XML-пакета, который отправляется на драйвер кассового аппарата.
Для начала проанализируем, какая именно функция отвечает за итоговую сборку XML-строки. В актуальных версиях УТ 11.5 ключевым местом является общий модуль МенеджерОборудованияВызовСервера. Именно здесь сосредоточена логика взаимодействия с оборудованием на серверной стороне.
Рассмотрим функцию, название которой было определено опытным путем в ходе обсуждения:
Функция СформироватьXMLПакетДляФискализацииЧека(ПараметрыФискализации, ОбщиеПараметры) Экспорт
// Здесь происходит вызов нижележащих уровней БПО
КонецФункции
Однако важно понимать, что эта функция сама по себе часто является «оберткой». Чтобы найти место, где заполняются конкретные теги (наименование товара, ставка НДС, признаки способа расчета), нам нужно спуститься глубже по стеку вызовов.
Выясним причину, по которой код распределен по разным модулям. Это связано с универсализацией драйверов. Рассмотрим основные модули, участвующие в процессе:
ПодключаемоеОборудование) происходит финальная сборка текстовой строки XML с использованием объекта ЗаписьXML.Проанализируем ситуацию: если вам необходимо изменить логику заполнения тегов (например, добавить специфический признак для маркированного товара или передать ИНН покупателя), вам нужно искать процедуру под названием ПодготовитьДанныеДляФискализации в модуле ПробитиеЧековПоКассе. Именно там заполняется структура ПараметрыФискализации, которая затем превращается в XML.
Разберем по шагам, как выглядит структура пакета, которую формирует система. Это поможет вам сориентироваться при отладке в конфигураторе. Пакет представляет собой XML-документ с корневым узлом CheckPackage.
Внутри него обычно присутствуют следующие блоки:
FiscalString.Пример формирования одной позиции в коде 1С может выглядеть примерно так (упрощенно):
ЗаписьXML.ЗаписатьНачалоЭлемента("FiscalString");
ЗаписьXML.ЗаписатьАтрибут("Name", СтрокаТовара.Наименование);
ЗаписьXML.ЗаписатьАтрибут("Quantity", СтрокаТовара.Количество);
ЗаписьXML.ЗаписатьАтрибут("PriceWithDiscount", СтрокаТовара.Цена);
ЗаписьXML.ЗаписатьАтрибут("Amount", СтрокаТовара.Сумма);
ЗаписьXML.ЗаписатьАтрибут("VATRate", СтрокаТовара.СтавкаНДС);
ЗаписьXML.ЗаписатьКонецЭлемента();
Посмотрим на практический совет по поиску нужного места. Если поиск по названию функции не дает быстрого результата из-за сложности конфигурации, применим метод «точки останова».
Рассмотрим алгоритм действий:
МенеджерОборудованияКлиент.ВыполнитьКоманду.ВходныеПараметры или ОбъектДрайвера передается сформированная XML-строка.В релизе 11.5.15.79 особое внимание уделяется формату фискальных данных 1.2. Если вы работаете с маркируемыми товарами, формирование XML усложняется добавлением узла GoodCodeData. Проанализируем, где формируется этот узел.
Логика обработки кодов маркировки (DataMatrix) вынесена в специализированные функции БПО. Система берет код маркировки из документа и преобразует его в формат, требуемый ФН (тег 1163). Если вам нужно вмешаться в этот процесс, ищите вызовы функций в общем модуле ИнтеграцияИСМП или процедурах преобразования кодов в модулях БПО. Важно помнить, что некорректное изменение XML-пакета в части маркировки может привести к ошибке «Некорректное состояние ФН» или отказу драйвера принимать пакет.
Мы выяснили, что для внесения изменений в логику формирования чека в 1С:УТ 11.5 необходимо работать в связке нескольких модулей. Основная логика подготовки данных находится в ПробитиеЧековПоКассе, а финальная сборка строки XML происходит в недрах модулей ПодключаемоеОборудование через функцию СформироватьXMLПакетДляФискализацииЧека. Использование глобального поиска по конфигурации и грамотная настройка точек останова в момент передачи данных драйверу позволят вам быстро локализовать нужный участок кода.