При переходе с обычных форм на управляемые разработчики часто сталкиваются с неприятной ситуацией: код внешнего соединения, который годами стабильно работал на клиенте, внезапно начинает выдавать ошибку «Класс не зарегистрирован» при выполнении на сервере. При этом в толстом клиенте все продолжает работать без нареканий.
В этой статье мы подробно проанализируем, почему возникает эта ошибка, разберем разницу в контекстах выполнения клиент-серверного взаимодействия и рассмотрим пошаговые сценарии решения проблемы, включая настройку обертки через службы компонентов COM+.
Давайте разберем первопричину проблемы. Когда код выполняется в обычном приложении или в толстом клиенте на рабочей станции пользователя, вызывается локальный 32-битный COM-объект. Операционная система пользователя легко находит зарегистрированный класс V83.COMConnector в реестре и инициализирует его.
В управляемом приложении (УФ) большинство критически важных экспортных процедур выполняется на сервере (в контексте НаСервере). Серверная служба 1С:Предприятие практически всегда устанавливается как 64-битное приложение. Когда такой сервер пытается выполнить инструкцию создания COM-объекта, он ищет в реестре 64-битную версию библиотеки. Если на сервере зарегистрирована только 32-битная компонента, или она не зарегистрирована вовсе под учетной записью службы 1С, операционная система возвращает ошибку «Класс не зарегистрирован».
Таким образом, мы сталкиваемся с конфликтом разрядности (x86 против x64) и ограничениями прав доступа серверного процесса.
---
Для начала рассмотрим самый простой вариант, когда разрядность сервера 1С и устанавливаемой платформы совпадает, но библиотека просто не была должным образом зарегистрирована в операционной системе Windows Server.
Нам необходимо вручную зарегистрировать библиотеку comcntlev.dll, которая отвечает за работу V83.COMConnector. Разберем этот процесс по шагам:
C:\Program Files\1cv8\8.3.XX.YYYY\bin\ (где XX.YYYY — номер вашего релиза платформы).
regsvr32 "C:\Program Files\1cv8\8.3.XX.YYYY\bin\comcntlev.dll"
Если сервер 1С является 32-битным (что сейчас встречается крайне редко), путь к библиотеке будет вести в папку C:\Program Files (x86)\1cv8\..., а для регистрации в 64-битной Windows потребуется использовать утилиту regsvr32 из папки C:\Windows\SysWOW64\.
---
Что делать, если сервер 1С у вас 64-битный, а внешняя информационная база или программное обеспечение требует работы исключительно с 32-битным коннектором? Или если стандартная регистрация библиотеки не решает проблему из-за изоляции процессов? В этом случае лучшим и наиболее надежным промышленным стандартом является создание изолированного приложения в Службах компонентов (COM+).
Этот способ позволяет запускать V83.COMConnector в отдельном системном процессе dllhost.exe, который будет выступать своеобразным мостом-переводчиком между 64-битным сервером 1С и 32-битной (или 64-битной) библиотекой.
Проанализируем детальный алгоритм настройки этого моста:
comexp.msc и нажмите Enter. Откроется оснастка «Службы компонентов».1C_COM_Connector. В области «Способ активации» обязательно установите переключатель в положение Серверное приложение. Нажмите «Далее».USR1CV8). Введите его пароль. Это критически важно, так как у процесса должно быть достаточно прав для работы с базой данных и временными файлами.1C_COM_Connector, найдите в нем папку Компоненты.comcntlev.dll из каталога bin нужного релиза платформы 1С.После выполнения этой настройки операционная система Windows будет автоматически перенаправлять все запросы к V83.COMConnector через службу COM+, изолируя работу коннектора и предотвращая падение сервера 1С при конфликтах памяти.
---
Иногда даже после успешной настройки COM+ сервер 1С продолжает рапортовать о том, что класс не зарегистрирован. Причина кроется в банальном отсутствии прав на чтение веток реестра у пользователя USR1CV8.
Давайте проверим и настроим эти права:
regedit в окне «Выполнить»).HKEY_CLASSES_ROOT\CLSID\{18EE6F94-E982-4113-9E40-F213A36511F1}
USR1CV8 или Служба), и у нее установлены флаги на Чтение.HKEY_LOCAL_MACHINE\SOFTWARE\Classes\V83.COMConnector
---
Посмотрим на пример программного кода, который корректно инициализирует подключение к другой базе данных 1С на стороне сервера управляемого приложения с обработкой возможных исключений.
&НаСервере
Процедура УстановитьВнешнееСоединениеНаСервере()
ИмяПровайдера = "V83.COMConnector";
Попытка
Соединитель = Новый COMОбъект(ИмяПровайдера);
Исключение
ЗаписьЖурналаРегистрации("ВнешнееСоединение",
УровеньЖурналаРегистрации.Ошибка, , ,
"Не удалось создать объект " + ИмяПровайдера + ". Описание ошибки: " + ОписаниеОшибки());
ВызватьИсключение "Ошибка инициализации COM-соединения на сервере. Обратитесь к администратору.";
КонецПопытки;
СтрокаПодключения = "Srvr=""ServerName"";Ref=""BaseName"";Usr=""Admin"";Pwd=""Password"";";
Попытка
ВнешнееСоединение = Соединитель.Connect(СтрокаПодключения);
Сообщить("Успешное подключение к базе данных!");
Исключение
ЗаписьЖурналаРегистрации("ВнешнееСоединение",
УровеньЖурналаРегистрации.Ошибка, , ,
"Ошибка авторизации во внешней базе. Текст ошибки: " + ОписаниеОшибки());
ВызватьИсключение "Не удалось установить соединение с внешней информационной базой.";
КонецПопытки;
КонецПроцедуры
Применяя данные подходы и последовательно исключая проблемы с разрядностью, правами доступа служб и регистрацией библиотек в реестре Windows, вы сможете гарантировать стабильную работу серверного кода в среде управляемых форм без досадных системных ошибок.