Как отключить безопасный режим при открытии внешней обработки через «Файл – Открыть» для пользователя без полных прав?

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

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

Одной из наиболее частых проблем, возникающих в безопасном режиме, является невозможность создания COM-объектов, например, Новый COMObject("V83.COMConnector") (через который часто реализуется выполнение запросов и алгоритмов), а также ограничения на работу с файловой системой (например, копирование файлов и каталогов между клиентом и сервером), доступ к привилегированному режиму и другие «опасные» операции. В рамках этой статьи мы проанализируем, почему возникают эти ограничения и какие существуют пути их преодоления.

Почему стандартные методы отключения безопасного режима не срабатывают

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

Неэффективность метода УстановитьОтключениеБезопасногоРежима(Истина)

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

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

Ограничения при программном подключении через ВнешниеОбработки.Подключить()

Аналогичная ситуация возникает при попытке программно подключить внешнюю обработку с отключенным безопасным режимом, используя метод ВнешниеОбработки.Подключить(АдресВоВременномХранилище,,Ложь). Казалось бы, указание параметра Ложь в третьем параметре метода должно решить проблему, как это показано в примере:


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

&НаКлиенте
Процедура ЗапуститьОбработку(Команда)
    // Предполагаем, что ПутьКОбработке где-то определен, например:
    // ПутьКОбработке = "C:\МояОбработка.epf"; 
    // ...
    ДвоичныеДанныеОбработки = Новый ДвоичныеДанные(ПутьКОбработке);
    АдресВХранилище = ПоместитьВоВременноеХранилище(ДвоичныеДанныеОбработки, Новый УникальныйИдентификатор());
    
    Попытка
        ВнешняяОбработка = ПодключитьВнешнююОбработку(АдресВХранилище);
        // Если подключение успешно, открываем форму
        ВнешняяОбработка.ПолучитьФорму().Открыть();
    Исключение
        Сообщить("Ошибка при подключении или открытии обработки: " + ОписаниеОшибки());
    КонецПопытки;
КонецПроцедуры

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

Причина ограничения: Платформа 1С и принципы безопасности

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

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

Решения и обходные пути для работы с внешними обработками без безопасного режима

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

1. Предоставление административных прав

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

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

2. Регистрация обработки как дополнительной

Если наша цель – не интерактивное открытие «на лету» для отладки, а постоянное использование обработки в системе, то наиболее корректным и безопасным методом является ее регистрация в подсистеме «Дополнительные отчеты и обработки» (если конфигурация использует Библиотеку стандартных подсистем – БСП).

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


// Модуль объекта внешней обработки

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

После реализации этой функции, обработку необходимо добавить в конфигурацию через интерфейс «Дополнительные отчеты и обработки» (обычно доступен через раздел «Администрирование» -> «Печатные формы, отчеты и обработки»). Когда обработка будет запущена через этот механизм, платформа учтет флаг БезопасныйРежим = Ложь, и она будет работать без ограничений. Этот механизм является штатным и предпочтительным для распространения функциональности, требующей повышенных прав, поскольку он требует явного действия администратора по ее регистрации и, возможно, назначения профиля безопасности.

3. Использование обработки-обертки

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

  1. Мы создаем простую внешнюю обработку, которую назовем «обработкой-оберткой».
  2. Эту обработку-обертку регистрируем как дополнительную обработку (как описано в пункте 2), установив для нее БезопасныйРежим = Ложь в функции СведенияОВнешнейОбработке().
  3. В коде этой обработки-обертки реализуем функционал по динамической загрузке и выполнению нашей основной «небезопасной» обработки. Поскольку обертка уже работает в небезопасном режиме (поскольку мы ее так зарегистрировали), она сможет без проблем подключить и запустить целевую обработку.

Пример кода в модуле объекта обработки-обертки для динамического запуска другой, целевой, обработки:


// Модуль объекта обработки-обертки (уже зарегистрирована как "небезопасная" в конфигурации)

// Переменная для хранения полного пути к файлу целевой обработки, которую мы хотим запустить
&НаКлиенте
Перем мПутьКЦелевойОбработке;

&НаКлиенте
Процедура ПриОткрытии(Отказ)
    // При открытии обертки, мы можем предложить пользователю выбрать файл
    // или указать путь к целевой обработке заранее в коде или настройках.
    ДиалогВыбораФайла = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
    ДиалогВыбораФайла.Заголовок = "Выберите файл целевой обработки (.epf)";
    ДиалогВыбораФайла.ПолноеИмяФайла = ""; // Начинаем с пустого имени файла
    ДиалогВыбораФайла.Фильтр = "Файлы обработки (*.epf)|*.epf";
    
    Если ДиалогВыбораФайла.Выбрать() Тогда
        мПутьКЦелевойОбработке = ДиалогВыбораФайла.ПолноеИмяФайла;
        // Вызываем серверную процедуру для запуска целевой обработки
        ЗапуститьЦелевуюОбработкуНаСервере(мПутьКЦелевойОбработке);
    Иначе
        Отказ = Истина; // Пользователь отменил выбор файла, закрываем обертку
    КонецЕсли;
КонецПроцедуры

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

Такой подход позволяет нам запускать любую внешнюю обработку без безопасного режима, используя одну «точку входа» – обработку-обертку, которая сама зарегистрирована в системе как работающая в небезопасном режиме. Это удобно для отладки или для временного использования внешних обработок.

4. Использование профилей безопасности (требуется версия КОРП и БСП)

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

  1. Активация профилей безопасности: Мы должны убедиться, что в нашей конфигурации включено использование профилей безопасности. Обычно это настраивается в константах или функциональных опциях конфигурации (например, «Использовать профили безопасности для…» в административных настройках).
  2. Создание профиля безопасности: В консоли кластера серверов 1С:Предприятия или через специальный интерфейс в конфигурации (доступный для пользователей с ролями «Полные права» и «Администратор системы») можно создать новый профиль безопасности. В этом профиле мы сможем явно разрешить выполнение определенных «небезопасных» действий, таких как:
    • Доступ к привилегированному режиму.
    • Доступ к интернет-ресурсам.
    • Доступ к файловой системе (кроме временных файлов).
    • Создание COM-объектов.
    • Загрузка внешних компонентов.
    Например, для создания COM-объекта V83.COMConnector может потребоваться явное разрешение с использованием функции РазрешениеНаСозданиеCOMКласса() из модуля БСП «РаботаВБезопасномРежиме», если она применяется в вашей конфигурации:
    
    Разрешение = РаботаВБезопасномРежиме.РазрешениеНаСозданиеCOMКласса(«V83.ComConnector», «{GUID-объекта-COM}», «ИмяСервера1С»)
    
    GUID COM-объекта можно найти в реестре Windows.
  3. Назначение профиля: После создания, этот профиль безопасности можно привязать к конкретным пользователям, ролям, или к дополнительным отчетам и обработкам, указывая его в настройках регистрации.

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

5. Отключение защиты от опасных действий на уровне сервера (системный подход)

Для очень специфических сценариев, например, в тестовых или разработческих средах, когда требуется полностью отключить защиту от опасных действий для определенных информационных баз, мы можем использовать параметр DisableUnsafeActionProtection в файле conf.cfg.

Файл conf.cfg обычно находится в каталоге установки сервера 1С:Предприятия (например, C:\Program Files\1cv8\vers_number\bin\conf). Добавив в него следующую строку, мы можем указать маску информационных баз, для которых защита от опасных действий будет отключена для всех пользователей:

DisableUnsafeActionProtection=SqlBaseName

Где SqlBaseName – это имя вашей информационной базы в SQL Server или имя файла базы данных для файлового варианта. Мы также можем использовать маски, например, * для всех баз, но мы настоятельно не рекомендуем использовать этот метод в продуктивных средах, поскольку он глобально отключает важный механизм безопасности, делая систему крайне уязвимой для любых видов атак и несанкционированных действий.

Заключение

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

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

  1. Предоставление административных прав пользователю, что является самым простым решением, но не всегда приемлемым в контексте безопасности.
  2. Регистрацию обработки как дополнительной в конфигурации с явным указанием БезопасныйРежим = Ложь в функции СведенияОВнешнейОбработке(). Это штатный и безопасный способ интеграции.
  3. Использование обработки-обертки, если прямая регистрация невозможна или нежелательна, что позволяет динамически запускать другие обработки.
  4. Внедрение и настройку профилей безопасности для детального управления разрешениями, что обеспечивает гранулярный контроль, но требует КОРП-лицензий и сложной настройки.

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

← На главную