Многим разработчикам приходится сталкиваться с механизмом платформы 1С под названием "Защита от опасных действий". Снятие соответствующего флага для конкретного пользователя в режиме Конфигуратора — процедура известная и понятная. Но как быть, если внешняя обработка выполняется по расписанию в фоне (например, под служебным пользователем DefUser)? Рассмотрим подробнее, почему платформа блокирует выполнение кода и какие существуют проверенные способы решения этой задачи.
Механизм защиты прерывает выполнение кода, если внешняя обработка, работающая в фоновом режиме, пытается инициировать процессы, которые платформа расценивает как потенциально опасные. Проанализируем основные из них:
Если ваша обработка делает хотя бы одно из вышеперечисленных действий, выполнение регламентного задания будет прервано с ошибкой безопасности. Разберем по шагам, как можно легитимно обойти это ограничение.
Если регламентное задание использует внешнюю обработку, то перед ее выполнением она, как правило, подключается к системе. Посмотрим на метод Подключить() менеджеров внешних отчетов и обработок.
Данный метод принимает специальный параметр ЗащитаОтОпасныхДействий. Если при программном подключении обработки явно передать в этот параметр значение Ложь, платформа проигнорирует предупреждение безопасности и позволит коду выполниться.
Пример использования при инициализации:
ИмяОбработки = ВнешниеОбработки.Подключить(АдресВоВременномХранилище, , Ложь);
ОбработкаОбъект = ВнешниеОбработки.Создать(ИмяОбработки);
Важное ограничение: Разрешение на запуск внешней обработки не всегда автоматически транслируется на вложенные вызовы. Если внутри обработки инициируется еще один внешний вызов, может потребоваться дополнительное отключение защиты.
Проанализируем архитектурно правильный подход. Назначать выполнение фоновых заданий под обезличенным пользователем по умолчанию или отключать защиту полностью для всей базы — плохая практика, ставящая под угрозу безопасность данных. Вредоносный код в таком случае сможет выполниться под любым аккаунтом.
Рекомендуется создать отдельного (служебного) пользователя информационной базы исключительно для выполнения регламентных и фоновых заданий. Защиту от опасных действий следует снять локально только для этой служебной учетной записи. Это можно сделать как в Конфигураторе, так и программно.
Посмотрим на пример программного отключения защиты для конкретного пользователя:
ПользовательИБ = ПользователиИнформационнойБазы.НайтиПоИмени("СлужебныйПользовательФЗ");
Если ПользовательИБ <> Неопределено Тогда
ПользовательИБ.ЗащитаОтОпасныхДействий.ПредупреждатьОбОпасныхДействиях = Ложь;
ПользовательИБ.Записать();
КонецЕсли;
Если внешняя обработка добавлена в типовую конфигурацию через подсистему БСП "Дополнительные отчеты и обработки", вы можете зайти в список регламентных заданий в режиме Предприятия и для нужного задания просто выбрать этого заранее созданного пользователя.
Если ваше фоновое задание взаимодействует с расширениями конфигурации, предупреждение безопасности также можно обойти программно. Для этого перед вызовом метода Записать() у объекта РасширениеКонфигурации необходимо установить соответствующее свойство в значение Ложь.
Расширение = РасширенияКонфигурации.Найти("МоеРасширение");
Если Расширение <> Неопределено Тогда
Расширение.ЗащитаОтОпасныхДействий = Ложь;
Расширение.Записать();
КонецЕсли;
Если вы находитесь на этапе разработки или тестирования, можно отключить этот механизм для всей информационной базы целиком. Для этого потребуется отредактировать конфигурационный файл платформы conf.cfg.
Особенности настройки: При использовании клиент-серверной архитектуры (а фоновые задания выполняются именно на стороне сервера), глобальное отключение защиты через файл конфигурации будет работать только в том случае, если этот файл изменен непосредственно на сервере в кластере серверов 1С. Изменение локального файла на компьютере разработчика не повлияет на серверные фоновые задания.
Используйте глобальное отключение с осторожностью, так как это полностью лишает механизм защиты смысла на данном сервере.