Как отключить безопасный режим при программном запуске внешней обработки из другой обработки?

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

Рассмотрим распространенную ситуацию при разработке в 1С: имеются две дополнительные внешние обработки, которые подключены к информационной базе. В карточках обеих обработок (в пользовательском режиме) флаг «Безопасный режим» снят (установлено значение «Ложь»). При запуске первой обработки мы нажимаем кнопку, которая программно ищет и запускает вторую обработку. Вторая обработка должна подключиться к базе данных MySQL. Однако при попытке вызова функции подключения платформа 1С выдает ошибку, сообщая, что установлен безопасный режим, и блокирует выполнение.

Проанализируем причину такого поведения платформы. Почему настройки, заданные пользователем в справочнике дополнительных отчетов и обработок, игнорируются при программном вызове? Разберем по шагам механизмы платформы и Библиотеки стандартных подсистем (БСП), которые влияют на запуск внешнего кода.

Почему возникает ошибка безопасного режима?

Даже если мы открываем обработку через меню «Файл - Открыть» и все работает корректно, программный вызов подчиняется другим правилам. Выясним основные причины блокировок:

  1. Поведение платформы по умолчанию: При программном подключении второй обработки средствами платформы (например, через метод ВнешниеОбработки.Подключить) параметр безопасного режима по умолчанию всегда имеет значение Истина. Настройки из справочника могут быть проигнорированы, если вызов идет в обход стандартных механизмов БСП.
  2. Механизмы защиты БСП: Библиотека стандартных подсистем принудительно ограничивает запуск стороннего кода из другого стороннего кода. Если вызов маршрутизируется через функции БСП, система защищается от несанкционированных действий.
  3. Защита от опасных действий: Начиная с версии платформы 8.3.8, действует механизм «Защита от опасных действий». При программном открытии внешних модулей платформа блокирует работу с сетью и COM-объектами, даже если у пользователя полные права.

Посмотрим на пример кода из конфигурации, который отвечает за проверку и установку безопасного режима на стороне БСП:


Менеджер = СоздатьМенеджерЗаписи();        
Менеджер.ТипПрограммногоМодуля = СвойстваПрограммногоМодуля.Тип;        
Менеджер.ИдентификаторПрограммногоМодуля = СвойстваПрограммногоМодуля.Идентификатор;        
Менеджер.Прочитать();    
Если Менеджер.Выбран() Тогда    
  Результат = Менеджер.БезопасныйРежим;    
Иначе
  Результат = Неопределено;    
КонецЕсли;

Если запись в регистре сведений РежимыПодключенияВнешнихМодулей не найдена или не читается (значение Неопределено), система может принудительно включить безопасный режим.

Способы решения проблемы

Рассмотрим подробнее несколько вариантов, как можно обойти данное ограничение и заставить вторую обработку корректно работать с сервером MySQL.

1. Явное указание параметра в коде подключения

Если вы подключаете вторую обработку программно через методы менеджера внешних обработок, необходимо обязательно передавать третьим параметром значение Ложь. Это переопределит стандартное поведение платформы. Код должен выглядеть примерно так:


// Третий параметр отвечает за безопасный режим
ИмяОбработки = ВнешниеОбработки.Подключить(ПутьКФайлу, Имя, Ложь);
ВтораяОбработка = ВнешниеОбработки.Создать(ИмяОбработки);

2. Запрос точечных разрешений через манифест БСП

Современный стандарт разработки под БСП предполагает, что обработка должна работать в безопасном режиме, но при этом запрашивать исключения для необходимых действий. В функции СведенияОВнешнейОбработке второй обработки необходимо программно добавить разрешения на использование нужных ресурсов с помощью общего модуля БСП. Например, следует явно запросить разрешение на использование интернет-ресурса (TCP/IP) или разрешение на создание COM-класса (если к MySQL вы подключаетесь через ADODB).

3. Отключение защиты от опасных действий

В карточке пользователя в режиме «Предприятие» необходимо снять флажок «Защита от опасных действий». Если обработка запускается в фоновом задании, оно должно выполняться под пользователем с полными правами и снятой защитой.

Альтернативные архитектурные решения

Проанализируем ситуацию: стоит ли вообще запускать одну внешнюю обработку из другой? Безопасный режим полностью блокирует попытки создания COM-объектов и внешние сетевые запросы. При работе информационной базы в облачном сервисе (модель SaaS) выполнение кода с отключенным безопасным режимом строго запрещено. Рассмотрим более надежные подходы:

  1. Объединение логики: Слейте функционал обеих внешних обработок в одну. Это исключит программный вызов «обработки из обработки» и полностью решит проблему передачи контекста, а также наследования профилей безопасности.
  2. Использование расширений конфигурации: Перенесите код интеграции с базой данных MySQL в расширение конфигурации. Для расширений администратор может централизованно снять флаг безопасного режима, а внешняя обработка будет просто вызывать готовый экспортный метод из серверного модуля расширения.
  3. Настройка профилей безопасности: Администратор кластера серверов 1С может создать отдельный «профиль безопасности» для информационной базы. В нем задаются явные разрешения (виртуальная песочница) на использование определенных COM-классов и сетевых портов, которые необходимы для связи с сервером MySQL.

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

← На главную