Всем добрый день!
Рассказать я хочу о том как мне пришлось бороться с выбором варианта отчета написанном при помощи СКД в НЕ управляемой форме. С управляемыми проблем нет. Там эта возможность включена по-умолчанию. Что касается обычных форм, то после безуспешного поиска в интернете стандартных решений, реализовал все сам вручную (кодом) через хранилище настроек. Может конечно я не умею искать, но думаю, что решение будет полезно и для других.
Вот ворма отчета:
Нижнее поле — результат, куда печ. форма выводится.
Чуть выше — стандартные настройки СКД Данные: «КомпоновщикНастроек.Настройки.ПараметрыДанных»
И верхнее — поле для выбора варианта, который нас и интересует.
Для выбора варианта отчета создал отдельную форму. На ней просто список вариантов.
Код из основной формы:
//////////////////////////////
Перем ИмяТекВар;
Процедура ЗаполнитьВарианты()
Для каждого Вар из СхемаКомпоновкиДанных.ВариантыНастроек Цикл
СЗВариантов.Добавить(Вар,Вар.Представление);
КонецЦикла;
КонецПроцедуры
Процедура ПередОткрытием(Отказ, СтандартнаяОбработка)
СписокВар = ХранилищеВариантовОтчетов.ПолучитьСписок("ЭтотОтчетОтчетПоПроизведеннойНекондицииЛяляля");
Для каждого вар из СписокВар Цикл
ТекВар = СхемаКомпоновкиДанных.ВариантыНастроек.Найти(вар.Значение);
Если ТекВар = Неопределено Тогда
СхемаКомпоновкиДанных.ВариантыНастроек.Добавить();
ТекВар = СхемаКомпоновкиДанных.ВариантыНастроек[СхемаКомпоновкиДанных.ВариантыНастроек.Количество()-1];
ТекВар.Имя = вар.Значение;
ТекВар.Представление = вар.Представление;
КонецЕсли;
КонецЦикла;
ЗаполнитьВарианты();
ИмяТекВар = СокрЛП(СЗВариантов[0].Значение.Имя);
ВыбВариант = СЗВариантов[0].Значение.Представление;
ТекН = ХранилищеВариантовОтчетов.Загрузить("ЭтотОтчетОтчетПоПроизведеннойНекондицииЛяляля",СокрЛП(СЗВариантов[0].Значение.Имя));
Если ТекН = Неопределено Тогда
КомпоновщикНастроек.ЗагрузитьНастройки(СЗВариантов[0].Значение.Настройки);
Иначе
КомпоновщикНастроек.ЗагрузитьНастройки(ТекН);
КонецЕсли;
КонецПроцедуры
Процедура ВыбВариантНачалоВыбора(Элемент, СтандартнаяОбработка)
Он = Новый ОписаниеНастроек;
Он.Представление = СокрЛП(ВыбВариант);
ХранилищеВариантовОтчетов.Сохранить("ЭтотОтчетОтчетПоПроизведеннойНекондицииЛяляля", СокрЛП(ИмяТекВар), КомпоновщикНастроек.Настройки, Он);
Форм = ПолучитьФорму("Форма");
Форм.Схема = СхемаКомпоновкиДанных;
Форм.Компановщ = КомпоновщикНастроек;
Форм.Варианты = СЗВариантов;
ТекВар = Форм.ОткрытьМодально();
Если НЕ(ТекВар = Неопределено) Тогда
ВыбВариант = ТекВар.Представление;
ИмяТекВар = СокрЛП(ТекВар.Имя);
КонецЕсли;
КонецПроцедуры
Процедура ПередЗакрытием(Отказ, СтандартнаяОбработка)
Он = Новый ОписаниеНастроек;
Он.Представление = СокрЛП(ВыбВариант);
ХранилищеВариантовОтчетов.Сохранить("ЭтотОтчетОтчетПоПроизведеннойНекондицииЛяляля", СокрЛП(ИмяТекВар), КомпоновщикНастроек.Настройки, СокрЛП(ВыбВариант));
КонецПроцедуры
///////////////////////////////////////
Код в форме выбора:
////////////////////////
Перем Схема Экспорт;
Перем Компановщ Экспорт;
Процедура КоманднаяПанель1Добавить(Кнопка)
имя = "";
Если ВвестиСтроку(имя) Тогда
Схема.ВариантыНастроек.Добавить();
Схема.ВариантыНастроек[Схема.ВариантыНастроек.Количество()-1].Представление = имя;
Схема.ВариантыНастроек[Схема.ВариантыНастроек.Количество()-1].Имя = СокрЛП(Схема.ВариантыНастроек.Количество());
Варианты.Добавить(Схема.ВариантыНастроек[Схема.ВариантыНастроек.Количество()-1],Схема.ВариантыНастроек[Схема.ВариантыНастроек.Количество()-1].Представление);
Он = Новый ОписаниеНастроек;
Он.Представление = СокрЛП(имя);
ХранилищеВариантовОтчетов.Сохранить("ЭтотОтчетОтчетПоПроизведеннойНекондицииЛяляля", СокрЛП(Схема.ВариантыНастроек.Количество()), Схема.ВариантыНастроек[Схема.ВариантыНастроек.Количество()-1].Настройки, Он);
КонецЕсли;
КонецПроцедуры
Процедура ПередОткрытием(Отказ, СтандартнаяОбработка)
КонецПроцедуры
Процедура ВариантыВыбор(Элемент, ВыбраннаяСтрока, Колонка, СтандартнаяОбработка)
ТекН = ХранилищеВариантовОтчетов.Загрузить("ЭтотОтчетОтчетПоПроизведеннойНекондицииЛяляля",СокрЛП(Элемент.ТекущиеДанные.Значение.Имя));
Если ТекН = Неопределено Тогда
Компановщ.ЗагрузитьНастройки(Элемент.ТекущиеДанные.Значение.Настройки);
Иначе
Компановщ.ЗагрузитьНастройки(ТекН);
КонецЕсли;
ЭтаФорма.Закрыть(Элемент.ТекущиеДанные.Значение);
КонецПроцедуры
Процедура КоманднаяПанель1Удалить(Кнопка)
ТекДан = ЭлементыФормы.Варианты.ТекущиеДанные;
Если НЕ (ТекДан = Неопределено) Тогда
ХранилищеВариантовОтчетов.Удалить("ЭтотОтчетОтчетПоПроизведеннойНекондицииЛяляля",ТекДан.Значение.Имя,ПользователиИнформационнойБазы.ТекущийПользователь().Имя);
Варианты.Удалить(Варианты.НайтиПоЗначению(ТекДан.Значение));
КонецЕсли;
КонецПроцедуры
Процедура ВариантыПередУдалением(Элемент, Отказ)
ХранилищеВариантовОтчетов.Удалить("ЭтотОтчетОтчетПоПроизведеннойНекондицииЛяляля",Элемент.ТекущиеДанные.Значение.Имя,ПользователиИнформационнойБазы.ТекущийПользователь().Имя);
КонецПроцедуры
Процедура КоманднаяПанель1Копировать(Кнопка)
Если НЕ(ЭлементыФормы.Варианты.ТекущиеДанные = Неопределено) Тогда
имя = "";
Если ВвестиСтроку(имя) Тогда
Схема.ВариантыНастроек.Добавить();
Схема.ВариантыНастроек[Схема.ВариантыНастроек.Количество()-1].Представление = имя;
Схема.ВариантыНастроек[Схема.ВариантыНастроек.Количество()-1].Имя = СокрЛП(Схема.ВариантыНастроек.Количество());
Варианты.Добавить(Схема.ВариантыНастроек[Схема.ВариантыНастроек.Количество()-1],Схема.ВариантыНастроек[Схема.ВариантыНастроек.Количество()-1].Представление);
НастройкиСохранения = Схема.ВариантыНастроек[Схема.ВариантыНастроек.Количество()-1].Настройки;
ТекН = ХранилищеВариантовОтчетов.Загрузить("ЭтотОтчетОтчетПоПроизведеннойНекондицииЛяляля",СокрЛП(ЭлементыФормы.Варианты.ТекущиеДанные.Значение.Имя));
Если НЕ(ТекН = Неопределено) Тогда
НастройкиСохранения = ТекН;
КонецЕсли;
Он = Новый ОписаниеНастроек;
Он.Представление = СокрЛП(имя);
ХранилищеВариантовОтчетов.Сохранить("ЭтотОтчетОтчетПоПроизведеннойНекондицииЛяляля", СокрЛП(Схема.ВариантыНастроек.Количество()),НастройкиСохранения , Он);
КонецЕсли;
КонецЕсли;
КонецПроцедуры
////////////////////
Вот как-то так.
Конечно, если кто-нибудь покажет, как сохранять и выбирать варианты СКД для обычных форм стандартными средствами, буду рад посмотреть 🙂
В ЗУП интересные шаблоны типового отчета, когда варианты выбираются на спец.панели под верхним обрезом формы, их можно спрятать, а так же набор инструментов по созданию нового и выдаче прав по редактированию вариантов.
Не совсем понял, в чем смысл статьи. Ведь есть стандартный шаблон отчета для СКД, как был и есть УниверсальныйОтчет для обычных запросов. На стандартном шаблоне отчетов для СКД построены все отчету по зарплате и проблемм с сохранение/востановлением настроек пользователем нет или я что-то не догнал?
(3) Не путайте настройки отчета, созданные пользователем, и варианты отчетов, зашитые в макет СКД.
(4) Dimasik2007,http://comol.livejournal.com/3867.html
это разве не то? что в этой статье есть такого, чего нет в типовом шаблоне???
А что накинулись то на ТС, он только учится еще, заодно и выкладывает вещи… Потом будет рефакторинг и левел-ап…
По типовому отчету от 1С, который с вертикальным меню вариантов отчета — вот все! мои пользователи кричат, что это гггг, работать не удобно, не понятно и т.п. Для 99% минималистичного отчета вполне достаточно.
так никто и не накидывался, я только спроисл в чём фокус, может я чего на понял в статье, да и человек просил ему типовые решение подсказать…..
эммм если, это статья которая должна чему то научить, то почему, тут тупо копипаст кода? Где подробное комментирование и документирование? Где ход мысли? Вы сами не понимаете что тут написано или просто лень нормально оформить? Я уж молчу про раскраску кода.
Как-то всё запутано…
Показать
Я делал немного по другому
При открытии на форме заполнял панель кнопками вариантов
Показать
При нажатии на кнопку варианта вызывалось
Показать
Большой + за старания =)
Так проще 🙂
Показать
Только пользовательские настройки сбрасывает.
(12) Гость, делал так же.
Подскажите, пожалуйста, как в таком отчете сделать так,что выводило параметры?
Делаю в первые отчет при помощи СКД в НЕ управляемой форме и никак не могу настроить что бы выводило параметры отчета
(12) Гость,
как сделать тип значения Произвольный?
УТ 10.3 — СКД
Вот проще:
Показать
Все представленные здесь варианты примеров загружают настройки из «КомпоновщикНастроек», которые создаются в режиме конфигуратора. Эти примеры не позволяют сохранять пользовательские изменения во ВСЕХ вариантов настроек. Что то более подходящее нашёл здесьhttp://infostart.ru/public/264758/ .
(9) anig99, спасибо, то что надо!
с сохранением заполненных настроек пример интересен.
а вот мой краткий без сохранения
ВариантыОтчетаСписок — поле выбора (элемент формы)
Показать