Выбор варианта отчета СКД для обычных форм

Выбор варианта отчета СКД для обычных форм

Всем добрый день!

Рассказать я хочу о том как мне пришлось бороться с выбором варианта отчета написанном при помощи СКД в НЕ управляемой форме. С управляемыми проблем нет. Там эта возможность включена по-умолчанию. Что касается обычных форм, то после безуспешного поиска в интернете стандартных решений, реализовал все сам вручную (кодом) через хранилище настроек. Может конечно я не умею искать, но думаю, что решение будет полезно и для других.

Вот ворма отчета:

Нижнее поле — результат, куда печ. форма выводится.

Чуть выше — стандартные настройки СКД Данные: «КомпоновщикНастроек.Настройки.ПараметрыДанных»

И верхнее — поле для выбора варианта, который нас и интересует.

Для выбора варианта отчета создал отдельную форму. На ней просто список вариантов.

Код из основной формы:

//////////////////////////////

Перем ИмяТекВар;

Процедура ЗаполнитьВарианты()
Для каждого Вар из СхемаКомпоновкиДанных.ВариантыНастроек Цикл
СЗВариантов.Добавить(Вар,Вар.Представление);
КонецЦикла;
КонецПроцедуры

Процедура ПередОткрытием(Отказ, СтандартнаяОбработка)
СписокВар = ХранилищеВариантовОтчетов.ПолучитьСписок("ЭтотОтчетОтчетПоПроизведеннойНекондицииЛяляля");
Для каждого вар из СписокВар Цикл
ТекВар = СхемаКомпоновкиДанных.ВариантыНастроек.Найти(вар.Значение);
Если ТекВар = Неопределено Тогда
СхемаКомпоновкиДанных.ВариантыНастроек.Добавить();
ТекВар = СхемаКомпоновкиДанных.ВариантыНастроек[СхемаКомпоновкиДанных.ВариантыНастроек.Количество()-1];
ТекВар.Имя = вар.Значение;
ТекВар.Представление = вар.Представление;
КонецЕсли;
КонецЦикла;

ЗаполнитьВарианты();
ИмяТекВар = СокрЛП(СЗВариантов[0].Значение.Имя);
ВыбВариант = СЗВариантов[0].Значение.Представление;
ТекН = ХранилищеВариантовОтчетов.Загрузить("ЭтотОтчетОтчетПоПроизведеннойНекондицииЛяляля",СокрЛП(СЗВариантов[0].Значение.Имя));
Если ТекН = Неопределено Тогда
КомпоновщикНастроек.ЗагрузитьНастройки(СЗВариантов[0].Значение.Настройки);
Иначе
КомпоновщикНастроек.ЗагрузитьНастройки(ТекН);
КонецЕсли;
КонецПроцедуры

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

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



Код в форме выбора:

////////////////////////

Перем Схема Экспорт;
Перем Компановщ Экспорт;

Процедура КоманднаяПанель1Добавить(Кнопка)
имя = "";
Если ВвестиСтроку(имя) Тогда
Схема.ВариантыНастроек.Добавить();
Схема.ВариантыНастроек[Схема.ВариантыНастроек.Количество()-1].Представление = имя;
Схема.ВариантыНастроек[Схема.ВариантыНастроек.Количество()-1].Имя = СокрЛП(Схема.ВариантыНастроек.Количество());
Варианты.Добавить(Схема.ВариантыНастроек[Схема.ВариантыНастроек.Количество()-1],Схема.ВариантыНастроек[Схема.ВариантыНастроек.Количество()-1].Представление);

Он = Новый ОписаниеНастроек;
Он.Представление =  СокрЛП(имя);

ХранилищеВариантовОтчетов.Сохранить("ЭтотОтчетОтчетПоПроизведеннойНекондицииЛяляля", СокрЛП(Схема.ВариантыНастроек.Количество()), Схема.ВариантыНастроек[Схема.ВариантыНастроек.Количество()-1].Настройки, Он);
КонецЕсли;
КонецПроцедуры

Процедура ПередОткрытием(Отказ, СтандартнаяОбработка)

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

Процедура ВариантыВыбор(Элемент, ВыбраннаяСтрока, Колонка, СтандартнаяОбработка)
ТекН = ХранилищеВариантовОтчетов.Загрузить("ЭтотОтчетОтчетПоПроизведеннойНекондицииЛяляля",СокрЛП(Элемент.ТекущиеДанные.Значение.Имя));
Если ТекН = Неопределено Тогда
Компановщ.ЗагрузитьНастройки(Элемент.ТекущиеДанные.Значение.Настройки);
Иначе
Компановщ.ЗагрузитьНастройки(ТекН);
КонецЕсли;
ЭтаФорма.Закрыть(Элемент.ТекущиеДанные.Значение);
КонецПроцедуры

Процедура КоманднаяПанель1Удалить(Кнопка)
ТекДан = ЭлементыФормы.Варианты.ТекущиеДанные;
Если НЕ (ТекДан = Неопределено) Тогда
ХранилищеВариантовОтчетов.Удалить("ЭтотОтчетОтчетПоПроизведеннойНекондицииЛяляля",ТекДан.Значение.Имя,ПользователиИнформационнойБазы.ТекущийПользователь().Имя);
Варианты.Удалить(Варианты.НайтиПоЗначению(ТекДан.Значение));
КонецЕсли;
КонецПроцедуры

Процедура ВариантыПередУдалением(Элемент, Отказ)
ХранилищеВариантовОтчетов.Удалить("ЭтотОтчетОтчетПоПроизведеннойНекондицииЛяляля",Элемент.ТекущиеДанные.Значение.Имя,ПользователиИнформационнойБазы.ТекущийПользователь().Имя);
КонецПроцедуры

Процедура КоманднаяПанель1Копировать(Кнопка)
Если НЕ(ЭлементыФормы.Варианты.ТекущиеДанные = Неопределено) Тогда
имя = "";
Если ВвестиСтроку(имя) Тогда
Схема.ВариантыНастроек.Добавить();
Схема.ВариантыНастроек[Схема.ВариантыНастроек.Количество()-1].Представление = имя;
Схема.ВариантыНастроек[Схема.ВариантыНастроек.Количество()-1].Имя = СокрЛП(Схема.ВариантыНастроек.Количество());
Варианты.Добавить(Схема.ВариантыНастроек[Схема.ВариантыНастроек.Количество()-1],Схема.ВариантыНастроек[Схема.ВариантыНастроек.Количество()-1].Представление);

НастройкиСохранения = Схема.ВариантыНастроек[Схема.ВариантыНастроек.Количество()-1].Настройки;

ТекН = ХранилищеВариантовОтчетов.Загрузить("ЭтотОтчетОтчетПоПроизведеннойНекондицииЛяляля",СокрЛП(ЭлементыФормы.Варианты.ТекущиеДанные.Значение.Имя));
Если НЕ(ТекН = Неопределено) Тогда
НастройкиСохранения = ТекН;
КонецЕсли;

Он = Новый ОписаниеНастроек;
Он.Представление =  СокрЛП(имя);

ХранилищеВариантовОтчетов.Сохранить("ЭтотОтчетОтчетПоПроизведеннойНекондицииЛяляля", СокрЛП(Схема.ВариантыНастроек.Количество()),НастройкиСохранения , Он);
КонецЕсли;
КонецЕсли;
КонецПроцедуры

////////////////////

Вот как-то так.

Конечно, если кто-нибудь покажет, как сохранять и выбирать варианты СКД для обычных форм стандартными средствами, буду рад посмотреть 🙂

19 Comments

  1. samamoiloff

    В ЗУП интересные шаблоны типового отчета, когда варианты выбираются на спец.панели под верхним обрезом формы, их можно спрятать, а так же набор инструментов по созданию нового и выдаче прав по редактированию вариантов.

    Reply
  2. Dimasik2007
    Reply
  3. Just

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

    Reply
  4. Dimasik2007

    (3) Не путайте настройки отчета, созданные пользователем, и варианты отчетов, зашитые в макет СКД.

    Reply
  5. Just

    (4) Dimasik2007, http://comol.livejournal.com/3867.html

    это разве не то? что в этой статье есть такого, чего нет в типовом шаблоне???

    Reply
  6. Dimasik2007

    А что накинулись то на ТС, он только учится еще, заодно и выкладывает вещи… Потом будет рефакторинг и левел-ап…

    По типовому отчету от 1С, который с вертикальным меню вариантов отчета — вот все! мои пользователи кричат, что это гггг, работать не удобно, не понятно и т.п. Для 99% минималистичного отчета вполне достаточно.

    Reply
  7. Just

    так никто и не накидывался, я только спроисл в чём фокус, может я чего на понял в статье, да и человек просил ему типовые решение подсказать…..

    Reply
  8. webester

    эммм если, это статья которая должна чему то научить, то почему, тут тупо копипаст кода? Где подробное комментирование и документирование? Где ход мысли? Вы сами не понимаете что тут написано или просто лень нормально оформить? Я уж молчу про раскраску кода.

    Reply
  9. anig99

    Как-то всё запутано…

    Процедура ЗаполнитьВариантыОтчетов()
    Для Каждого стрВариант из ОтчетОбъект.СхемаКомпоновкиДанных.ВариантыНастроек Цикл
    ЭтаФорма.ЭлементыФормы.ВариантОтчета.СписокВыбора.Добавить(стрВариант, стрВариант.Представление,, БиблиотекаКартинок.Отчет);
    КонецЦикла;
    КонецПроцедуры
    
    Процедура ПриОткрытии()
    СтруктураНастройки = Новый Структура;
    СтруктураНастройки.Вставить(«Пользователь», глЗначениеПеременной(«глТекущийПользователь»));
    СтруктураНастройки.Вставить(«ИмяОбъекта», ЭтотОбъект.Метаданные().ПолноеИмя());
    
    Если УниверсальныеМеханизмы.ПолучитьНастройкуИспользоватьПриОткрытии(СтруктураНастройки) Тогда
    мТекущаяНастройкаИмя = СтруктураНастройки.НаименованиеНастройки;
    КомпоновщикНастроек.ЗагрузитьНастройки(СтруктураНастройки.СохраненнаяНастройка);
    УстановитьЗаголовокФормы();
    Иначе
    ВариантОтчета = ЭлементыФормы.ВариантОтчета.СписокВыбора[0].Значение;
    УстановитьЗаголовокФормы(» [Вариант: » + ВариантОтчета.Представление + «]»);
    КонецЕсли;
    КонецПроцедуры
    
    Процедура ВариантОтчетаПриИзменении(Элемент)
    //Если НЕ ЗначениеЗаполнено(ЭтаФорма.ВариантОтчета) Тогда Возврат КонецЕсли;
    Если Вопрос(«Заменить текущие настройки на стандартные настройки варианта?», РежимДиалогаВопрос.ДаНет,, КодВозвратаДиалога.Нет) = КодВозвратаДиалога.Нет Тогда
    ЭтаФорма.ВариантОтчета = Неопределено;
    Возврат;
    КонецЕсли;
    ОтчетОбъект.КомпоновщикНастроек.ЗагрузитьНастройки(ЭтаФорма.ВариантОтчета.Настройки);
    мТекущаяНастройкаИмя = «»;
    УстановитьЗаголовокФормы(» [Вариант: » + ЭтаФорма.ВариантОтчета.Представление + «]»);
    КонецПроцедуры

    Показать

    Reply
  10. y22-k

    Я делал немного по другому

    При открытии на форме заполнял панель кнопками вариантов

    Процедура ПриОткрытии()
    ЭлементыФормы.КоманднаяПанель1.Кнопки.Очистить();
    пВарианты = СхемаКомпоновкиДанных.ВариантыНастроек;
    Для Каждого пЭл ИЗ пВарианты Цикл
    СтруктураВариантов.Вставить(пЭл.Имя,пЭл.Настройки);
    ЭлементыФормы.КоманднаяПанель1.Кнопки.Добавить(пЭл.Имя,ТипКнопкиКоманднойПанели.Действие,пЭл.Представление,Новый Действие(«НажатиеНаКнопкуВарианта»));
    ЭлементыФормы.КоманднаяПанель1.Кнопки.Добавить(«»,ТипКнопкиКоманднойПанели.Разделитель);
    КонецЦикла;
    ЭлементыФормы.КоманднаяПанель1.Кнопки.Добавить(«»,ТипКнопкиКоманднойПанели.Разделитель);
    КонецПроцедуры

    Показать

    При нажатии на кнопку варианта вызывалось

    Процедура Нажатие(Кнопка)
    пНастройки = СтруктураВариантов[Кнопка.Имя];
    Для Каждого Кнопка_ из ЭлементыФормы.КоманднаяПанель1.Кнопки цикл
    Кнопка_.Пометка = Ложь;
    КонецЦикла;
    Кнопка.Пометка = Истина;
    
    СтарыйОтбор = КомпоновщикНастроек.Настройки.Отбор.Элементы;
    КомпоновщикНастроек.ЗагрузитьНастройки(пНастройки);
    КомпоновщикНастроек.Настройки.Отбор.Элементы.Очистить();
    
    НачПериодаПриИзменении(ЭлементыФормы.НачПериода);
    КонПериодаПриИзменении(ЭлементыФормы.КонПериода);
    
    Для Каждого Строка из СтарыйОтбор Цикл
    СтрокаОтбора = КомпоновщикНастроек.Настройки.Отбор.Элементы.Добавить(Тип(«ЭлементОтбораКомпоновкиДанных»));
    ЗаполнитьЗначенияСвойств(СтрокаОтбора,Строка);
    КонецЦикла;
    ДействияФормыСформировать(Неопределено);
    КонецПроцедуры

    Показать

    Reply
  11. klel

    Большой + за старания =)

    Reply
  12. Гость

    Так проще 🙂

    Процедура ПриОткрытии()
    СписокВыбора = Новый СписокЗначений;
    Для Каждого Вариант Из ОтчетОбъект.СхемаКомпоновкиДанных.ВариантыНастроек Цикл
    СписокВыбора.Добавить(Вариант, Вариант.Представление);
    КонецЦикла;
    ЭлементыФормы.Вариант.СписокВыбора = СписокВыбора;
    КонецПроцедуры
    
    Процедура ВариантПриИзменении(Элемент)
    ОтчетОбъект.КомпоновщикНастроек.ЗагрузитьНастройки(ЭлементыФормы.Вариант.Значение.Настройки);
    КонецПроцедуры
    

    Показать

    Только пользовательские настройки сбрасывает.

    Reply
  13. cheburashka

    (12) Гость, делал так же.

    Reply
  14. Pechenuych_ka

    Подскажите, пожалуйста, как в таком отчете сделать так,что выводило параметры?

    Делаю в первые отчет при помощи СКД в НЕ управляемой форме и никак не могу настроить что бы выводило параметры отчета

    Reply
  15. Serge_ASB

    (12) Гость,

    как сделать тип значения Произвольный?

    УТ 10.3 — СКД

    Reply
  16. vashkostya

    Вот проще:

    Процедура _СменаВариантаНастройки (Элемент)
    Для Каждого Настройка Из СхемаКомпоновкиДанных.ВариантыНастроек Цикл
    Если Элемент.Текст = Настройка.Представление Тогда
    КомпоновщикНастроек.ЗагрузитьНастройки(Настройка.Настройки);
    Прервать;
    КонецЕсли;
    КонецЦикла;
    КонецПроцедуры
    
    Процедура УстановитьВариантыНастроек()
    КП = ЭлементыФормы.ДействияФормы;
    НоваяКнопка = КП.Кнопки.Вставить(1,»_ВариантыОтчетов», ТипКнопкиКоманднойПанели.Подменю, «Варианты отчетов», );
    НовоеДействие = Новый Действие(«_СменаВариантаНастройки»);
    ч = 1;
    Для Каждого Настройка Из СхемаКомпоновкиДанных.ВариантыНастроек Цикл
    НоваяКнопка = КП.Кнопки._ВариантыОтчетов.Кнопки.Добавить(«Вариант»+Строка(ч), ТипКнопкиКоманднойПанели.Действие, Настройка.Представление, НовоеДействие);
    ч = ч + 1;
    КонецЦикла;
    КонецПроцедуры
    
    Процедура ПриОткрытии()
    УстановитьВариантыНастроек();
    …

    Показать

    Reply
  17. victor_k

    Все представленные здесь варианты примеров загружают настройки из «КомпоновщикНастроек», которые создаются в режиме конфигуратора. Эти примеры не позволяют сохранять пользовательские изменения во ВСЕХ вариантов настроек. Что то более подходящее нашёл здесь http://infostart.ru/public/264758/.

    Reply
  18. Najly

    (9) anig99, спасибо, то что надо!

    Reply
  19. ivs2000

    с сохранением заполненных настроек пример интересен.

    а вот мой краткий без сохранения

    ВариантыОтчетаСписок — поле выбора (элемент формы)

    Процедура УстановитьНастройки()
    
    ВариантОтчета = ЭлементыФормы.ВариантыОтчетаСписок.Значение;
    КомпоновщикНастроек.ЗагрузитьНастройки(СхемаКомпоновкиДанных.ВариантыНастроек[ВариантОтчета].Настройки);
    
    Конецпроцедуры
    //
    Процедура ПриОткрытии()
    
    счетчикцикла = 0;
    
    Для каждого Настройка Из СхемаКомпоновкиДанных.ВариантыНастроек Цикл
    
    ЭлементыФормы.ВариантыОтчетаСписок.СписокВыбора.Добавить(счетчикцикла, Настройка.Представление);
    СчетчикЦикла = СчетчикЦикла + 1;
    
    КонецЦикла;
    
    попытка
    ЭлементыФормы.ВариантыОтчетаСписок.Значение = ВосстановитьЗначение(«ВариантОтчета12345»);
    исключение
    КонецПопытки;
    
    если ЭлементыФормы.ВариантыОтчетаСписок.Значение = Неопределено тогда
    ЭлементыФормы.ВариантыОтчетаСписок.Значение = 0;
    КонецЕсли;
    
    УстановитьНастройки();
    
    КонецПроцедуры
    //
    Процедура ВариантОтчетаПриИзменении(Элемент)
    
    ВариантОтчета = ЭлементыФормы.ВариантыОтчетаСписок.Значение;
    КомпоновщикНастроек.ЗагрузитьНастройки(СхемаКомпоновкиДанных.ВариантыНастроек[ВариантОтчета].Настройки);
    
    КонецПроцедуры
    //
    Процедура ПриЗакрытии()
    
    СохранитьЗначение(«ВариантОтчета12345», ЭлементыФормы.ВариантыОтчетаСписок.Значение);
    
    КонецПроцедуры

    Показать

    Reply

Leave a Comment

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