Как централизованно назначать настройки СКД пользователям в самописной конфигурации 1С?

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

При разработке собственных конфигураций на платформе «1С:Предприятие 8.3» часто возникает задача централизованного управления настройками отчетов на базе схемы компоновки данных (СКД). Классический вариант — выгрузить настройки в XML-файл и разослать их пользователям для ручного импорта — крайне неудобен, трудоемок и часто вызывает ошибки у конечных пользователей. Интеграция тяжелых подсистем из Библиотеки Стандартных Подсистем (БСП) ради одной этой задачи также не всегда целесообразна.

В этой статье мы подробно разберем, как реализовать механизм централизованной раздачи настроек СКД штатными средствами платформы 1С. Мы рассмотрим три различных подхода: программное копирование через стандартные хранилища платформы, создание собственного регистра сведений для хранения настроек и переопределение стандартного хранилища настроек конфигурации.

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

Рассмотрим по шагам каждый из этих практических способов.

Способ 1. Программное копирование через встроенные хранилища настроек платформы

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

Выясним причину, почему этот способ является наиболее простым. Дело в том, что он не требует изменения структуры конфигурации (создания новых справочников или регистров) и работает полностью на штатных механизмах СУБД, используемых платформой.

Проанализируем пример кода, выполняющего копирование настроек варианта отчета от одного пользователя к другому:


// Процедура копирует настройки конкретного отчета от одного пользователя другим
Процедура СкопироватьНастройкиОтчета(ИмяОтчета, ПользовательИсточник, МассивПользователейПриемников) Экспорт
    
    // Получаем список сохраненных вариантов отчета пользователя-источника
    СписокВариантов = ХранилищеВариантовОтчетов.ПолучитьСписок(ИмяОтчета, ПользовательИсточник);
    
    Для Каждого Вариант Из СписокВариантов Цикл
        КлючВарианта = Вариант.Значение;
        ОписаниеВарианта = Вариант.Представление;
        
        // Загружаем саму настройку компоновки данных (объект НастройкиКомпоновкиДанных)
        ТекущаяНастройка = ХранилищеВариантовОтчетов.Загрузить(ИмяОтчета, КлючВарианта, , ПользовательИсточник);
        
        Если ТекущаяНастройка <> Неопределено Тогда
            // Записываем полученную настройку каждому пользователю из списка приемников
            Для Каждого ПользовательПолучатель Из МассивПользователейПриемников Цикл
                ХранилищеВариантовОтчетов.Сохранить(
                    ИмяОтчета, 
                    КлючВарианта, 
                    ТекущаяНастройка, 
                    ОписаниеВарианта, 
                    ПользовательПолучатель
                );
            КонецЦикла;
        КонецЕсли;
    КонецЦикла;
    
КонецПроцедуры

Используя этот подход, мы можем создать простую обработку, в которой администратор выбирает отчет, исходного пользователя и список целевых пользователей. По нажатию одной кнопки настройки СКД будут растиражированы по всей базе данных.

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

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

Разберем по шагам процесс создания и использования такого механизма:

  1. Создание регистра сведений: Создайте непериодический независимый регистр сведений СохраненныеНастройкиСКД.
  2. Настройка измерений:
    • Пользователь (Тип: СправочникСсылка.Пользователи, либо СправочникСсылка.ГруппыПользователей для групповой раздачи).
    • ИмяОтчета (Тип: Строка, длина 150, индексировать).
    • КлючНастройки (Тип: Строка, длина 100).
  3. Настройка ресурсов:
    • Настройка (Тип: ХранилищеЗначения). В этом ресурсе будет сериализован и сохранен XML-пакет настроек или непосредственно объект НастройкиКомпоновкиДанных.

Посмотрим на пример кода, который позволяет сохранить текущие настройки СКД из отчета в наш регистр сведений:


Процедура СохранитьНастройкуВРегистр(ИмяОтчета, КлючНастройки, НастройкиСКД, ЦелевойПользователь) Экспорт
    
    МенеджерЗаписи = РегистрыСведений.СохраненныеНастройкиСКД.СоздатьМенеджерЗаписи();
    МенеджерЗаписи.Пользователь = ЦелевойПользователь;
    МенеджерЗаписи.ИмяОтчета    = ИмяОтчета;
    МенеджерЗаписи.КлючНастройки = КлючНастройки;
    
    // Помещаем объект настроек компоновки в ХранилищеЗначения
    МенеджерЗаписи.Настройка     = Новый ХранилищеЗначения(НастройкиСКД, Новый СжатиеДанных(9));
    
    Попытка
        МенеджерЗаписи.Записать(Истина);
    Исключение
        ЗаписьЖурналаРегистрации("Сохранение настроек СКД", УровеньЖурналаРегистрации.Ошибка, , , ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
        ВызватьИсключение;
    КонецПопытки;
    
КонецПроцедуры

При открытии отчета у конечного пользователя мы можем переопределить стандартное чтение настроек. Для этого в модуле формы отчета в обработчике ПриОткрытии или в модуле объекта в событии ПриКомпоновкеРезультата мы считываем данные из нашего регистра:


Функция ПолучитьНастройкуИзРегистра(ИмяОтчета, КлючНастройки, ТекущийПользователь) Экспорт
    
    Запрос = Новый Запрос;
    Запрос.Текст = 
        "ВЫБРАТЬ
        |	СохраненныеНастройкиСКД.Настройка КАК Настройка
        |ИЗ
        |	РегистрСведений.СохраненныеНастройкиСКД КАК СохраненныеНастройкиСКД
        |ГДЕ
        |	СохраненныеНастройкиСКД.Пользователь = &Пользователь
        |	И СохраненныеНастройкиСКД.ИмяОтчета = &ИмяОтчета
        |	И СохраненныеНастройкиСКД.КлючНастройки = &КлючНастройки";
        
    Запрос.УстановитьПараметр("Пользователь",  ТекущийПользователь);
    Запрос.УстановитьПараметр("ИмяОтчета",    ИмяОтчета);
    Запрос.УстановитьПараметр("КлючНастройки", КлючНастройки);
    
    Выборка = Запрос.Выполнить().Выбрать();
    Если Выборка.Следующий() Тогда
        Возврат Выборка.Настройка.Получить();
    КонецЕсли;
    
    Возврат Неопределено;
    
КонецФункции

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

Способ 3. Переопределение системного хранилища настроек конфигурации

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

Рассмотрим подробнее, как это сделать:

  1. Откройте конфигуратор вашей самописной системы.
  2. В дереве метаданных перейдите в ветку Общие -> Хранилища настроек.
  3. Добавьте новое хранилище настроек и назовите его, например, ЦентрализованноеХранилищеНастроек.
  4. Откройте свойства конфигурации (самый верхний элемент дерева метаданных) и найдите свойство Хранилище настроек отчетов. Укажите в нем созданное хранилище ЦентрализованноеХранилищеНастроек.
  5. Откройте модуль созданного хранилища настроек. В нем предопределены два основных события: ОбработкаСохранения и ОбработкаЗагрузки.

Напишем код внутри модуля хранилища настроек для автоматической переадресации всех операций сохранения и чтения в наш регистр сведений:


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

Процедура ОбработкаЗагрузки(КлючОбъекта, КлючНастройки, Настройка, ПорцияНастроек, ИмяПользователя)
    
    СсылкаНаПользователя = НайтиПользователяПоИмени(ИмяПользователя);
    
    Запрос = Новый Запрос;
    Запрос.Текст = 
        "ВЫБРАТЬ
        |	СохраненныеНастройкиСКД.Настройка КАК Настройка
        |ИЗ
        |	РегистрСведений.СохраненныеНастройкиСКД КАК СохраненныеНастройкиСКД
        |ГДЕ
        |	СохраненныеНастройкиСКД.Пользователь = &Пользователь
        |	И СохраненныеНастройкиСКД.ИмяОтчета = &ИмяОтчета
        |	И СохраненныеНастройкиСКД.КлючНастройки = &КлючНастройки";
        
    Запрос.УстановитьПараметр("Пользователь",   СсылкаНаПользователя);
    Запрос.УстановитьПараметр("ИмяОтчета",     КлючОбъекта);
    Запрос.УстановитьПараметр("КлючНастройки",  КлючНастройки);
    
    Выборка = Запрос.Выполнить().Выбрать();
    Если Выборка.Следующий() Тогда
        Настройка = Выборка.Настройка.Получить();
    КонецЕсли;
    
КонецПроцедуры

Важное преимущество: После назначения этого хранилища в свойствах конфигурации, стандартные кнопки сохранения и загрузки вариантов СКД во всех отчетах автоматически начнут использовать ваш регистр сведений. Вам больше не придется писать ни одной строчки кода внутри самих отчетов!

Резюме и рекомендации

Мы проанализировали три различных подхода к централизованному управлению настройками СКД. Подведем итоги, чтобы выбрать наиболее подходящий вариант для вашей задачи:

Применение этих методик позволит вам уйти от архаичного и неудобного обмена XML-файлами настроек, повысить удобство работы пользователей и централизовать администрирование аналитической отчетности в вашей информационной базе.

← На главную