Как исправить ошибку «Установлен безопасный режим. Выполнение операции запрещено» при работе с внешней обработкой в 1С?

Программист 1С v8.3 (Управляемые формы) 1C:Бухгалтерия IT и автоматизация бизнеса
← На главную

При разработке внешних обработок в среде 1С:Предприятие 8.3 программисты часто сталкиваются с ситуацией, когда под учетной записью администратора с полными правами весь заложенный функционал работает идеально, но стоит запустить обработку обычному пользователю, как система моментально блокирует выполнение кода. Особенно часто это происходит при попытке соединиться с внешними ресурсами — например, при отправке HTTP-запросов, работе с веб-сервисами или создании объекта WSОпределения для интеграции со сторонними API.

В этой статье мы подробно разберем, почему возникает ошибка «Ошибка при вызове конструктора (WSОпределения): Установлен безопасный режим. Выполнение операции запрещено», почему стандартное отключение защиты от опасных действий в карточке пользователя не решает проблему, и как правильно реализовать обход этого ограничения тремя различными способами.

Выясняем причину: почему платформа блокирует код?

Начиная с современных версий платформы 1С:Предприятие 8.3, разработчики фирмы 1С существенно ужесточили требования к безопасности исполнения программного кода. Если пользователь, не имеющий административных прав (то есть у него отсутствуют роли ПолныеПрава или АдминистраторСистемы), пытается интерактивно открыть внешнюю обработку через стандартное меню «Файл — Открыть», платформа принудительно запускает эту обработку в так называемом безопасном режиме.

Безопасный режим накладывает жесткие ограничения на следующие операции:

  1. Выполнение COM-соединений и работа с внешними объектами операционной системы.
  2. Работа с файловой системой сервера и локального компьютера (разрешается только чтение/запись в каталог временных файлов).
  3. Загрузка и использование внешних компонент (add-ins).
  4. Любая сетевая активность и работа с интернет-ресурсами. Сюда относится создание объектов HTTPСоединение, WSПрокси и, конечно же, инициализация конструктора WSОпределения.

Когда обычный пользователь открывает файл формата .epf через меню «Файл», платформа автоматически присваивает сеансу выполнения этой обработки признак безопасного режима. Как только код доходит до строки инициализации веб-сервиса:

WS_Определения_UPDATE = Новый WSОпределения(НастройкиAPI.СервисОбновления);

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

Многие разработчики ошибочно полагают, что эту проблему можно решить в Конфигураторе, зайдя в список пользователей и сняв флажок «Защита от опасных действий» в свойствах учетной записи. Проанализируем эту ситуацию: данный флажок отвечает лишь за показ предупреждающего диалогового окна («Данное действие может быть небезопасным...»), которое запрашивает у пользователя подтверждение на открытие файла. Сами же ограничения безопасного режима платформы этот флажок никак не отменяет.


Способ 1: Регистрация обработки в справочнике «Дополнительные отчеты и обработки» (Рекомендуемый)

Самым правильным, безопасным и архитектурно верным решением в конфигурациях, построенных на базе Библиотеки Стандартных Подсистем (БСП) — таких как «1С:Бухгалтерия 3.0», «1С:Управление торговлей 11», «1С:ERP» — является отказ от интерактивного открытия через меню «Файл — Открыть» и регистрация обработки в справочнике дополнительных отчетов и обработок.

Для того чтобы система распознала нашу внешнюю обработку как дополнительную, нам необходимо встроить в модуль объекта обработки специальную экспортную функцию СведенияОВнешнейОбработке().

Рассмотрим два варианта регистрации в зависимости от требований к безопасности вашей информационной базы.

Вариант А. Полное отключение безопасного режима при регистрации (Простой путь)

Если ваша база данных развернута локально и к ней не предъявляются жесткие требования аудита безопасности (например, вы не работаете в облачном сервисе 1С:Fresh), вы можете полностью отключить безопасный режим для данной конкретной обработки при ее установке администратором.

Для этого в модуле объекта внешней обработки разместим следующий код:


Функция СведенияОВнешнейОбработке() Экспорт

    ПараметрыРегистрации = ДополнительныеОтчетыИОбработки.СведенияОВнешнейОбработке("2.2.2.1");
    ПараметрыРегистрации.Информация = "Внешняя обработка интеграции с API обновлений.";
    ПараметрыРегистрации.Вид = ДополнительныеОтчетыИОбработкиКлиентСервер.ВидОбработкиДополнительнаяОбработка();
    ПараметрыРегистрации.Версия = "1.0.0.1";
    
    // Отключаем безопасный режим!
    ПараметрыРегистрации.БезопасныйРежим = Ложь;
    
    // Описание команды запуска
    НоваяКоманда = ПараметрыРегистрации.Команды.Добавить();
    НоваяКоманда.Представление = "Открыть панель интеграции API";
    НоваяКоманда.Идентификатор = "ОткрытьФормуОбработки";
    НоваяКоманда.Использование = ДополнительныеОтчетыИОбработкиКлиентСервер.ТипЗапускаОткрытиеФормы();
    НоваяКоманда.ПоказыватьОповещение = Истина;
    
    Возврат ПараметрыРегистрации;

КонецФункции

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

Вариант Б. Предоставление точечных разрешений (Максимально безопасный путь)

Если ваша база проходит аудит безопасности, или вы планируете разместить обработку во фреше, полностью отключать безопасный режим запрещено. В этом случае мы должны оставить свойство БезопасныйРежим = Истина, но в коде регистрации явно запросить у системы разрешение на работу с конкретным сетевым адресом (сайтом вашего API).

Разберем, как это реализовать на практике с помощью встроенных механизмов БСП:


Функция СведенияОВнешнейОбработке() Экспорт

    ПараметрыРегистрации = ДополнительныеОтчетыИОбработки.СведенияОВнешнейОбработке("2.2.2.1");
    ПараметрыРегистрации.Информация = "Внешняя обработка интеграции с API обновлений.";
    ПараметрыРегистрации.Вид = ДополнительныеОтчетыИОбработкиКлиентСервер.ВидОбработкиДополнительнаяОбработка();
    ПараметрыРегистрации.Версия = "1.0.0.1";
    
    // Безопасный режим включен для защиты остальной системы!
    ПараметрыРегистрации.БезопасныйРежим = Истина;
    
    // Запрашиваем разрешение на доступ к конкретному интернет-ресурсу
    Протокол = "HTTPS"; 
    АдресСайта = "api.service.ru"; // Указываем только доменное имя без протокола
    ПортПодключения = 443;
    ОписаниеЗапроса = "Необходимо для отправки запросов к API обновлений и получения метаданных.";
    
    Разрешение = РаботаВБезопасномРежиме.РазрешениеНаИспользованиеИнтернетРесурса(Протокол, АдресСайта, ПортПодключения, ОписаниеЗапроса);
    ПараметрыРегистрации.Разрешения.Добавить(Разрешение);
    
    // Описание команды запуска
    НоваяКоманда = ПараметрыРегистрации.Команды.Добавить();
    НоваяКоманда.Представление = "Открыть панель интеграции API";
    НоваяКоманда.Идентификатор = "ОткрытьФормуОбработки";
    НоваяКоманда.Использование = ДополнительныеОтчетыИОбработкиКлиентСервер.ТипЗапускаОткрытиеФормы();
    НоваяКоманда.ПоказыватьОповещение = Истина;
    
    Возврат ПараметрыРегистрации;

КонецФункции

При загрузке такой обработки в базу данных администратор увидит системное окно с запросом на предоставление доступа к сайту api.service.ru. После подтверждения обработка будет выполняться в безопасном режиме, но платформа сделает исключение для сетевых пакетов, идущих к указанному адресу. Конструктор WSОпределения отработает корректно и без ошибок.


Способ 2: Настройка профилей безопасности на сервере 1С:Предприятия

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

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

Проанализируем шаги настройки профиля безопасности:

  1. Запустите консоль администрирования кластера серверов 1С:Предприятия (Администрирование серверов 1С Предприятия).
  2. Раскройте дерево нужного вам кластера и перейдите в ветку «Профили безопасности».
  3. Щелкните правой кнопкой мыши и выберите команду «Создать — Профиль безопасности». Укажите понятное имя, например, РазрешитьСетевыеПодключения.
  4. В свойствах созданного профиля безопасности обязательно установите флажок «Может использоваться как профиль безопасности безопасного режима».
  5. Внутри созданного профиля перейдите в подраздел «Интернет-ресурсы» и добавьте разрешенные адреса серверов, к которым ваша обработка будет обращаться (или разрешите любые адреса, если политика безопасности компании это допускает).
  6. Перейдите к свойствам вашей конкретной информационной базы в консоли кластера и найдите поле «Профиль безопасности безопасного режима по умолчанию». Выберите из выпадающего списка только что созданный нами профиль.

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


Способ 3: Программный запуск через привилегированный общий модуль

Если вы являетесь разработчиком самой конфигурации 1С (она снята с поддержки или находится на доработке) и вам нужно реализовать механизм, при котором обычные пользователи выбирают внешний файл обработки с диска, но при этом код должен выполняться без ограничений безопасного режима, стандартный метод ОткрытьФорму() вам не подойдет.

Для реализации обхода ограничений платформы мы можем задействовать серверный вызов через привилегированный общий модуль. Рассмотрим, как это сделать шаг за шагом:

Шаг 1. В Конфигураторе создадим новый общий модуль с именем УправлениеВнешнимиОбработкамиСервер. В свойствах модуля установим следующие флажки:

Шаг 2. Напишем в созданном привилегированном модуле функцию подключения обработки с явным отключением безопасного режима:


// Функция подключает внешнюю обработку во временное хранилище без безопасного режима
Функция ПодключитьВнешнююОбработкуНебезопасно(АдресВоВременномХранилище) Экспорт
    
    // Передаем Ложь в третий параметр метода Подключить() для отключения безопасного режима
    ИмяОбработки = ВнешниеОбработки.Подключить(АдресВоВременномХранилище, , Ложь);
    Возврат ИмяОбработки;
    
КонецФункции

Шаг 3. В клиентском коде нашей конфигурации, где пользователь выбирает файл обработки, мы сначала помещаем этот файл во временное хранилище, передаем адрес на сервер, подключаем его без ограничений и открываем форму:


&НаКлиенте
Процедура ВыбратьИОткрытьОбработку(ПутьКФайлу)
    
    // Помещаем выбранный пользователем файл во временное хранилище
    ОписаниеФайла = Новый Файл(ПутьКФайлу);
    ДвоичныеДанныеФайла = Новый ДвоичныеДанные(ПутьКФайлу);
    АдресХранилища = ПоместитьВоВременноеХранилище(ДвоичныеДанныеФайла, УникальныйИдентификатор);
    
    // Вызываем наш привилегированный серверный метод
    ИмяПодключеннойОбработки = УправлениеВнешнимиОбработкамиСервер.ПодключитьВнешнююОбработкуНебезопасно(АдресХранилища);
    
    // Теперь мы можем безопасно открыть форму, и безопасный режим не будет активирован!
    ОткрытьФорму("ВнешняяОбработка." + ИмяПодключеннойОбработки + ".Форма");
    
КонецПроцедуры

Благодаря тому, что физическое подключение файла к контексту программы происходило в привилегированном режиме с параметром отключения защиты, все последующие действия внутри этой формы (включая работу с WSОпределения) будут выполняться так, словно у пользователя есть полные права администратора.


Подведем итоги: какой метод выбрать?

Мы детально проанализировали три кардинально разных подхода к решению проблемы безопасного режима при вызове веб-сервисов. Выбор конкретного варианта зависит от условий эксплуатации вашей системы:

← На главную