Почему COM-соединение в 1С перестает создавать объекты в клиент-серверном режиме и как это исправить

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

При интеграции баз 1С с использованием COM-соединения разработчики нередко сталкиваются с ситуацией: в файловом режиме отладка и создание новых данных проходят успешно, но при переносе решения в клиент-серверный вариант (на MS SQL Server или PostgreSQL) вызовы методов создания объектов перестают работать. При выполнении строк вида COM.Документы[Тип].СоздатьДокумент() или COM.Справочники[Тип].СоздатьЭлемент() отладчик аварийно прекращает сеанс, соединение обрывается, а стандартные окна с текстом ошибки не появляются.

Разберем подробно причины такого поведения платформы 1С:Предприятие и пошаговые способы диагностики и решения проблемы.

Причины сбоя при создании объектов через COM-соединение

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

  1. Исполнение кода на стороне вызываемой базы. При вызове метода создания объекта (например, СоздатьДокумент()) управление передается в вызываемую базу. В этот момент неявно срабатывают события инициализации (ОбработкаЗаполнения в модуле объекта, подписки на события, инициализация параметров сеанса). Если в вызываемой конфигурации код модуля объекта или общего модуля содержит конструкции, недопустимые в контексте внешнего соединения или сервера (например, обращение к клиентским методам работы с интерфейсом), сеанс внешнего соединения аварийно прерывается.
  2. Падение рабочего процесса rphost. В клиент-серверном режиме вызов COM выполняется серверным процессом rphost.exe, который загружает библиотеку comcntr.dll в свое адресное пространство. Критическая ошибка или конфликт версий библиотек приводит к сбою процесса (Access Violation) и моментальному разрыву сеанса отладки без записи стандартных исключений.
  3. Ошибки инициализации параметров сеанса в БСП. В типовых конфигурациях (1С:Бухгалтерия, 1С:Управление торговлей, 1С:ERP) при обращении к объектам проверяются параметры сеанса (текущий пользователь, функциональные опции, настройки прав). Если для внешнего соединения эти параметры не инициализированы в модуле сеанса, вызов завершается критической ошибкой.
  4. Несовпадение разрядности и версий comcntr.dll. Если на сервере установлено несколько релизов платформы или разрядность сервера 1С не совпадает с зарегистрированной в реестре компонентой COM, возникает системный сбой взаимодействия.

Шаг 1. Проверка конфигурации вызываемой базы на внешнее соединение

Выясним, корректно ли скомпилированы модули в базе, к которой выполняется подключение. Для этого выполним проверку конфигурации вызываемой базы:

  1. Откроем в конфигураторе базу-приемник (ту, к которой подключаемся по COM).
  2. В главном меню перейдем в пункт Конфигурация — Проверка конфигурации.
  3. Установим флаги Внешнее соединение и Внешнее соединение клиент-сервер, а также проверку логической целостности.
  4. Запустим проверку и проанализируем отчет на наличие ошибок компиляции в модулях объектов, общих модулях и подписках на события.

Особое внимание обратим на свойства общих модулей: модули, к которым обращаются подписки на события или логика объекта, должны иметь установленный флаг Внешнее соединение и не содержать директив взаимодействия с интерфейсом (форм, предупреждений, вопросов пользователю).

Шаг 2. Перехват и логирование ошибок

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

Посмотрим на пример безопасного создания объекта с записью диагностических данных:


Процедура СоздатьОбъектПоCOM(СтрокаПодключения, ИмяДокумента, ДанныеОбъекта) Экспорт

    Попытка
        COMСоединитель = Новый COMОбъект("V83.COMConnector");
        COM = COMСоединитель.Connect(СтрокаПодключения);
    Исключение
        ЗаписьЖурналаРегистрации(
            "Интеграция COM. Подключение",
            УровеньЖурналаРегистрации.Ошибка,
            ,
            ,
            ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())
        );
        Возврат;
    КонецПопытки;

    Попытка
        // Создание объекта в контексте вызываемой базы
        НовыйДокумент = COM.Документы[ИмяДокумента].СоздатьДокумент();
        
        // Заполнение реквизитов
        НовыйДокумент.Дата = ДанныеОбъекта.Дата;
        НовыйДокумент.Комментарий = "Создано через COM-соединение";
        
        НовыйДокумент.Записать(COM.РежимЗаписиДокумента.Запись);
    Исключение
        ЗаписьЖурналаРегистрации(
            "Интеграция COM. Создание объекта",
            УровеньЖурналаРегистрации.Ошибка,
            ,
            ,
            "Ошибка при создании документа " + ИмяДокумента + ": " + Символы.ПС + 
            ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())
        );
    КонецПопытки;

КонецПроцедуры

Также рекомендуется проверить журнал регистрации в базе-приемнике: отфильтруем события по пользователю, под которым выполняется авторизация через COM, и уровню Ошибка.

Шаг 3. Настройка отладки сеансов внешнего соединения

Чтобы точно локализовать строку в модуле вызываемой базы, на которой происходит сбой, подключим отладчик к сеансу COM:

  1. Откроем конфигуратор базы-приемника.
  2. В меню перейдем в Отладка — Подключение (или Предметы отладки).
  3. Нажмем кнопку Настройка автоматического подключения и установим флаг Внешние соединения.
  4. Установим точку останова в процедуре ОбработкаЗаполнения или ПередЗаписью соответствующего объекта.
  5. Запустим выгрузку из базы-источника. При обращении отладчик базы-приемника остановится на нужной строке кода.

Шаг 4. Изоляция COM-соединения в отдельном процессе COM+

Если сбой связан с конфликтом разрядностей (например, сервер 1С разрядностью 64-bit пытается вызвать 32-битную библиотеку) или нестабильностью процесса rphost, вынесем работу COM-коннектора в отдельное приложение Windows:

  1. Откроем оснастку Службы компонентов (выполнить команду dcomcnfg).
  2. Перейдем в ветку Компьютеры — Мой компьютер — Приложения COM+.
  3. Создадим новое приложение с типом Серверное приложение и укажем учетную запись с правами на запуск службы 1С.
  4. В созданное приложение добавим компонент: выберем регистрацию новых компонентов и укажем файл comcntr.dll из каталога bin установленной платформы 1С.

Такой подход изолирует выполнение COM-вызовов в системном процессе dllhost.exe и предотвращает аварийное завершение серверных процессов кластера 1С.

← На главную