При настройке автоматического обмена данными между базами «1С:Предприятие» разработчики часто используют механизм COM-соединения посредством объекта V83.COMConnector. На этапе разработки и интерактивного тестирования все может работать безупречно: вы нажимаете кнопку в обработке или вручную запускаете регламентное задание из консоли, и подключение успешно устанавливается. Однако стоит оставить систему работать в автономном режиме по расписанию, как в журнале регистрации начинает сыпаться досадная ошибка: «Ошибка при вызове метода контекста (Connect)».
В этой статье мы подробно разберем, почему возникает эта проблема, проанализируем внутренние механизмы платформы «1С» и операционной системы Windows, а также рассмотрим по шагам несколько эффективных способов решения данной задачи.
---
Прежде чем перейти к техническим решениям, давайте проанализируем разницу в контексте выполнения кода. Когда вы запускаете обмен интерактивно (нажатием кнопки на форме или через ручной запуск в консоли регламентных заданий под вашим сеансом), код выполняется в контексте вашего текущего пользователя Windows и вашего клиентского приложения. В этот момент у системы есть доступ к зарегистрированным в вашем сеансе COM-компонентам, сетевым путям и окружению.
Когда же задание стартует автоматически по расписанию, оно выполняется в фоновом режиме на сервере «1С» (в случае клиент-серверного варианта) или в выделенном фоновом потоке специального сеанса-планировщика (в случае файловой базы). В этот момент код выполняется от имени системной учетной записи (например, usr1cv8 для сервера «1С»), которая имеет совершенно другие права доступа, не видит сетевые диски текущего пользователя и может быть ограничена политиками безопасности платформы.
Рассмотрим основные причины возникновения ошибки и детальные способы их устранения.
---
Если ваше регламентное задание настроено внутри дополнительной (внешней) обработки, зарегистрированной в справочнике «Дополнительные отчеты и обработки», то наиболее вероятная причина ошибки — автоматический запуск обработки в безопасном режиме.
Даже если при ручной регистрации вы указали параметр БезопасныйРежим = Ложь, БСП при выполнении регламентных заданий внешних обработок по расписанию принудительно включает безопасный режим. В безопасном режиме платформой «1С» накладывается жесткое ограничение на создание любых COM-объектов, включая V83.COMConnector. Попытка инициализации COM-объекта в этот момент как раз и приводит к ошибке вызова метода.
Чтобы решить эту проблему, нам необходимо явно запросить у системы разрешения на работу с COM-объектами в функции СведенияОВнешнейОбработке модуля объекта нашей обработки. Проанализируем, как правильно модифицировать код регистрации:
Функция СведенияОВнешнейОбработке() Экспорт
ПараметрыРегистрации = ДополнительныеОтчетыИОбработки.СведенияОВнешнейОбработке("1.1.1.1");
ПараметрыРегистрации.Вид = ДополнительныеОтчетыИОбработкиКлиентСервер.ВидОбработкиДополнительнаяОбработка;
ПараметрыРегистрации.Версия = "1.1";
// Явно указываем Ложь, но для работы в БСП этого недостаточно
ПараметрыРегистрации.БезопасныйРежим = Ложь;
// Создаем массив разрешений для безопасного режима
ТаблицаРазрешений = Новый Массив;
// Запрашиваем разрешение на создание COM-объекта V83.COMConnector
ИмяКласса = "V83.COMConnector";
// Указываем стандартный CLSID для V83.COMConnector
ИдентификаторКласса = "7A0C6CD3-C1BA-4113-9118-CC0D980C0B0C";
РазрешениеCOM = РаботаВБезопасномРежиме.РазрешениеНаСозданиеCOMКласса(ИмяКласса, ИдентификаторКласса);
ТаблицаРазрешений.Добавить(РазрешениеCOM);
// Если планируется обращение к файловым каталогам на сервере
// РазрешениеФайлы = РаботаВБезопасномРежиме.РазрешениеНаИспользованиеКаталогаВременныхФайлов(Истина, Истина);
// ТаблицаРазрешений.Добавить(РазрешениеФайлы);
ПараметрыРегистрации.Разрешения = ТаблицаРазрешений;
// Описываем команды обработки
СтрокаКоманды = ПараметрыРегистрации.Команды.Добавить();
СтрокаКоманды.Представление = "Выполнить обмен (по расписанию)";
СтрокаКоманды.Идентификатор = "ВыполнитьОбменРегламент";
СтрокаКоманды.Использование = ДополнительныеОтчетыИОбработкиКлиентСервер.ТипКомандыВызовСерверногоМетода;
СтрокаКоманды.ПоказыватьОповещение = Ложь;
Возврат ПараметрыРегистрации;
КонецФункции
Важно: После того как вы внесли эти изменения в модуль внешней обработки, обязательно зайдите в режим «1С:Предприятие», откройте справочник «Дополнительные отчеты и обработки», обновите вашу обработку из файла и нажмите кнопку «Записать и закрыть». При этом БСП выдаст запрос на предоставление разрешений безопасности — согласитесь с ним.
---
Если вы хотите полностью обойти ограничения подсистемы безопасности БСП, связанной со внешними обработками, самым надежным инженерным решением будет перенос логики регламентного задания непосредственно в саму конфигурацию (или в расширение конфигурации).
Давайте разберем этот процесс по шагам:
_ОбменДаннымиСервер). Установите у него свойства Сервер и Вызов сервера.Экспорт:
Процедура ВыполнитьРегламентныйОбмен() Экспорт
// Логика подключения и выполнения обмена
ПараметрыПодключения = "File=""C:\Base1C\TargetBase""; Usr=""Admin""; Pwd=""password"";";
V83COMConnector = Новый COMОбъект("V83.COMConnector");
Попытка
Соединение = V83COMConnector.Connect(ПараметрыПодключения);
// Выполнение операций обмена...
Соединение = Неопределено;
Исключение
ЗаписатьВЖурналРегистрации("ОбменДанными", УровеньЖурналаРегистрации.Ошибка,,, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
КонецПопытки;
КонецПроцедуры
_ОбменДаннымиСервер.ВыполнитьРегламентныйОбмен.Поскольку задание теперь является частью конфигурации, оно не подчиняется правилам безопасного режима для внешних обработок БСП и будет успешно создавать COM-объект при запуске по расписанию.
---
Часто в ИТ-инфраструктуре предприятий на одном физическом сервере могут быть установлены одновременно и 32-разрядная, и 64-разрядная версии платформы «1С». Это может приводить к конфликту регистрации библиотеки comcntr.dll.
Когда фоновое задание запускается на сервере по расписанию, оно выполняется в контексте рабочего процесса сервера 1С:Предприятия (файл rphost.exe). Если ваш сервер «1С» является 64-разрядным, то рабочий процесс будет искать 64-битную версию COM-коннектора. Если в операционной системе зарегистрирована только 32-битная библиотека, возникнет ошибка инициализации.
Рассмотрим, как правильно зарегистрировать обе версии библиотеки в операционной системе Windows. Откройте командную строку (cmd) обязательно от имени Администратора и выполните следующие команды:
Для регистрации 64-разрядной версии компоненты:
C:\Windows\System32\regsvr32.exe "C:\Program Files\1cv8\8.3.15.1830\bin\comcntr.dll"
Для регистрации 32-разрядной версии компоненты:
C:\Windows\SysWOW64\regsvr32.exe "C:\Program Files (x86)\1cv8\8.3.15.1830\bin\comcntr.dll"
Примечание: Замените 8.3.15.1830 в путях на актуальный номер релиза платформы, который используется на вашем сервере.
---
Если целевая база данных, к которой вы подключаетесь через COM-соединение, является файловой и расположена на сетевом ресурсе, фоновое задание по расписанию может аварийно завершаться из-за некорректно указанного пути или нехватки прав доступа.
Проанализируем две важные детали:
Z:\Base, X:\Exchange). Поэтому в строке подключения всегда прописывайте полные сетевые пути. Вместо File="Z:\Base1C" используйте сетевой путь вида File="\\ServerName\ShareName\Base1C".usr1cv8 или локальной системы LocalSystem. Эти пользователи не имеют доступа к сетевым папкам других компьютеров домена. Вам необходимо зайти в оснастку «Службы» Windows, открыть свойства службы 1C:Enterprise 8.3 Server Agent, перейти на вкладку «Вход в систему» и указать доменную учетную запись, которая имеет полные права доступа к сетевой папке с базой данных.---
Самым надежным и профессиональным способом решения любых проблем с разрядностью и правами доступа при работе с COM является изоляция компоненты V83.COMConnector в отдельном системном процессе dllhost.exe через службу компонентов Windows.
Разберем по шагам, как это сделать:
dcomcnfg и нажмите Enter. Откроется окно «Службы компонентов».1C_COM_Connector. Способ активации обязательно укажите как Серверное приложение.comcntr.dll нужной вам разрядности (например, C:\Program Files\1cv8\8.3.15.1830\bin\comcntr.dll).1C_COM_Connector, выберите «Свойства», перейдите на вкладку Безопасность и снимите флажок Принудительная проверка доступа для приложения. Также убедитесь, что уровень аутентификации установлен в значение «Отсутствует».Этот подход полностью решает проблему несовместимости 32-битных и 64-битных систем: операционная система Windows сама выступит посредником и перенаправит вызовы из платформы «1С» любой разрядности в изолированный процесс с COM-объектом.
---
Мы рассмотрели все возможные причины возникновения ошибки метода Connect при выполнении фоновых заданий. Подводя итог, дадим краткую рекомендацию по выбору решения: