При интеграции фискальных регистраторов АТОЛ с конфигурациями 1С разработчики нередко сталкиваются с ситуацией, когда товары в чеке упорно регистрируются по первой секции (отделу 01), несмотря на то, что в коде программы и в сформированном XML-пакете явно передан атрибут Department="2" или другой номер секции. Разберем детально, почему возникает эта ошибка, как ее диагностировать по логам и какие существуют пути решения.
Рассмотрим стандартный механизм работы через библиотеку подключаемого оборудования (БПО). В 1С формируется структура пакета данных чека в формате XML, которая затем передается в метод внешней компоненты:
Результат = ОбъектДрайвера.СформироватьЧек(ПараметрыПодключения.ИДУстройства, Кассир, Электронно, ДанныеЧека, НомерЧека, НомерСмены, ФискальныйПризнак, АдресСайтаПроверки);
Посмотрим на сформированный XML-пакет CheckPackage:
<?xml version="1.0" encoding="UTF-8"?>
<CheckPackage>
<Parameters PaymentType="1" TaxVariant="0" SenderEmail="" CustomerEmail="" CustomerPhone=""/>
<Positions>
<FiscalString Name="7677 Шайба М 5" Quantity="1" Price="0.08" Amount="0.08" Department="2" Tax="18"/>
</Positions>
<Payments Cash="0.08" CashLessType1="0" CashLessType2="0" CashLessType3="0"/>
</CheckPackage>
В приведенном пакете для фискальной строки FiscalString четко определен атрибут Department="2". Однако при печати чека ККТ регистрирует операцию по секции 1. Чтобы выяснить причину, проанализируем файл журнала драйвера FprnM1C.txt (журнал находится в каталоге логов АТОЛ, доступном через утилиту «Управление драйверами» с включенным расширенным протоколированием):
Driver.Set_Name 7677 Шайба М 5
Driver.Set_Quantity 1
Driver.Set_Price 0,08
Driver.Set_DiscountValue 0
Driver.Set_TaxTypeNumber 3
Driver.Registration
Обратим внимание: в логе полностью отсутствует вызов метода Driver.Set_Department перед регистрацией позиции. Это означает, что промежуточная компонента драйвера (например, FprnM1C82_54FZ.dll или FprnM1C.dll сборки 8.14–8.15) некорректно разбирает XML-структуру и просто «теряет» атрибут Department при трансляции команд в нативный драйвер.
Выделим основные технические факторы, приводящие к игнорированию секций:
Department не считывается и касса применяет значение отдела по умолчанию.Tax / TaxTypeNumber), не совпадает с установленным для указанной секции в аппарате, ККТ либо вернет ошибку, либо сбросит регистрацию на отдел по умолчанию.Если в конфигурации используется стандартный механизм вызова СформироватьЧек() по стандарту БПО, наиболее быстрым решением является установка стабильной версии библиотеки, корректно обрабатывающей атрибут Department.
FprnM1C82_54FZ.dll / FprnM1C.dll).Если требуется гарантированная работа независимо от ошибок XML-парсера БПО, откажемся от передачи пакета через CheckPackage и перейдем на прямое формирование чека методами нативного драйвера АТОЛ (AddIn.FprnM45 для ДТО 8 или AddIn.Fptr10 для ДТО 10).
Рассмотрим, как выглядит правильная последовательность регистрации позиций в коде 1С при прямой работе с драйвером:
// Открываем чек (1 - чек прихода)
ОбъектДрайвера.CheckType = 1;
ОбъектДрайвера.OpenCheck();
// Позиция 1 - отправляем во 2-й отдел
ОбъектДрайвера.Name = "7677 Шайба М 5";
ОбъектДрайвера.Quantity = 1;
ОбъектДрайвера.Price = 0.08;
ОбъектДрайвера.Department = 2; // Установка секции напрямую
ОбъектДрайвера.TaxTypeNumber = 3; // 18% / 20%
ОбъектДрайвера.Registration();
// Регистрация оплаты и закрытие чека
ОбъектДрайвера.Summ = 0.08;
ОбъектДрайвера.TypeClose = 0; // Наличные
ОбъектДрайвера.Payment();
ОбъектДрайвера.CloseCheck();
В этом случае в логах драйвера будет четко зафиксирована команда передачи секции:
Driver.Set_Name 7677 Шайба М 5
Driver.Set_Quantity 1
Driver.Set_Price 0,08
Driver.Set_Department 2
Driver.Registration
Если конфигурация поддерживает современные версии БПО, рекомендуется перейти на линейку драйверов АТОЛ 10.х (компонента AddIn.Fptr10). В актуальных версиях ДТО 10 обработка атрибута Department (параметр LIBFPTR_PARAM_DEPARTMENT) в пакетах CheckPackage полностью исправлена разработчиками и работает в штатном режиме.
Перед повторным тестированием печати обязательно проверим внутренние таблицы кассы с помощью утилиты «Тест драйвера ККТ»: