При интеграции торгового оборудования, в частности ККТ АТОЛ 10-й серии, программисты 1С часто сталкиваются с неприятной ситуацией: при попытке подключения устройства или открытии формы настроек система выдает исключение: «Слишком много фактических параметров». Ошибка локализуется в общем модуле ПодключаемоеОборудованиеУниверсальныйДрайверКлиент при вызове метода ПолучитьОписание. Давайте детально разберем, почему это происходит и как привести систему в рабочее состояние.
Проанализируем ситуацию. Проблема кроется в эволюции стандарта интеграции «1С:Совместимо». Фирма «1С» и производители оборудования (в данном случае АТОЛ) постоянно обновляют требования к драйверам для поддержки новых фискальных данных (ФФД 1.05, 1.1, 1.2). В старых версиях Библиотеки подключаемого оборудования (БПО) метод ПолучитьОписание ожидал 4 или 5 параметров. В современных редакциях количество аргументов увеличилось до 7.
Конфликт возникает, когда программный код 1С (конфигурация) уже обновлен и пытается передать 7 параметров, но загруженная в память сеанса внешняя компонента (драйвер Atol_KKT_1C83_V10.dll) является устаревшей и «знает» только о 5 параметрах. Или же наоборот — платформа пытается использовать новую компоненту по старым правилам. В случае с конфигурацией «Управление холдингом» 3.0.6.15, мы имеем дело с версией, где механизмы БПО могут некорректно определять ревизию интерфейса драйвера.
Рассмотрим фрагмент кода, на котором происходит сбой:
ОбъектДрайвера.ПолучитьОписание(НаименованиеДрайвера,
ОписаниеДрайвера,
ТипОборудования,
РевизияИнтерфейса,
ИнтеграционныйКомпонент,
ОсновнойДрайверУстановлен,
URLЗагрузкиДрайвера);
Если ОбъектДрайвера был инициализирован из компоненты старого образца, выполнение прервется, так как сигнатура метода в DLL не совпадает с вызовом в 1С.
Выясним причину, почему 1С может подхватывать старую библиотеку. Часто это связано с механизмом кэширования. При первой установке драйвера 1С копирует DLL-файл в локальную папку пользователя. Даже если вы обновили версию драйвера в самой базе (через справочник «Драйверы оборудования»), система может продолжать обращаться к старой копии на диске.
Выполним следующие шаги для очистки системы:
%AppData%\Local\1C\1cv8\ExtCompDir.dbgs, config и прочие в каталоге %AppData%\Local\1C\1cv8\).После очистки запустим 1С и проверим работоспособность. В большинстве случаев этот простой метод решает проблему «фантомных» старых версий.
Рассмотрим ситуацию, когда в макете самой конфигурации зашита устаревшая версия компоненты. Даже если вы установили на компьютер свежий Драйвер ККТ 10.9.x, 1С может использовать встроенный макет.
Разберем алгоритм действий по обновлению драйвера напрямую из дистрибутива:
C:\Program Files (x86)\ATOL\Drivers10\KKT\1c\Atol_KKT_1C83_V10.zip (или распакованная DLL).Важный момент: обратите внимание на разрядность. Если вы используете 64-битный клиент 1С, вам обязательно нужна 64-битная компонента драйвера, иначе вызовы методов будут возвращать неочевидные ошибки или объект вообще не будет создан.
Проанализируем ситуацию, когда автоматическая регистрация компоненты силами 1С не срабатывает из-за ограничений прав доступа в Windows. В этом случае мы можем зарегистрировать библиотеку вручную.
Выполним регистрацию через regsvr32:
regsvr32 "C:\Program Files (x86)\ATOL\Drivers10\KKT\bin\Atol_KKT_1C83_V10.dll"
После ручной регистрации 1С должна корректно инициализировать объект AddIn.ATOL_KKT_1C83_V10 и увидеть все семь параметров метода ПолучитьОписание.
Если вы используете достаточно старый релиз конфигурации (например, «Управление холдингом» версии 3.0.6.15), встроенная в неё БПО может быть физически не готова к работе с самыми последними выпусками драйверов АТОЛ (например, 10.10 или выше). В коде БПО может стоять жесткая проверка на РевизияИнтерфейса, и если драйвер возвращает новую ревизию, которую 1С еще не знает, код может ошибочно выбирать не ту ветку исполнения.
В такой ситуации проанализируем возможность отката на стабильную версию драйвера. Попробуйте установить версию драйвера АТОЛ 10.6.х или 10.8.х. Эти версии считаются наиболее стабильными для конфигураций 1С трех-четырехлетней давности. При этом не забудьте удалить более новую версию драйвера через «Панель управления» перед установкой старой.
Если вы занимаетесь отладкой и хотите точно знать, что «видит» 1С, можно воспользоваться средствами встроенного языка. Посмотрим на пример кода, который поможет вам продиагностировать объект в режиме отладки:
Попытка
// Попробуем вызвать метод с 7 параметрами
ОбъектДрайвера.ПолучитьОписание(П1, П2, П3, П4, П5, П6, П7);
Сообщить("Драйвер поддерживает 7 параметров");
Исключение
Инфо = ИнформацияОбОшибке();
Сообщить("Ошибка: " + Инфо.Описание);
// Если ошибка "Слишком много параметров", значит драйвер старый (нужно 5)
КонецПопытки;
Использование подобных конструкций позволяет временно «заплатать» типовой код, если обновить драйвер или конфигурацию не представляется возможным прямо сейчас. Однако правильным решением всегда будет приведение в соответствие версии БПО в 1С и версии интеграционной компоненты АТОЛ.
Резюме: в большинстве случаев ошибка лечится очисткой кэша в папке AppData или принудительным обновлением компоненты в справочнике драйверов 1С из официального дистрибутива АТОЛ. Если же это не помогает, стоит обратить внимание на совместимость версии БПО и ревизии интерфейса конкретного релиза драйвера.