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

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

При разработке сложных отчетов в 1С на базе Системы компоновки данных (СКД) часто возникает необходимость формировать структуру отчета динамически. Это актуально, когда состав колонок, группировок или источников данных (например, внешние источники) зависит от выбора пользователя. Однако стандартная проблема заключается в том, что программно созданные настройки часто «не видны» в стандартном окне «Изменить вариант». Пользователь получает готовый отчет, но не может его подправить под себя.

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

Почему стандартный механизм «Изменить вариант» не видит программные настройки?

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

Чтобы решить задачу, нам нужно выполнить три условия:

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

Шаг 1: Инициализация компоновщика на сервере

Рассмотрим основной метод подготовки отчета. Нам необходимо получить схему компоновки (даже если она создана полностью кодом), сохранить ее в хранилище и «привязать» к ней компоновщик настроек, который живет в реквизите формы Отчет.

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


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

Шаг 2: Программное управление отборами и полями

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


// Добавление выбранного поля программно
НовоеПоле = Отчет.КомпоновщикНастроек.Настройки.Выбор.Элементы.Добавить(Тип("ВыбранноеПолеКомпоновкиДанных"));
НовоеПоле.Поле = Новый ПолеКомпоновкиДанных("СуммаОстаток");
НовоеПоле.Использование = Истина;

Важный нюанс: Чтобы изменения отразились в форме редактирования настроек, после модификации основных настроек рекомендуется обновлять пользовательские настройки. В СКД существует разделение: есть «общая структура» (Settings), а есть «то, что вынесено пользователю на форму» (UserSettings). Для синхронизации используем метод:

Отчет.КомпоновщикНастроек.ЗагрузитьПользовательскиеНастройки();

Шаг 3: Сохранение и восстановление настроек

Часто требуется, чтобы пользователь мог не только редактировать вариант, но и чтобы его правки сохранялись между сеансами. Для этого можно использовать реквизит отчета типа ХранилищеЗначения. Рассмотрим пример реализации восстановления последних настроек в процедуре ПриОткрытии:


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

Дополнительные рекомендации для работы с динамическими вариантами

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

  1. Режим отображения элементов: Когда вы создаете элементы отбора программно, устанавливайте свойство РежимОтображения. Например, значение РежимОтображенияЭлементаНастройкиКомпоновкиДанных.БыстрыйДоступ позволит пользователю видеть отбор прямо в шапке отчета, не заходя в глубокие настройки.
  2. Идентификатор пользовательской настройки: Если вы хотите, чтобы программно созданный отбор попал в список пользовательских настроек (те, что доступны по кнопке «Настройки» на форме), обязательно генерируйте ИдентификаторПользовательскойНастройки. Без этого идентификатора 1С будет считать настройку «технической» и скроет ее от пользователя.
  3. Фиксированные настройки: Если часть настроек (например, фильтр по организации) должна быть жестко задана кодом и пользователь не должен иметь возможности ее удалить даже через «Изменить вариант», используйте свойство КомпоновщикНастроек.ФиксированныеНастройки. Все, что попало туда, суммируется с пользовательскими настройками, но не редактируется в интерфейсе.

Выясним, как это выглядит в комплексе. Мы создаем схему, кладем ее в ВременноеХранилище, инициализируем КомпоновщикНастроек, программно настраиваем структуру группировок и полей, а затем вызываем ЗагрузитьПользовательскиеНастройки(). После этого команда «Изменить вариант» будет работать со сформированной нами структурой, позволяя пользователю добавлять свои сортировки, условное оформление или дополнительные поля.

Этот подход превращает «статичный» отчет в гибкий инструмент, который подстраивается под задачи бизнеса, сохраняя при этом все преимущества стандартного интерфейса 1С.

← На главную