При интеграции современных онлайн-касс АТОЛ (например, АТОЛ 30Ф, 55Ф, 22Ф) с конфигурацией «Торговля и Склад 7.7» через типовые или доработанные обработки обслуживания (frATOL54_comm.ert) разработчики часто сталкиваются с ошибкой выполнения кода:
Поле агрегатного объекта не обнаружено (СформироватьЧек)
Разберем детально, почему возникает данный сбой, как правильно зарегистрировать необходимую библиотеку в операционной системе Windows Server и как настроить программный код 1С для стабильного взаимодействия с фискальным регистратором.
Проанализируем архитектуру драйверов АТОЛ. Исторически для работы с торговым оборудованием в 1С 7.7 использовалась внешняя компонента FprnM1C.dll с программным идентификатором AddIn.FprnM45. Этот драйвер работал по низкоуровневому протоколу, управляя печатью построчно через команды открытия чека, регистрации позиции и закрытия чека.
С переходом на требования 54-ФЗ фирма «1С» разработала унифицированный стандарт взаимодействия с ККТ, реализованный в библиотеке FprnM1C82_54FZ.dll (идентификатор AddIn.ATOL_KKM_1C82_54FZ). Именно в этой компоненте реализован высокоуровневый метод СформироватьЧек, принимающий данные фискального документа в виде XML-пакета.
Ошибка возникает в тех случаях, когда обработка обслуживания пытается вызвать метод СформироватьЧек, но в памяти инициализирован объект старого драйвера (AddIn.FprnM45), либо внешняя компонента нового стандарта вовсе не смогла зарегистрироваться в системе и загрузиться в сеанс 1С.
Выясним причину сбоев при регистрации FprnM1C82_54FZ.dll через стандартный вызов regsvr32. Платформа 1С:Предприятие 7.7 является 32-разрядным приложением (x86). При попытке зарегистрировать библиотеку в 64-битной среде Windows через обычную командную строку часто возникают ошибки отсутствия CLSID или сбои инициализации точки входа.
Разберем по шагам, как корректно выполнить регистрацию:
FprnM1C82_54FZ.dll зависит от низкоуровневых библиотек ядра АТОЛ (FprnM.dll и сопутствующих файлов). Регистрировать компоненту следует непосредственно в каталоге установки драйвера, например: C:\Program Files (x86)\ATOL\Drivers8\Bin_Free\.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 успешно завершено» подтверждает корректную привязку библиотеки в системе.
Посмотрим на пример адаптации типовой функции подключения оборудования в обработке обслуживания. Для новой компоненты требуется явно передать параметры порта, скорости и модели оборудования перед вызовом метода Подключить.
Функция ПодключитьсяКФР(Объект)
Рез = 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 клиент).
При передаче документа в метод СформироватьЧек драйвер выполняет разбор XML-структуры. Важно корректно заполнить параметры налогообложения и ставок НДС по каждой товарной строке:
TaxVariant в корневом теге фискализации должен содержать числовой код применяемой СНО (например, 1 — общая система налогообложения, ОСН).Tax товарной позиции передается не процентная ставка и не наименование, а строго регламентированные драйвером строковые идентификаторы: "none" (без НДС), "0", "10", "18" или "20".
// Передача системы налогообложения чека
Атрибут(XMLParameters, "TaxVariant", 1);
// Формирование ставки НДС для позиции чека
Если СокрЛП(СписокТоваров.СтавкаНДС) = "Без НДС" Тогда
ЗначениеСтавки = "none";
Иначе
// Передаем числовое значение (0, 10, 18, 20)
ЗначениеСтавки = Строка(СписокТоваров.НДС);
КонецЕсли;
Атрибут(XMLFiscalString, "Tax", ЗначениеСтавки);
Если работа в 1С 7.7 организована через удаленный рабочий стол, учтем следующие особенности эксплуатации касс АТОЛ:
EthOverUsb рекомендуется запускать локально на физическом компьютере пользователя. Это исключает конфликты блокировки портов между различными сессиями на сервере.Таким образом, для устранения ошибки достаточно использовать корректную библиотеку FprnM1C82_54FZ.dll, выполнить ее регистрацию под правами администратора через 32-разрядный регистратор и передать в коде обработки правильные идентификаторы порта, скорости и модели ККТ.