При разработке собственных конфигураций на платформе «1С:Предприятие 8.3» часто возникает задача централизованного управления настройками отчетов на базе схемы компоновки данных (СКД). Классический вариант — выгрузить настройки в XML-файл и разослать их пользователям для ручного импорта — крайне неудобен, трудоемок и часто вызывает ошибки у конечных пользователей. Интеграция тяжелых подсистем из Библиотеки Стандартных Подсистем (БСП) ради одной этой задачи также не всегда целесообразна.
В этой статье мы подробно разберем, как реализовать механизм централизованной раздачи настроек СКД штатными средствами платформы 1С. Мы рассмотрим три различных подхода: программное копирование через стандартные хранилища платформы, создание собственного регистра сведений для хранения настроек и переопределение стандартного хранилища настроек конфигурации.
Выбор конкретного варианта зависит от того, насколько гибко вам требуется управлять настройками: нужно ли просто скопировать один вариант отчета от администратора к пользователям или же требуется динамически применять настройки в зависимости от роли или группы пользователя.
Рассмотрим по шагам каждый из этих практических способов.
Платформа 1С содержит глобальные объекты метаданных — ХранилищеВариантовОтчетов и ХранилищеПользовательскихНастроекОтчетов. Они предназначены для управления стандартными настройками отчетов в разрезе пользователей информационной базы. С помощью этих объектов мы можем написать простую административную обработку, которая позволит выбрать пользователя-«донора» (у которого настроен отчет), отметить галочками пользователей-«получателей» и мгновенно скопировать настройки в их профили.
Выясним причину, почему этот способ является наиболее простым. Дело в том, что он не требует изменения структуры конфигурации (создания новых справочников или регистров) и работает полностью на штатных механизмах СУБД, используемых платформой.
Проанализируем пример кода, выполняющего копирование настроек варианта отчета от одного пользователя к другому:
// Процедура копирует настройки конкретного отчета от одного пользователя другим
Процедура СкопироватьНастройкиОтчета(ИмяОтчета, ПользовательИсточник, МассивПользователейПриемников) Экспорт
// Получаем список сохраненных вариантов отчета пользователя-источника
СписокВариантов = ХранилищеВариантовОтчетов.ПолучитьСписок(ИмяОтчета, ПользовательИсточник);
Для Каждого Вариант Из СписокВариантов Цикл
КлючВарианта = Вариант.Значение;
ОписаниеВарианта = Вариант.Представление;
// Загружаем саму настройку компоновки данных (объект НастройкиКомпоновкиДанных)
ТекущаяНастройка = ХранилищеВариантовОтчетов.Загрузить(ИмяОтчета, КлючВарианта, , ПользовательИсточник);
Если ТекущаяНастройка <> Неопределено Тогда
// Записываем полученную настройку каждому пользователю из списка приемников
Для Каждого ПользовательПолучатель Из МассивПользователейПриемников Цикл
ХранилищеВариантовОтчетов.Сохранить(
ИмяОтчета,
КлючВарианта,
ТекущаяНастройка,
ОписаниеВарианта,
ПользовательПолучатель
);
КонецЦикла;
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Используя этот подход, мы можем создать простую обработку, в которой администратор выбирает отчет, исходного пользователя и список целевых пользователей. По нажатию одной кнопки настройки СКД будут растиражированы по всей базе данных.
Если вам требуется более гибкий контроль, например, возможность привязать настройки не к конкретному имени пользователя, а к его роли или подразделению, стандартных возможностей хранилища платформы будет недостаточно. В этом случае мы рекомендуем создать собственный регистр сведений.
Разберем по шагам процесс создания и использования такого механизма:
СохраненныеНастройкиСКД.Пользователь (Тип: СправочникСсылка.Пользователи, либо СправочникСсылка.ГруппыПользователей для групповой раздачи).ИмяОтчета (Тип: Строка, длина 150, индексировать).КлючНастройки (Тип: Строка, длина 100).Настройка (Тип: ХранилищеЗначения). В этом ресурсе будет сериализован и сохранен XML-пакет настроек или непосредственно объект НастройкиКомпоновкиДанных.Посмотрим на пример кода, который позволяет сохранить текущие настройки СКД из отчета в наш регистр сведений:
Процедура СохранитьНастройкуВРегистр(ИмяОтчета, КлючНастройки, НастройкиСКД, ЦелевойПользователь) Экспорт
МенеджерЗаписи = РегистрыСведений.СохраненныеНастройкиСКД.СоздатьМенеджерЗаписи();
МенеджерЗаписи.Пользователь = ЦелевойПользователь;
МенеджерЗаписи.ИмяОтчета = ИмяОтчета;
МенеджерЗаписи.КлючНастройки = КлючНастройки;
// Помещаем объект настроек компоновки в ХранилищеЗначения
МенеджерЗаписи.Настройка = Новый ХранилищеЗначения(НастройкиСКД, Новый СжатиеДанных(9));
Попытка
МенеджерЗаписи.Записать(Истина);
Исключение
ЗаписьЖурналаРегистрации("Сохранение настроек СКД", УровеньЖурналаРегистрации.Ошибка, , , ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
ВызватьИсключение;
КонецПопытки;
КонецПроцедуры
При открытии отчета у конечного пользователя мы можем переопределить стандартное чтение настроек. Для этого в модуле формы отчета в обработчике ПриОткрытии или в модуле объекта в событии ПриКомпоновкеРезультата мы считываем данные из нашего регистра:
Функция ПолучитьНастройкуИзРегистра(ИмяОтчета, КлючНастройки, ТекущийПользователь) Экспорт
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| СохраненныеНастройкиСКД.Настройка КАК Настройка
|ИЗ
| РегистрСведений.СохраненныеНастройкиСКД КАК СохраненныеНастройкиСКД
|ГДЕ
| СохраненныеНастройкиСКД.Пользователь = &Пользователь
| И СохраненныеНастройкиСКД.ИмяОтчета = &ИмяОтчета
| И СохраненныеНастройкиСКД.КлючНастройки = &КлючНастройки";
Запрос.УстановитьПараметр("Пользователь", ТекущийПользователь);
Запрос.УстановитьПараметр("ИмяОтчета", ИмяОтчета);
Запрос.УстановитьПараметр("КлючНастройки", КлючНастройки);
Выборка = Запрос.Выполнить().Выбрать();
Если Выборка.Следующий() Тогда
Возврат Выборка.Настройка.Получить();
КонецЕсли;
Возврат Неопределено;
КонецФункции
Этот метод дает абсолютную гибкость. Например, если персональная настройка для конкретного пользователя не найдена, в запросе можно легко прописать левое соединение для поиска настроек, назначенных группе пользователей или роли, в которую входит данный сотрудник.
Если вы хотите, чтобы вся конфигурация автоматически сохраняла и считывала настройки через ваш собственный регистр сведений, не требуя написания кода в каждом отдельном отчете, можно использовать механизм переопределения стандартных хранилищ.
Рассмотрим подробнее, как это сделать:
ЦентрализованноеХранилищеНастроек.ЦентрализованноеХранилищеНастроек.ОбработкаСохранения и ОбработкаЗагрузки.Напишем код внутри модуля хранилища настроек для автоматической переадресации всех операций сохранения и чтения в наш регистр сведений:
Процедура ОбработкаСохранения(КлючОбъекта, КлючНастройки, Настройка, ПорцияНастроек, ИмяПользователя)
// КлючОбъекта содержит имя отчета, например "Отчет.Продажи"
// Настройка содержит объект настроек компоновки данных
МенеджерЗаписи = РегистрыСведений.СохраненныеНастройкиСКД.СоздатьМенеджерЗаписи();
МенеджерЗаписи.Пользователь = НайтиПользователяПоИмени(ИмяПользователя);
МенеджерЗаписи.ИмяОтчета = КлючОбъекта;
МенеджерЗаписи.КлючНастройки = КлючНастройки;
МенеджерЗаписи.Настройка = Новый ХранилищеЗначения(Настройка, Новый СжатиеДанных(9));
МенеджерЗаписи.Записать(Истина);
КонецПроцедуры
Процедура ОбработкаЗагрузки(КлючОбъекта, КлючНастройки, Настройка, ПорцияНастроек, ИмяПользователя)
СсылкаНаПользователя = НайтиПользователяПоИмени(ИмяПользователя);
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| СохраненныеНастройкиСКД.Настройка КАК Настройка
|ИЗ
| РегистрСведений.СохраненныеНастройкиСКД КАК СохраненныеНастройкиСКД
|ГДЕ
| СохраненныеНастройкиСКД.Пользователь = &Пользователь
| И СохраненныеНастройкиСКД.ИмяОтчета = &ИмяОтчета
| И СохраненныеНастройкиСКД.КлючНастройки = &КлючНастройки";
Запрос.УстановитьПараметр("Пользователь", СсылкаНаПользователя);
Запрос.УстановитьПараметр("ИмяОтчета", КлючОбъекта);
Запрос.УстановитьПараметр("КлючНастройки", КлючНастройки);
Выборка = Запрос.Выполнить().Выбрать();
Если Выборка.Следующий() Тогда
Настройка = Выборка.Настройка.Получить();
КонецЕсли;
КонецПроцедуры
Важное преимущество: После назначения этого хранилища в свойствах конфигурации, стандартные кнопки сохранения и загрузки вариантов СКД во всех отчетах автоматически начнут использовать ваш регистр сведений. Вам больше не придется писать ни одной строчки кода внутри самих отчетов!
Мы проанализировали три различных подхода к централизованному управлению настройками СКД. Подведем итоги, чтобы выбрать наиболее подходящий вариант для вашей задачи:
Применение этих методик позволит вам уйти от архаичного и неудобного обмена XML-файлами настроек, повысить удобство работы пользователей и централизовать администрирование аналитической отчетности в вашей информационной базе.