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