Проблема взаимодействия информационных баз 1С через COM-соединение на серверных операционных системах является одной из самых распространенных в практике системного администрирования и разработки. Ситуация осложняется тем, что один и тот же код может идеально работать на локальном компьютере программиста, но выдавать критические ошибки вроде Ошибка при вызове конструктора (COMОбъект) или Отказано в доступе (0x80070005) при переносе на сервер. В рамках данной статьи мы подробно разберем причины возникновения этих ошибок и пошагово настроим систему для стабильной работы обмена.
Рассмотрим типовой фрагмент кода, который используется для инициализации соединения. Проблема часто возникает в момент вызова метода Connect, когда сервер 1С пытается инициализировать внешнюю библиотеку comcntr.dll под учетной записью службы (обычно это USR1CV83).
// Фрагмент инициализации COM-объекта
Попытка
Если СтруктураПараметров.Платформа = Перечисления.Платформы.Платформа82 Тогда
Обработчик = Новый COMObject("V82.COMConnector");
Иначе
Обработчик = Новый COMObject("V83.COMConnector");
КонецЕсли;
Исключение
Сообщить("Ошибка создания объекта V83.COMConnector!");
Сообщить(ОписаниеОшибки());
КонецПопытки;
// Попытка установки соединения
Попытка
ТекCOMОбъект = Обработчик.Connect(ПараметрыПодключения);
Сообщить("Соединение установлено");
Исключение
СтрокаСообщенияОбОшибке = "При попытке соединения с COM-сервером произошла ошибка: " + ОписаниеОшибки();
Сообщить(СтрокаСообщенияОбОшибке);
КонецПопытки;
Если при выполнении этого кода на сервере вы получаете исключительную ситуацию, первым делом необходимо проанализировать разрядность процессов и права доступа. Сервер 1С Предприятие почти всегда работает в 64-битном режиме, в то время как библиотеки COM могут иметь свои особенности регистрации.
Основная причина неудачи при создании COMObject на 64-битных серверах — конфликт разрядности. Процесс rphost.exe (64-битный) не может напрямую загрузить 32-битную DLL. Чтобы обойти это ограничение, мы воспользуемся механизмом Windows COM+. Это позволит запускать библиотеку comcntr.dll в отдельном системном процессе dllhost.exe, который выступит «суррогатом» или мостом.
Выполним следующие шаги:
dcomcnfg.Компьютеры -> Мой компьютер -> Приложения COM+.Создать -> Приложение.1C_COM_Connector) и обязательно укажем тип Серверное приложение (Server application)..\USR1CV83), либо административную учетную запись с достаточными правами.Компоненты. Нажмем Создать -> Компонент.comcntr.dll. Обычно он находится по пути: C:\Program Files\1cv8\8.3.X.XXXX\bin\comcntr.dll.После этого система сможет вызывать компонент через созданный нами «мост», что решает большинство проблем с инициализацией V83.COMConnector.
Если объект создается, но метод Connect выдает ошибку доступа, значит, у пользователя, под которым работает сервер 1С, недостаточно прав в настройках DCOM или на уровне файловой системы. Проанализируем настройки безопасности.
Разберем детальную настройку прав в Службах компонентов:
1C_COM_Connector, нажмем правой кнопкой — Свойства.USR1CV83 и установим для него все галочки: Локальный запуск, Удаленный запуск, Локальная активация, Удаленная активация.Важный нюанс: Если база, к которой вы подключаетесь, является файловой, пользователь USR1CV83 должен иметь полные права (Read/Write/Modify) на папку с этой базой. Поскольку подключение происходит в контексте сервера, ваши личные права администратора здесь не учитываются.
Иногда стандартная регистрация через regsvr32 на 64-битных системах проходит некорректно, так как регистратор может поместить записи не в ту ветку реестра. Выясним, как сделать это правильно.
Запустим командную строку от имени администратора и выполним следующие команды для принудительной перерегистрации:
cd "C:\Windows\System32"
regsvr32 /u "C:\Program Files\1cv8\8.3.12.1685\bin\comcntr.dll"
regsvr32 "C:\Program Files\1cv8\8.3.12.1685\bin\comcntr.dll"
Если вы используете 32-битную версию платформы на 64-битной Windows, используйте regsvr32 из папки C:\Windows\SysWOW64. Также убедитесь, что в реестре по адресу HKEY_CLASSES_ROOT\CLSID\{...}\InprocServer32 путь к библиотеке соответствует актуальной версии установленной платформы. Если там указан путь к старой, уже удаленной версии, 1С не сможет инициализировать объект.
При выполнении метода Connect компонента 1С создает временные файлы блокировок. Рассмотрим, куда именно она их пишет. Обычно это папка %TEMP% профиля пользователя, под которым запущена служба 1С. Для USR1CV83 это может быть путь C:\Windows\ServiceProfiles\NetworkService\AppData\Local\Temp или системная папка C:\Windows\Temp.
Проанализируем ситуацию: если у пользователя службы нет прав на запись в системную временную папку, вызов Connect упадет с неочевидной ошибкой. Рекомендуется явно дать права Изменение для группы Пользователи или конкретно для USR1CV83 на папку C:\Windows\Temp.
Подводя итог, можно выделить «золотое правило» настройки COM на сервере:
comcntr.dll и установленной платформы.Выполнив эти шаги, мы обеспечим стабильную работу регламентных заданий и механизмов обмена данными, исключив влияние ограничений безопасности серверных операционных систем.