gifts2017

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

Опубликовал anton anton (B_ant_V) в раздел Программирование - Практика программирования

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

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

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

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

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

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

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

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

 

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

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

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

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

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

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

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

 

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

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

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

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

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

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

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

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

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

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

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

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

См. также

Подписаться Добавить вознаграждение

Комментарии

1. Владимир Самойлов (samamoiloff) 11.10.12 08:23
В ЗУП интересные шаблоны типового отчета, когда варианты выбираются на спец.панели под верхним обрезом формы, их можно спрятать, а так же набор инструментов по созданию нового и выдаче прав по редактированию вариантов.
romankoav; cleaner_it; Rustig; +3 Ответить
2. Dmitry Dmitry (Dimasik2007) 11.10.12 08:25
Когда давно скачал шаблон отчета на СКД с инфорстарта (авторство сейчас не помню), и добавил туда следующий блок

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

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

ч = ч + 1;
КонецЦикла;
КонецПроцедуры

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


получается вот такое простое меню:

Прикрепленные файлы:
gusda; RegrZ; simich; VovkaPutin; rise; rainspb; teyana; kvk98; 1Снег; mc_bublik_90@mail.ru; Yasen; ftm; artichoke; +13 Ответить
3. Just (Just) 11.10.12 08:29
Не совсем понял, в чем смысл статьи. Ведь есть стандартный шаблон отчета для СКД, как был и есть УниверсальныйОтчет для обычных запросов. На стандартном шаблоне отчетов для СКД построены все отчету по зарплате и проблемм с сохранение/востановлением настроек пользователем нет или я что-то не догнал?
4. Dmitry Dmitry (Dimasik2007) 11.10.12 08:32
(3) Не путайте настройки отчета, созданные пользователем, и варианты отчетов, зашитые в макет СКД.
5. Just (Just) 11.10.12 08:36
(4) Dimasik2007, http://comol.livejournal.com/3867.html
это разве не то? что в этой статье есть такого, чего нет в типовом шаблоне???
6. Dmitry Dmitry (Dimasik2007) 11.10.12 08:44
А что накинулись то на ТС, он только учится еще, заодно и выкладывает вещи... Потом будет рефакторинг и левел-ап...
По типовому отчету от 1С, который с вертикальным меню вариантов отчета - вот все! мои пользователи кричат, что это гггг, работать не удобно, не понятно и т.п. Для 99% минималистичного отчета вполне достаточно.
7. Just (Just) 11.10.12 08:53
так никто и не накидывался, я только спроисл в чём фокус, может я чего на понял в статье, да и человек просил ему типовые решение подсказать.....
8. Роман Ложкин (webester) 11.10.12 09:09
эммм если, это статья которая должна чему то научить, то почему, тут тупо копипаст кода? Где подробное комментирование и документирование? Где ход мысли? Вы сами не понимаете что тут написано или просто лень нормально оформить? Я уж молчу про раскраску кода.
9. Александр Медведев (anig99) 11.10.12 12:25
Как-то всё запутано...

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

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

Процедура ВариантОтчетаПриИзменении(Элемент)
    //Если НЕ ЗначениеЗаполнено(ЭтаФорма.ВариантОтчета) Тогда Возврат КонецЕсли;
    Если Вопрос("Заменить текущие настройки на стандартные настройки варианта?", РежимДиалогаВопрос.ДаНет,, КодВозвратаДиалога.Нет) = КодВозвратаДиалога.Нет Тогда 
        ЭтаФорма.ВариантОтчета = Неопределено;
        Возврат;
    КонецЕсли;
    ОтчетОбъект.КомпоновщикНастроек.ЗагрузитьНастройки(ЭтаФорма.ВариантОтчета.Настройки);
    мТекущаяНастройкаИмя = "";
    УстановитьЗаголовокФормы(" [Вариант: " + ЭтаФорма.ВариантОтчета.Представление + "]");
КонецПроцедуры
...Показать Скрыть
10. Ярослав Юнка (y22-k) 11.10.12 17:15
Я делал немного по другому
При открытии на форме заполнял панель кнопками вариантов
Процедура ПриОткрытии()
    ЭлементыФормы.КоманднаяПанель1.Кнопки.Очистить();
    пВарианты = СхемаКомпоновкиДанных.ВариантыНастроек;
    Для Каждого пЭл ИЗ пВарианты Цикл
        СтруктураВариантов.Вставить(пЭл.Имя,пЭл.Настройки);
        ЭлементыФормы.КоманднаяПанель1.Кнопки.Добавить(пЭл.Имя,ТипКнопкиКоманднойПанели.Действие,пЭл.Представление,Новый Действие("НажатиеНаКнопкуВарианта"));
        ЭлементыФормы.КоманднаяПанель1.Кнопки.Добавить("",ТипКнопкиКоманднойПанели.Разделитель);
    КонецЦикла;
    ЭлементыФормы.КоманднаяПанель1.Кнопки.Добавить("",ТипКнопкиКоманднойПанели.Разделитель);
КонецПроцедуры
...Показать Скрыть

При нажатии на кнопку варианта вызывалось
Процедура Нажатие(Кнопка)
     пНастройки = СтруктураВариантов[Кнопка.Имя];
     Для Каждого Кнопка_ из ЭлементыФормы.КоманднаяПанель1.Кнопки цикл
         Кнопка_.Пометка = Ложь;
     КонецЦикла;
     Кнопка.Пометка = Истина;
	 
     СтарыйОтбор = КомпоновщикНастроек.Настройки.Отбор.Элементы; 
     КомпоновщикНастроек.ЗагрузитьНастройки(пНастройки);
     КомпоновщикНастроек.Настройки.Отбор.Элементы.Очистить();
	 
     НачПериодаПриИзменении(ЭлементыФормы.НачПериода);
     КонПериодаПриИзменении(ЭлементыФормы.КонПериода);
	 
     Для Каждого Строка из СтарыйОтбор Цикл
         СтрокаОтбора = КомпоновщикНастроек.Настройки.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
		 ЗаполнитьЗначенияСвойств(СтрокаОтбора,Строка);
     КонецЦикла;
     ДействияФормыСформировать(Неопределено);
КонецПроцедуры
...Показать Скрыть
11. Dimon (klel) 11.10.12 20:42
12. Гость 11.10.12 22:36
Так проще :)
Процедура ПриОткрытии()
	СписокВыбора = Новый СписокЗначений;
	Для Каждого Вариант Из ОтчетОбъект.СхемаКомпоновкиДанных.ВариантыНастроек Цикл
		СписокВыбора.Добавить(Вариант, Вариант.Представление);
	КонецЦикла;
	ЭлементыФормы.Вариант.СписокВыбора = СписокВыбора;
КонецПроцедуры

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

Только пользовательские настройки сбрасывает.
RegrZ; sheffchik; NittenRenegade; svilsa; the1; Jazz2; cheburashka; +7 Ответить 2
13. CHEBURASHKA (cheburashka) 12.10.12 14:00
14. Lena Denysuyk (Pechenuych_ka) 19.02.13 16:16
Подскажите, пожалуйста, как в таком отчете сделать так,что выводило параметры?
Делаю в первые отчет при помощи СКД в НЕ управляемой форме и никак не могу настроить что бы выводило параметры отчета
15. Сергей Племянников (Serge_ASB) 06.11.14 15:39
(12) Гость,
как сделать тип значения Произвольный?
УТ 10.3 - СКД
16. vashkostya vaschuk (vashkostya) 04.01.16 10:18
Вот проще:

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

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

Процедура ПриОткрытии()
    УстановитьВариантыНастроек();
    ...
...Показать Скрыть
Прикрепленные файлы:
SamS; alexhline; +2 Ответить
17. Виктор Ким (victorkim64) 12.08.16 04:46
Все представленные здесь варианты примеров загружают настройки из "КомпоновщикНастроек", которые создаются в режиме конфигуратора. Эти примеры не позволяют сохранять пользовательские изменения во ВСЕХ вариантов настроек. Что то более подходящее нашёл здесь http://infostart.ru/public/264758/.
18. Ярослава Ядрова (Najly) 03.10.16 09:08
(9) anig99, спасибо, то что надо!
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа