Как исправить ошибку «Тип не определен» при подключении внешней компоненты АТОЛ в тонком клиенте 1С?

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

При разработке торговых решений на платформе «1С:Предприятие» программисты часто сталкиваются с ситуацией, когда код подключения торгового оборудования (например, касс АТОЛ или Штрих-М) отлично работает в режиме толстого клиента, но выдает критическую ошибку в тонком клиенте. При попытке инициализации объекта драйвера система сообщает: «тип не определен AddIn.MyName.ATOL_KKT_1C83_V9». Разобраться, почему так происходит, и как правильно настроить подключение внешней компоненты (ВК), нам поможет детальный разбор механизмов платформы.

Выясним причину: почему в толстом клиенте всё работает, а в тонком возникает ошибка?

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

  1. Толстый клиент обладает полным доступом к ресурсам операционной системы. При вызове метода ПодключитьВнешнююКомпоненту() платформа способна «на лету» прочитать двоичные данные из общего макета конфигурации и загрузить библиотеку непосредственно в память текущего процесса, не требуя ее предварительного сохранения на жесткий диск.
  2. Тонкий клиент работает в изолированной среде («песочнице»). В целях безопасности он физически не может загрузить dll-файл внешней компоненты прямо из базы данных в оперативную память. Платформе требуется сначала физически распаковать файлы библиотеки на локальный диск пользователя, зарегистрировать их в системе и только после этого инициализировать объект.

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

Решение 1. Классический синхронный метод подключения

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

Проанализируем пример кода, который решает эту задачу в синхронном режиме:


Попытка
    // Сначала пробуем просто подключить уже установленную компоненту
    ПодключитьВнешнююКомпоненту("ОбщийМакет.ДрайверАТОЛККТ54ФЗ105", "MyName", ТипВнешнейКомпоненты.Native);
    ОбъектДрайвера = Новый("AddIn.MyName.ATOL_KKT_1C83_V9");
Исключение
    Попытка
        // Если подключить не удалось, значит компонента еще не установлена на этот ПК.
        // Выполняем установку библиотеки на диск пользователя.
        УстановитьВнешнююКомпоненту("ОбщийМакет.ДрайверАТОЛККТ54ФЗ105");
        
        // После установки повторяем попытку подключения
        ПодключитьВнешнююКомпоненту("ОбщийМакет.ДрайверАТОЛККТ54ФЗ105", "MyName", ТипВнешнейКомпоненты.Native);
        ОбъектДрайвера = Новый("AddIn.MyName.ATOL_KKT_1C83_V9");
    Исключение
        Сообщить("Не удалось установить или инициализировать драйвер ККТ: " + ОписаниеОшибки());
    КонецПопытки;
КонецПопытки;

Разберем по шагам, что происходит «под капотом» во время выполнения этого кода:

  1. При вызове метода УстановитьВнешнююКомпоненту() платформа 1С обращается к указанному общему макету, извлекает из него ZIP-архив и распаковывает его в специальный каталог пользователя на локальном компьютере. В операционной системе Windows это обычно папка %APPDATA%\1C\1Cv8\ExtCompT.
  2. В этой же папке автоматически создается или обновляется служебный файл registry.xml. В нем платформа регистрирует символическое имя компоненты, пути к файлам библиотек и поддерживаемую архитектуру процессора.
  3. При повторном вызове ПодключитьВнешнююКомпоненту() 1С обращается к локальному файлу registry.xml, находит там запись о компоненте MyName, успешно загружает библиотеку в память процесса и позволяет создать объект Новый("AddIn.MyName.ATOL_KKT_1C83_V9").

Решение 2. Современный стандарт 1С — асинхронный метод (Рекомендуется)

Начиная с версии платформы 8.3.6, использование синхронных методов работы с внешними компонентами в интерфейсных потоках считается устаревшим (deprecated). В современных конфигурациях (особенно построенных на БСП — Библиотеке стандартных подсистем) синхронные методы могут блокировать интерфейс или приводить к ошибкам работы в веб-клиенте.

Посмотрим на пример реализации асинхронного подключения с использованием механизма оповещений:


&НаКлиенте
Процедура ИнициализироватьДрайвер()
    
    ПараметрыПодключения = Новый Структура;
    ПараметрыПодключения.Вставить("ИмяМакета", "ОбщийМакет.ДрайверАТОЛККТ54ФЗ105");
    ПараметрыПодключения.Вставить("СимволическоеИмя", "MyName");
    
    ОписаниеОповещения = Новый ОписаниеОповещения("ПослеПодключенияКомпоненты", ЭтотОбъект, ПараметрыПодключения);
    
    // Асинхронно пробуем подключить компоненту
    НачатьПодключениеВнешнейКомпоненты(ОписаниеОповещения, 
                                        ПараметрыПодключения.ИмяМакета, 
                                        ПараметрыПодключения.СимволическоеИмя, 
                                        ТипВнешнейКомпоненты.Native);
КонецПроцедуры

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

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

Такой асинхронный подход гарантирует стабильную работу во всех типах клиентов (включая запуск 1С через веб-браузер) и исключает зависание сеанса пользователя при медленной установке драйверов.

Дополнительные подводные камни при установке компонент

Если вы применили правильные методы установки и подключения, но ошибка «тип не определен» всё равно сохраняется в тонком клиенте, обязательно проанализируйте следующие факторы:

  1. Разрядность платформы 1С:Предприятие (32-бит vs 64-бит). Это наиболее частая причина проблем. Тонкий клиент на рабочих местах пользователей очень часто устанавливают 64-разрядный (x64), в то время как драйвер в макете может содержать только 32-битные dll-файлы. 64-битное приложение 1С физически не может загрузить 32-битную библиотеку. Убедитесь, что внутри макета внешней компоненты (в zip-архиве) находятся dll-файлы под обе архитектуры, а файл manifest.xml правильно их описывает.
  2. Права доступа в операционной системе. Метод УстановитьВнешнююКомпоненту() пытается записать файлы в каталог %APPDATA%. Если у пользователя Windows ограничены права на запись в эту папку или её блокирует доменная политика безопасности (например, AppLocker), то физическая распаковка файлов не произойдет.
  3. Блокировка антивирусом. Эвристические анализаторы многих современных антивирусов могут воспринимать распаковку динамических библиотек из 1С в пользовательские каталоги как потенциальную угрозу (троянскую активность) и автоматически блокировать или удалять файлы драйвера. Попробуйте добавить папку %APPDATA%\1C в исключения антивирусного ПО.

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

← На главную