При разработке и внедрении внешних отчетов и обработок в среде «1С:Предприятие» разработчики часто сталкиваются с крайне неприятной ошибкой: «Установлен безопасный режим. Выполнение операции запрещено». Данное ограничение безопасности платформы блокирует выполнение таких операций, как создание COM-объектов, подключение внешних компонент, работа с файловой системой, отправка HTTP/FTP-запросов и использование преимуществ привилегированного режима.
В этой статье мы подробно разберем природу безопасного режима, выясним причины его возникновения и рассмотрим все возможные способы обхода и настройки ограничений для версий платформы 1С 8.2 и 8.3.
---
Платформа 1С автоматически или программно включает безопасный режим в целях защиты базы данных от потенциально опасного программного кода, который может содержаться во внешних файлах. В безопасном режиме жестко ограничиваются действия кода:
COMОбъект("Excel.Application") или COMОбъект("ADODB.Connection")).Рассмотрим по шагам практические сценарии решения этой проблемы в зависимости от того, как именно запускается ваша обработка.
---
Если вы подключаете обработку в справочник «Дополнительные отчеты и обработки» в типовой конфигурации, платформа по умолчанию запускает ее в безопасном режиме. Чтобы отключить это поведение, необходимо внести изменения в модуль объекта обработки.
Проанализируем функцию СведенияОВнешнейОбработке(). В ней формируется структура параметров регистрации. Нам необходимо принудительно передать параметр БезопасныйРежим со значением Ложь.
Рассмотрим пример правильной структуры регистрации:
Функция СведенияОВнешнейОбработке() Экспорт
ПараметрыРегистрации = Новый Структура;
ПараметрыРегистрации.Вставить("Вид", "ДополнительнаяОбработка");
ПараметрыРегистрации.Вставить("Наименование", "Загрузка данных из внешних систем");
ПараметрыРегистрации.Вставить("Версия", "1.1");
// Ключевая строка для отключения безопасного режима:
ПараметрыРегистрации.Вставить("БезопасныйРежим", Ложь);
ПараметрыРегистрации.Вставить("Информация", "Обработка выполняет загрузку данных через COM-соединение.");
// Определение команд
ТаблицаКоманд = ПолучитьТаблицуКоманд();
ДобавитьКоманду(ТаблицаКоманд, "Запустить загрузку", "ЗапуститьЗагрузку", "ВызовСерверногоМетода", Истина);
ПараметрыРегистрации.Вставить("Команды", ТаблицаКоманд);
Возврат ПараметрыРегистрации;
КонецФункции
Важно: После внесения изменений в код модуля объекта не забудьте обновить файл обработки в справочнике «Дополнительные отчеты и обработки» внутри вашей информационной базы, иначе настройки не вступят в силу.
---
Если обработка не регистрируется в справочнике, а открывается и запускается программным кодом из внешнего файла на диске, разработчики часто используют метод ВнешниеОбработки.Создать(). По умолчанию этот метод может инициализировать безопасный режим.
Чтобы избежать блокировки выполнения команд, мы должны явно указать платформе, что обработку нужно создать без ограничений. Для этого используем второй параметр метода Создать(), отвечающий за безопасный режим.
Разберем пример программного вызова:
// Неправильно (может включить безопасный режим по умолчанию):
// ВнешняяОбработка = ВнешниеОбработки.Создать(ПутьКФайлу);
// Правильно (явно передаем Ложь во второй параметр):
БезопасныйРежимОтключен = Ложь;
ВнешняяОбработка = ВнешниеОбработки.Создать(ПутьКФайлу, БезопасныйРежимОтключен);
// Выполняем экспортный метод обработки
ВнешняяОбработка.ВыполнитьКоманду();
Передавая Ложь вторым параметром, мы гарантируем, что программный код внешней обработки получит полные права в рамках прав текущего пользователя.
---
Существуют ситуации, когда полностью отключать безопасный режим запрещено требованиями безопасности (например, при размещении обработки в сервисе 1С:Fresh или при работе в строгом корпоративном контуре). В таких случаях необходимо использовать механизм запроса разрешений Библиотеки Стандартных Подсистем (БСП).
Выясним, как предоставить обработке права на выполнение конкретных небезопасных операций, не отключая безопасный режим целиком. Для этого используется заполнение таблицы (массива) разрешений в функции СведенияОВнешнейОбработке().
Посмотрим на пример настройки разрешений для работы с внешней компонентой печати штрихкодов и создания временных файлов (для XBase):
Функция СведенияОВнешнейОбработке() Экспорт
ПараметрыРегистрации = Новый Структура;
ПараметрыРегистрации.Вставить("Вид", "ДополнительнаяОбработка");
ПараметрыРегистрации.Вставить("Наименование", "Печать этикеток со штрихкодом");
ПараметрыРегистрации.Вставить("Версия", "1.2");
// Безопасный режим остается включенным!
ПараметрыРегистрации.Вставить("БезопасныйРежим", Истина);
// Создаем массив для хранения разрешений БСП
МассивРазрешений = Новый Массив;
// 1. Разрешение на подключение внешней компоненты печати штрихкодов из макета
РазрешениеКомпонента = РаботаВБезопасномРежиме.РазрешениеНаИспользованиеВнешнейКомпоненты(
"ОбщийМакет.КомпонентаПечатиШтрихкодов",
"Вывод в печатную форму штрихкода"
);
МассивРазрешений.Добавить(РазрешениеКомпонента);
// 2. Разрешение на работу с каталогом временных файлов (необходимо для DBF/XBase)
РазрешениеКаталог = РаботаВБезопасномРежиме.РазрешениеНаИспользованиеКаталогаВременныхФайлов(Истина, Истина);
МассивРазрешений.Добавить(РазрешениеКаталог);
// 3. Разрешение на создание COM-объекта (например, ADODB.Connection для связи с Oracle/MS SQL)
РазрешениеCOM = РаботаВБезопасномРежиме.РазрешениеНаСозданиеCOMКласса(
"ADODB.Connection",
"{00000514-0000-0010-8000-00AA006D2EA4}" // GUID класса ADODB.Connection
);
МассивРазрешений.Добавить(РазрешениеCOM);
// Передаем массив разрешений в параметры регистрации
ПараметрыРегистрации.Вставить("Разрешения", МассивРазрешений);
Возврат ПараметрыРегистрации;
КонецФункции
С помощью модуля БСП РаботаВБезопасномРежиме мы можем гибко запрашивать доступы к интернет-ресурсам (РазрешениеНаИспользованиеИнтернетРесурса), внешним приложениям операционной системы (РазрешениеНаИспользованиеПриложенияОперационнойСистемы) и каталогам файловой системы.
---
Начиная с версии платформы 1С 8.3.9, появился дополнительный контур защиты — Защита от опасных действий. Даже если вы пытаетесь открыть обработку интерактивно через меню «Файл — Открыть», платформа может выдать предупреждение или принудительно запустить код в безопасном режиме.
Проанализируем варианты отключения этой защиты:
Откройте Конфигуратор, зайдите в меню Администрирование — Пользователи. Выберите пользователя, под которым запускается обработка, откройте его свойства и на вкладке «Основные» снимите флажок «Защита от опасных действий».
Если база данных работает в серверном режиме или пользователей слишком много, защиту можно отключить на уровне платформы. Найдите файл конфигурации conf.cfg (обычно расположен по пути C:\Program Files\1cv8\conf\) и добавьте туда строку:
DisableUnsafeActionProtection=.*
Примечание: Значение .* отключает защиту для всех баз данных. При необходимости вместо регулярного выражения можно прописать конкретные пути к доверенным базам.
Если вы открываете внешнюю обработку кодом, у метода Подключить() менеджера внешних обработок можно отключить защиту, передав соответствующий параметр:
ИмяОбработки = ВнешниеОбработки.Подключить(ПутьКФайлу, , Ложь); // Третий параметр отключает защиту
---
Если вы столкнулись с ошибкой ограничения прав при выполнении кода внутри **расширения конфигурации**, помните, что все новые расширения по умолчанию подключаются платформой в безопасном режиме.
Для исправления этой ситуации выполните следующие действия:
Выполнив эти шаги, вы предоставите программному коду расширения полные права на интеграцию, работу с файлами и внешними библиотеками.