При работе в типовых конфигурациях 1С:Предприятие (таких как 1С:Бухгалтерия, 1С:ERP, 1С:Комплексная автоматизация и других), построенных на базе Библиотеки стандартных подсистем (БСП), пользователи часто сталкиваются с неприятной технической проблемой. При попытке сформировать дополнительный (внешний) отчет под учетной записью без полных административных прав система аварийно завершает работу, выдавая ошибку «Нарушение прав доступа!».
В стеке вызовов при этом фигурируют фоновые задания, а сбой происходит на стандартных механизмах платформы и БСП:
{Справочник.ВерсииРасширений.МодульМенеджера(73)}: РасширенияБазыДанных = РасширенияКонфигурации.Получить();
{Справочник.ВерсииРасширений.МодульМенеджера(138)}: УстановленныеРасширения = УстановленныеРасширения();
...
{ОбщийМодуль.ДлительныеОперации.Модуль(953)}: Справочники.ВерсииРасширений.ЗарегистрироватьИспользованиеВерсииРасширений();
Давайте подробно разберем, почему возникает эта ошибка, как устроены внутренние механизмы платформы в данный момент и какими способами можно оперативно решить эту проблему.
Для того чтобы понять корень проблемы, проанализируем поведение платформы 1С:Предприятие и механизмов БСП шаг за шагом.
ДополнительныеОтчетыИОбработки, платформа по умолчанию запускает его в так называемом безопасном режиме. Этот режим предназначен для защиты информационной базы от потенциально опасного или вредоносного кода, который может содержаться во внешнем файле. В безопасном режиме накладываются жесткие ограничения: запрещен доступ к файловой системе сервера, COM-объектам, программному изменению некоторых настроек, а также к ряду системных методов платформы. К числу таких запрещенных системных методов относится и РасширенияКонфигурации.Получить().ДлительныеОперации.ВыполнитьСКонтекстомКлиента). Фоновое задание запускается в собственном сеансе, но полностью наследует ограничения безопасности (безопасный режим), которые были наложены на вызвавший его внешний отчет.ЗарегистрироватьИспользованиеВерсииРасширений() справочника ВерсииРасширений. Внутри этого метода происходит обращение к функции платформы РасширенияКонфигурации.Получить().УстановитьПривилегированныйРежим(Истина). Однако на уровне платформы 1С реализовано жесткое правило: привилегированный режим не может обойти ограничения безопасного режима, если этот безопасный режим был явно установлен для текущего потока выполнения внешним отчетом. В итоге попытка прочитать список расширений в безопасном режиме вызывает мгновенное исключение платформы «Нарушение прав доступа!».Таким образом, обычный пользователь без административных прав застревает на системной проверке БСП, даже не дойдя до непосредственного выполнения алгоритмов самого отчета.
---
Это самый быстрый, надежный и рекомендуемый способ решения проблемы в том случае, если вы доверяете источнику внешнего отчета и уверены в его безопасности.
Выполним следующие шаги под учетной записью с правами администратора:
После этого фоновое задание отчета будет выполняться без ограничений безопасного режима, и БСП сможет беспрепятственно зарегистрировать версии расширений.
---
Если корпоративная политика безопасности вашей организации строго запрещает полностью отключать безопасный режим для внешнего кода, нам потребуется настроить точечные разрешения.
Для этого используется механизм Профилей безопасности:
ВнешниеОтчетыСРасширениями).ДополнительныеОтчетыИОбработки.В этом случае отчет продолжит выполняться в изолированном окружении, но платформа сделает точечное исключение для вызова методов работы с расширениями.
---
Если вы являетесь разработчиком данного отчета и планируете распространять его для установки в базы клиентов, правильным решением будет программно прописать параметры его регистрации так, чтобы он сразу устанавливался без безопасного режима (конечно, предупредив об этом пользователей).
Давайте посмотрим, как изменить код функции регистрации внешнего отчета. Откроем модуль объекта внешнего отчета в Конфигураторе и найдем экспортную функцию СведенияОВнешнейОбработке(). Нам необходимо явно передать параметр безопасного режима:
Функция СведенияОВнешнейОбработке() Экспорт
ПараметрыРегистрации = ДополнительныеОтчетыИОбработки.СведенияОВнешнейОбработке("2.2.2.1");
// Определяем базовые свойства отчета
ПараметрыРегистрации.Наименование = "Расшифровка строк баланса 1230 и 1520";
ПараметрыРегистрации.Вид = ДополнительныеОтчетыИОбработкиКлиентСервер.ВидОбработкиДополнительныйОтчет();
ПараметрыРегистрации.Версия = "1.0";
// КРИТИЧЕСКИ ВАЖНО: Отключаем безопасный режим при авторегистрации
ПараметрыРегистрации.БезопасныйРежим = Ложь;
// Описываем команды отчета
ТаблицаКоманд = ПолучитьТаблицуКоманд();
ДобавитьКоманду(ТаблицаКоманд,
"Сформировать отчет",
"СформироватьОтчет",
ДополнительныеОтчетыИОбработкиКлиентСервер.СпособВызоваКомандыОткрытиеФормы(),
Истина); // Показывать оповещение
ПараметрыРегистрации.Команды = ТаблицаКоманд;
Возврат ПараметрыРегистрации;
КонецФункции
При повторном обновлении отчета из файла в режиме «1С:Предприятие» система автоматически применит данную настройку, избавив администраторов базы от необходимости ручной корректировки прав доступа.
---
Если архитектура вашего отчета предусматривает программный запуск фоновых заданий вручную через API платформы, обратите внимание на параметры инициализации фонового процесса. Начиная с версии платформы 1С v8.3.15, в метод запуска фоновых заданий можно передавать параметры структуры, управляющие контекстом выполнения.
В некоторых случаях помогает принудительный запуск фонового задания без инициализации расширений базы данных, если для работы отчета они заведомо не требуются. Проанализируем пример передачи параметров:
ПараметрыЗадания = Новый Структура;
ПараметрыЗадания.Вставить("ИмяМетода", "МойОбщийМодульСервер.СформироватьДанныеОтчета");
// Передаем параметры, отключающие расширения для изоляции контекста выполнения
ПараметрыВыполнения = Новый Структура;
ПараметрыВыполнения.Вставить("БезРасширений", Истина);
ИдентификаторЗадания = ФоновыеЗадания.Выполнить("ИмяПроцедурыФоновогоЗадания", ПараметрыЗадания, , "КлючЗадания", ПараметрыВыполнения);
Этот способ требует изменения кода конфигурации или внешнего отчета, но он позволяет обойти системную ошибку БСП без снижения уровня общей безопасности системы.
---
Мы подробно разобрали природу ошибки «Нарушение прав доступа» при запуске внешних отчетов. Основная причина кроется в конфликте между безопасным режимом внешнего отчета и внутренними системными вызовами БСП по обслуживанию расширений. Для быстрого исправления ситуации воспользуйтесь Способом 1 (отключение безопасного режима в пользовательском интерфейсе карточки отчета), а для детальной проработки архитектуры — скорректируйте код регистрации отчета согласно Способу 3.