При разработке механизмов обмена данными между базами 1С программисты часто сталкиваются с ситуацией, когда код, идеально работающий в интерактивном режиме (на клиенте), полностью отказывает при запуске в фоновом или регламентном задании. Особенно остро эта проблема проявляется при использовании технологии COM-соединения. Разберем подробно, почему возникают ошибки вроде "Неизвестная ошибка" при вызове метода Выполнить() или "Класс не зарегистрирован", и как правильно настроить серверную среду для стабильной работы обмена.
Прежде всего, проанализируем фундаментальную причину сбоя. Когда вы запускаете обработку вручную, она выполняется в контексте вашего текущего пользователя Windows на вашем локальном компьютере. У вас есть права доступа, зарегистрированные в реестре компоненты и графическая оболочка.
Регламентное задание выполняется на сервере 1С. Это означает следующее:
USR1CV8), у которой по умолчанию сильно ограничены права в операционной системе.Рассмотрим код, который часто используют разработчики:
БазаИсточник = Новый COMОбъект("V83.Application");
// или
БазаИсточник = Новый COMОбъект("V83.COMConnector");
Для фоновых заданий крайне рекомендуется использовать именно V83.COMConnector. Объект Application запускает полноценный (хоть и невидимый) экземпляр платформы 1С. Это требует значительных ресурсов и инициализации оконных подсистем, что в фоновом режиме часто приводит к «зависаниям» или неспецифическим ошибкам выполнения запросов. COMConnector — это «облегченная» версия соединения, специально предназначенная для программного доступа к данным без запуска интерфейса.
Если при попытке создания объекта возникает ошибка «Класс не зарегистрирован» (код 0x80040154), это означает, что в реестре сервера отсутствует запись о библиотеке comcntr.dll или возник конфликт разрядности. Выясним, как это исправить.
Если сервер 1С 64-разрядный, ему требуется 64-разрядная версия компоненты. Рассмотрим шаги по ручной регистрации:
cd "C:\Program Files\1cv8\8.3.XX.XXXX\bin".regsvr32 comcntr.dll.Если это не помогло (например, при взаимодействии 64-битного сервера и 32-битных внешних библиотек), используйте настройку COM+ Applications:
comcntr.dll.Это позволит прослойке Windows корректно перебрасывать вызовы между процессами разной разрядности.
Метод Запрос.Выполнить() в COM-соединении может возвращать «Неизвестную ошибку», если у пользователя службы сервера 1С нет прав на создание временных файлов. Проанализируем ситуацию: для выполнения сложных запросов 1С активно использует временные таблицы и кэширование, которые записываются в системную папку Temp.
Убедитесь, что пользователь, под которым запущена служба 1C:Enterprise 8.3 Server Agent (например, .\USR1CV8), имеет полные права (Full Control) на следующие каталоги:
C:\Windows\TempC:\Users\USR1CV8\AppData\Local\TempНачиная с версии платформы 8.3.9, появилась функция «Защита от опасных действий». При программном создании COM-объектов система может выдавать интерактивное окно с вопросом «Разрешить подключение?». В фоновом задании нажать кнопку некому, и процесс завершается ошибкой.
Для решения этой проблемы на сервере выполним следующие действия:
Найдите или создайте файл conf.cfg в каталоге C:\Program Files\1cv8\conf (или C:\Program Files (x86)\1cv8\conf для 32-битной версии). Добавьте в него строки, отключающие проверку:
SystemLanguage=System
DisableUnsafeActionProtection=.*;
После изменения файла необходимо перезапустить службу сервера 1С. Это позволит фоновым заданиям беспрепятственно создавать объекты V83.COMConnector.
Посмотрим на пример кода автора и выявим потенциальную проблему в передаче параметров:
Запрос = БазаИсточник.NewObject("Запрос");
Запрос.Текст = "ВЫБРАТЬ ... ГДЕ Документ.Дата МЕЖДУ &НачДата И &КонДата";
Запрос.УстановитьПараметр("НачДата", НачалоГода(ТекущаяДата()));
Запрос.УстановитьПараметр("КонДата", КонецГода(ТекущаяДата()));
ВыборкаНомер = Запрос.Выполнить().Выбрать();
Важно помнить: при работе через COM объекты одной базы «не знают» о типах другой базы. Хотя даты являются примитивным типом и обычно передаются корректно, хорошим тоном считается явное преобразование типов. Если в параметры запроса передаются ссылки (Справочники, Документы), их нельзя передавать напрямую из текущей базы в БазаИсточник. Нужно сначала найти соответствующую ссылку в БазаИсточник по коду или ГУИД-у, и только потом устанавливать её в параметр.
Также проанализируем использование ТекущаяДата(). В фоновом задании она возвращает дату сервера. Убедитесь, что часовые пояса и региональные настройки сервера совпадают с ожиданиями логики обмена.
Если вы используете механизм «Дополнительные отчеты и обработки», обратите внимание на параметр «Безопасный режим». В коде регистрации обработки (функция СведенияОВнешнейОбработке) должно быть указано:
ПараметрыРегистрации.Вставить("БезопасныйРежим", Ложь);
Если установлен БезопасныйРежим = Истина, платформа блокирует создание любых COM-объектов из соображений безопасности, что и приводит к отказу в работе регламентного задания.
Подведем итог: для успешного запуска обмена через COM в фоновом режиме необходимо обеспечить использование COMConnector, проверить регистрацию 64-битной компоненты на сервере, предоставить права пользователю USR1CV8 на временные папки и отключить защиту от опасных действий в conf.cfg.