При работе с внешними отчетами и обработками в системе 1С:Предприятие мы часто сталкиваемся с таким понятием, как безопасный режим. Этот механизм разработан платформой для предотвращения выполнения потенциально вредоносного или нежелательного кода, который может угрожать безопасности данных и стабильности системы. По умолчанию, когда мы открываем внешнюю обработку через меню «Файл – Открыть», особенно для пользователей, не обладающих полными административными правами, такая обработка запускается именно в безопасном режиме.
Одной из наиболее частых проблем, возникающих в безопасном режиме, является невозможность создания COM-объектов, например, Новый COMObject("V83.COMConnector") (через который часто реализуется выполнение запросов и алгоритмов), а также ограничения на работу с файловой системой (например, копирование файлов и каталогов между клиентом и сервером), доступ к привилегированному режиму и другие «опасные» операции. В рамках этой статьи мы проанализируем, почему возникают эти ограничения и какие существуют пути их преодоления.
Многие разработчики, столкнувшись с ограничениями безопасного режима, пытаются отключить его непосредственно из кода внешней обработки или через программное подключение. Рассмотрим подробнее, почему эти подходы могут не дать ожидаемого результата, особенно в контексте интерактивного открытия обработки.
УстановитьОтключениеБезопасногоРежима(Истина)Метод УстановитьОтключениеБезопасногоРежима(Истина), который на первый взгляд кажется логичным решением для отключения безопасного режима из встроенного языка, имеет свои ограничения. Его действие привязано к контексту вызова. Если безопасный режим был установлен самой системой 1С:Предприятие (как это происходит при открытии через «Файл – Открыть» для неадминистративных пользователей), а не программно в текущей процедуре, то попытка его отключить внутри уже запущенной в безопасном режиме обработки не принесет результата. Платформа просто не позволит обработке, находящейся под ограничениями безопасности, снять эти ограничения с самой себя.
Более того, попытка выполнения такого метода может вызвать исключение или просто не сработать, если количество вызовов УстановитьБезопасныйРежим(Ложь) превышает количество вызовов УстановитьБезопасныйРежим(Истина). Также важно отметить, что выполнение кода, отключающего безопасный режим, возможно только в том случае, если сам программный код, из которого выполняется попытка отключения, не находится в расширении конфигурации или других ограниченных контекстах.
ВнешниеОбработки.Подключить()Аналогичная ситуация возникает при попытке программно подключить внешнюю обработку с отключенным безопасным режимом, используя метод ВнешниеОбработки.Подключить(АдресВоВременномХранилище,,Ложь). Казалось бы, указание параметра Ложь в третьем параметре метода должно решить проблему, как это показано в примере:
&НаСервере
Функция ПодключитьВнешнююОбработку(АдресВХранилище)
// Попытка подключить обработку с отключенным безопасным режимом
Имя = ВнешниеОбработки.Подключить(АдресВХранилище,,Ложь);
Возврат ВнешниеОбработки.Создать(Имя);
КонецФункции
&НаКлиенте
Процедура ЗапуститьОбработку(Команда)
// Предполагаем, что ПутьКОбработке где-то определен, например:
// ПутьКОбработке = "C:\МояОбработка.epf";
// ...
ДвоичныеДанныеОбработки = Новый ДвоичныеДанные(ПутьКОбработке);
АдресВХранилище = ПоместитьВоВременноеХранилище(ДвоичныеДанныеОбработки, Новый УникальныйИдентификатор());
Попытка
ВнешняяОбработка = ПодключитьВнешнююОбработку(АдресВХранилище);
// Если подключение успешно, открываем форму
ВнешняяОбработка.ПолучитьФорму().Открыть();
Исключение
Сообщить("Ошибка при подключении или открытии обработки: " + ОписаниеОшибки());
КонецПопытки;
КонецПроцедуры
Однако, как показывает опыт, если код, который вызывает ВнешниеОбработки.Подключить(), сам выполняется в безопасном режиме (например, если он находится во внешней обработке, открытой через «Файл – Открыть»), то даже с параметром Ложь подключение может завершиться ошибкой «Установлен безопасный режим. Выполнение операции запрещено». Это происходит потому, что платформа 1С:Предприятие запрещает выполнение в небезопасном режиме любого кода на сервере 1С:Предприятия, который не является частью конфигурации, если только явно не предоставлены соответствующие права или не используются специализированные механизмы.
Мы должны понимать, что внешние отчеты и обработки, открываемые через меню «Файл – Открыть», всегда выполняются в безопасном режиме, если у пользователя нет административных прав доступа. Это не является недоработкой платформы, а представляет собой сознательное и фундаментальное решение разработчиков 1С:Предприятия, направленное на обеспечение высокой степени защиты от выполнения произвольного кода с повышенными привилегиями. В таких условиях даже декларативное указание БезопасныйРежим = Ложь в функции СведенияОВнешнейОбработке() самой обработки не приведет к отключению безопасного режима при ее интерактивном открытии через «Файл – Открыть».
Платформа жестко контролирует действия, которые могут быть выполнены из внешнего кода, не являющегося частью доверенной конфигурации. Операции, связанные с прямым доступом к файловой системе (кроме временных файлов), создание COM-объектов, доступ к интернет-ресурсам и другие действия, считаются потенциально опасными и требуют либо полных административных прав, либо явного разрешения через специализированные механизмы.
Несмотря на вышеописанные ограничения, существуют проверенные способы, позволяющие работать с внешними обработками в режиме без ограничений безопасности. Эти методы, однако, требуют либо предоставления повышенных прав пользователю, либо интеграции обработки в конфигурацию, либо использования продвинутых механизмов платформы.
Самый простой, но зачастую нежелательный, и прямолинейный способ – это предоставление пользователю полных административных прав в конфигурации. Пользователь с ролью «Полные права» или любой другой ролью, которая включает право «Администрирование» (используйте обработку для быстрой проверки прав доступа, чтобы определить список таких ролей), по умолчанию имеет возможность запускать внешние отчеты и обработки через «Файл – Открыть» в режиме без ограничений безопасности. Это связано с тем, что администратор считается доверенным лицом, обладающим полным контролем над системой и осознающим риски.
Однако, мы понимаем, что предоставление полных административных прав обычным пользователям крайне не рекомендуется в рабочей среде, так как это нарушает принцип наименьших привилегий и значительно повышает риски безопасности и несанкционированных действий.
Если наша цель – не интерактивное открытие «на лету» для отладки, а постоянное использование обработки в системе, то наиболее корректным и безопасным методом является ее регистрация в подсистеме «Дополнительные отчеты и обработки» (если конфигурация использует Библиотеку стандартных подсистем – БСП).
Для этого в модуле объекта внешней обработки необходимо реализовать специальную функцию СведенияОВнешнейОбработке(), где мы явно указываем, что обработка не использует безопасный режим:
// Модуль объекта внешней обработки
// Функция для получения сведений о внешней обработке
// Используется подсистемой Дополнительные отчеты и обработки
Функция СведенияОВнешнейОбработке() Экспорт
ПараметрыРегистрации = Новый Структура;
ПараметрыРегистрации.Вставить("Вид", "ДополнительнаяОбработка"); // Указываем вид: "ДополнительнаяОбработка" или "ДополнительныйОтчет"
ПараметрыРегистрации.Вставить("Наименование", "Моя обработка без безопасного режима");
ПараметрыРегистрации.Вставить("Версия", "1.0");
ПараметрыРегистрации.Вставить("БезопасныйРежим", Ложь); // Ключевой параметр! Указываем, что безопасный режим не используется
ПараметрыРегистрации.Вставить("Информация", "Обработка для примера, запускается без безопасного режима.");
ПараметрыРегистрации.Вставить("Представление", "Моя особая обработка"); // Представление для пользователя
// ... можно добавить другие параметры, например, Назначение
Возврат ПараметрыРегистрации;
КонецФункции
После реализации этой функции, обработку необходимо добавить в конфигурацию через интерфейс «Дополнительные отчеты и обработки» (обычно доступен через раздел «Администрирование» -> «Печатные формы, отчеты и обработки»). Когда обработка будет запущена через этот механизм, платформа учтет флаг БезопасныйРежим = Ложь, и она будет работать без ограничений. Этот механизм является штатным и предпочтительным для распространения функциональности, требующей повышенных прав, поскольку он требует явного действия администратора по ее регистрации и, возможно, назначения профиля безопасности.
В случае, если нам все же необходимо запускать «небезопасную» обработку, но мы не хотим предоставлять полные административные права, и при этом не можем или не хотим добавлять ее в список дополнительных отчетов и обработок (например, конфигурация не типовая и не содержит подсистемы БСП, или требуется частая отладка, не требующая постоянной регистрации), можно создать обработку-обертку. Это своего рода «прокси» для нашей целевой обработки.
БезопасныйРежим = Ложь в функции СведенияОВнешнейОбработке().Пример кода в модуле объекта обработки-обертки для динамического запуска другой, целевой, обработки:
// Модуль объекта обработки-обертки (уже зарегистрирована как "небезопасная" в конфигурации)
// Переменная для хранения полного пути к файлу целевой обработки, которую мы хотим запустить
&НаКлиенте
Перем мПутьКЦелевойОбработке;
&НаКлиенте
Процедура ПриОткрытии(Отказ)
// При открытии обертки, мы можем предложить пользователю выбрать файл
// или указать путь к целевой обработке заранее в коде или настройках.
ДиалогВыбораФайла = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
ДиалогВыбораФайла.Заголовок = "Выберите файл целевой обработки (.epf)";
ДиалогВыбораФайла.ПолноеИмяФайла = ""; // Начинаем с пустого имени файла
ДиалогВыбораФайла.Фильтр = "Файлы обработки (*.epf)|*.epf";
Если ДиалогВыбораФайла.Выбрать() Тогда
мПутьКЦелевойОбработке = ДиалогВыбораФайла.ПолноеИмяФайла;
// Вызываем серверную процедуру для запуска целевой обработки
ЗапуститьЦелевуюОбработкуНаСервере(мПутьКЦелевойОбработке);
Иначе
Отказ = Истина; // Пользователь отменил выбор файла, закрываем обертку
КонецЕсли;
КонецПроцедуры
&НаСервере
Процедура ЗапуститьЦелевуюОбработкуНаСервере(ПутьКФайлу)
Попытка
// Считываем двоичные данные из файла целевой обработки
ДвоичныеДанныеОбработки = Новый ДвоичныеДанные(ПутьКФайлу);
АдресВХранилище = ПоместитьВоВременноеХранилище(ДвоичныеДанныеОбработки, Новый УникальныйИдентификатор());
// Подключаем целевую обработку.
// Поскольку обертка, вызывающая этот код, уже работает в небезопасном режиме,
// подключение целевой обработки с параметром Ложь успешно сработает.
ИмяОбработки = ВнешниеОбработки.Подключить(АдресВХранилище, , Ложь);
// Создаем экземпляр объекта целевой обработки и открываем ее форму
ЦелеваяОбработка = ВнешниеОбработки.Создать(ИмяОбработки);
ФормаЦелевойОбработки = ЦелеваяОбработка.ПолучитьФорму();
ФормаЦелевойОбработки.Открыть();
Исключение
Сообщить("Ошибка при запуске целевой обработки: " + ОписаниеОшибки());
КонецПопытки;
КонецПроцедуры
Такой подход позволяет нам запускать любую внешнюю обработку без безопасного режима, используя одну «точку входа» – обработку-обертку, которая сама зарегистрирована в системе как работающая в небезопасном режиме. Это удобно для отладки или для временного использования внешних обработок.
Для более тонкой настройки прав выполнения «небезопасных» операций без предоставления полных прав администратора, мы можем использовать профили безопасности. Этот механизм доступен в конфигурациях, построенных на Библиотеке стандартных подсистем (БСП) соответствующей версии, и обычно требует серверных и клиентских лицензий уровня КОРП. Профили безопасности позволяют определить, какие именно «опасные» действия разрешены для определенных пользователей, ролей или дополнительных отчетов/обработок.
V83.COMConnector может потребоваться явное разрешение с использованием функции РазрешениеНаСозданиеCOMКласса() из модуля БСП «РаботаВБезопасномРежиме», если она применяется в вашей конфигурации:
Разрешение = РаботаВБезопасномРежиме.РазрешениеНаСозданиеCOMКласса(«V83.ComConnector», «{GUID-объекта-COM}», «ИмяСервера1С»)
Этот метод предоставляет высокую гибкость и гранулярность контроля, но требует глубокого понимания администрирования 1С:Предприятия, наличия соответствующих лицензий и тщательной настройки. Если мы видим ошибку «Установлен безопасный режим. Выполнение операции запрещено» и при этом включены профили безопасности, это может указывать на то, что текущий активный профиль не содержит необходимых разрешений для выполняемых операций.
Для очень специфических сценариев, например, в тестовых или разработческих средах, когда требуется полностью отключить защиту от опасных действий для определенных информационных баз, мы можем использовать параметр DisableUnsafeActionProtection в файле conf.cfg.
Файл conf.cfg обычно находится в каталоге установки сервера 1С:Предприятия (например, C:\Program Files\1cv8\vers_number\bin\conf). Добавив в него следующую строку, мы можем указать маску информационных баз, для которых защита от опасных действий будет отключена для всех пользователей:
DisableUnsafeActionProtection=SqlBaseName
Где SqlBaseName – это имя вашей информационной базы в SQL Server или имя файла базы данных для файлового варианта. Мы также можем использовать маски, например, * для всех баз, но мы настоятельно не рекомендуем использовать этот метод в продуктивных средах, поскольку он глобально отключает важный механизм безопасности, делая систему крайне уязвимой для любых видов атак и несанкционированных действий.
Мы выяснили, что интерактивное открытие внешней обработки через меню «Файл – Открыть» без безопасного режима для пользователя с неполными правами крайне ограничено и, как правило, невозможно без существенных доработок конфигурации или использования механизмов, таких как профили безопасности, которые сами требуют административного доступа и настройки.
Оптимальные и рекомендуемые подходы для работы с внешними обработками без безопасного режима включают:
БезопасныйРежим = Ложь в функции СведенияОВнешнейОбработке(). Это штатный и безопасный способ интеграции.Каждый из этих методов имеет свои преимущества и недостатки, и выбор конкретного подхода зависит от требований к безопасности, сложности конфигурации, наличия подсистем БСП и доступности административных ресурсов. Всегда помните о необходимости соблюдать баланс между функциональностью, удобством работы и безопасностью вашей информационной системы.