Как настроить COM-соединение в фоновом задании и исправить ошибку Неизвестная ошибка при выполнении запроса

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

При разработке механизмов обмена данными между базами 1С программисты часто сталкиваются с ситуацией, когда код, идеально работающий в интерактивном режиме (на клиенте), полностью отказывает при запуске в фоновом или регламентном задании. Особенно остро эта проблема проявляется при использовании технологии COM-соединения. Разберем подробно, почему возникают ошибки вроде "Неизвестная ошибка" при вызове метода Выполнить() или "Класс не зарегистрирован", и как правильно настроить серверную среду для стабильной работы обмена.

Различие контекстов исполнения: Клиент vs Сервер

Прежде всего, проанализируем фундаментальную причину сбоя. Когда вы запускаете обработку вручную, она выполняется в контексте вашего текущего пользователя Windows на вашем локальном компьютере. У вас есть права доступа, зарегистрированные в реестре компоненты и графическая оболочка.

Регламентное задание выполняется на сервере 1С. Это означает следующее:

  1. Другой пользователь: Код исполняется от имени системной учетной записи (обычно USR1CV8), у которой по умолчанию сильно ограничены права в операционной системе.
  2. Отсутствие графического интерфейса: Сервер 1С работает в так называемой «Сессии 0». В современных версиях Windows эта сессия изолирована от любых визуальных объектов.
  3. Разрядность: Если ваш сервер 1С 64-битный, а вы пытаетесь вызвать 32-битную компоненту COM, система выдаст ошибку.

Решение 1: Замена V83.Application на V83.COMConnector

Рассмотрим код, который часто используют разработчики:


БазаИсточник = Новый COMОбъект("V83.Application");
// или
БазаИсточник = Новый COMОбъект("V83.COMConnector");

Для фоновых заданий крайне рекомендуется использовать именно V83.COMConnector. Объект Application запускает полноценный (хоть и невидимый) экземпляр платформы 1С. Это требует значительных ресурсов и инициализации оконных подсистем, что в фоновом режиме часто приводит к «зависаниям» или неспецифическим ошибкам выполнения запросов. COMConnector — это «облегченная» версия соединения, специально предназначенная для программного доступа к данным без запуска интерфейса.

Решение 2: Регистрация компоненты и решение проблемы разрядности

Если при попытке создания объекта возникает ошибка «Класс не зарегистрирован» (код 0x80040154), это означает, что в реестре сервера отсутствует запись о библиотеке comcntr.dll или возник конфликт разрядности. Выясним, как это исправить.

Если сервер 1С 64-разрядный, ему требуется 64-разрядная версия компоненты. Рассмотрим шаги по ручной регистрации:

  1. Запустите командную строку от имени администратора на сервере.
  2. Перейдите в каталог установленной платформы, например: cd "C:\Program Files\1cv8\8.3.XX.XXXX\bin".
  3. Выполните команду: regsvr32 comcntr.dll.

Если это не помогло (например, при взаимодействии 64-битного сервера и 32-битных внешних библиотек), используйте настройку COM+ Applications:

  1. Откройте «Службы компонентов» (dcomcnfg).
  2. Создайте новое пустое приложение COM+.
  3. В разделе «Роли» или «Удостоверение» укажите пользователя с правами администратора.
  4. В папку «Компоненты» добавьте comcntr.dll.

Это позволит прослойке Windows корректно перебрасывать вызовы между процессами разной разрядности.

Решение 3: Настройка прав доступа и папки Temp

Метод Запрос.Выполнить() в COM-соединении может возвращать «Неизвестную ошибку», если у пользователя службы сервера 1С нет прав на создание временных файлов. Проанализируем ситуацию: для выполнения сложных запросов 1С активно использует временные таблицы и кэширование, которые записываются в системную папку Temp.

Убедитесь, что пользователь, под которым запущена служба 1C:Enterprise 8.3 Server Agent (например, .\USR1CV8), имеет полные права (Full Control) на следующие каталоги:

Решение 4: Отключение защиты от опасных действий

Начиная с версии платформы 8.3.9, появилась функция «Защита от опасных действий». При программном создании COM-объектов система может выдавать интерактивное окно с вопросом «Разрешить подключение?». В фоновом задании нажать кнопку некому, и процесс завершается ошибкой.

Для решения этой проблемы на сервере выполним следующие действия:

Найдите или создайте файл conf.cfg в каталоге C:\Program Files\1cv8\conf (или C:\Program Files (x86)\1cv8\conf для 32-битной версии). Добавьте в него строки, отключающие проверку:


SystemLanguage=System
DisableUnsafeActionProtection=.*;

После изменения файла необходимо перезапустить службу сервера 1С. Это позволит фоновым заданиям беспрепятственно создавать объекты V83.COMConnector.

Решение 5: Особенности написания кода запроса через COM

Посмотрим на пример кода автора и выявим потенциальную проблему в передаче параметров:


Запрос = БазаИсточник.NewObject("Запрос");  
Запрос.Текст = "ВЫБРАТЬ ... ГДЕ Документ.Дата МЕЖДУ &НачДата И &КонДата";
Запрос.УстановитьПараметр("НачДата", НачалоГода(ТекущаяДата()));
Запрос.УстановитьПараметр("КонДата", КонецГода(ТекущаяДата()));
ВыборкаНомер = Запрос.Выполнить().Выбрать();

Важно помнить: при работе через COM объекты одной базы «не знают» о типах другой базы. Хотя даты являются примитивным типом и обычно передаются корректно, хорошим тоном считается явное преобразование типов. Если в параметры запроса передаются ссылки (Справочники, Документы), их нельзя передавать напрямую из текущей базы в БазаИсточник. Нужно сначала найти соответствующую ссылку в БазаИсточник по коду или ГУИД-у, и только потом устанавливать её в параметр.

Также проанализируем использование ТекущаяДата(). В фоновом задании она возвращает дату сервера. Убедитесь, что часовые пояса и региональные настройки сервера совпадают с ожиданиями логики обмена.

Решение 6: Безопасный режим в дополнительных обработках

Если вы используете механизм «Дополнительные отчеты и обработки», обратите внимание на параметр «Безопасный режим». В коде регистрации обработки (функция СведенияОВнешнейОбработке) должно быть указано:

ПараметрыРегистрации.Вставить("БезопасныйРежим", Ложь);

Если установлен БезопасныйРежим = Истина, платформа блокирует создание любых COM-объектов из соображений безопасности, что и приводит к отказу в работе регламентного задания.

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

← На главную