Привилегированные отчеты
Расширение позволяет настроить для пользователей выполнение отчетов в привилегированном режиме. 1) Убирает тормоза формирования отчета, возникающие при наложении прав пользователя на запросы отчета; 2) Позволяет обойти ошибки формирования отчета из-за отсутствия прав на часть объектов у пользователя.
- Описание
- Подробнее
Описание
Для чего это расширение:
1) Многие знают, что если "элитный" пользователь работает с ролью "Полные права", то все его операции в базе 1С выполняются по времени значительно быстрее, чем у пользователей, которые работают с наборами ролей. Это связано с тем, что платформа 1С при выполнении запросов навешивает на него подзапросы прав доступа, тем самым утяжеляя и увеличивая время выполнения. Т.е. если вы, например, админ 1С, работающий под полными правами, то запрос в отчете "А" на получение данных выполняется в кратчайшие сроки и в минимальном виде (считаем, что к серверу отправляется запрос практически таким, как написан в коде конфигуратора), но если вы один из пользователей, права которых заданы через профили, содержащие наборы ролей, то к этому же запросу отчета "А" платформой 1С навешиваются подзапросы прав на каждый реквизит и его тип (в итоге к серверу отправляется огромный расширенный текст запроса, утяжеленный подзапросами прав на используемые реквизиты и типы объектов, особенно тяжело это выглядит для составных типов. Не зря же советуют в запросах использовать Выразить(….КАК…)).
2) Многие также наталкиваются на ситуацию ошибки формирования отчета из-за нехватки прав пользователя на часть объектов, к которыми идет запрос чтения данных. При этом копаться в журнале регистрации (а там по факту можно найти информацию на какой объект идет отказ в праве), а затем найти подходящую роль на этот объект в базе 1С и назначить её пользователю, не всегда получается (бывает нет такой роли или она дает дополнительные права, которые избыточны для пользователя). Но отчет пользователю всё-таки дать нужно.
Вот для таких 2ух ситуаций данное расширение и можно применить:
- Ускорить вывод отчета
- Игнорировать ошибки прав доступа
Из чего состоит и как работает расширение:
Расширение состоит из
- Перехвата события фонового выполнения операций ОбщийМодуль.ДлительныеОперации.ВыполнитьВФоне
- Справочника Имена фоновых операций (расширение), который заполняется автоматически системой при выполнении процедуры, которая привязана к объему метаданных. (Т.е. вам нужно 1 раз запустить отчет и процедура, автоматически появится в справочнике)
- Регистра сведений Привилегированные операции (расширение), в котором задается комбинация {Пользователь, Объект, Имя процедуры, Включен привилегированный режим} позволяющая персонифицировать подключение привилегированного режима для всех (Пользователя оставляем пустым) либо конкретному пользователю, к конкретному отчету.
Рис.1 Справочник фоновых процедур
НАВИГАЦИОННАЯ ССЫЛКА: e1cib/list/Справочник.по_ИменаФоновыхОпераций
ПРИМЕЧАНИЕ: Справочник заполняется автоматически при выполнении операции


Рис.2 Имена отчетов и фоновых процедур c привилегированным режимом выполнения
НАВИГАЦИОННАЯ ССЫЛКА: e1cib/list/РегистрСведений.по_ПривилегированныеОперации
ПРИМЕЧАНИЕ: Здесь в примере отчет Выпуск продукции выполняется в привилегированном режиме для пользователя Экономист производства, а отчет Продажи (он же Валовая прибыль) выполняется для всех в привилегированном режиме (т.к. Пользователь не указан).


Рис.3 Код общих модулей
&Вместо("ВыполнитьВФоне")
Функция по_ВыполнитьВФоне(Знач ИмяПроцедуры, Знач ПараметрыПроцедуры, Знач ПараметрыВыполнения)
Если по_ДлительныеОперации.ОбработатьФоновуюОперацию(ИмяПроцедуры, ПараметрыПроцедуры, ПараметрыВыполнения) Тогда
УстановитьПривилегированныйРежим(Истина);
КонецЕсли;
Результат = ПродолжитьВызов(ИмяПроцедуры, ПараметрыПроцедуры, ПараметрыВыполнения);
Возврат Результат;
КонецФункции
Функция ОбработатьФоновуюОперацию(ИмяПроцедуры, ПараметрыПроцедуры, ПараметрыВыполнения) Экспорт
ВозвращаемоеЗначение = Ложь;
УстановитьПривилегированныйРежим(Истина);
Если ЗначениеЗаполнено(ИмяПроцедуры) И ТипЗнч(ПараметрыПроцедуры) = Тип("Структура") Тогда
//Ищем владельца операции
Владелец = Неопределено;
Для Каждого Эл_ПараметрыПроцедуры Из ПараметрыПроцедуры Цикл
Если (ТипЗнч(Эл_ПараметрыПроцедуры.Значение) = Тип("СправочникСсылка.ИдентификаторыОбъектовМетаданных")
ИЛИ ТипЗнч(Эл_ПараметрыПроцедуры.Значение) = Тип("СправочникСсылка.ИдентификаторыОбъектовРасширений")) Тогда
Если ЗначениеЗаполнено(Эл_ПараметрыПроцедуры.Значение) Тогда
Владелец = Эл_ПараметрыПроцедуры.Значение;
Если Справочники.по_ИменаФоновыхОпераций.НайтиПоРеквизиту("ИмяПроцедуры", ИмяПроцедуры, , Владелец).Пустая() Тогда
//Добавляем операцию в справочник
Нов_Об = Справочники.по_ИменаФоновыхОпераций.СоздатьЭлемент();
Нов_Об.Владелец = Владелец;
Нов_Об.ИмяПроцедуры = ИмяПроцедуры;
Нов_Об.Записать();
КонецЕсли;
Прервать;
КонецЕсли;
КонецЕсли;
КонецЦикла;
Если ЗначениеЗаполнено(Владелец) Тогда
//Проверяем включен ли привелигированный режим для {объект, пользователь, процедура}
Запрос = Новый Запрос("ВЫБРАТЬ ПЕРВЫЕ 1
//1. Приоритетной является персональная настройка
| Таб.Включен КАК Включен
|ИЗ
| РегистрСведений.по_ПривилегированныеОперации КАК Таб
|ГДЕ
| Таб.Пользователь = &Пользователь
| И Таб.Объект = &Объект
| И Таб.Операция.ИмяПроцедуры = &ИмяПроцедуры
| И Таб.Включен
|
|ОБЪЕДИНИТЬ ВСЕ
|
|ВЫБРАТЬ ПЕРВЫЕ 1
//2. Общая настройка менее приоритетна (например, если персональная настройка выключена, а общая - включена, то у пользователя будет выключен привилегированный режим)
| Таб.Включен
|ИЗ
| РегистрСведений.по_ПривилегированныеОперации КАК Таб
|ГДЕ
| Таб.Пользователь = ЗНАЧЕНИЕ(Справочник.Пользователи.ПустаяСсылка)
| И Таб.Объект = &Объект
| И Таб.Операция.ИмяПроцедуры = &ИмяПроцедуры
| И Таб.Включен");
Запрос.УстановитьПараметр("Пользователь", Пользователи.ТекущийПользователь());
Запрос.УстановитьПараметр("Объект", Владелец);
Запрос.УстановитьПараметр("ИмяПроцедуры", ИмяПроцедуры);
Выборка = Запрос.Выполнить().Выбрать();
Если Выборка.Следующий() Тогда
ВозвращаемоеЗначение = Выборка.Включен; //Привилегированный режим одобряем (по приоритету: перс. настройка выше общей)
КонецЕсли;
КонецЕсли;
КонецЕсли;
Возврат ВозвращаемоеЗначение;
КонецФункцииПроверка работоспособности в конфигурациях:
Работа расширения успешно проверена на платформе 1С:Предприятие 8.3 (8.3.18.1520) в конфигурациях:
- 1С:ERP Управление предприятием 2 (2.4.11.91, 2.5.7.201)
Расширение использует универсальные механизмы, общие для многих продуктов 1С, поэтому может быть подключено к разным продуктам 1С (БП, УТ, КА, УХ и т.п.) либо доработано с минимальными затратами (пишите мне в личку). Конфигурация продукта 1С должна быть построена на базе БСП (Библиотеки стандартных подсистем, входит в типовые конфигурации 8.3) и содержать следующие объекты:
- ОбщийМодуль.ДлительныеОперации
- Справочник.Пользователи
- Справочник.ИдентификаторыОбъектовМетаданных
- Справочник.ИдентификаторыОбъектовРасширений
Режим совместимости расширения от Версия 8.3.12.
