После обновления платформы «1С:Предприятие» до версии 8.3.9 (и выше) многие специалисты сталкиваются с ситуацией, когда фоновые или регламентные задания, вызывающие код из внешних обработок или использующие COM-подключения, перестают выполняться. Проанализируем, почему возникает эта проблема и какими способами можно ее решить.
Основной причиной блокировки выполнения кода является введенный разработчиками платформы механизм «Защита от опасных действий». Начиная с версии 8.3.9, платформа по умолчанию считает потенциально небезопасными следующие операции:
Если опасное действие вызывается в обычным интерактивном сеансе, платформа выводит пользователю предупреждающий диалог с запросом подтверждения. Однако при исполнении кода в контексте фонового или регламентного задания интерактивный диалог выводиться не может. В результате платформа автоматически прерывает выполнение операции и генерирует ошибку безопасности.
Рассмотрим наименее трудоемкий вариант решения проблемы в пользовательском режиме или Конфигураторе. Если фоновое задание выполняется от имени конкретного пользователя информационной базы, достаточно снять для него ограничение безопасности.
После этого фоновые задания, исполняемые под данным пользователем, смогут беспятственно подключать внешние обработки и работать с COM-объектами.
Посмотрим на способ, который позволяет отключить механизма контроля потенциально опасных действий на уровне всего сервера или конкретных информационных баз без изменения настроек пользователей.
Для этого используется файл конфигурации платформы conf.cfg, расположенный в каталоге установки conf на сервере 1С:Предприятия.
conf.cfg в каталоге параметров платформы.DisableUnsafeActionProtection=.*;
Важный момент: в клиент-серверном режиме данный параметр необходимо прописывать именно в conf.cfg на стороне сервера 1С:Предприятия, поскольку фоновые задания выполняются в контексте кластера серверов. В файловом режиме файл конфигурации настраивается на рабочей станции, выполняющей обработку фоновых задач.
Проанализируем ситуацию, когда необходимо программно отключить предупреждения безопасности для всех существующих пользователей информационной базы. Для этого можно использовать следующий фрагмент кода на встроенном языке 1С:
Для Каждого ПользовательИБ Из ПользователиИнформационнойБазы.ПолучитьПользователей() Цикл
ПользовательИБ.ЗащитаОтОпасныхДействий.ПредупреждатьОбОпасныхДействиях = Ложь;
ПользовательИБ.Записать();
КонецЦикла;
Данный код выполняет обход массива объектов ПользовательИнформационнойБазы и сбрасывает свойство ПредупреждатьОбОпасныхДействиях у каждого из них.
Если внешняя обработка подключается программно с помощью объекта ВнешниеОбработки, защитный режим можно отключить непосредственно в моменте вызова метода Подключить().
Выясним, как передать нужный параметр: при вызове ВнешниеОбработки.Подключить() передается параметр ЗащитаОтОпасныхДействий со значением Ложь. Это позволяет системе доверять подключаемому модулю без выдачи предупреждений.
Отдельно разберем проблему, возникающую при переходе на 64-разрядную версию сервера 1С:Предприятия. Некоторые внешние библиотеки и COM-компоненты (например, библиотека печати штрихкодов PDF-417 от ГНИВЦ ФНС РФ) существуют исключительно в 32-разрядном исполнении.
В 64-разрядном процессе сервера 1С прямое подключение 32-разрядных COM-объектов невозможно. Если внешняя обработка в фоновом задании использует такие библиотеки, потребуется вынести их выполнение в отдельный 32-разрядный процесс (например, через COM+ Application / dllhost или запуск стороннего 32-битного клиента).