При работе в среде «1С:Предприятие 8.3» разработчики часто сталкиваются с ситуацией, когда регламентное или фоновое задание, выполняющее интеграцию с внешними системами через COM-соединение (например, для подключения к MS SQL Server через ADODB.Connection), аварийно завершается. В логах регистрируется ошибка, связанная с выводом предупреждения безопасности: «Модуль выполняет подключение исполнимого бинарного файла... Разрешить подключать исполнимые бинарные файлы для данного модуля?».
Поскольку регламентные задания выполняются на сервере в фоновом режиме, интерактивно нажать кнопку «Да» невозможно. В результате процесс прерывается. В этой статье мы подробно разберем, почему возникает эта проблема, проанализируем внутренние механизмы платформы 1С и рассмотрим три практических способа решения — от простых административных до безопасных программных подходов.
Многие разработчики пытаются решить проблему «в лоб» — программно отключают предупреждения при подключении внешней обработки с помощью объекта ОписаниеЗащитыОтОпасныхДействий. Рассмотрим пример такого кода:
ОбъектОписанияЗащиты = Новый ОписаниеЗащитыОтОпасныхДействий;
ОбъектОписанияЗащиты.ПредупреждатьОбОпасныхДействиях = Ложь;
ПутьКФайлу = "C:\ExternalProcessings\LoadData.epf";
ВнешниеОбработки.Подключить(ПутьКФайлу, , , ОбъектОписанияЗащиты);
При использовании этого кода сама внешняя обработка успешно подключается без вывода диалоговых окон. Однако при первой же попытке инициализировать внутри модуля обработки COM-объект, например, с помощью конструкции Новый COMОбъект("ADODB.Connection"), платформа всё равно выдает критическую ошибку безопасности.
Почему так происходит? Параметр ОписаниеЗащитыОтОпасныхДействий регулирует безопасность исключительно в момент загрузки самого файла обработки (файла .epf или .erf). Как только обработка загружена в память и начинает исполняться, любой вызов потенциально опасных методов платформы (работа с файловой системой, запуск внешних приложений, создание COM-объектов) инициирует новую, независимую проверку безопасности. Если сеанс, в котором выполняется код, находится под защитой, платформа заблокирует вызов, проигнорировав настройки, заданные при подключении файла.
Ниже детально разберем три рабочих способа обхода и решения этой проблемы.
Самый быстрый способ заставить регламентное задание работать — запустить его под правами конкретного пользователя, у которого в конфигурации отключена защита от опасных действий. По умолчанию регламентные задания выполняются под системным пользователем (в неопределенном сеансе), для которого платформа принудительно включает максимальный уровень безопасности.
Рассмотрим этот способ по шагам:
РоботРегламентныхЗаданий) или выберем существующего.Если конфигурация разработана на базе БСП (Библиотеки Стандартных Подсистем), откроем базу в режиме «1С:Предприятие», перейдем в раздел «Администрирование» — «Обслуживание» — «Регламентные и фоновые задания».
Найдем нужное регламентное задание, откроем его свойства и в поле «Пользователь» выберем созданную учетную запись со снятым флагом защиты.
Если задание создается программно в коде конфигурации, назначить ему пользователя можно следующим образом:
Задание = РегламентныеЗадания.НайтиПоПредопределенномуИмени("ЗагрузкаИзВнешнегоИсточника");
Задание.ИмяПользователя = "РоботРегламентныхЗаданий";
Задание.Записать();
Теперь фоновый процесс будет инициализироваться в контексте безопасности указанного пользователя, и вызов ADODB.Connection пройдет успешно без каких-либо предупреждений.
Если регламентных заданий много, или нет возможности привязывать их к конкретным пользователям информационной базы, можно отключить защиту от опасных действий на уровне всего сервера 1С или для конкретных баз через файл конфигурации conf.cfg.
Рассмотрим этот процесс подробнее:
conf.cfg. Обычно он располагается по пути:
C:\Program Files\1cv8\conf\conf.cfg (или в папке конкретной версии платформы bin\conf\conf.cfg).
DisableUnsafeActionProtection.
Чтобы отключить защиту абсолютно для всех баз на данном сервере, пропишем строку:
DisableUnsafeActionProtection=.*
Если требуется отключить защиту только для конкретных баз (что крайне рекомендуется из соображений безопасности), укажем их шаблоны через точку с запятой (в качестве шаблона выступает строка соединения с БД):
DisableUnsafeActionProtection=srv-db1_work;srv-db1_test
Важное предупреждение: Использование этого метода полностью отключает защитные механизмы платформы для указанных баз. Применяйте его только в изолированных и доверенных контурах администрирования.
Предыдущие два метода решают задачу путем снижения уровня безопасности всей системы. Но что делать, если регламентная обработка должна работать в строгом безопасном режиме, а политика безопасности компании запрещает снимать флаги защиты у пользователей или отключать ее на сервере?
В современных конфигурациях 1С, использующих БСП, существует штатный и самый правильный механизм — запрос разрешений в безопасном режиме. Мы можем программно объяснить платформе, что нашей внешней обработке требуется доступ именно к конкретному COM-объекту, и администратор системы выдаст это разрешение при интерактивном подключении обработки. Для быстрого поиска готовых шаблонов и процедур можно использовать справочник по методам БСП с примерами кода.
Разберем, как реализовать этот подход программно в модуле внешней обработки:
СведенияОВнешнейОбработке(), которая отвечает за регистрацию обработки в справочнике БСП, настроим запрос разрешений. Для создания COM-объекта ADODB.Connection нам потребуется его уникальный идентификатор класса (CLSID). Для ADODB это значение: {00000514-0000-0010-8000-00AA006D2EA4}.
Функция СведенияОВнешнейОбработке() Экспорт
ПараметрыРегистрации = ДополнительныеОтчетыИОбработки.СведенияОВнешнейОбработке();
ПараметрыРегистрации.Вид = ДополнительныеОтчетыИОбработкиКлиентСервер.ВидОбработкиДополнительнаяОбработка();
ПараметрыРегистрации.Версия = "1.2";
ПараметрыРегистрации.Наименование = "Регламентный импорт данных из SQL (COM)";
// Включаем безопасный режим работы для обработки
ПараметрыРегистрации.БезопасныйРежим = Истина;
// Описываем команду запуска
НоваяКоманда = ПараметрыРегистрации.Команды.Добавить();
НоваяКоманда.Представление = "Запустить импорт данных";
НоваяКоманда.Идентификатор = "ЗапускИмпортаДанных";
НоваяКоманда.Использование = ДополнительныеОтчетыИОбработкиКлиентСервер.ТипЗапускаВызовСерверногоМетода();
// Запрашиваем точечное разрешение на создание COM-класса ADODB
ИдентификаторКлассаADODB = "{00000514-0000-0010-8000-00AA006D2EA4}";
РазрешениеCOM = РаботаВБезопасномРежиме.РазрешениеНаСозданиеCOMКласса("ADODB.Connection", ИдентификаторКлассаADODB);
ПараметрыРегистрации.Разрешения.Добавить(РазрешениеCOM);
Возврат ПараметрыРегистрации;
КонецФункции
Как это работает на практике для администратора:
ADODB.Connection.Мы проанализировали три метода борьбы с блокировкой фоновых заданий механизмами защиты платформы. Подведем итоги их применимости: