Как сохранить иерархические настройки отчета для всех пользователей в 1С?

Программист 1С v8.3 (Управляемые формы) Управленческий учет IT и автоматизация бизнеса
← На главную

При разработке отчетов без использования СКД нередко возникает задача предоставить пользователю возможность настраивать группировку аналитики. Например, сгруппировать список статей БДР (бюджета доходов и расходов) по двум корневым узлам — «Доходы» и «Расходы» — с переопределением их текстовых названий. При этом настройки должны быть едиными для всех пользователей информационной базы, а создание новых объектов метаданных (отдельных справочников или регистров) нежелательно.

Разберем по шагам, как правильно преобразовать иерархическую структуру для хранения, а затем сохранить ее для общего доступа.

Шаг 1. Подготовка структуры данных для хранения дерева

Коллекция ДеревоЗначений удобна для отображения на форме, однако напрямую передавать и сохранять её между сеансами не всегда эффективно. На клиенте управляемого приложения дерево представлено объектом ДанныеФормыДерево, который не сериализуется стандартными средствами платформы.

Проанализируем оптимальный способ представления: дерево раскладывается в плоскую ТаблицаЗначений или массив структур со следующими полями:

  1. Родитель (строка или идентификатор группы, например: «Доходы», «Расходы»).
  2. Статья (ссылка на статью справочника).
  3. Представление (пользовательский текст, если стандартное наименование статьи переопределено).
  4. Порядок (число для сохранения последовательности вывода).

Посмотрим на пример процедуры на сервере, которая преобразует элементы формы в сериализуемый массив структур:


&НаСервере
Функция ПолучитьНастройкиВДеревеДляСохранения()
    НастройкиМассив = Новый Массив;
    
    // Преобразуем данные формы в дерево значений для обхода
    Дерево = ДанныеФормыВЗначение(РеквизитФормыДерево, Тип("ДеревоЗначений"));
    
    Для Каждого СтрокаГруппы Из Дерево.Строки Цикл
        Для Каждого СтрокаСтатьи Из СтрокаГруппы.Строки Цикл
            ЭлементНастройки = Новый Структура;
            ЭлементНастройки.Вставить("Группа", СтрокаГруппы.Наименование);
            ЭлементНастройки.Вставить("Статья", СтрокаСтатьи.Статья);
            ЭлементНастройки.Вставить("Представление", СтрокаСтатьи.Представление);
            
            НастройкиМассив.Добавить(ЭлементНастройки);
        КонецЦикла;
    КонецЦикла;
    
    Возврат НастройкиМассив;
КонецФункции

Способ 1. Использование Хранилища общих настроек (рекомендуемый)

Если в конфигурацию нельзя добавлять новые регистры или справочники, наиболее правильным решением на платформе 1С:Предприятие 8.3 является использование объекта ХранилищеОбщихНастроек. По умолчанию настройки отчетов в платформе изолируются по текущему пользователю. Чтобы настройка стала общедоступной, достаточно передать фиксированный строковый идентификатор пользователя (например, «Общие»).

Выясним важный нюанс: чтение и запись настроек от имени другого пользователя или произвольной строки требуют административных прав. Чтобы у обычных пользователей отчет открывался без ошибок, операции сохранения и загрузки выполняем в привилегированном режиме.

Рассмотрим реализацию сохранения и загрузки:


&НаСервере
Процедура СохранитьОбщиеНастройкиОтчета(Настройки)
    УстановитьПривилегированныйРежим(Истина);
    
    КлючОбъекта   = "Отчет_ОтчетПоБДР";
    КлючНастроек  = "ОсновнаяСтруктураСтатей";
    ИмяПользователя = "Общие";
    
    ХранилищеОбщихНастроек.Сохранить(КлючОбъекта, КлючНастроек, Настройки, , ИмяПользователя);
КонецПроцедуры

&НаСервере
Функция ЗагрузитьОбщиеНастройкиОтчета()
    УстановитьПривилегированныйРежим(Истина);
    
    КлючОбъекта   = "Отчет_ОтчетПоБДР";
    КлючНастроек  = "ОсновнаяСтруктураСтатей";
    ИмяПользователя = "Общие";
    
    Возврат ХранилищеОбщихНастроек.Загрузить(КлючОбъекта, КлючНастроек, , ИмяПользователя);
КонецФункции

Объект ХранилищеОбщихНастроек умеет сохранять сериализуемые коллекции (массивы, структуры, таблицы значений) напрямую, поэтому дополнительно упаковывать данные в ХранилищеЗначения не требуется.

Способ 2. Использование регистра сведений «СохраненныеНастройки»

В типовых конфигурациях предыдущих поколений присутствует регистр сведений СохраненныеНастройки. Если используется конфигурация с данным регистром, можно записать структуру в него.

Проанализируем особенности этого варианта:

  1. Данные настроек обычно хранятся в реквизите типа ХранилищеЗначения.
  2. Измерение Пользователь необходимо оставлять пустым (передавать пустую ссылку справочника пользователей), чтобы настройка не привязывалась к конкретному сеансу.
  3. Чтение настроек следует выполнять явно в процедуре ПриСозданииНаСервере формы отчета, переопределяя стандартную загрузку пользовательских вариантов.

Пример записи в регистр сведений:


&НаСервере
Процедура ЗаписатьВРегистрСохраненныхНастроек(НастройкиМассив)
    МенеджерЗаписи = РегистрыСведений.СохраненныеНастройки.СоздатьМенеджерЗаписи();
    МенеджерЗаписи.ИмяОбъекта = "ОтчетПоБДР";
    МенеджерЗаписи.Пользователь = Справочники.Пользователи.ПустаяСсылка();
    МенеджерЗаписи.Настройка = "ОбщаяСтруктура";
    МенеджерЗаписи.ХранилищеНастроек = Новый ХранилищеЗначения(НастройкиМассив);
    МенеджерЗаписи.Записать(Истина);
КонецПроцедуры

Организация предопределенных (базовых) настроек

При первом запуске отчета в информационной базе хранилище вернет значение Неопределено. Чтобы интерфейс отчета сразу отображал базовые узлы («Доходы» и «Расходы»), предусмотрим инициализацию по умолчанию:

  1. Базовую структуру можно описать непосредственно в коде или сохранить в макете отчета (например, в формате XML, JSON или макете табличного документа).
  2. При открытии формы проверяем факт наличия сохраненных настроек: если функция загрузки вернула Неопределено, вызываем процедуру заполнения данными из макета.

Такой подход обеспечивает полную автономность отчета: он содержит рабочую структуру «из коробки», не требует ручного ввода начальных данных и сохраняет внесенные изменения для всех сотрудников предприятия.

← На главную