При настройке регулярного фонового обмена данными между базами 1С (например, при переносе справочников из конфигурации Зарплата и управление персоналом в Бухгалтерия предприятия) разработчики нередко сталкиваются со следующей ситуацией: при ручном запуске внешняя обработка успешно выполняет подключение через V83.COMConnector, однако при вызове того же самого программного кода внутри регламентного или фонового задания возникает исключение:
«Ошибка при вызове метода контекста (Connect): Произошла исключительная ситуация (V83.COMConnector.1): Идентификация пользователя не выполнена. Неправильное имя или пароль пользователя».
Разберем детально, почему возникает такое поведение, выясним скрытые технические причины и рассмотрим по шагам, как правильно настроить подключение и избежать типичных ошибок при работе с COM-соединениями на стороне сервера.
Проанализируем ключевые различия между интерактивным вызовом кода пользователем и выполнением регламентного задания на сервере 1С:
rphost.exe) под системной учетной записью службы (обычно это USR1CV8 или SYSTEM). Если профиль учетной записи службы не инициализирован с русскоязычными региональными стандартами, передаваемые в COM-объект кириллические символы имени пользователя или пароля искажаются (преобразуются в знаки вопроса или некорректные байтовые последовательности). В результате целевая база отклоняет авторизацию.Наиболее надежным решением проблемы с кодировками является создание в целевой информационной базе отдельного технического пользователя, предназначенного исключительно для межпрограммной интеграции.
Выполним следующие рекомендации при создании учетной записи:
ExchangeUser или ComSync).Посмотрим на типичную ошибку при склейке строки подключения:
// Неправильно: отсутствие кавычек вокруг значений параметров
Параметры = "Srvr= " + Сервер + "; Ref = " + База + "; Usr = " + Пользователь + "; Pwd = " + Пароль;
Лишние пробелы вокруг знаков равенства и отсутствие экранирования строковых литералов часто приводят к ошибкам разбора строки парсером библиотеки comcntr.dll. Перепишем формирование строки подключения правильно, используя тройные кавычки для корректного экранирования:
Функция УстановитьCOMПодключение(Знач ИмяСервера, Знач ИмяБазы, Знач Логин, Знач Пароль) Экспорт
COMКоннектор = Новый COMObject("V83.COMConnector");
// Формируем безопасную строку соединения с экранированием параметров
СтрокаПодключения = СтрШаблон("Srvr=""%1"";Ref=""%2"";Usr=""%3"";Pwd=""%4"";",
ИмяСервера,
ИмяБазы,
Логин,
Пароль
);
Попытка
Возврат COMКоннектор.Connect(СтрокаПодключения);
Исключение
ЗаписьЖурналаРегистрации(
"Интеграция.COM",
УровеньЖурналаРегистрации.Ошибка,
,
,
"Ошибка установки COM-соединения: " + ОписаниеОшибки()
);
ВызватьИсключение;
КонецПопытки;
КонецФункции
При выполнении регламентных заданий на сервере важно следить за освобождением ресурсов. Неосвобожденные COM-объекты удерживают сеансы в целевой базе и приводят к утечкам памяти в процессе rphost.
Рассмотрим правильный паттерн завершения работы с COM-соединением:
Процедура ВыполнитьОбменДанными() Экспорт
Соединение = УстановитьCOMПодключение("srv-app01", "zup_prod", "ExchangeUser", "SecretPass123");
Попытка
// Выполняем выборку данных через COM
Выборка = Соединение.Справочники.Должности.Выбрать();
Пока Выборка.Следующий() Цикл
// Обработка полученных данных
КонецЦикла;
Исключение
ЗаписьЖурналаРегистрации(
"Интеграция.COM",
УровеньЖурналаРегистрации.Ошибка,
,
,
"Ошибка при обработке данных через COM: " + ОписаниеОшибки()
);
КонецПопытки;
// Обязательное освобождение COM-объекта
Соединение = Неопределено;
КонецПроцедуры
Если после исправления учетных данных и строки подключения соединение все равно не устанавливается, проверим следующие системные параметры:
x86-64), в операционной системе Windows должна быть корректно зарегистрирована именно 64-битная версия библиотеки comcntr.dll соответствующей версии платформы с помощью утилиты regsvr32.V83.COMConnector работать не сможет.EnterpriseData. Это полностью снимает проблемы с разрядностью, блокировками памяти и зависимостью от операционной системы.