Как отключить безопасный режим во внешней обработке 1С и избежать ошибки «Нарушение прав доступа»

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

При разработке внешних обработок в системе «1С:Предприятие 8» программисты часто сталкиваются со строгими ограничениями системы безопасности платформы. Типичный сценарий: пользователю без полных прав необходимо запустить обработку для пакетной перезаписи или проведения документов. При попытке выполнить это действие интерактивно (через меню «Файл — Открыть») программа выдает ошибку «Недостаточно прав доступа» или «Нарушение прав доступа!».

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

Выясним причины такого поведения платформы и детально рассмотрим каждый доступный инструмент для решения проблемы.

---

Почему стандартные методы обхода безопасности не работают изнутри обработки?

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

1. Ошибка при вызове метода УстановитьОтключениеБезопасногоРежима()

Если ваша обработка уже запущена в безопасном режиме, вызов метода УстановитьОтключениеБезопасногоРежима(Истина) вернет ошибку выполнения:

«В данной процедуре/функции не был установлен безопасный режим»

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

2. Игнорирование метода УстановитьПривилегированныйРежим()

Платформа накладывает жесткое ограничение: в безопасном режиме привилегированный режим полностью игнорируется. Вызов метода УстановитьПривилегированныйРежим(Истина) внутри безопасного режима не вызовет ошибку выполнения, но фактически режим не включится. Платформа продолжит проверять права текущего пользователя на СУБД, что и приведет к ошибке «Нарушение прав доступа!» при попытке записать или провести документ.

3. Механизм защиты от опасных действий

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

---

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

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

Разберем этот процесс по шагам:

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

Рассмотрим пример кода:


Функция СведенияОВнешнейОбработке() Экспорт

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

КонецФункции

Функция ПолучитьТаблицуКоманд()
    Команды = Новый ТаблицаЗначений;
    Команды.Колонки.Добавить("Представление", Новый ОписаниеТипов("Строка"));
    Команды.Колонки.Добавить("Идентификатор", Новый ОписаниеТипов("Строка"));
    Команды.Колонки.Добавить("Использование", Новый ОписаниеТипов("Строка"));
    Команды.Колонки.Добавить("ПоказыватьОповещение", Новый ОписаниеТипов("Булево"));
    Команды.Колонки.Добавить("Модификатор", Новый ОписаниеТипов("Строка"));
    Возврат Команды;
КонецФункции

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

Теперь внутри кода формы или модуля объекта вашей обработки вы можете смело использовать следующий вызов для выполнения действий под полными правами:


УстановитьПривилегированныйРежим(Истина);
// Код по изменению, записи и проведению документов
// ...
УстановитьПривилегированныйРежим(Ложь);

---

Способ 2. Настройка профиля безопасности кластера серверов (для клиент-серверной версии)

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

Выполним следующие шаги для настройки:

  1. Откроем утилиту «Администрирование серверов 1С:Предприятия».
  2. Перейдем к ветке нужного кластера, откроем список информационных баз и найдем требуемую базу данных.
  3. В ветке информационной базы перейдем к разделу «Профили безопасности».
  4. Создадим новый профиль безопасности (например, с именем UnsafeProcessingProfile).
  5. В свойствах созданного профиля безопасности обязательно установим флаг «Может использоваться как профиль безопасности безопасного режима».
  6. Внутри профиля перейдем в раздел «Разрешения» и предоставим полное разрешение на использование привилегированного режима (или доступ к необходимым ресурсам файловой системы и СУБД).
  7. Свяжем этот профиль безопасности с конкретным пользователем или назначим его по умолчанию для безопасного режима информационной базы.

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

---

Способ 3. Программный запуск обработки на сервере без безопасного режима

Рассмотрим ситуацию, когда запуск обработки должен быть инициирован программно (например, из регламентного задания или общего модуля под управлением другого процесса).

Для программного подключения внешней обработки используется метод менеджера ВнешниеОбработки.Подключить(). Обратите внимание на сигнатуру этого метода:

ВнешниеОбработки.Подключить(ПутьКФайлу, ИмяПодключения, БезопасныйРежим)

Третий параметр отвечает за запуск обработки в безопасном режиме. Если мы передадим туда значение Ложь, обработка загрузится с отключенным безопасным режимом. Посмотрим на пример кода, который должен выполняться на сервере в контексте с достаточными правами (например, в привилегированном общем модуле):


Процедура ВыполнитьОбработкуИзФайлаНаСервере(ПутьКФайлу) Экспорт

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

КонецПроцедуры

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

---

Способ 4. Использование расширения конфигурации

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

Выполним процедуру создания такого решения:

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

Поскольку у самого расширения отключен безопасный режим, весь код, написанный внутри его объектов, будет выполняться в обычном режиме. Это позволит без каких-либо препятствий использовать метод УстановитьПривилегированныйРежим(Истина) для записи документов пользователями с ограниченными правами доступа.

---

Подведем итоги

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

← На главную