Всем добрый день!
Рассказать я хочу о том как мне пришлось бороться с выбором варианта отчета написанном при помощи СКД в НЕ управляемой форме. С управляемыми проблем нет. Там эта возможность включена по-умолчанию. Что касается обычных форм, то после безуспешного поиска в интернете стандартных решений, реализовал все сам вручную (кодом) через хранилище настроек. Может конечно я не умею искать, но думаю, что решение будет полезно и для других.
Вот ворма отчета:
Нижнее поле - результат, куда печ. форма выводится.
Чуть выше - стандартные настройки СКД Данные: "КомпоновщикНастроек.Настройки.ПараметрыДанных"
И верхнее - поле для выбора варианта, который нас и интересует.
Для выбора варианта отчета создал отдельную форму. На ней просто список вариантов.
Код из основной формы:
//////////////////////////////
Перем ИмяТекВар;
Процедура ЗаполнитьВарианты()
Для каждого Вар из СхемаКомпоновкиДанных.ВариантыНастроек Цикл
СЗВариантов.Добавить(Вар,Вар.Представление);
КонецЦикла;
КонецПроцедуры
Процедура ПередОткрытием(Отказ, СтандартнаяОбработка)
СписокВар = ХранилищеВариантовОтчетов.ПолучитьСписок("ЭтотОтчетОтчетПоПроизведеннойНекондицииЛяляля");
Для каждого вар из СписокВар Цикл
ТекВар = СхемаКомпоновкиДанных.ВариантыНастроек.Найти(вар.Значение);
Если ТекВар = Неопределено Тогда
СхемаКомпоновкиДанных.ВариантыНастроек.Добавить();
ТекВар = СхемаКомпоновкиДанных.ВариантыНастроек[СхемаКомпоновкиДанных.ВариантыНастроек.Количество()-1];
ТекВар.Имя = вар.Значение;
ТекВар.Представление = вар.Представление;
КонецЕсли;
КонецЦикла;
ЗаполнитьВарианты();
ИмяТекВар = СокрЛП(СЗВариантов[0].Значение.Имя);
ВыбВариант = СЗВариантов[0].Значение.Представление;
ТекН = ХранилищеВариантовОтчетов.Загрузить("ЭтотОтчетОтчетПоПроизведеннойНекондицииЛяляля",СокрЛП(СЗВариантов[0].Значение.Имя));
Если ТекН = Неопределено Тогда
КомпоновщикНастроек.ЗагрузитьНастройки(СЗВариантов[0].Значение.Настройки);
Иначе
КомпоновщикНастроек.ЗагрузитьНастройки(ТекН);
КонецЕсли;
КонецПроцедуры
Процедура ВыбВариантНачалоВыбора(Элемент, СтандартнаяОбработка)
Он = Новый ОписаниеНастроек;
Он.Представление = СокрЛП(ВыбВариант);
ХранилищеВариантовОтчетов.Сохранить("ЭтотОтчетОтчетПоПроизведеннойНекондицииЛяляля", СокрЛП(ИмяТекВар), КомпоновщикНастроек.Настройки, Он);
Форм = ПолучитьФорму("Форма");
Форм.Схема = СхемаКомпоновкиДанных;
Форм.Компановщ = КомпоновщикНастроек;
Форм.Варианты = СЗВариантов;
ТекВар = Форм.ОткрытьМодально();
Если НЕ(ТекВар = Неопределено) Тогда
ВыбВариант = ТекВар.Представление;
ИмяТекВар = СокрЛП(ТекВар.Имя);
КонецЕсли;
КонецПроцедуры
Процедура ПередЗакрытием(Отказ, СтандартнаяОбработка)
Он = Новый ОписаниеНастроек;
Он.Представление = СокрЛП(ВыбВариант);
ХранилищеВариантовОтчетов.Сохранить("ЭтотОтчетОтчетПоПроизведеннойНекондицииЛяляля", СокрЛП(ИмяТекВар), КомпоновщикНастроек.Настройки, СокрЛП(ВыбВариант));
КонецПроцедуры
///////////////////////////////////////
Код в форме выбора:
////////////////////////
Перем Схема Экспорт;
Перем Компановщ Экспорт;
Процедура КоманднаяПанель1Добавить(Кнопка)
имя = "";
Если ВвестиСтроку(имя) Тогда
Схема.ВариантыНастроек.Добавить();
Схема.ВариантыНастроек[Схема.ВариантыНастроек.Количество()-1].Представление = имя;
Схема.ВариантыНастроек[Схема.ВариантыНастроек.Количество()-1].Имя = СокрЛП(Схема.ВариантыНастроек.Количество());
Варианты.Добавить(Схема.ВариантыНастроек[Схема.ВариантыНастроек.Количество()-1],Схема.ВариантыНастроек[Схема.ВариантыНастроек.Количество()-1].Представление);
Он = Новый ОписаниеНастроек;
Он.Представление = СокрЛП(имя);
ХранилищеВариантовОтчетов.Сохранить("ЭтотОтчетОтчетПоПроизведеннойНекондицииЛяляля", СокрЛП(Схема.ВариантыНастроек.Количество()), Схема.ВариантыНастроек[Схема.ВариантыНастроек.Количество()-1].Настройки, Он);
КонецЕсли;
КонецПроцедуры
Процедура ПередОткрытием(Отказ, СтандартнаяОбработка)
КонецПроцедуры
Процедура ВариантыВыбор(Элемент, ВыбраннаяСтрока, Колонка, СтандартнаяОбработка)
ТекН = ХранилищеВариантовОтчетов.Загрузить("ЭтотОтчетОтчетПоПроизведеннойНекондицииЛяляля",СокрЛП(Элемент.ТекущиеДанные.Значение.Имя));
Если ТекН = Неопределено Тогда
Компановщ.ЗагрузитьНастройки(Элемент.ТекущиеДанные.Значение.Настройки);
Иначе
Компановщ.ЗагрузитьНастройки(ТекН);
КонецЕсли;
ЭтаФорма.Закрыть(Элемент.ТекущиеДанные.Значение);
КонецПроцедуры
Процедура КоманднаяПанель1Удалить(Кнопка)
ТекДан = ЭлементыФормы.Варианты.ТекущиеДанные;
Если НЕ (ТекДан = Неопределено) Тогда
ХранилищеВариантовОтчетов.Удалить("ЭтотОтчетОтчетПоПроизведеннойНекондицииЛяляля",ТекДан.Значение.Имя,ПользователиИнформационнойБазы.ТекущийПользователь().Имя);
Варианты.Удалить(Варианты.НайтиПоЗначению(ТекДан.Значение));
КонецЕсли;
КонецПроцедуры
Процедура ВариантыПередУдалением(Элемент, Отказ)
ХранилищеВариантовОтчетов.Удалить("ЭтотОтчетОтчетПоПроизведеннойНекондицииЛяляля",Элемент.ТекущиеДанные.Значение.Имя,ПользователиИнформационнойБазы.ТекущийПользователь().Имя);
КонецПроцедуры
Процедура КоманднаяПанель1Копировать(Кнопка)
Если НЕ(ЭлементыФормы.Варианты.ТекущиеДанные = Неопределено) Тогда
имя = "";
Если ВвестиСтроку(имя) Тогда
Схема.ВариантыНастроек.Добавить();
Схема.ВариантыНастроек[Схема.ВариантыНастроек.Количество()-1].Представление = имя;
Схема.ВариантыНастроек[Схема.ВариантыНастроек.Количество()-1].Имя = СокрЛП(Схема.ВариантыНастроек.Количество());
Варианты.Добавить(Схема.ВариантыНастроек[Схема.ВариантыНастроек.Количество()-1],Схема.ВариантыНастроек[Схема.ВариантыНастроек.Количество()-1].Представление);
НастройкиСохранения = Схема.ВариантыНастроек[Схема.ВариантыНастроек.Количество()-1].Настройки;
ТекН = ХранилищеВариантовОтчетов.Загрузить("ЭтотОтчетОтчетПоПроизведеннойНекондицииЛяляля",СокрЛП(ЭлементыФормы.Варианты.ТекущиеДанные.Значение.Имя));
Если НЕ(ТекН = Неопределено) Тогда
НастройкиСохранения = ТекН;
КонецЕсли;
Он = Новый ОписаниеНастроек;
Он.Представление = СокрЛП(имя);
ХранилищеВариантовОтчетов.Сохранить("ЭтотОтчетОтчетПоПроизведеннойНекондицииЛяляля", СокрЛП(Схема.ВариантыНастроек.Количество()),НастройкиСохранения , Он);
КонецЕсли;
КонецЕсли;
КонецПроцедуры
////////////////////
Вот как-то так.
Конечно, если кто-нибудь покажет, как сохранять и выбирать варианты СКД для обычных форм стандартными средствами, буду рад посмотреть :)