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