Как подключить внешнюю компоненту на сервере 1С в фоновом задании

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

Работа с внешними компонентами на стороне сервера 1С, особенно в контексте фоновых заданий, часто становится камнем преткновения для разработчиков. Типичная ситуация: код, который идеально работает на клиенте, при попытке выполнения на сервере выдает ошибку метода контекста или возвращает значение Ложь. Особенно остро это проявляется при интеграции с торговым оборудованием (ККТ, сканеры штрихкодов), когда возникает необходимость автоматизировать печать чеков или обработку данных без участия пользователя.

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

Разбираем причины: Почему компонента не подключается на сервере?

Прежде чем переходить к коду, выясним основную причину неудач. Когда мы вызываем ПодключитьВнешнююКомпоненту на клиенте, 1С работает в контексте текущего пользователя Windows. На сервере же выполнение происходит в контексте службы «Агент сервера 1С:Предприятия». Это накладывает ряд ограничений, которые мы рассмотрим далее.

  1. Проблема разрядности (32-bit vs 64-bit): Это самая распространенная причина. Если ваш сервер 1С установлен как 64-разрядное приложение, он не сможет напрямую загрузить в свой процесс 32-разрядную DLL-библиотеку. При попытке подключения методом ProgID система просто не найдет подходящий объект.
  2. Права доступа службы: Пользователь usr1cv8 (под которым обычно работает сервер) имеет крайне ограниченные права. У него может не быть доступа к веткам реестра HKEY_CLASSES_ROOT, где зарегистрирована компонента, или к папке C:\Windows\System32.
  3. Отсутствие графического интерфейса (Сессия 0): Фоновые задания выполняются в так называемой «Сессии 0». Многие драйверы ККТ при инициализации пытаются создать скрытое окно для обмена сообщениями с операционной системой. Поскольку в сессии сервера нет рабочего стола и графической подсистемы, компонента аварийно завершает работу, а 1С выдает ошибку «Тип не определен».

Метод 1. Использование механизма COM+ для решения проблем разрядности

Если нам необходимо запустить 32-битную компоненту на 64-битном сервере, лучшим решением будет использование Служб компонентов (COM+). Этот механизм позволяет запустить библиотеку в отдельном процессе dllhost.exe, который будет выступать прослойкой между сервером 1С и компонентой.

Рассмотрим алгоритм настройки:

  1. Откройте «Панель управления» -> «Администрирование» -> «Службы компонентов».
  2. Перейдите в ветку «Компьютеры» -> «Мой компьютер» -> «Приложения COM+».
  3. Создайте новое приложение (Пустое приложение), назовите его, например, 1C_AddIn.
  4. В свойствах приложения на вкладке «Удостоверение» укажите пользователя с правами локального администратора (это важно для доступа к портам).
  5. Внутри приложения перейдите в папку «Компоненты» и добавьте вашу DLL библиотеку.

После этой настройки вызов через Новый COMОбъект("ProgID") или подключение компоненты начнет работать, так как разрядность процессов будет согласована через маршалинг COM+.

Метод 2. Правильное подключение через макет конфигурации

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

Рассмотрим пример кода для загрузки компоненты из макета на сервере:


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

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

Важный нюанс: Если вы используете метод УстановитьВнешнююКомпоненту, 1С автоматически подберет нужную библиотеку из ZIP-архива макета (если там содержатся версии для разных платформ и разрядностей).

Метод 3. Проверка прав доступа и безопасного режима

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

Проверьте следующие настройки:

Архитектурная альтернатива: HTTP-сервис или Клиентский агент

Если компонента категорически отказывается работать в «Сессии 0» (например, из-за жесткой привязки драйвера ККТ к графическому окну), рассмотрим альтернативный подход. Вместо того чтобы мучить сервер, можно создать небольшое приложение-агент или использовать 1С в режиме «Тонкого клиента» на компьютере, где физически подключена касса.

Схема работы будет выглядеть так:

  1. Сервер 1С формирует данные для чека и записывает их в специальный регистр (очередь печати).
  2. На клиентском компьютере запущен сеанс 1С, который по таймеру проверяет этот регистр.
  3. Клиентский сеанс считывает данные, подключает компоненту (что на клиенте всегда проще) и печатает чек.

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

Резюме

Подключение внешней компоненты на сервере — задача выполнимая, но требующая глубокого понимания контекста выполнения кода. Мы выяснили, что ключевыми факторами успеха являются согласование разрядности через COM+, использование макетов конфигурации для автоматического управления файлами и обеспечение необходимых прав доступа для серверной учетной записи. Выбирайте метод в зависимости от специфики вашей библиотеки, и всегда начинайте диагностику с проверки разрядности серверного процесса.

← На главную