Как исправить ошибку «Поле агрегатного объекта не обнаружено (СформироватьЧек)» при подключении кассы АТОЛ в 1С 7.7?

Программист 1С v7.7 Управленческий учет Торговля и дистрибуция
← На главную

При интеграции современных онлайн-касс АТОЛ (например, АТОЛ 30Ф, 55Ф, 22Ф) с конфигурацией «Торговля и Склад 7.7» через типовые или доработанные обработки обслуживания (frATOL54_comm.ert) разработчики часто сталкиваются с ошибкой выполнения кода:

Поле агрегатного объекта не обнаружено (СформироватьЧек)

Разберем детально, почему возникает данный сбой, как правильно зарегистрировать необходимую библиотеку в операционной системе Windows Server и как настроить программный код 1С для стабильного взаимодействия с фискальным регистратором.

1. Причина возникновения ошибки

Проанализируем архитектуру драйверов АТОЛ. Исторически для работы с торговым оборудованием в 1С 7.7 использовалась внешняя компонента FprnM1C.dll с программным идентификатором AddIn.FprnM45. Этот драйвер работал по низкоуровневому протоколу, управляя печатью построчно через команды открытия чека, регистрации позиции и закрытия чека.

С переходом на требования 54-ФЗ фирма «1С» разработала унифицированный стандарт взаимодействия с ККТ, реализованный в библиотеке FprnM1C82_54FZ.dll (идентификатор AddIn.ATOL_KKM_1C82_54FZ). Именно в этой компоненте реализован высокоуровневый метод СформироватьЧек, принимающий данные фискального документа в виде XML-пакета.

Ошибка возникает в тех случаях, когда обработка обслуживания пытается вызвать метод СформироватьЧек, но в памяти инициализирован объект старого драйвера (AddIn.FprnM45), либо внешняя компонента нового стандарта вовсе не смогла зарегистрироваться в системе и загрузиться в сеанс 1С.

2. Правильная регистрация компоненты на 64-битной Windows Server

Выясним причину сбоев при регистрации FprnM1C82_54FZ.dll через стандартный вызов regsvr32. Платформа 1С:Предприятие 7.7 является 32-разрядным приложением (x86). При попытке зарегистрировать библиотеку в 64-битной среде Windows через обычную командную строку часто возникают ошибки отсутствия CLSID или сбои инициализации точки входа.

Разберем по шагам, как корректно выполнить регистрацию:

  1. Убедимся в наличии библиотек сред выполнения: для работы DTO 8 требуются пакеты Microsoft Visual C++ Redistributable (версии 2008, 2010 и 2013) исключительно в редакции x86 (32-bit), даже если сервер 64-битный.
  2. Библиотека FprnM1C82_54FZ.dll зависит от низкоуровневых библиотек ядра АТОЛ (FprnM.dll и сопутствующих файлов). Регистрировать компоненту следует непосредственно в каталоге установки драйвера, например: C:\Program Files (x86)\ATOL\Drivers8\Bin_Free\.
  3. Для успешной записи в ветки системного реестра запускаем командную строку от имени Администратора и используем 32-разрядный регистратор SysWOW64. Создадим командный файл .bat со следующим содержимым:

cd /d "C:\Program Files (x86)\ATOL\Drivers8\Bin_Free"
C:\Windows\SysWOW64\regsvr32.exe "FprnM1C82_54FZ.dll"
pause

Запуск командного файла обязательно выполняем через контекстное меню: Запуск от имени администратора. Сообщение «DllRegisterServer в FprnM1C82_54FZ.dll успешно завершено» подтверждает корректную привязку библиотеки в системе.

3. Доработка функции подключения к фискальному регистратору

Посмотрим на пример адаптации типовой функции подключения оборудования в обработке обслуживания. Для новой компоненты требуется явно передать параметры порта, скорости и модели оборудования перед вызовом метода Подключить.


Функция ПодключитьсяКФР(Объект)
    Рез = 0;
    
    Если ПустаяСтрока(глФРИДУстройства) = 0 Тогда
        Рез = 1;
    Иначе
        // Номер COM-порта: COM1 - 1001, COM2 - 1002, ..., COM8 - 1008
        ПортНомер = 1008;
        Объект.УстановитьПараметр("PortNumber", ПортНомер);
        
        // Скорость обмена: 18 соответствует 115200, 2 соответствует 1200
        ПортСкорость = 18;
        Объект.УстановитьПараметр("BaudRate", ПортСкорость);
        
        // Код модели кассы: 61 соответствует АТОЛ 30Ф
        Модель = 61;
        Объект.УстановитьПараметр("Model", Модель);  
        
        глФРИДУстройства = "";
        Объект.Подключить(глФРИДУстройства);
        
        ОписаниеПоследнейОшибки = "";
        КодПоследнейОшибки = Объект.GetLastError(ОписаниеПоследнейОшибки);
        
        Если СокрЛП(ОписаниеПоследнейОшибки) = "Ошибок нет" Тогда
            Рез = 1;
        Иначе    
            ОписаниеРезультата = ОписаниеПоследнейОшибки;
        КонецЕсли;
    КонецЕсли;
    
    Возврат Рез;
КонецФункции

Для создания универсального интерфейса настроек торгового оборудования рассмотрим справочные списки значений, которые сопоставляют внутренние коды компоненты с понятными пользователю наименованиями.

Справочник моделей устройств АТОЛ:


ПараметрыПодключенияМодель = СоздатьОбъект("СписокЗначений"); 
ПараметрыПодключенияМодель.ДобавитьЗначение("67", "АТОЛ 11Ф");
ПараметрыПодключенияМодель.ДобавитьЗначение("78", "АТОЛ 15Ф");
ПараметрыПодключенияМодель.ДобавитьЗначение("63", "АТОЛ 22Ф / Fprint-22ПТК");
ПараметрыПодключенияМодель.ДобавитьЗначение("57", "АТОЛ 25Ф");
ПараметрыПодключенияМодель.ДобавитьЗначение("61", "АТОЛ 30Ф");
ПараметрыПодключенияМодель.ДобавитьЗначение("77", "АТОЛ 42ФС");
ПараметрыПодключенияМодель.ДобавитьЗначение("64", "АТОЛ 52Ф");
ПараметрыПодключенияМодель.ДобавитьЗначение("62", "АТОЛ 55Ф");
ПараметрыПодключенияМодель.ДобавитьЗначение("75", "АТОЛ 60Ф"); 
ПараметрыПодключенияМодель.ДобавитьЗначение("69", "АТОЛ 77Ф");
ПараметрыПодключенияМодель.ДобавитьЗначение("72", "АТОЛ 90Ф");
ПараметрыПодключенияМодель.ДобавитьЗначение("74", "Эвотор СТ2Ф");

Справочник скоростей передачи данных (BaudRate):


ПараметрыПодключенияСкорость = СоздатьОбъект("СписокЗначений"); 
ПараметрыПодключенияСкорость.ДобавитьЗначение("2",  "1200");
ПараметрыПодключенияСкорость.ДобавитьЗначение("4",  "2400");
ПараметрыПодключенияСкорость.ДобавитьЗначение("5",  "4800");
ПараметрыПодключенияСкорость.ДобавитьЗначение("7",  "9600");
ПараметрыПодключенияСкорость.ДобавитьЗначение("9",  "14400");
ПараметрыПодключенияСкорость.ДобавитьЗначение("10", "19200");
ПараметрыПодключенияСкорость.ДобавитьЗначение("12", "38400");
ПараметрыПодключенияСкорость.ДобавитьЗначение("14", "57600");
ПараметрыПодключенияСкорость.ДобавитьЗначение("18", "115200");

Номера COM-портов в драйвере кодируются со смещением: COM1 соответствует значению 1001, COM8 — значению 1008, а для сетевых интерфейсов используются значения 110 (UDP/IP) и 99 (TCP/IP клиент).

4. Формирование фискальных реквизитов в XML

При передаче документа в метод СформироватьЧек драйвер выполняет разбор XML-структуры. Важно корректно заполнить параметры налогообложения и ставок НДС по каждой товарной строке:

  1. Система налогообложения (СНО): атрибут TaxVariant в корневом теге фискализации должен содержать числовой код применяемой СНО (например, 1 — общая система налогообложения, ОСН).
  2. Ставки налога: в атрибуте Tax товарной позиции передается не процентная ставка и не наименование, а строго регламентированные драйвером строковые идентификаторы: "none" (без НДС), "0", "10", "18" или "20".

// Передача системы налогообложения чека
Атрибут(XMLParameters, "TaxVariant", 1);

// Формирование ставки НДС для позиции чека
Если СокрЛП(СписокТоваров.СтавкаНДС) = "Без НДС" Тогда
    ЗначениеСтавки = "none";
Иначе
    // Передаем числовое значение (0, 10, 18, 20)
    ЗначениеСтавки = Строка(СписокТоваров.НДС);
КонецЕсли;

Атрибут(XMLFiscalString, "Tax", ЗначениеСтавки);

5. Нюансы работы в терминальной среде (RDP)

Если работа в 1С 7.7 организована через удаленный рабочий стол, учтем следующие особенности эксплуатации касс АТОЛ:

  1. Кассы АТОЛ с подключением по USB эмулируют два виртуальных последовательных порта. Первый порт предназначен для передачи фискальных команд, второй — для службы передачи чеков в ОФД (EthernetOverUSB / EoU).
  2. В терминальную RDP-сессию следует пробрасывать только порт управления ККТ. Службу EthOverUsb рекомендуется запускать локально на физическом компьютере пользователя. Это исключает конфликты блокировки портов между различными сессиями на сервере.
  3. Если проброшенный порт в терминале периодически теряет связь или меняет свой номер, рекомендуется закрепить номер порта в диспетчере устройств клиента либо использовать сторонние утилиты проброса COM-портов по протоколу TCP/IP.

Таким образом, для устранения ошибки достаточно использовать корректную библиотеку FprnM1C82_54FZ.dll, выполнить ее регистрацию под правами администратора через 32-разрядный регистратор и передать в коде обработки правильные идентификаторы порта, скорости и модели ККТ.

← На главную