Как правильно подключить внешнюю компоненту ККТ Штрих-М в 1С и исправить ошибку «Тип не определен»

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При разработке или доработке конфигураций 1С часто возникает задача интеграции торгового оборудования, в частности кассовых аппаратов (ККТ) «Штрих-М». Несмотря на наличие готовых библиотек в типовых решениях (БСП), в самописных конфигурациях разработчики нередко сталкиваются с трудностями при подключении внешних компонент. Ошибки типа «Тип не определен» или «Недопустимая строка с указанием класса» могут поставить в тупик даже опытного программиста. Разберем детально, почему возникают эти проблемы и как их решить двумя основными способами.

Анализ проблемы: почему стандартное подключение не работает

Проанализируем типичную ситуацию. Разработчик берет драйвер из типовой конфигурации (например, «Бухгалтерия предприятия 3.0»), упаковывает его в архив с манифестом, загружает в макет и пытается подключить через УстановитьВнешнююКомпоненту. Система сообщает об успешной установке, файл DLL появляется в папке AppData, но при попытке создания объекта Новый("AddIn.FR") возникает ошибка.

Выясним причину такого поведения. Основная сложность заключается в смешивании двух разных технологий: COM и Native API. Если компонента написана по технологии COM, она требует обязательной регистрации в реестре Windows. Если же используется Native API, регистрация не нужна, но крайне важно соблюсти структуру манифеста и правильно обращаться к внутренним именам классов компоненты.

Решение №1: Подключение через технологию COM

Рассмотрим наиболее надежный для самописных конфигураций способ, который помог автору темы. Этот метод основан на использовании объекта COMОбъект. Важно понимать, что для работы этого метода драйвер должен быть физически установлен в операционной системе с помощью штатного инсталлятора от производителя.

Выполним следующие шаги:

  1. Установим последнюю версию драйвера «Штрих-М» (например, 4.15 или выше) на рабочую станцию.
  2. Убедимся, что разрядность драйвера соответствует разрядности платформы 1С. Если вы используете 32-битный клиент 1С, драйвер также должен быть 32-битным.
  3. Зарегистрируем библиотеку DrvFR.dll в реестре вручную через regsvr32, если это не произошло автоматически.

Посмотрим на пример кода, который инициализирует объект драйвера:


// Попытка прямого создания COM-объекта
Попытка
    ФР = Новый COMОбъект("AddIn.DrvFR");
    // Если объект создан успешно, можно вызывать его методы
    ФР.Password = 30; // Пароль администратора по умолчанию
    ФР.Connect();
    Если ФР.ResultCode <> 0 Тогда
        Сообщить("Ошибка подключения: " + ФР.ResultCodeDescription);
    КонецЕсли;
Исключение
    Сообщить("Не удалось создать объект драйвера: " + ОписаниеОшибки());
КонецПопытки;

Важный нюанс: Ошибка «Недопустимая строка с указанием класса» с кодом 0x800401F3 однозначно указывает на то, что ProgID AddIn.DrvFR не найден в реестре Windows. Это происходит либо из-за отсутствия регистрации DLL, либо из-за конфликта разрядности.

Решение №2: Использование Native API и макетов конфигурации

Теперь разберем более современный подход, который не требует ручной регистрации библиотек в системе. Этот способ предпочтителен для распределенных систем, так как 1С сама доставляет нужные файлы на компьютер пользователя из общего макета.

Проанализируем последовательность действий для этого метода:

  1. Подготовим ZIP-архив, содержащий manifest.xml и файлы DLL для разных архитектур (x86 и x64).
  2. Загрузим этот архив в Общий макет с типом «Двоичные данные».
  3. Используем метод ПодключитьВнешнююКомпоненту, указывая путь к макету и локальный псевдоним.

Рассмотрим правильный код подключения:


// 1. Устанавливаем компоненту из макета в профиль пользователя
РезультатУстановки = УстановитьВнешнююКомпоненту("ОбщийМакет.ДрайверШтрихМ");

Если РезультатУстановки Тогда
    // 2. Подключаем компоненту. Вторым параметром задаем имя группы (псевдоним)
    РезультатПодключения = ПодключитьВнешнююКомпоненту("ОбщийМакет.ДрайверШтрихМ", "Shtrih", ТипВнешнейКомпоненты.Native);
    
    Если РезультатПодключения Тогда
        // 3. Создаем объект. Обратите внимание на синтаксис обращения!
        // "AddIn.Псевдоним.ИмяКлассаИзМанифеста"
        Попытка
            ФР = Новый("AddIn.Shtrih.ShtrihMDRV"); 
            // Имя класса ShtrihMDRV должно быть прописано в манифесте
        Исключение
            Сообщить("Тип не определен: " + ОписаниеОшибки());
        КонецПопытки;
    КонецЕсли;
КонецЕсли;

Почему возникает ошибка «Тип не определен» при Native-подключении?

Выясним причину, по которой даже при РезультатПодключения = Истина создание объекта через Новый() может завершаться ошибкой.

Во-первых, это несоответствие имен в манифесте. Откроем файл manifest.xml внутри архива. Найдем узел component. Атрибут object в этом узле — это и есть то самое имя, которое нужно указывать после псевдонима. Если в манифесте написано object="Driver", а вы пишете Новый("AddIn.Shtrih.FR"), система выдаст ошибку.

Во-вторых, это структура архива. Платформа 8.3 крайне чувствительна к расположению файлов. Все DLL и манифест должны лежать в корне ZIP-архива, без лишних вложенных папок.

Практические советы по отладке

Рассмотрим несколько приемов, которые помогут вам быстрее найти неисправность:

Подводя итог, можно сказать, что для стабильной работы с кассами «Штрих-М» в самописных конфигурациях проще всего установить официальный драйвер в систему и использовать Новый COMОбъект("AddIn.DrvFR"). Если же требуется автономность и установка из макета, необходимо тщательно выверить содержимое manifest.xml и использовать технологию Native API с корректным указанием программного идентификатора.

← На главную