Почему метод СоздатьДокумент() через COM выдает ошибку в клиент-серверной базе 1С?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При разработке интеграций между базами 1С через COM-соединение разработчики нередко сталкиваются с ситуацией, когда один и тот же код без проблем отрабатывает в файловом варианте информационной базы, однако при переносе базы на SQL (клиент-серверный режим) вызов метода СоздатьДокумент() завершается ошибкой выполнения.

Рассмотрим детально, почему возникают сбои при вызове СоздатьДокумент() через COM-соединение на сервере 1С, как правильно диагностировать проблему и какими способами её устранить.

Суть проблемы и различие контекстов исполнения

Проанализируем типовой фрагмент кода подключения и создания объекта во внешней базе:


COM_Документы = Соединение.Документы.МОЙ;
COM_Документ = COM_Документы.СоздатьДокумент();

В файловом режиме границы клиентского и серверного контекстов сглаживаются, так как все операции выполняются в рамках единого процесса. В клиент-серверном режиме исполнение COM-соединения происходит строго на стороне сервера приложений 1С в контексте ВнешнееСоединение.

Если для других документов код работает, но для конкретного вида документа метод СоздатьДокумент() выдает сбой вида «Ошибка при вызове метода контекста (СоздатьДокумент)», это свидетельствует о проблемах с правами или наличии клиентского кода в модулях этого документа.

Причина 1. Недостаточно прав у пользователя COM-соединения

Выясним, как настройки прав влияют на работу через COM. Авторизация COM-соединения выполняется от имени конкретного пользователя информационной базы. Если у ролей этого пользователя нет прав на добавление или создание конкретного типа документа (или включен механизм RLS), попытка вызова СоздатьДокумент() вернет ошибку доступа.

Решение по шагам:

  1. Уточним учетную запись, под которой выполняется авторизация через COMConnector.
  2. В Конфигураторе базы-приемника откроем роли пользователя и проверим наличие прав Добавление и Интерактивное добавление для нужного документа.
  3. Если вызов метода происходит внутри серверного кода основной базы, для обхода ограничений прав можно временно включить привилегированный режим вызовом УстановитьПривилегированныйРежим(Истина).

Причина 2. Использование клиентских функций в модуле объекта документа

При обращении к методу СоздатьДокумент() платформа 1С создаёт новый объект и автоматически исполняет его обработчики (например, ОбработкаЗаполнения). Если в модуле объекта документа или связанных процедурах общих модулей используются клиентские функции (вызовы форм, интерактивные диалоги Предупреждение(), Вопрос()), в клиент-серверном режиме вызов COM прерывается ошибкой компиляции.

Для исправления обернем клиентские вызовы инструкциями препроцессора:


#Если Не ВнешнееСоединение И Не Сервер Тогда
    // Интерактивный код (работа с формами и диалогами)
#КонецЕсли

Причина 3. Неверные свойства общих модулей

Проверим свойства общих модулей, к которым обращается модуль объекта создаваемого документа. Если процедура вызывается из общего модуля, у которого в Конфигураторе снят флажок Внешнее соединение, вызов функции из COM-сессии завершится ошибкой.

Убедимся, что для используемых общих модулей установлены флаги:

  1. Сервер
  2. Внешнее соединение
  3. Вызов сервера (при необходимости вызова с клиента)

Причина 4. Проблемы с регистрацией библиотеки comcntr.dll на сервере

В клиент-серверном варианте 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-соединения вызывает сложности с настройкой прав или библиотек на сервере, рассмотрим более современные подходы к интеграции:

  1. HTTP-сервисы (REST API): Создание HTTP-сервиса в базе-приемнике позволяет принимать данные в формате JSON или XML и выполнять создание документа внутренним кодом 1С на стороне сервера.
  2. Web-сервисы (SOAP): Использование штатных Web-сервисов 1С с передачей объектов XDTO.
  3. Асинхронный обмен через файлы: Запись данных во внешние файлы (JSON/XML) с их последующей обработкой фоновым заданием в целевой базе.
← На главную