Создание меню выбора вариантов отчета на СКД в 1С

Как известно, система компоновки данных в 1С позволяет создавать различные варианты отчетов с заранее подготовленными настройками еще на этапе создания.

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

Для начала подготовим процедуру, которая будет создавать меню с вариантами:

Процедура УстановитьВариантыНастроек()

//Добавляем кнопку подменю на панель действий формы. Имя кнопки "ВариантыОтчетов", пользователю. будет видна как "Варианты"
КП = ЭлементыФормы.ДействияФормы;
НоваяКнопка = КП.Кнопки.Вставить(1,"ВариантыОтчетов", ТипКнопкиКоманднойПанели.Подменю, "Варианты", );

НовоеДействие = Новый Действие("ИзменитьВариант"); //Создаем действие, которое потом назначим на кнопки с вариантами

Счетчик = 1; //посчитаем кнопки, у них должны быть разные имена

//Добавляем кнопки для каждого варианта настроки СКД
//Отображение кнопки берем из представления настройки
//Назначаем в качестве действия кнопки действие, созданное выше
Для каждого Настройка Из СхемаКомпоновкиДанных.ВариантыНастроек Цикл

НоваяКнопка = КП.Кнопки.ВариантыОтчетов.Кнопки.Добавить("Вариант"+Строка(Счетчик), ТипКнопкиКоманднойПанели.Действие, Настройка.Представление, НовоеДействие);
Счетчик = Счетчик + 1;

КонецЦикла;

КонецПроцедуры

Вызовем эту процедуру при открытии формы:

Процедура ПриОткрытии()

УстановитьВариантыНастроек();

КонецПроцедуры

А теперь создаем обработчик события для добавленных кнопок. В предыдущем коде была строчка НовоеДействие = Новый Действие(«ИзменитьВариант»); значит обработчик должен иметь название ИзменитьВариант.

Процедура ИзменитьВариант (Элемент)

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

Если Элемент.Текст = Вариант.Представление тогда

//Загружаем вариант
КомпоновщикНастроек.ЗагрузитьНастройки(Вариант.Настройки);

//Меняем заголовок формы, чтобы было понятно, что за вариант работает
//Можно и где-то в другом месте отобразить название варианта
ЭтаФорма.Заголовок=ЭтотОбъект.Метаданные().Представление()+": "+Вариант.Представление;

//У меня на форму были выведены дополнительные поля отборов из компоновщика настроек
//Если есть что-то подобное, то такие процедуры писать сюда
//Если нет, то следующую строчку удалить
ЗаполнитьОтборНастроек();

//Прерываем цикл, т.к. нашли настройку
Прервать;

КонецЕсли;

КонецЦикла;

КонецПроцедуры

За идею спасибо коллегам с сайта programmist1s.ru

Создание меню выбора вариантов отчета на СКД в 1С: 5 комментариев

  1. серг

    ЗаполнитьОтборНастроек();
    эта функция не определена.

    1. Нестандартные решения в 1С Автор записи

      Смотрите мой комментарий над этой функцией.

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

  2. Лилия

    Тип не определен (Действие)
    НовоеДействие = Новый <>Действие(«ИзменитьВариант»);

    1. Нестандартные решения в 1С Автор записи

      Добрый день.
      Уточните пожалуйста:
      1. Вы работаете с обычными формами или с управляемыми?
      2. Если с управляемыми, то процедура, в которой возникает ошибка, выполняется на клиенте или на сервере?

  3. NoName

    // в оригинале https://programmist1s.ru/vyibor-varianta-otcheta-skd-obyichnyie-formyi/ — очень(!) важное замечание,
    // которое тут не упомянуто — в комментарии Дмитрия — о реализации в случаях, когда используется несколько макетов:
    Соответствие = Новый Соответствие;
    Для Каждого Макет Из ЭтотОбъект.Метаданные().Макеты Цикл
    Макеты = ПолучитьМакет(Макет.Имя);
    Для Каждого Настройка Из Макеты.ВариантыНастроек Цикл
    Соответствие.Вставить(Настройка.Представление, Макет.Имя);
    КонецЦикла;
    КонецЦикла;
    ЗначениеСоответсия = Соответствие.Получить(Элемент.Текст);
    Если ЗначениеСоответсия Неопределено Тогда
    СхемаКомпоновкиДанных = ПолучитьМакет(ЗначениеСоответсия);
    КомпоновщикНастроек.Инициализировать(Новый ИсточникДоступныхНастроекКомпоновкиДанных(СхемаКомпоновкиДанных));
    КомпоновщикНастроек.ЗагрузитьНастройки(СхемаКомпоновкиДанных.ВариантыНастроек[Элемент.Текст].Настройки);
    КонецЕсли;

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *