При работе с торговым оборудованием в старых релизах 1С:Управление нашей фирмой (УНФ), таких как 1.6.8.28, пользователи часто сталкиваются с критической ошибкой при попытке открыть кассовую смену. Проблема проявляется внезапно: даже если вчера всё работало корректно, сегодня система может выдать сообщение: «Ошибка вызова метода <ОбъектДрайвера.ОткрытьСмену>. Недостаточно фактических параметров». Особенно часто это происходит при использовании фискальных регистраторов семейства Viki Print (57Ф, 80Ф) от компании Дримкас.
В данной статье мы подробно разберем, почему возникает этот программный конфликт, проанализируем внутренний код системы и подготовим пошаговый план решения проблемы.
Давайте проанализируем ситуацию. Ошибка Недостаточно фактических параметров на языке 1С означает, что вызываемая функция или метод ожидает на вход определенное количество значений (аргументов), а программный код передает их меньше, чем требуется.
Рассмотрим, как развивалась Библиотека подключаемого оборудования (БПО), которая встроена в вашу 1С. В старых стандартах (ревизия интерфейса 1.04 и ниже) метод ОткрытьСмену принимал только один параметр — ИДУстройства. Однако с развитием законодательства и обновлением драйверов производителями оборудования (в частности, переход на драйверы версии 1.2.х от Дримкас), метод был модернизирован. Теперь он требует два или более параметров (например, добавляется выходной параметр для массива данных ответа от ККТ).
Конфигурация УНФ 1.6.8 — это достаточно старый релиз. Ее программный код «застыл» на этапе использования одного параметра. Когда вы обновляете драйвер ККТ на компьютере или в системе регистрируется новая компонента AddIn.DRVFR, старый код 1С пытается вызвать метод по-старому, а новая библиотека драйвера «отказывается» работать, так как не получила ожидаемого второго параметра.
Давайте заглянем «под капот» системы. Обратим внимание на общий модуль ПодключаемоеОборудованиеУниверсальныйДрайвер. Именно там происходит формирование команды к драйверу. Проанализируем типичный фрагмент кода, где возникает сбой:
ИначеЕсли ПараметрыПодключения.ТипОборудования = "ФискальныйРегистратор" Тогда
// Ветка на стандарт 1.4. Поддержка команды драйвера "ОткрытьСмену".
Если ПараметрыПодключения.РевизияИнтерфейса > 1004 Тогда
Попытка
Результат = ОбъектДрайвера.ОткрытьСмену(ПараметрыПодключения.ИДУстройства);
Исключение
Результат = Ложь;
ВыходныеПараметры.Очистить();
ВыходныеПараметры.Добавить(999);
ВыходныеПараметры.Добавить(НСтр("ru='Ошибка вызова метода <ОбъектДрайвера.ОткрытьСмену>.'") + Символы.ПС + ОписаниеОшибки());
Возврат Результат;
КонецПопытки;
В строке Результат = ОбъектДрайвера.ОткрытьСмену(ПараметрыПодключения.ИДУстройства); мы видим передачу только одного аргумента. Если установленная в Windows внешняя компонента (DLL) драйвера Viki Print ожидает два аргумента, выполнение сразу уходит в блок Исключение, и мы получаем ту самую ошибку.
Если вы не хотите вносить изменения в конфигурацию 1С (снимать ее с поддержки), самым правильным решением будет принудительное использование старой, стабильной ветки драйверов 1.1.0. Разберем этот процесс по шагам:
regsvr32 /u AddIn.DRVFR.dll (если вы знаете путь к файлу). Также обязательно удалите содержимое папок:
%AppData%\Roaming\1C\1cv8\ExtCompT%AppData%\Local\TempЕсли обновление драйвера невозможно (например, вам требуются функции новых версий для работы с ФФД 1.05 или 1.2), необходимо адаптировать код 1С под требования драйвера. Для этого нам потребуется внести изменения в модуль ПодключаемоеОборудованиеУниверсальныйДрайвер.
Рассмотрим вариант исправления. Нам нужно добавить второй параметр в вызов метода ОткрытьСмену. Даже если этот параметр не будет использоваться конфигурацией в дальнейшем, его наличие позволит драйверу успешно выполнить команду.
Скорректированный код будет выглядеть так:
// Добавляем переменную для приема выходных параметров, если это требуется драйвером
ВыходныеДанныеДрайвера = Неопределено;
Попытка
// Вызываем метод с двумя параметрами
Результат = ОбъектДрайвера.ОткрытьСмену(ПараметрыПодключения.ИДУстройства, ВыходныеДанныеДрайвера);
Исключение
// Если драйвер совсем старый и не принял два параметра, пробуем вызвать с одним (fallback-вариант)
Попытка
Результат = ОбъектДрайвера.ОткрытьСмену(ПараметрыПодключения.ИДУстройства);
Исключение
// Здесь уже обрабатываем окончательную ошибку
Результат = Ложь;
// ... (код очистки ВыходныеПараметры как в оригинале)
КонецПопытки;
КонецПопытки;
Использование конструкции Попытка...Исключение внутри другой попытки позволяет сделать код универсальным для разных версий драйверов Dreamkas.
Важно отметить ситуацию, когда ККТ используется в режиме без ОФД (сообщение 9 в теме). В 1С такое оборудование часто регистрируется как «Фискальный регистратор», а не «ККТ с передачей данных». Для «Фискальных регистраторов» 1С использует упрощенные алгоритмы взаимодействия.
Проанализируем настройки оборудования: если вы используете современную версию драйвера (ветка 1.2), но при этом работаете в автономном режиме, попробуйте в настройках драйвера внутри 1С принудительно установить «Ревизию интерфейса» в значение 2001 или выше, если это позволяет драйвер. Это может заставить 1С использовать более современные методы обращения к компоненте. Однако для УНФ 1.6.8 этот путь редко бывает успешным без обновления самой БПО.
Подводя итог, можно сказать, что проблема носит чисто технический характер и связана с «конфликтом поколений» программного обеспечения.
Основные выводы:
AppData.regsvr32 /u.ОткрытьСмену решит проблему раз и навсегда для текущей версии драйвера.Помните, что любые манипуляции с оборудованием и кодом лучше проводить после создания резервной копии базы данных.