При работе в современных версиях платформы «1С:Предприятие 8.3» разработчики и администраторы часто сталкиваются с ситуацией, когда регламентное задание, выполняющее внешнюю обработку или обращающееся к внешним ресурсам, внезапно аварийно завершается. В логах технологического журнала или в истории выполнения фоновых заданий фиксируется ошибка, связанная с блокировкой выполнения из-за защиты от опасных действий. Поскольку регламентные задания выполняются на сервере в фоновом режиме (без участия пользователя), система не может вывести интерактивное предупреждение и просто блокирует операцию.
В этой статье мы подробно разберем, почему возникает эта проблема, проанализируем механизмы работы защиты и рассмотрим несколько эффективных способов решения задачи: от точечной настройки прав пользователей до изменения конфигурационных файлов сервера и написания программного кода.
Начиная с версии платформы 8.3.9, в «1С:Предприятии» реализован встроенный механизм защиты пользователя от выполнения потенциально опасных операций. К таким операциям платформа относит:
COMОбъект("Excel.Application")).ЗапуститьПриложение.Когда интерактивный пользователь пытается выполнить такое действие (например, вручную открывает внешнюю обработку), система показывает предупреждающее диалоговое окно с вопросом: «Вы доверяете этому источнику?». Если действие инициировано регламентным заданием, интерактивный диалог невозможен. Платформа расценивает отсутствие ответа как отказ и немедленно прерывает выполнение потока фонового сеанса, генерируя ошибку. Наша задача — объяснить платформе, что выполняемый код безопасен и не требует интерактивного подтверждения.
---
Самым простым, безопасным и точечным решением является запуск регламентного задания от имени специально созданного служебного пользователя, у которого отключена защита от опасных действий. Рассмотрим этот процесс по шагам.
Шаг 1. Создание служебного пользователя в Конфигураторе
РоботРегламентныхЗаданий).ПолныеПрава или специализированные роли для выполнения конкретных задач регламентного задания).Шаг 2. Привязка пользователя к регламентному заданию
Теперь нам необходимо указать созданного пользователя в свойствах нашего регламентного задания. Это можно сделать двумя способами:
Общие — РегламентныеЗадания, откроем его свойства и в поле ИмяПользователя выберем нашего нового служебного пользователя.Если в базе данных работает множество регламентных заданий или технических учетных записей, мы можем отключить эту защиту программно для целого списка пользователей. Посмотрим на пример кода, который выполняет эту операцию пакетно:
Для Каждого ПользовательИБ Из ПользователиИнформационнойБазы.ПолучитьПользователей() Цикл
// Фильтруем пользователей по определенному признаку (например, содержащих "Робот" в имени)
Если Найти(ПользовательИБ.Имя, "Робот") > 0 Тогда
ПользовательИБ.ЗащитаОтОпасныхДействий.ПредупреждатьОбОпасныхДействиях = Ложь;
ПользовательИБ.Записать();
КонецЕсли;
КонецЦикла;
---
Если регламентное задание запускает внешнюю обработку динамически из файла или хранилища значений, мы можем отключить предупреждение непосредственно в программном коде с помощью объекта платформы ОписаниеЗащитыОтОпасныхДействий. Рассмотрим, как это сделать.
Создадим объект описания защиты, установим свойство ПредупреждатьОбОпасныхДействиях в значение Ложь и передадим его в качестве параметра при создании или подключении внешней обработки.
Пример 1. Создание объекта внешней обработки из файла на диске:
ОписаниеЗащиты = Новый ОписаниеЗащитыОтОпасныхДействий;
ОписаниеЗащиты.ПредупреждатьОбОпасныхДействиях = Ложь;
// Передаем ОписаниеЗащиты третьим параметром в метод Создать()
ПутьКФайлу = "C:\ExternalReports\MyProcess.epf";
ОбработкаОбъект = ВнешниеОбработки.Создать(ПутьКФайлу, Ложь, ОписаниеЗащиты);
ОбработкаОбъект.ВыполнитьКоманду();
Пример 2. Подключение внешней обработки через менеджер внешних обработок:
ОписаниеЗащиты = Новый ОписаниеЗащитыОтОпасныхДействий;
ОписаниеЗащиты.ПредупреждатьОбОпасныхДействиях = Ложь;
// Подключаем обработку в безопасном режиме (или без него) с отключением защиты
ИмяОбработки = ВнешниеОбработки.Подключить(ПутьКФайлу, , Ложь, ОписаниеЗащиты);
ОбработкаОбъект = ВнешниеОбработки.Создать(ИмяОбработки);
ОбработкаОбъект.ВыполнитьКоманду();
Если ваша конфигурация построена на базе БСП (Библиотека Стандартных Подсистем), рекомендуется использовать встроенные методы библиотеки. Например, функция ОбщегоНазначения.ОписаниеЗащитыБезПредупреждений() возвращает уже готовый и преднастроенный объект защиты. Это позволяет избежать ошибок совместимости при обновлении платформы:
ОписаниеЗащиты = ОбщегоНазначения.ОписаниеЗащитыБезПредупреждений();
ОбработкаОбъект = ВнешниеОбработки.Создать(ПутьКФайлу, Ложь, ОписаниеЗащиты);
---
В некоторых случаях (например, на тестовых серверах разработки или в полностью доверенной закрытой корпоративной сети) целесообразно отключить механизм защиты от опасных действий глобально для определенных или для всех информационных баз сразу. Для этого используется конфигурационный файл платформы conf.cfg.
Важное условие: поскольку регламентные задания всегда выполняются на стороне сервера приложений «1С:Предприятие» в контексте фонового сеанса, изменять файл conf.cfg необходимо именно на том сервере, где запущен рабочий процесс (rphost). Изменение файла на клиентском компьютере не повлияет на работу серверных регламентных заданий.
Проанализируем шаги по настройке файла conf.cfg:
Шаг 1. Поиск конфигурационного файла
Расположение файла зависит от операционной системы, под управлением которой работает сервер «1С:Предприятие»:
C:\Program Files\1cv8\conf\conf.cfg (или C:\Program Files (x86)\1cv8\conf\conf.cfg для 32-разрядной версии).C:\Program Files\1cv8\[Номер_Версии]\bin\conf\conf.cfg./etc/1cv8/conf.cfg./opt/1cv8/x86_64/[Номер_Версии]/conf/conf.cfg.Шаг 2. Редактирование файла conf.cfg
Откроем файл текстовым редактором с правами администратора (или суперпользователя root в Linux) и добавим параметр DisableUnsafeActionProtection. Этот параметр принимает строку, содержащую регулярные выражения (разделенные точкой с запятой), определяющие маски имен или путей к базам данных, для которых защиту нужно отключить.
Рассмотрим примеры настройки параметра:
DisableUnsafeActionProtection=.*
Примечание: регулярное выражение .* означает «любая строка», то есть защита будет отключена абсолютно для всех баз, обслуживаемых данным сервером.
DisableUnsafeActionProtection=test_.*;stage_.*;
В данном случае защита отключится только для баз, чьи имена начинаются с префиксов "test_" и "stage_".
Внимание! Избегайте синтаксических ошибок в регулярных выражениях. Если вы некорректно укажете маску (например, забудете экранировать спецсимволы или оставите висячую точку), сервер 1С при обращении к базе выдаст критическую ошибку следующего вида: Ошибка при работе с регулярными выражениями. Код ошибки - 10301 (U_REGEX_RULE_SYNTAX). Наиболее универсальным и безопасным шаблоном для полного отключения защиты является строка:
DisableUnsafeActionProtection=.*;
После внесения изменений в файл conf.cfg перезапуск службы сервера «1С:Предприятие» обычно не требуется, изменения вступают в силу для всех новых сеансов и фоновых заданий автоматически.
---
Даже если мы успешно открыли внешнюю обработку одним из вышеописанных способов, внутри исполняемого кода обработки могут содержаться вызовы опасных функций (например, создание COM-объекта Excel для выгрузки отчета или запуск скрипта PowerShell через ЗапуститьПриложение). Платформа может заблокировать эти действия на этапе их непосредственного выполнения.
Если это происходит, проанализируем следующие варианты решения:
Ложь) или настройте профили безопасности в кластере серверов 1С, явно разрешив конкретные операции.Для быстрого решения проблемы с запуском регламентного задания достаточно создать выделенного пользователя с отключенной защитой от опасных действий и запускать регламентное задание от его имени. Для системных администраторов, сопровождающих крупные инфраструктуры разработки и тестирования, наиболее удобным решением станет глобальное отключение защиты через файл conf.cfg с использованием маски баз данных.