При организации интеграции между различными информационными базами 1С программисты часто используют проверенный механизм COM-соединения. Однако при переносе работающего кода из обычной интерактивной обработки в фоновое или регламентное задание мы часто сталкиваемся с неприятной ошибкой: "Ошибка при вызове конструктора (COMОбъект): Недопустимая строка с указанием класса". При этом интерактивный запуск той же самой обработки под учетной записью пользователя на его локальном компьютере может проходить абсолютно успешно и без каких-либо сбоев.
В этой статье мы подробно разберем, почему возникает эта проблема, проанализируем внутренние механизмы взаимодействия операционной системы Windows и платформы 1С:Предприятие, а также рассмотрим пошаговые инструкции по устранению данной ошибки с помощью настройки служб компонентов COM+ и альтернативных современных методов интеграции.
Для того чтобы понять, почему код ведет себя по-разному в разных контекстах, давайте проанализируем архитектуру выполнения клиентских и серверных процессов в 1С.
Когда мы запускаем обработку интерактивно на своем рабочем месте, код выполняется в контексте клиентского приложения (например, тонкого или толстого клиента). В подавляющем большинстве случаев на рабочих станциях пользователей установлена 32-разрядная версия клиента 1С. При вызове оператора Новый COMОбъект("V83.COMConnector") операционная система Windows обращается к реестру, находит зарегистрированную 32-битную библиотеку comcntr.dll и успешно загружает её в адресное пространство процесса 1С.
Ситуация кардинально меняется, когда этот же код вызывается внутри регламентного или фонового задания. В этом случае выполнение происходит на стороне сервера 1С:Предприятие в контексте процесса rphost.exe. Современные серверные операционные системы и сами серверы 1С практически всегда являются 64-разрядными (x64). Процесс rphost.exe работает в 64-битной адресации.
Главное системное ограничение Windows: 64-битный процесс физически не может напрямую загрузить в свою память 32-битную динамическую библиотеку (DLL), равно как и 32-битный процесс не может загрузить 64-битную DLL. Когда 64-битный сервер 1С пытается инициализировать 32-битный COM-класс, операционная система сообщает, что класс не зарегистрирован или строка с указанием класса недопустима. Именно это и приводит к аварийному завершению регламентного задания.
Также к этой проблеме часто добавляется конфликт версий платформ. Например, если на сервере установлена и база-источник на платформе 1С 8.2, и база-приемник на платформе 1С 8.3, библиотеки COM-соединения начинают конфликтовать в реестре операционной системы. Каждая последующая установка или обновление платформы перезаписывает пути к comcntr.dll в системном реестре Windows, нарушая работу старых интеграционных шлюзов.
Если нам критически важно сохранить интеграцию именно через технологию COM-соединения, лучшим и наиболее надежным решением является создание специального изолированного приложения в Службах компонентов Windows (COM+). Этот механизм позволяет запускать библиотеку comcntr.dll в отдельном системном процессе суррогата dllhost.exe, который будет выступать своеобразным "мостом" между 64-битным процессом сервера 1С и 32-битной библиотекой (или наоборот).
Рассмотрим этот процесс подробно и разберем его по шагам:
comcntr.dll (обычно он находится в каталоге установки 1С, например, C:\Program Files\1cv8\8.3.X.X\bin\comcntr.dll).Win + R, введем команду comexp.msc и нажмем Enter. Откроется стандартная оснастка операционной системы "Службы компонентов".Службы компонентов -> Компьютеры -> Мой компьютер -> Приложения COM+.Приложения COM+ и выберем в контекстном меню Создать -> Приложение.V83_COMConnector.dllhost.exe, изолированно от сервера 1С. Нажмем кнопку "Далее".Агент сервера 1С:Предприятия (обычно это локальный пользователь USR1CV8). Обязательно укажем верный пароль. Это гарантирует, что у процесса dllhost.exe будут все необходимые права доступа к каталогам баз данных и системным ресурсам.V83_COMConnector и найдем папку Компоненты.Создать -> Компонент.comcntr.dll. Нажмем "Открыть", затем "Далее" и "Готово".V83_COMConnector и перейдем в его Свойства.0x80070005 (Отказано в доступе) при обращении процесса сервера 1С к созданному COM-объекту.dllhost.exe из оперативной памяти, освобождая ресурсы сервера.После выполнения этих шагов рекомендуется перезапустить службу сервера 1С или просто перезапустить созданное нами приложение COM+ через контекстное меню (пункт "Запуск" / "Останов"). Теперь при вызове конструктора 1С сможет успешно проинициализировать класс через системный суррогатный процесс.
В тех ситуациях, когда разрядность вашего сервера 1С совпадает с разрядностью устанавливаемой компоненты (например, у вас полностью 64-битное окружение, и вы используете 64-битную версию платформы 1С), сложная настройка COM+ может не потребоваться. Достаточно корректно зарегистрировать библиотеку в реестре Windows.
Для этого выполним регистрацию через командную строку. Обратите внимание, что командную строку необходимо запускать строго от имени Администратора:
Если мы работаем с 64-разрядной версией сервера 1С и регистрируем 64-разрядную библиотеку, выполним команду:
regsvr32 "C:\Program Files\1cv8\8.3.22.1709\bin\comcntr.dll"
Если на 64-разрядном сервере Windows нам по какой-то причине необходимо зарегистрировать 32-разрядную библиотеку для использования другими 32-разрядными клиентами, нам нужно задействовать утилиту регистрации из специального системного каталога SysWOW64:
C:\Windows\SysWOW64\regsvr32 "C:\Program Files (x86)\1cv8\8.3.22.1709\bin\comcntr.dll"
Полезный совет: Если в системе ранее были зарегистрированы другие версии этой же компоненты, перед регистрацией новой версии крайне желательно отменить старую регистрацию. Это позволит избежать путаницы в реестре Windows. Сделать это можно с помощью ключа /u:
regsvr32 /u "C:\Program Files\1cv8\старая_версия\bin\comcntr.dll"
Несмотря на то, что технология COM долгое время была стандартом де-факто для обмена данными между информационными базами 1С, сегодня она считается устаревшей и накладывает серьезные ограничения на архитектуру и развитие ИТ-ландшафта предприятия. Рассмотрим ключевые причины, почему нам стоит рассмотреть переход на использование Web- и HTTP-сервисов:
1. Кроссплатформенность и независимость от операционной системы. Технология COM (Component Object Model) — это проприетарная разработка компании Microsoft, жестко привязанная к операционной системе Windows. В условиях активного импортозамещения и массового перехода серверов 1С на операционные системы семейства Linux использование COM-соединений становится непреодолимым барьером. Код, содержащий вызовы Новый COMОбъект, физически не сможет выполниться на сервере под управлением Linux. Веб- и HTTP-сервисы работают на базе стандартных сетевых протоколов (HTTP/HTTPS) и успешно функционируют на любой операционной системе.
2. Сложность администрирования при обновлении платформ. Каждый раз, когда мы обновляем версию платформы 1С на сервере, нам приходится вручную перерегистрировать компоненту comcntr.dll, контролировать разрядность процессов и проверять настройки в службах компонентов COM+. Это создает дополнительную рутинную нагрузку на системных администраторов и повышает риски простоя из-за человеческого фактора. Интеграция через HTTP-запросы вообще не зависит от версии платформы на стороне клиента или сервера.
3. Производительность, стабильность и утечки памяти. COM-соединения создают полноценную тяжеловесную сессию в базе-приемнике. Это расходует значительный объем оперативной памяти на сервере. Более того, при аварийном завершении сетевого соединения или ошибках в коде COM-сессии могут "зависать" в памяти сервера, не высвобождая лицензии и блокируя таблицы базы данных. HTTP-сервисы работают по принципу "запрос-ответ", они практически мгновенно обрабатывают транзакцию, не удерживают постоянное соединение и изолированы друг от друга, что гарантирует стабильность работы всей системы.
Для сравнения рассмотрим, насколько лаконично и понятно выглядит отправка данных через HTTP-сервис по сравнению с классическим COM-соединением. Вместо долгого и ресурсоемкого создания тяжелого COM-объекта, мы можем отправить легкий структурированный JSON-пакет.
Пример отправки данных на стороне источника через HTTP-запрос:
&НаСервере
Процедура ОтправитьДанныеЧерезHTTP(АдресСервера, ДанныеДляПередачи)
// Преобразуем наши данные в формат JSON
ЗаписьJSON = Новый ЗаписьJSON;
ЗаписьJSON.УстановитьСтроку();
ЗаписатьJSON(ЗаписьJSON, ДанныеДляПередачи);
СтрокаЗапроса = ЗаписьJSON.Закрыть();
// Настраиваем HTTP-соединение
НТТРСоединение = Новый HTTPСоединение(АдресСервера, , , , , 30); // Таймаут 30 секунд
// Формируем POST-запрос к нашему HTTP-сервису
HTTPЗапрос = Новый HTTPЗапрос("/v1/exchange/data");
HTTPЗапрос.УстановитьТелоИзСтроки(СтрокаЗапроса, КодировкаТекста.UTF8);
HTTPЗапрос.Заголовки.Вставить("Content-Type", "application/json");
Попытка
HTTPОтвет = НТТРСоединение.ОтправитьДляОбработки(HTTPЗапрос);
Если HTTPОтвет.КодСостояния = 200 Тогда
ЗаписьЖурналаРегистрации("ОбменДанными", УровеньЖурналаРегистрации.Информация, , , "Данные успешно переданы.");
Иначе
ЗаписьЖурналаРегистрации("ОбменДанными", УровеньЖурналаРегистрации.Ошибка, , , "Ошибка передачи. Код ответа сервера: " + HTTPОтвет.КодСостояния);
EndIf;
Исключение
ЗаписьЖурналаРегистрации("ОбменДанными", УровеньЖурналаРегистрации.Ошибка, , , "Не удалось установить соединение с сервером.");
КонецПопытки;
КонецПроцедуры
Использование HTTP-сервисов позволяет построить надежную, быструю и современную архитектуру обмена данными, которая не потребует от вас постоянного вмешательства в настройки операционной системы при каждом обновлении платформы 1С.