Как исправить ошибку «Нарушение прав доступа» при запуске внешнего отчета в 1С?

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

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

В стеке вызовов при этом фигурируют фоновые задания, а сбой происходит на стандартных механизмах платформы и БСП:


{Справочник.ВерсииРасширений.МодульМенеджера(73)}:    РасширенияБазыДанных = РасширенияКонфигурации.Получить();
{Справочник.ВерсииРасширений.МодульМенеджера(138)}:    УстановленныеРасширения = УстановленныеРасширения();
...
{ОбщийМодуль.ДлительныеОперации.Модуль(953)}:    Справочники.ВерсииРасширений.ЗарегистрироватьИспользованиеВерсииРасширений();

Давайте подробно разберем, почему возникает эта ошибка, как устроены внутренние механизмы платформы в данный момент и какими способами можно оперативно решить эту проблему.

Выясняем причину: почему платформа блокирует код?

Для того чтобы понять корень проблемы, проанализируем поведение платформы 1С:Предприятие и механизмов БСП шаг за шагом.

  1. Безопасный режим дополнительных отчетов и обработок. Когда мы регистрируем внешний отчет в справочнике ДополнительныеОтчетыИОбработки, платформа по умолчанию запускает его в так называемом безопасном режиме. Этот режим предназначен для защиты информационной базы от потенциально опасного или вредоносного кода, который может содержаться во внешнем файле. В безопасном режиме накладываются жесткие ограничения: запрещен доступ к файловой системе сервера, COM-объектам, программному изменению некоторых настроек, а также к ряду системных методов платформы. К числу таких запрещенных системных методов относится и РасширенияКонфигурации.Получить().
  2. Контекст выполнения фонового задания. Большинство современных тяжелых отчетов формируются в фоновом режиме через механизм длительных операций (метод ДлительныеОперации.ВыполнитьСКонтекстомКлиента). Фоновое задание запускается в собственном сеансе, но полностью наследует ограничения безопасности (безопасный режим), которые были наложены на вызвавший его внешний отчет.
  3. Инициализация расширений в БСП. При старте любого фонового задания БСП инициализирует параметры сеанса и выполняет служебные операции. В частности, система пытается проверить и зарегистрировать используемые версии расширений конфигурации в базе данных путем вызова метода ЗарегистрироватьИспользованиеВерсииРасширений() справочника ВерсииРасширений. Внутри этого метода происходит обращение к функции платформы РасширенияКонфигурации.Получить().
  4. Конфликт привилегированного и безопасного режимов. Разработчики БСП предусмотрели выполнение этой операции в привилегированном режиме с помощью вызова УстановитьПривилегированныйРежим(Истина). Однако на уровне платформы 1С реализовано жесткое правило: привилегированный режим не может обойти ограничения безопасного режима, если этот безопасный режим был явно установлен для текущего потока выполнения внешним отчетом. В итоге попытка прочитать список расширений в безопасном режиме вызывает мгновенное исключение платформы «Нарушение прав доступа!».

Таким образом, обычный пользователь без административных прав застревает на системной проверке БСП, даже не дойдя до непосредственного выполнения алгоритмов самого отчета.

---

Способ 1. Отключение безопасного режима в пользовательском интерфейсе

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

Выполним следующие шаги под учетной записью с правами администратора:

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

После этого фоновое задание отчета будет выполняться без ограничений безопасного режима, и БСП сможет беспрепятственно зарегистрировать версии расширений.

---

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

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

Для этого используется механизм Профилей безопасности:

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

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

---

Способ 3. Программное отключение безопасного режима при регистрации

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

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


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

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

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

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

---

Способ 4. Изменение логики запуска фонового задания (Флаг «Без расширений»)

Если архитектура вашего отчета предусматривает программный запуск фоновых заданий вручную через API платформы, обратите внимание на параметры инициализации фонового процесса. Начиная с версии платформы 1С v8.3.15, в метод запуска фоновых заданий можно передавать параметры структуры, управляющие контекстом выполнения.

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


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

// Передаем параметры, отключающие расширения для изоляции контекста выполнения
ПараметрыВыполнения = Новый Структура;
ПараметрыВыполнения.Вставить("БезРасширений", Истина);

ИдентификаторЗадания = ФоновыеЗадания.Выполнить("ИмяПроцедурыФоновогоЗадания", ПараметрыЗадания, , "КлючЗадания", ПараметрыВыполнения);

Этот способ требует изменения кода конфигурации или внешнего отчета, но он позволяет обойти системную ошибку БСП без снижения уровня общей безопасности системы.

---

Резюме

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

← На главную