Почему касса АТОЛ игнорирует атрибут Department и печатает чек в секцию по умолчанию

Программист 1С v8.3 (Обычные формы) Торговля и дистрибуция
← На главную

При интеграции фискальных регистраторов АТОЛ с конфигурациями 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 при трансляции команд в нативный драйвер.

Причины сбоя разделения по отделам

Выделим основные технические факторы, приводящие к игнорированию секций:

  1. Ошибки в парсере XML внешней компоненты 1С: В некоторых версиях интеграционных библиотек ДТО 8 парсер тегов 1С содержит внутренний дефект, из-за которого значение атрибута Department не считывается и касса применяет значение отдела по умолчанию.
  2. Несоответствие налоговых ставок в таблицах ККТ: В прошивке кассы и таблицах настроек секций за каждым отделом может быть закреплена определенная налоговая ставка. Если налог, переданный из 1С (параметр Tax / TaxTypeNumber), не совпадает с установленным для указанной секции в аппарате, ККТ либо вернет ошибку, либо сбросит регистрацию на отдел по умолчанию.
  3. Специфика форматов фискальных документов (ФФД): По требованиям 54-ФЗ реквизит номера секции не входит в число обязательных фискальных тегов чека (в отличие от НДС, признаков предмета и способа расчета), поэтому в ранних редакциях драйверов для онлайн-касс его поддержка работала с перебоями.

Способ 1. Замена версии интеграционной компоненты

Если в конфигурации используется стандартный механизм вызова СформироватьЧек() по стандарту БПО, наиболее быстрым решением является установка стабильной версии библиотеки, корректно обрабатывающей атрибут Department.

  1. Проверим текущую версию установленной библиотеки в 1С (в настройках подключаемого оборудования).
  2. Заменим проблемную версию DLL (например, 8.15.х) на стабильную сборку 8.12.1.0 (FprnM1C82_54FZ.dll / FprnM1C.dll).
  3. Перерегистрируем компоненту в системе и обновим макет внешней компоненты в конфигураторе 1С при необходимости.

Способ 2. Прямое управление через нативный COM-объект драйвера

Если требуется гарантированная работа независимо от ошибок 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

Способ 3. Переход на современный драйвер ДТО 10

Если конфигурация поддерживает современные версии БПО, рекомендуется перейти на линейку драйверов АТОЛ 10.х (компонента AddIn.Fptr10). В актуальных версиях ДТО 10 обработка атрибута Department (параметр LIBFPTR_PARAM_DEPARTMENT) в пакетах CheckPackage полностью исправлена разработчиками и работает в штатном режиме.

Проверка настроек таблиц ККТ

Перед повторным тестированием печати обязательно проверим внутренние таблицы кассы с помощью утилиты «Тест драйвера ККТ»:

  1. Откроем утилиту и перейдем в раздел Параметры ККТ / Таблицы.
  2. Проверим таблицу «Секции»: убедимся, что нужные отделы (например, Секция 2, Секция 3) включены, не заблокированы и имеют корректные названия.
  3. Проверим таблицу «Налоги»: убедимся, что номер налога, закрепленный за секцией в ККТ, соответствует ставке НДС, передаваемой из 1С.
← На главную