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

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

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

Анализ проблемы и поведение платформы

Посмотрим на исходный код серверной процедуры, вызывающей ошибку во время выполнения:


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

Проанализируем, почему платформа блокирует эту строку:

  1. Когда пользователь открывает внешнюю обработку интерактивно через системное меню «Файл — Открыть», платформа 1С автоматически активирует безопасный режим для любого сеанса, у которого в наборе ролей отсутствует системное право Администрирование. Отдельного точечного права, позволяющего интерактивно запускать файлы без безопасного режима и не предоставляющего полных прав управления базой, в платформе не существует.
  2. В безопасном режиме на сервере полностью запрещены любые обращения к файловой системе (включая чтение и запись через ТабличныйДокумент, ТекстовыйДокумент, ЧтениеXML), вызовы COM-объектов, запуск внешних приложений и компонент.
  3. Попытка обойти ограничение с помощью вызова УстановитьПривилегированныйРежим(Истина) внутри внешней обработки не сработает: платформа игнорирует включение привилегированного режима, если исполняемый код уже запущен в безопасном режиме.
  4. Кроме того, если переменная ФайлДляЗагрузкиЦен указывает на локальный диск пользователя (например, «C:\Users\...»), сервер 1С в клиент-серверном режиме попросту не увидит этот путь на своей файловой системе.

Способ 1. Регистрация обработки в справочнике «Дополнительные отчеты и обработки»

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

Разберем по шагам, как настроить обработку:

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

Посмотрим на пример описания функции:


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

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

Способ 2. Чтение файла на клиенте и передача объекта на сервер

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

Разберем реализацию этого подхода:

  1. Считываем Excel-файл методом Прочитать() в объект ТабличныйДокумент непосредственно в контексте &НаКлиенте. На клиенте безопасный режим платформы не блокирует чтение локального файла пользователя.
  2. Передаем уже наполненный данными ТабличныйДокумент в серверную процедуру.
  3. На сервере связываем переданный табличный документ с ПостроительЗапроса. Поскольку объект уже находится в оперативной памяти и не обращается к диску сервера, ошибка безопасного режима не возникает.

Посмотрим на пример переработанного кода формы обработки:


&НаКлиенте
Процедура ЗагрузитьЦены(Команда)
	ТабличныйДок = Новый ТабличныйДокумент;
	// Чтение выполняется на клиенте из локального файла пользователя:
	ТабличныйДок.Прочитать(ФайлДляЗагрузкиЦен, СпособЧтенияЗначенийТабличногоДокумента.Значение);
	
	// Передаем прочитанный табличный документ на сервер для обработки:
	ВыполнитьЗагрузкуЦенНаСервере(ТабличныйДок);
КонецПроцедуры

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

Обратите внимание: чтение файла методом ТабличныйДокумент.Прочитать() на стороне клиента работает в толстом и тонком клиентах. В веб-клиенте прямое обращение по локальному пути ограничено политиками безопасности браузера — в таком случае потребуется использовать диалог помещения файла во временное хранилище.

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

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

← На главную