Я сделал свой отчёт на СКД с использованием обычной (т.е. не управляемой) формы. В качестве заготовки взял типовой шаблон отчёта на СКД с ИТС http://its.1c.ru/db/metod81#content:3048:1 .
В самом конце возникла неожиданная проблема - как организовать переключение вариантов отчета на форме?
На форме этого шаблона уже была изначально предусмотрена панель выбора вариантов отчёта - "ПанельВыбораВариантов" - в самом верху формы, и в левом углу её уже имелась надпись "Варианты отчёта".
Как добавить все варианты отчёта в виде кнопок этой панели?
В Интернете я нашёл лишь решение в виде добавления новой кнопки "Выбор варианта отчёта" на форму - но так не интересно, зачем изобретать велосипед, когда уже есть штатная панель кнопок варианта отчёта?
Я исследовал вопрос. Оказалось, что кнопки на эту панель добавляются, если пользователь сохранит текущую настройку путём нажатия кнопки "Сохранить вариант" (с дискетой, в правом нижнем углу отображённой панели настроек). Оказалось также, что сохраняются не просто варианты отчёта - но одновременно и пользовательские настройки, и сохраняется всё это в справочнике "Сохраненные настройки" и в хранилище значения, причём настройки эти привязаны индивидуально к пользователю.
Я написал две процедуры, программно имитирующие нажатие кнопки с дискетой. Только вместо текущего варианта отчёта они сохраняют все имеющиеся варианты отчёта. Процедуры вызываются при открытии отчёта. При этом эти кнопки (при необходимости) создаются.
Вот программный код этих процедур:
Процедура СохранитьВариантНастроекПользователя(СохраненнаяНастройка, НастраиваемыйОбъект, ВариантНастроек)
Наименование = ВариантНастроек.Имя;
ТипНастройки = Перечисления.ТипыНастроек.НастройкиОтчета;
Пользователь = глЗначениеПеременной("глТекущийПользователь");
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| СохраненныеНастройкиПользователи.Ссылка
|ИЗ
| Справочник.СохраненныеНастройки.Пользователи КАК СохраненныеНастройкиПользователи
|ГДЕ
| СохраненныеНастройкиПользователи.Ссылка.Наименование = &Наименование
| И СохраненныеНастройкиПользователи.Ссылка.ТипНастройки = &ТипНастройки
| И СохраненныеНастройкиПользователи.Ссылка.НастраиваемыйОбъект = &НастраиваемыйОбъект
| И СохраненныеНастройкиПользователи.Пользователь = &Пользователь";
Запрос.УстановитьПараметр("Наименование", Наименование);
Запрос.УстановитьПараметр("НастраиваемыйОбъект", НастраиваемыйОбъект);
Запрос.УстановитьПараметр("Пользователь", Пользователь);
Запрос.УстановитьПараметр("ТипНастройки", ТипНастройки);
Результат = Запрос.Выполнить();
Если НЕ Результат.Пустой() Тогда
//Сообщить("Такой элемент уже есть в справочнике.");
Возврат;
КонецЕсли;
// Создание новой настройки
НовыйЭлемент = Справочники.СохраненныеНастройки.СоздатьЭлемент();
НовыйЭлемент.Наименование = Наименование;
НовыйЭлемент.Описание = Наименование;
НовыйЭлемент.НастраиваемыйОбъект = НастраиваемыйОбъект;
НовыйЭлемент.ТипНастройки = Перечисления.ТипыНастроек.НастройкиОтчета;
НовыйПользователь = НовыйЭлемент.Пользователи.Добавить();
НовыйПользователь.Пользователь = глЗначениеПеременной("глТекущийПользователь");
НовыйПользователь.ПравоИзменения = Истина;
Отказ = Ложь;
Сообщение = "";
НовыйЭлемент.ПроверитьОбязательныеРеквизиты(НовыйЭлемент, Отказ, Сообщение);
Если Отказ Тогда
Сообщить("Элемент не может быть записан! " + Сообщение, СтатусСообщения.Важное);
Возврат;
КонецЕсли;
НовыйЭлемент.Записать();
// Сохранение
СохраненнаяНастройка = НовыйЭлемент.Ссылка;
СтруктураНастроек = ТиповыеОтчеты.ПолучитьСтруктуруПараметровТиповогоОтчета(ЭтотОбъект);
СтруктураНастроек.НастройкиКомпоновщика = ВариантНастроек.Настройки;
СохранениеНастроек.СохранитьНастройкуОбъекта(СохраненнаяНастройка, СтруктураНастроек);
Модифицированность = Ложь;
Если Не ТиповыеОтчеты.ЭтоСтараяВерсияОтчета(ЭтотОбъект) Тогда
РежимРедактированияНастройки = Ложь;
ЭтоОтработкаРасшифровки = Ложь;
КонецЕсли;
КонецПроцедуры
Процедура СоздатьКнопкиПанелиВариантовОтчета(ОтчетОбъект, ФормаОтчета) Экспорт
Макет = ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных");
Для каждого ВариантНастроек Из Макет.ВариантыНастроек Цикл
СохранитьВариантНастроекПользователя(ОтчетОбъект.СохраненнаяНастройка, ТиповыеОтчеты.ПолучитьИдентификаторОбъекта(ОтчетОбъект), ВариантНастроек);
КонецЦикла;
КонецПроцедуры
......
Процедура ПриОткрытии()
//Начало изменения
СоздатьКнопкиПанелиВариантовОтчета(ЭтотОбъект, ЭтаФорма);
//Конец изменения
...........
КонецПроцедуры
Такой вариант создания этих кнопок я считаю наиболее безопасным - потому что этот код в максимальной степени имитирует имеющийся функционал (функционал кнопки с дискетой). Всё это работает под любым пользователем.
Также я выкладываю демо-отчёт для демонстрации этого функционала - там 2 варианта отчёта - первый выводит коды справочника "Контрагенты", второй - его наименования. Всё это будет работать в любой конфигурации, где есть справочник "Контрагенты", если же такого справочника не найдётся - подправьте запрос в СКД, замените справочник "Контрагенты" на какой-нибудь свой.