Как исправить ошибку подключения внешней компоненты драйвера ККТ при доработке конфигурации 1С

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

При адаптации нетиповых и устаревших конфигураций (например, 1С:Управление торговлей 10.3) под работу с онлайн-кассами по требованиям 54-ФЗ разработчики часто сталкиваются с ситуацией, когда метод подключения внешней компоненты возвращает Ложь, а при последующем обращении к объекту драйвера возникает исключение: Значение не является значением объектного типа (Драйвер).

Разберем по шагам, почему возникает эта ошибка, как устроена работа интеграционных компонент ККТ в 1С и какими способами можно наладить стабильную печать фискальных чеков.

Причины сбоя инициализации драйвера торгового оборудования

Проанализируем фрагмент кода, на котором происходит падение алгоритма:


Макет = ПолучитьМакет("ИнтеграционнаяКомпонента");
Адрес = ПоместитьВоВременноеХранилище(Макет);
Результат = ПодключитьВнешнююКомпоненту(Адрес, "ИнтеграционнаяКомпонента", ТипВнешнейКомпоненты.Native);
Драйвер = Новый("AddIn.ИнтеграционнаяКомпонента.SMDrvFR1C20");
РезультатВыполнения = ПодключаемоеОборудованиеУниверсальныйДрайверКлиент.ВыполнитьКоманду("ПолучитьОписаниеДрайвера", ...);

Если функция ПодключитьВнешнююКомпоненту не смогла загрузить библиотеку в память процесса, объект Драйвер не создается (остается равным Неопределено), и любая последующая попытка вызова его методов приводит к аварийной остановке программы. Выделим ключевые причины такого поведения:

  1. Отсутствие базового низкоуровневого драйвера производителя в операционной системе. Макет ИнтеграционнаяКомпонента (например, SMDrvFR1C20 для оборудования «Штрих-М») содержит не самостоятельный драйвер управления кассой, а лишь транслятор команд по стандарту «1С:Совместимо». Для его функционирования в ОС обязательно должен быть установлен официальный дистрибутив драйвера производителя ККТ (содержащий базовую библиотеку DrvFR.dll и системные зависимости). Без него интеграционная компонента не сможет инициализироваться.
  2. Несовпадение разрядности клиента 1С и библиотек драйвера. Подавляющее большинство внешних компонент торгового оборудования для обычных форм и старых версий БПО разработано в 32-битном варианте (x86). Если запуск сеанса 1С выполнен через 64-разрядный клиент (x64), 32-битная DLL-библиотека не загрузится.
  3. Несоответствие программного идентификатора версии стандарта. Имя класса при создании объекта строго регламентировано версией требований 1С. Например, для стандарта 2.0 используется AddIn.ИнтеграционнаяКомпонента.SMDrvFR1C20, а для более свежих ревизий — AddIn.ИнтеграционнаяКомпонента.SMDrvFR1C22. Если в макете сохранена библиотека одной ревизии, а в коде вызывается класс другой, инициализация завершится ошибкой.
  4. Отсутствие необходимых библиотек Microsoft Visual C++ Redistributable. Для загрузки Native-компонент в Windows требуются соответствующие системные библиотеки среды выполнения C++ x86.

Способ 1. Установка пакета драйверов и настройка подсистемы БПО

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

  1. Установка драйвера производителя. Скачаем и установим на рабочее место кассира (или на сервер терминалов RDP) полный дистрибутив драйвера ККТ производителя («Штрих-М: Драйвер ККТ» или «АТОЛ: Драйвер ККТ») от имени администратора.
  2. Проверка разрядности платформы. Убедимся, что ярлык запуска 1С ссылается на 32-битный исполняемый файл платформы (каталог C:\Program Files (x86)\1cv8\...).
  3. Диагностика загрузки компоненты в коде. Добавим обработку исключительных ситуаций, чтобы точно видеть системное описание ошибки, если загрузка не удалась:

Макет = ПолучитьМакет("ИнтеграционнаяКомпонента");
Адрес = ПоместитьВоВременноеХранилище(Макет);

Если Не ПодключитьВнешнююКомпоненту(Адрес, "ИнтеграционнаяКомпонента", ТипВнешнейКомпоненты.Native) Тогда
    ВызватьИсключение "Не удалось подключить внешнюю компоненту драйвера из макета!";
КонецЕсли;

Попытка
    Драйвер = Новый("AddIn.ИнтеграционнаяКомпонента.SMDrvFR1C20");
Исключение
    Сообщить("Ошибка создания объекта драйвера: " + ОписаниеОшибки(), СтатусСообщения.Важное);
    Возврат;
КонецПопытки;

Способ 2. Использование актуальной внешней обработки обслуживания

Чтобы исключить ошибки ручного переноса кода и макетов между конфигурациями разных поколений, целесообразно использовать готовые внешние обработки обслуживания торгового оборудования:

  1. Возьмем типовую внешнюю обработку обслуживания ККТ с передачей данных (например, ShtrihMkkt.epf) из релизов конфигураций, где поддержка 54-ФЗ уже реализована разработчиками 1С.
  2. Подключим обработку через справочник Торговое оборудование (или Обработки обслуживания ТО).
  3. Выполним установку драйвера непосредственно из формы настройки оборудования в режиме 1С:Предприятие — обработка сама распакует нужную компоненту и выполнит ее корректную регистрацию.

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

Если конфигурация сильно переработана, а внедрение современных библиотек БПО требует слишком масштабных изменений метаданных, рассмотрим альтернативный вариант — прямое обращение к зарегистрированному в системе COM-серверу производителя кассы.

Этот способ позволяет работать с фискальным регистратором напрямую в обход стандартов БПО 1С:


Попытка
    ДрайверФР = Новый COMОбъект("AddIn.DrvFR");
Исключение
    Сообщить("COM-объект драйвера Штрих-М не зарегистрирован в системе: " + ОписаниеОшибки());
    Возврат;
КонецПопытки;

// Настройка параметров подключения
ДрайверФР.ComNumber = 1; // Номер COM-порта
ДрайверФР.BaudRate = 4;  // Скорость обмена (115200)
ДрайверФР.Password = 30; // Пароль системного администратора

Если ДрайверФР.Connect() <> 0 Тогда
    Сообщить("Не удалось установить связь с ККТ: " + ДрайверФР.ResultCodeDescription);
КонецЕсли;

Важно: при прямой работе через COM-объект разработчик берет на себя полную ответственность за корректное заполнение фискальных реквизитов чека по 54-ФЗ (передача признаков способа расчета, ставок НДС, реквизитов покупателя и номеров фискальных тегов).

← На главную