При адаптации нетиповых и устаревших конфигураций (например, 1С:Управление торговлей 10.3) под работу с онлайн-кассами по требованиям 54-ФЗ разработчики часто сталкиваются с ситуацией, когда метод подключения внешней компоненты возвращает Ложь, а при последующем обращении к объекту драйвера возникает исключение: Значение не является значением объектного типа (Драйвер).
Разберем по шагам, почему возникает эта ошибка, как устроена работа интеграционных компонент ККТ в 1С и какими способами можно наладить стабильную печать фискальных чеков.
Проанализируем фрагмент кода, на котором происходит падение алгоритма:
Макет = ПолучитьМакет("ИнтеграционнаяКомпонента");
Адрес = ПоместитьВоВременноеХранилище(Макет);
Результат = ПодключитьВнешнююКомпоненту(Адрес, "ИнтеграционнаяКомпонента", ТипВнешнейКомпоненты.Native);
Драйвер = Новый("AddIn.ИнтеграционнаяКомпонента.SMDrvFR1C20");
РезультатВыполнения = ПодключаемоеОборудованиеУниверсальныйДрайверКлиент.ВыполнитьКоманду("ПолучитьОписаниеДрайвера", ...);
Если функция ПодключитьВнешнююКомпоненту не смогла загрузить библиотеку в память процесса, объект Драйвер не создается (остается равным Неопределено), и любая последующая попытка вызова его методов приводит к аварийной остановке программы. Выделим ключевые причины такого поведения:
ИнтеграционнаяКомпонента (например, SMDrvFR1C20 для оборудования «Штрих-М») содержит не самостоятельный драйвер управления кассой, а лишь транслятор команд по стандарту «1С:Совместимо». Для его функционирования в ОС обязательно должен быть установлен официальный дистрибутив драйвера производителя ККТ (содержащий базовую библиотеку DrvFR.dll и системные зависимости). Без него интеграционная компонента не сможет инициализироваться.AddIn.ИнтеграционнаяКомпонента.SMDrvFR1C20, а для более свежих ревизий — AddIn.ИнтеграционнаяКомпонента.SMDrvFR1C22. Если в макете сохранена библиотека одной ревизии, а в коде вызывается класс другой, инициализация завершится ошибкой.Рассмотрим правильный порядок действий для запуска оборудования через стандартные механизмы интеграции 1С:
C:\Program Files (x86)\1cv8\...).
Макет = ПолучитьМакет("ИнтеграционнаяКомпонента");
Адрес = ПоместитьВоВременноеХранилище(Макет);
Если Не ПодключитьВнешнююКомпоненту(Адрес, "ИнтеграционнаяКомпонента", ТипВнешнейКомпоненты.Native) Тогда
ВызватьИсключение "Не удалось подключить внешнюю компоненту драйвера из макета!";
КонецЕсли;
Попытка
Драйвер = Новый("AddIn.ИнтеграционнаяКомпонента.SMDrvFR1C20");
Исключение
Сообщить("Ошибка создания объекта драйвера: " + ОписаниеОшибки(), СтатусСообщения.Важное);
Возврат;
КонецПопытки;
Чтобы исключить ошибки ручного переноса кода и макетов между конфигурациями разных поколений, целесообразно использовать готовые внешние обработки обслуживания торгового оборудования:
ShtrihMkkt.epf) из релизов конфигураций, где поддержка 54-ФЗ уже реализована разработчиками 1С.Если конфигурация сильно переработана, а внедрение современных библиотек БПО требует слишком масштабных изменений метаданных, рассмотрим альтернативный вариант — прямое обращение к зарегистрированному в системе COM-серверу производителя кассы.
Этот способ позволяет работать с фискальным регистратором напрямую в обход стандартов БПО 1С:
Попытка
ДрайверФР = Новый COMОбъект("AddIn.DrvFR");
Исключение
Сообщить("COM-объект драйвера Штрих-М не зарегистрирован в системе: " + ОписаниеОшибки());
Возврат;
КонецПопытки;
// Настройка параметров подключения
ДрайверФР.ComNumber = 1; // Номер COM-порта
ДрайверФР.BaudRate = 4; // Скорость обмена (115200)
ДрайверФР.Password = 30; // Пароль системного администратора
Если ДрайверФР.Connect() <> 0 Тогда
Сообщить("Не удалось установить связь с ККТ: " + ДрайверФР.ResultCodeDescription);
КонецЕсли;
Важно: при прямой работе через COM-объект разработчик берет на себя полную ответственность за корректное заполнение фискальных реквизитов чека по 54-ФЗ (передача признаков способа расчета, ставок НДС, реквизитов покупателя и номеров фискальных тегов).