При разработке интеграций между базами 1С через COM-соединение разработчики нередко сталкиваются с ситуацией, когда один и тот же код без проблем отрабатывает в файловом варианте информационной базы, однако при переносе базы на SQL (клиент-серверный режим) вызов метода СоздатьДокумент() завершается ошибкой выполнения.
Рассмотрим детально, почему возникают сбои при вызове СоздатьДокумент() через COM-соединение на сервере 1С, как правильно диагностировать проблему и какими способами её устранить.
Проанализируем типовой фрагмент кода подключения и создания объекта во внешней базе:
COM_Документы = Соединение.Документы.МОЙ;
COM_Документ = COM_Документы.СоздатьДокумент();
В файловом режиме границы клиентского и серверного контекстов сглаживаются, так как все операции выполняются в рамках единого процесса. В клиент-серверном режиме исполнение COM-соединения происходит строго на стороне сервера приложений 1С в контексте ВнешнееСоединение.
Если для других документов код работает, но для конкретного вида документа метод СоздатьДокумент() выдает сбой вида «Ошибка при вызове метода контекста (СоздатьДокумент)», это свидетельствует о проблемах с правами или наличии клиентского кода в модулях этого документа.
Выясним, как настройки прав влияют на работу через COM. Авторизация COM-соединения выполняется от имени конкретного пользователя информационной базы. Если у ролей этого пользователя нет прав на добавление или создание конкретного типа документа (или включен механизм RLS), попытка вызова СоздатьДокумент() вернет ошибку доступа.
Решение по шагам:
COMConnector.УстановитьПривилегированныйРежим(Истина).При обращении к методу СоздатьДокумент() платформа 1С создаёт новый объект и автоматически исполняет его обработчики (например, ОбработкаЗаполнения). Если в модуле объекта документа или связанных процедурах общих модулей используются клиентские функции (вызовы форм, интерактивные диалоги Предупреждение(), Вопрос()), в клиент-серверном режиме вызов COM прерывается ошибкой компиляции.
Для исправления обернем клиентские вызовы инструкциями препроцессора:
#Если Не ВнешнееСоединение И Не Сервер Тогда
// Интерактивный код (работа с формами и диалогами)
#КонецЕсли
Проверим свойства общих модулей, к которым обращается модуль объекта создаваемого документа. Если процедура вызывается из общего модуля, у которого в Конфигураторе снят флажок Внешнее соединение, вызов функции из COM-сессии завершится ошибкой.
Убедимся, что для используемых общих модулей установлены флаги:
В клиент-серверном варианте COM-объект создается в контексте службы сервера 1С (процесс ragent.exe или rphost.exe). Если на сервере приложений 1С не зарегистрирована или некорректно зарегистрирована библиотека comcntr.dll соответствующей разрядности (32/64 бит), вызовы методов менеджерских объектов могут сбоить.
Для решения перерегистрируем библиотеку через командную строку от имени администратора:
regsvr32 "C:\Program Files\1cv8\8.3.9.2033\bin\comcntr.dll"
Важно: версия и релиз библиотеки comcntr.dll должны строго совпадать с версией платформы 1С:Предприятие, на которой работает служба сервера.
Если использование COM-соединения вызывает сложности с настройкой прав или библиотек на сервере, рассмотрим более современные подходы к интеграции: