При активной разработке в экосистеме «1С:Предприятие 8» программисты часто используют расширения конфигурации для добавления новых объектов метаданных, таких как каталоги, документы или регистры сведений. Это позволяет сохранить основную конфигурацию на поддержке и упростить процесс обновления.
Однако при попытке обратиться к таким новым объектам (например, к регистру сведений в расширении) из внешней обработки или отчета разработчики регулярно сталкиваются с неприятной ошибкой: «Ошибка при вызове метода контекста (Прочитать): Нарушение прав доступа!». Самое интересное, что ошибка может возникать даже у пользователя с административными правами, а стандартное добавление ролей в расширении не всегда приносит желаемый результат.
В этой статье мы подробно разберем, почему возникает эта проблема, проанализируем внутренние механизмы работы платформы с правами доступа в расширениях, рассмотрим готовые решения и изучим современные подходы к созданию сопутствующих регламентных заданий.
Давайте проанализируем поведение платформы «1С:Предприятие 8» при работе с правами доступа внутри расширений. Многие разработчики полагают, что если они заимствовали или создали роль в расширении и отметили права на новый объект, то этого достаточно. На практике ситуация выглядит иначе из-за следующих архитектурных особенностей:
ПолныеПрава) имели доступ к вашему объекту, вам необходимо принудительно заимствовать роль ПолныеПрава в расширение и вручную проставить в ней галочки разрешений на ваш новый регистр сведений или справочник.Если эти действия кажутся вам избыточными или неоправданно сложными для простой сервисной задачи, рассмотрим более быстрые и надежные технические решения.
Самым простым и быстрым способом обхода проверки прав при работе с регистрами или другими объектами расширения является временное переключение контекста выполнения в привилегированный режим с помощью функции УстановитьПривилегированныйРежим(Истина).
Давайте рассмотрим пример кода для внешней обработки, в которой нам необходимо прочитать набор записей регистра сведений из расширения:
Процедура ПрочитатьДанныеРегистраИзРасширения() Экспорт
// Включаем привилегированный режим для обхода ограничений прав доступа
УстановитьПривилегированныйРежим(Истина);
// Проверяем, действительно ли режим установился
Если ПривилегированныйРежим() Тогда
НаборЗаписей = РегистрыСведений.МойРегистрИзРасширения.СоздатьНаборЗаписей();
// Устанавливаем необходимые отборы
НаборЗаписей.Отбор.Организация.Установить(Справочники.Организации.ПустаяСсылка());
Попытка
НаборЗаписей.Прочитать();
// Выполняем обработку полученных записей
Для Каждого Запись Из НаборЗаписей Цикл
// Ваша бизнес-логика
КонецЦикла;
Исключение
ЗаписьЖурналаРегистрации("ВнешняяОбработка.ДоступКРегистру",
УровеньЖурналаРегистрации.Ошибка,,,
ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
КонецПопытки;
Иначе
ВызватьИсключение "Не удалось установить привилегированный режим! Проверьте безопасный режим внешней обработки.";
КонецЕсли;
// Отключаем привилегированный режим, возвращаясь в безопасный контекст
УстановитьПривилегированныйРежим(Ложь);
КонецПроцедуры
Важное предупреждение о Безопасном режиме: Если ваша внешняя обработка запускается в безопасном режиме (например, через механизм дополнительных отчетов и обработок БСП с включенным флагом безопасного режима), платформа проигнорирует вызов УстановитьПривилегированныйРежим(Истина). Привилегированный режим просто не включится, и вы снова увидите ошибку доступа.
Чтобы привилегированный режим гарантированно отрабатывал во внешней обработке, ее необходимо регистрировать в справочнике «Дополнительные отчеты и обработки» с отключенным безопасным режимом. В модуле объекта внешней обработки в функции СведенияОВнешнейОбработке() обязательно укажите параметр:
ПараметрыРегистрации.Вставить("БезопасныйРежим", Ложь);
Если требования безопасности вашей компании запрещают запуск внешних обработок вне безопасного режима, нам придется пошагово настроить права доступа в самом расширении. Разберем этот процесс по шагам:
ПолныеПрава (или аналогичную административную роль вашей конфигурации). Если ее нет, заимствуйте ее из основной конфигурации.ПолныеПрава внутри расширения найдите ваш новый регистр сведений и установите на него все права (Чтение, Изменение, Просмотр, Редактирование).РаботаСРегистромРасширения) и предоставьте ей права на чтение и запись этого регистра.Часто доступ к объектам расширения из внешних обработок требуется для выполнения регламентных (фоновых) процедур по расписанию. Вместо использования внешних обработок-костылей, современные версии платформы предлагают гораздо более элегантные решения.
Начиная с версии платформы 8.3.23, разработчикам доступна долгожданная возможность создавать полноценные объекты метаданных «Регламентные задания» непосредственно внутри расширений конфигурации. Рассмотрим, как это сделать:
ОбщиеМодули и создайте новый общий модуль (например, РегламентыРасширенияСервер). Установите свойства модуля: Сервер - Истина, Вызов сервера - Ложь.
Процедура ВыполнитьОбработкуДанных() Экспорт
// Здесь пишем код работы с регистром сведений расширения.
// Регламентные задания по умолчанию выполняются под полными правами,
// поэтому проблем с доступом к регистру не возникнет.
КонецПроцедуры
РегламентныеЗадания в расширении, добавьте новое регламентное задание.РегламентыРасширенияСервер.ВыполнитьОбработкуДанных.Если ваша информационная база работает на версии платформы ниже 8.3.23, создавать регламентные задания в расширениях напрямую нельзя. В этом случае мы применим паттерн «Тонкая обертка»:
Процедура ЗапускРегламентаИзРасширения() Экспорт
// Вызываем общий модуль расширения по его имени через менеджер БСП
Попытка
ОбщегоНазначения.ОбщийМодуль("ИмяОбщегоМодуляИзРасширения").ВыполнитьБизнесЛогику();
Исключение
ЗаписьЖурналаРегистрации("РегламентноеЗадание.ОшибкаВызоваРасширения",
УровеньЖурналаРегистрации.Предупреждение,,,
ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
КонецПопытки;
КонецПроцедуры
Таким образом, мы детально разобрали особенности прохождения авторизации в расширениях конфигурации «1С:Предприятие 8». Использование УстановитьПривилегированныйРежим(Истина) совместно с отключением безопасного режима во внешней обработке гарантирует быстрое устранение ошибки доступа, а внедрение современных регламентных заданий в расширениях избавит вас от необходимости поддержки внешних файлов.