При интеграции баз 1С с использованием COM-соединения разработчики нередко сталкиваются с ситуацией: в файловом режиме отладка и создание новых данных проходят успешно, но при переносе решения в клиент-серверный вариант (на MS SQL Server или PostgreSQL) вызовы методов создания объектов перестают работать. При выполнении строк вида COM.Документы[Тип].СоздатьДокумент() или COM.Справочники[Тип].СоздатьЭлемент() отладчик аварийно прекращает сеанс, соединение обрывается, а стандартные окна с текстом ошибки не появляются.
Разберем подробно причины такого поведения платформы 1С:Предприятие и пошаговые способы диагностики и решения проблемы.
Проанализируем техническую сторону работы внешнего соединения в клиент-серверной архитектуре:
СоздатьДокумент()) управление передается в вызываемую базу. В этот момент неявно срабатывают события инициализации (ОбработкаЗаполнения в модуле объекта, подписки на события, инициализация параметров сеанса). Если в вызываемой конфигурации код модуля объекта или общего модуля содержит конструкции, недопустимые в контексте внешнего соединения или сервера (например, обращение к клиентским методам работы с интерфейсом), сеанс внешнего соединения аварийно прерывается.rphost. В клиент-серверном режиме вызов COM выполняется серверным процессом rphost.exe, который загружает библиотеку comcntr.dll в свое адресное пространство. Критическая ошибка или конфликт версий библиотек приводит к сбою процесса (Access Violation) и моментальному разрыву сеанса отладки без записи стандартных исключений.comcntr.dll. Если на сервере установлено несколько релизов платформы или разрядность сервера 1С не совпадает с зарегистрированной в реестре компонентой COM, возникает системный сбой взаимодействия.Выясним, корректно ли скомпилированы модули в базе, к которой выполняется подключение. Для этого выполним проверку конфигурации вызываемой базы:
Особое внимание обратим на свойства общих модулей: модули, к которым обращаются подписки на события или логика объекта, должны иметь установленный флаг Внешнее соединение и не содержать директив взаимодействия с интерфейсом (форм, предупреждений, вопросов пользователю).
Поскольку при падении COM-вызова окно с ошибкой не выводится, необходимо перехватить исключение программно и записать полную информацию в журнал регистрации.
Посмотрим на пример безопасного создания объекта с записью диагностических данных:
Процедура СоздатьОбъектПоCOM(СтрокаПодключения, ИмяДокумента, ДанныеОбъекта) Экспорт
Попытка
COMСоединитель = Новый COMОбъект("V83.COMConnector");
COM = COMСоединитель.Connect(СтрокаПодключения);
Исключение
ЗаписьЖурналаРегистрации(
"Интеграция COM. Подключение",
УровеньЖурналаРегистрации.Ошибка,
,
,
ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())
);
Возврат;
КонецПопытки;
Попытка
// Создание объекта в контексте вызываемой базы
НовыйДокумент = COM.Документы[ИмяДокумента].СоздатьДокумент();
// Заполнение реквизитов
НовыйДокумент.Дата = ДанныеОбъекта.Дата;
НовыйДокумент.Комментарий = "Создано через COM-соединение";
НовыйДокумент.Записать(COM.РежимЗаписиДокумента.Запись);
Исключение
ЗаписьЖурналаРегистрации(
"Интеграция COM. Создание объекта",
УровеньЖурналаРегистрации.Ошибка,
,
,
"Ошибка при создании документа " + ИмяДокумента + ": " + Символы.ПС +
ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())
);
КонецПопытки;
КонецПроцедуры
Также рекомендуется проверить журнал регистрации в базе-приемнике: отфильтруем события по пользователю, под которым выполняется авторизация через COM, и уровню Ошибка.
Чтобы точно локализовать строку в модуле вызываемой базы, на которой происходит сбой, подключим отладчик к сеансу COM:
ОбработкаЗаполнения или ПередЗаписью соответствующего объекта.Если сбой связан с конфликтом разрядностей (например, сервер 1С разрядностью 64-bit пытается вызвать 32-битную библиотеку) или нестабильностью процесса rphost, вынесем работу COM-коннектора в отдельное приложение Windows:
dcomcnfg).comcntr.dll из каталога bin установленной платформы 1С.Такой подход изолирует выполнение COM-вызовов в системном процессе dllhost.exe и предотвращает аварийное завершение серверных процессов кластера 1С.