При разработке интеграций на платформе 1С:Предприятие 8.3 программисты часто сталкиваются с ситуацией, когда код, успешно работающий в обычной обработке или отчете, внезапно "падает" с ошибкой при переносе его в метод HTTP-сервиса. Самая коварная из таких ошибок — Ошибка при вызове конструктора (COMObject). Ситуация осложняется тем, что система не выдает подробностей, оставляя разработчика наедине со строкой инициализации V83.COMConnector.
В этой статье мы подробно разберем, почему связка HTTP-сервис + COMConnector требует особой настройки, проанализируем причины возникновения сбоев и пошагово реализуем комплекс мер для восстановления работоспособности системы. Мы рассмотрим как программные методы диагностики, так и системные настройки операционной системы Windows.
Рассмотрим типовой сценарий: нам необходимо собрать данные об остатках продукции из нескольких удаленных баз через HTTP-запрос. Автор темы использует следующий код для инициализации соединения:
СтрокаСоединения = "Srvr=""app1cfast:1742"";Ref=""Мельник30"";Usr=""Администратор"";Pwd=""книгапокупок""";
Попытка
Ком = Новый COMObject("V83.COMConnector");
Соединение = Ком.Connect(СтрокаСоединения);
Исключение
ЗаписьЖурналаРегистрации("Ошибка_COM", УровеньЖурналаРегистрации.Ошибка, , , ОписаниеОшибки());
ВызватьИсключение "Не удалось установить COM-соединение: " + ОписаниеОшибки();
КонецПопытки;
Проанализируем ситуацию: если этот код работает под управлением тонкого или толстого клиента на сервере, но выдает ошибку внутри HTTP-сервиса, значит, проблема кроется в контексте исполнения. HTTP-сервис запускается в неинтерактивном сеансе от имени пользователя, под которым работает веб-сервер (IIS или Apache), и имеет ряд ограничений безопасности.
Первым делом необходимо убедиться, что библиотека comcntr.dll корректно зарегистрирована в системе. Важно помнить о разрядности сервера 1С. Если вы используете 64-битную версию сервера 1С:Предприятие, библиотека должна быть зарегистрирована именно из папки bin соответствующей версии платформы.
Рассмотрим порядок действий для регистрации:
cd "C:\Program Files\1cv8\8.3.XX.XXXX\bin".regsvr32 comcntr.dll.Если сервер 1С 64-битный, а вы пытаетесь использовать 32-битную компоненту (или наоборот), вы гарантированно получите ошибку конструктора. Всегда проверяйте соответствие версий comcntr.dll и процесса rphost.
Выясним причину, связанную с правами доступа. Когда запрос поступает на HTTP-сервис, код выполняется от имени системной учетной записи. Рассмотрим это на примере IIS:
По умолчанию Пул приложений (Application Pool) работает под учетной записью ApplicationPoolIdentity. У этой записи зачастую недостаточно прав для запуска DCOM-объектов. Чтобы исправить это, проанализируем настройки веб-сервера:
Это обеспечит коду 1С те же права, которые он имеет при обычном серверном вызове.
Даже при наличии прав пользователя, Windows может блокировать запуск COM-объекта из-за настроек безопасности DCOM. Разберем по шагам настройку компонента:
Win + R, введите dcomcnfg и нажмите Enter.V82.COMConnector, если используется старая версия).В 1С существует механизм защиты, называемый "Безопасный режим". В этом режиме создание объектов COMObject категорически запрещено. Проанализируем, не включен ли он в вашем случае.
Если ваш HTTP-сервис вызывает метод из общего модуля, проверьте свойства этого модуля. Если установлена галочка "Безопасный режим", COM-соединение не взлетит. Также проверьте настройки профиля безопасности в консоли администрирования серверов 1С.
Для программного отключения ограничений внутри кода (если это разрешено настройками системы) используйте функцию:
УстановитьБезопасныйРежим(Ложь);
Ком = Новый COMObject("V83.COMConnector");
Помимо этого, загляните в карточку пользователя, под которым авторизуется HTTP-сервис. Если у него стоит флаг "Защита от опасных действий", система может блокировать создание COM-объекта без явного подтверждения, которое в HTTP-сервисе дать невозможно.
Существует специфическая особенность Windows Server: для инициализации некоторых COM-компонентов системному профилю необходимы папки рабочего стола, даже если интерфейс не используется. Без них COMConnector может выдавать ошибку конструктора.
Рассмотрим, какие папки нужно создать вручную:
C:\Windows\System32\config\systemprofile\DesktopC:\Windows\SysWOW64\config\systemprofile\Desktop (для 64-битных систем)После создания папок перезагрузите сервер или службу Агента 1С.
Разберем ситуацию более глобально. Использование COM-соединения внутри HTTP-сервиса — это создание "матрешки". На каждый HTTP-запрос сервер 1С вынужден поднимать полноценный тяжелый сеанс COM-соединения в другой базе, что крайне неэффективно расходует память и процессорное время.
Проанализируем более современные подходы, которые избавят вас от проблем с COMObject навсегда:
HTTPСоединение. Это работает в десятки раз быстрее и стабильнее.Выясним преимущества такого подхода: вам не нужно регистрировать библиотеки, настраивать DCOM и бороться с правами системных учетных записей. Весь обмен идет по стандартному протоколу HTTP.
Подводя итог, если вам необходимо срочно починить текущее решение, сосредоточьтесь на настройке прав удостоверения Пула приложений IIS и регистрации правильной разрядности comcntr.dll. Эти два действия решают проблему в 90% случаев.