Как отключить предупреждение безопасности при вызове COM-объектов в фоновых заданиях 1С

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

При работе в среде «1С:Предприятие 8.3» разработчики часто сталкиваются с ситуацией, когда регламентное или фоновое задание, выполняющее интеграцию с внешними системами через COM-соединение (например, для подключения к MS SQL Server через ADODB.Connection), аварийно завершается. В логах регистрируется ошибка, связанная с выводом предупреждения безопасности: «Модуль выполняет подключение исполнимого бинарного файла... Разрешить подключать исполнимые бинарные файлы для данного модуля?».

Поскольку регламентные задания выполняются на сервере в фоновом режиме, интерактивно нажать кнопку «Да» невозможно. В результате процесс прерывается. В этой статье мы подробно разберем, почему возникает эта проблема, проанализируем внутренние механизмы платформы 1С и рассмотрим три практических способа решения — от простых административных до безопасных программных подходов.

Выясняем причину: почему не работает программное отключение защиты в коде?

Многие разработчики пытаются решить проблему «в лоб» — программно отключают предупреждения при подключении внешней обработки с помощью объекта ОписаниеЗащитыОтОпасныхДействий. Рассмотрим пример такого кода:


ОбъектОписанияЗащиты = Новый ОписаниеЗащитыОтОпасныхДействий;
ОбъектОписанияЗащиты.ПредупреждатьОбОпасныхДействиях = Ложь;

ПутьКФайлу = "C:\ExternalProcessings\LoadData.epf";
ВнешниеОбработки.Подключить(ПутьКФайлу, , , ОбъектОписанияЗащиты);

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

Почему так происходит? Параметр ОписаниеЗащитыОтОпасныхДействий регулирует безопасность исключительно в момент загрузки самого файла обработки (файла .epf или .erf). Как только обработка загружена в память и начинает исполняться, любой вызов потенциально опасных методов платформы (работа с файловой системой, запуск внешних приложений, создание COM-объектов) инициирует новую, независимую проверку безопасности. Если сеанс, в котором выполняется код, находится под защитой, платформа заблокирует вызов, проигнорировав настройки, заданные при подключении файла.

Ниже детально разберем три рабочих способа обхода и решения этой проблемы.

Способ 1. Назначение пользователя регламентному заданию и отключение защиты (Решение с форума)

Самый быстрый способ заставить регламентное задание работать — запустить его под правами конкретного пользователя, у которого в конфигурации отключена защита от опасных действий. По умолчанию регламентные задания выполняются под системным пользователем (в неопределенном сеансе), для которого платформа принудительно включает максимальный уровень безопасности.

Рассмотрим этот способ по шагам:

  1. Создание или выбор пользователя: Откроем информационную базу в режиме Конфигуратор. Перейдем в меню «Администрирование» — «Пользователи». Создадим специального служебного пользователя (например, РоботРегламентныхЗаданий) или выберем существующего.
  2. Отключение защиты от опасных действий: В карточке выбранного пользователя на вкладке «Основные» найдем флаг «Защита от опасных действий» и снимем его. Сохраним изменения.
  3. Назначение пользователя регламентному заданию:

    Если конфигурация разработана на базе БСП (Библиотеки Стандартных Подсистем), откроем базу в режиме «1С:Предприятие», перейдем в раздел «Администрирование» — «Обслуживание» — «Регламентные и фоновые задания».

    Найдем нужное регламентное задание, откроем его свойства и в поле «Пользователь» выберем созданную учетную запись со снятым флагом защиты.

Если задание создается программно в коде конфигурации, назначить ему пользователя можно следующим образом:


Задание = РегламентныеЗадания.НайтиПоПредопределенномуИмени("ЗагрузкаИзВнешнегоИсточника");
Задание.ИмяПользователя = "РоботРегламентныхЗаданий";
Задание.Записать();

Теперь фоновый процесс будет инициализироваться в контексте безопасности указанного пользователя, и вызов ADODB.Connection пройдет успешно без каких-либо предупреждений.

Способ 2. Глобальное отключение защиты на сервере через conf.cfg

Если регламентных заданий много, или нет возможности привязывать их к конкретным пользователям информационной базы, можно отключить защиту от опасных действий на уровне всего сервера 1С или для конкретных баз через файл конфигурации conf.cfg.

Рассмотрим этот процесс подробнее:

  1. На сервере «1С:Предприятия» найдем файл conf.cfg. Обычно он располагается по пути:
    C:\Program Files\1cv8\conf\conf.cfg (или в папке конкретной версии платформы bin\conf\conf.cfg).
  2. Откроем файл любым текстовым редактором от имени Администратора.
  3. Добавим параметр DisableUnsafeActionProtection.

    Чтобы отключить защиту абсолютно для всех баз на данном сервере, пропишем строку:

    DisableUnsafeActionProtection=.*

    Если требуется отключить защиту только для конкретных баз (что крайне рекомендуется из соображений безопасности), укажем их шаблоны через точку с запятой (в качестве шаблона выступает строка соединения с БД):

    DisableUnsafeActionProtection=srv-db1_work;srv-db1_test
  4. Сохраним файл и перезапустим службу сервера «1С:Предприятия».

Важное предупреждение: Использование этого метода полностью отключает защитные механизмы платформы для указанных баз. Применяйте его только в изолированных и доверенных контурах администрирования.

Способ 3. Безопасный и правильный метод через БСП (Рекомендуется)

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

В современных конфигурациях 1С, использующих БСП, существует штатный и самый правильный механизм — запрос разрешений в безопасном режиме. Мы можем программно объяснить платформе, что нашей внешней обработке требуется доступ именно к конкретному COM-объекту, и администратор системы выдаст это разрешение при интерактивном подключении обработки. Для быстрого поиска готовых шаблонов и процедур можно использовать справочник по методам БСП с примерами кода.

Разберем, как реализовать этот подход программно в модуле внешней обработки:

  1. Откроем модуль нашей внешней обработки.
  2. В функции СведенияОВнешнейОбработке(), которая отвечает за регистрацию обработки в справочнике БСП, настроим запрос разрешений. Для создания COM-объекта ADODB.Connection нам потребуется его уникальный идентификатор класса (CLSID). Для ADODB это значение: {00000514-0000-0010-8000-00AA006D2EA4}.
  3. Напишем следующий код регистрации обработки:

Функция СведенияОВнешнейОбработке() Экспорт
    
    ПараметрыРегистрации = ДополнительныеОтчетыИОбработки.СведенияОВнешнейОбработке();
    ПараметрыРегистрации.Вид = ДополнительныеОтчетыИОбработкиКлиентСервер.ВидОбработкиДополнительнаяОбработка();
    ПараметрыРегистрации.Версия = "1.2";
    ПараметрыРегистрации.Наименование = "Регламентный импорт данных из SQL (COM)";
    
    // Включаем безопасный режим работы для обработки
    ПараметрыРегистрации.БезопасныйРежим = Истина;
    
    // Описываем команду запуска
    НоваяКоманда = ПараметрыРегистрации.Команды.Добавить();
    НоваяКоманда.Представление = "Запустить импорт данных";
    НоваяКоманда.Идентификатор = "ЗапускИмпортаДанных";
    НоваяКоманда.Использование = ДополнительныеОтчетыИОбработкиКлиентСервер.ТипЗапускаВызовСерверногоМетода();
    
    // Запрашиваем точечное разрешение на создание COM-класса ADODB
    ИдентификаторКлассаADODB = "{00000514-0000-0010-8000-00AA006D2EA4}";
    РазрешениеCOM = РаботаВБезопасномРежиме.РазрешениеНаСозданиеCOMКласса("ADODB.Connection", ИдентификаторКлассаADODB);
    
    ПараметрыРегистрации.Разрешения.Добавить(РазрешениеCOM);
    
    Возврат ПараметрыРегистрации;
    
КонецФункции

Как это работает на практике для администратора:

  1. Администратор заходит в базу в режиме «1С:Предприятие», открывает справочник «Дополнительные отчеты и обработки» и загружает обновленный файл обработки.
  2. При записи элемента БСП автоматически обнаружит запрос на создание COM-класса. На экране появится стандартное окно платформы с предупреждением: «Для работы обработки требуются дополнительные разрешения».
  3. Администратор нажимает кнопку «Разрешить выполнение операции». Система автоматически регистрирует профиль безопасности для этой конкретной обработки.
  4. В дальнейшем регламентное задание будет успешно выполняться в безопасном режиме под любым пользователем. Платформа будет блокировать любые несанкционированные действия обработки (например, попытки записать файлы на диск сервера или запустить сторонние утилиты), но при этом беспрепятственно разрешит создание и работу с COM-объектом ADODB.Connection.

Резюме

Мы проанализировали три метода борьбы с блокировкой фоновых заданий механизмами защиты платформы. Подведем итоги их применимости:

← На главную