Динамический отчет на СКД с разными вариантами На днях делал несколько однотипных отчетов на СКД.
Общий принцип: формируются все варианты отчета, указанные в настройках схемы и каждый вариант выводится на отдельной вкладке.
Потом возникла мысль попробовать объединить все схемы в один отчет, чтобы не плодить лишних объектов в конфигурации. При этом количество вариантов в этих схемах заранее неизвестно. Ok, challenge accepted.
В тестовой конфигурации создаю для отчета две схемы компоновки, "Склад" и "Заявки".
Запросы наборов данных приводить не буду, для каждой схемы в настройках добавляю несколько вариантов отчетов.
Теперь переходим к созданию формы. Практически все реквизиты формы будут создаваться при выборе необходимого макета отчета.
Код 1C v 8.2 УП &НаСервере
Процедура СоздатьПереченьОтчетов()
Для Каждого Макет Из РеквизитФормыВЗначение( "Отчет" ) . Метаданные( ) . Макеты Цикл
Элементы. МакетОтчета. СписокВыбора. Добавить( Макет. Имя, Макет. Синоним) ;
КонецЦикла ;
КонецПроцедуры
&НаСервере
Процедура ОбработатьВыборМакета()
Макет = РеквизитФормыВЗначение( "Отчет" ) . ПолучитьМакет( МакетОтчета) ;
мУдалить = ? ( ПустаяСтрока( РеквизитыКУдалению) , Новый Массив, ПолучитьИзВременногоХранилища( РеквизитыКУдалению) ) ;
мДобавить = Новый Массив;
кУдалению = Новый Массив;
Для Каждого Вариант Из Макет. ВариантыНастроек Цикл
ИмяРеквизита = "ТабДок_" + Вариант. Имя;
тРеквизит = Новый РеквизитФормы( ИмяРеквизита, Новый ОписаниеТипов( "ТабличныйДокумент" ) ) ;
мДобавить. Добавить( тРеквизит) ;
кУдалению. Добавить( ИмяРеквизита) ;
КонецЦикла ;
ИзменитьРеквизиты( мДобавить, мУдалить) ;
Пока Элементы. СтраницыОтчета. ПодчиненныеЭлементы. Количество( ) Цикл
Элементы. Удалить( Элементы. СтраницыОтчета. ПодчиненныеЭлементы[0 ]) ;
КонецЦикла ;
Для Каждого Вариант Из Макет. ВариантыНастроек Цикл
Страница = Элементы. Добавить( "Страница_" + Вариант. Имя, Тип( "ГруппаФормы" ) , Элементы. СтраницыОтчета) ;
Страница. Вид = ВидГруппыФормы. Страница;
Страница. Заголовок = Вариант. Представление;
ИмяРеквизита = "ТабДок_" + Вариант. Имя;
ТабДок = Элементы. Добавить( ИмяРеквизита, Тип( "ПолеФормы" ) , Страница) ;
ТабДок. Вид = ВидПоляФормы. ПолеТабличногоДокумента;
ТабДок. ПутьКДанным = ИмяРеквизита;
ТабДок. ПоложениеЗаголовка = ПоложениеЗаголовкаЭлементаФормы. Нет;
ЭтаФорма[ИмяРеквизита]. Очистить( ) ;
КонецЦикла ;
РеквизитыКУдалению = ПоместитьВоВременноеХранилище( кУдалению, УникальныйИдентификатор) ;
КонецПроцедуры
&НаСервере
Процедура СформироватьОтчеты()
Схема = РеквизитФормыВЗначение( "Отчет" ) . ПолучитьМакет( МакетОтчета) ;
Для Каждого Вариант Из Схема. ВариантыНастроек Цикл
Отчет. КомпоновщикНастроек. ЗагрузитьНастройки( Вариант. Настройки) ;
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
Макет = КомпоновщикМакета. Выполнить( Схема, Отчет. КомпоновщикНастроек. ПолучитьНастройки( ) ) ;
ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновки. Инициализировать( Макет) ;
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
ПроцессорВывода. УстановитьДокумент( ЭтаФорма["ТабДок_" + Вариант. Имя]) ;
ПроцессорВывода. Вывести( ПроцессорКомпоновки) ;
КонецЦикла ;
КонецПроцедуры
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
СоздатьПереченьОтчетов( ) ;
КонецПроцедуры
&НаКлиенте
Процедура МакетОтчетаПриИзменении(Элемент)
ОбработатьВыборМакета( ) ;
КонецПроцедуры
&НаКлиенте
Процедура Сформировать(Команда)
СформироватьОтчеты( ) ;
КонецПроцедуры
Смотрим, что получилось.
Выгрузка базы 1Cv8skd.rar
Источник
Категория:
Схема Компоновки Данных Форма ~ Добавление элементов на форму [Команда, Кнопка, ТаблицаЗначений] Код 1C v 8.2 УП &НаСервере
Процедура ДобавитьНаСервере()
ДобавляемыеРеквизиты = Новый Массив;
Реквизит1 = Новый РеквизитФормы( "Таб" , Новый ОписаниеТипов( "ТаблицаЗначений" ) , , "Таблица" , Истина ) ;
ДобавляемыеРеквизиты. Добавить( Реквизит1 ) ;
ИзменитьРеквизиты( ДобавляемыеРеквизиты) ;
ДобавляемыеРеквизиты = Новый Массив;
Реквизит2 = Новый РеквизитФормы( "Кол" , Новый ОписаниеТипов( "Строка" ) , "Таб" , "Колонка" , Истина ) ;
ДобавляемыеРеквизиты. Добавить( Реквизит2 ) ;
ИзменитьРеквизиты( ДобавляемыеРеквизиты) ;
ТаблицаФормы = ЭтаФорма. Элементы. Добавить( "Таблица" , Тип( "ТаблицаФормы" ) , ЭтаФорма) ;
ТаблицаФормы. ПутьКДанным = "Таб" ;
Колонка = ЭтаФорма. Элементы. Добавить( "Колонка" , Тип( "ПолеФормы" ) , ТаблицаФормы) ;
Колонка. ПутьКДанным = "Таб.Кол" ;
КонецПроцедуры
еще
Код 1C v 8.2 УП
Кмд = ЭтаФорма. Команды. Добавить( "Выгрузить" ) ;
Кмд. Действие = "Выгрузить" ;
Кмд. Заголовок = "Выгрузить в файл" ;
КмдЗ = ЭтаФорма. Команды. Добавить( "Загрузить" ) ;
КмдЗ. Действие = "Загрузить" ;
КмдЗ. Заголовок = "Загрузить из файла" ;
КмдЗ = ЭтаФорма. Команды. Добавить( "ЗаписатьВДокумент" ) ;
КмдЗ. Действие = "ЗаписатьВДокумент" ;
КмдЗ. Заголовок = "Записать в документ" ;
Горизонт = ЭтаФорма. Элементы. Добавить( "Горизонт" , Тип( "ГруппаФормы" ) , ЭтаФорма) ;
Горизонт. Вид = ВидГруппыФормы. ОбычнаяГруппа;
Элемент2 = ЭтаФорма. Элементы. Добавить( "Выгрузить" , Тип( "КнопкаФормы" ) , Горизонт) ;
Элемент2 . Вид = ВидКнопкиФормы. ОбычнаяКнопка;
Элемент2 . ИмяКоманды = "Выгрузить" ;
Элемент = ЭтаФорма. Элементы. Добавить( "Загрузить" , Тип( "КнопкаФормы" ) , ЭтаФорма) ;
Элемент. Вид = ВидКнопкиФормы. ОбычнаяКнопка;
Элемент. ИмяКоманды = "Загрузить" ;
Элемент = ЭтаФорма. Элементы. Добавить( "ЗаписатьВДокумент" , Тип( "КнопкаФормы" ) , ЭтаФорма) ;
Элемент. Вид = ВидКнопкиФормы. ОбычнаяКнопка;
Элемент. ИмяКоманды = "ЗаписатьВДокумент" ;
ТаблицаФормы = Элементы. Добавить( "ф__ТЗ" , Тип( "ТаблицаФормы" ) ) ;
ТаблицаФормы. ПутьКДанным = "ТЗ" ;
Категория:
Работа с Формой (Диалог) и её элементами Быстрый отбор в справочнике по первой букве В статье описан способ быстрой организации отбора в списке справочника по первой букве наименования. Механизм легко дотачивается под собственные нужды.
Код 1C v 8.2 УП
&НаКлиенте
Процедура УстановитьПометку(Команда)
Для Каждого Кнопка Из Элементы. ПанельСБуквами. ПодчиненныеЭлементы Цикл
Кнопка. Пометка = ( Команда. Имя = Кнопка. Имя) ;
КонецЦикла ;
КонецПроцедуры
&НаСервере
Процедура ПодготовитьДинамическийСписок()
Список. ПроизвольныйЗапрос = Истина ;
ТекстЗапроса =
"ВЫБРАТЬ *
|ИЗ
| %ИмяТаблицы% КАК Т
|{ГДЕ
| (ПОДСТРОКА(Т.Наименование, 1, 1) В (&СписокБукв))}" ;
ТекстЗапроса = СтрЗаменить( ТекстЗапроса, "%ИмяТаблицы%" , Список. ОсновнаяТаблица) ;
Список. ТекстЗапроса = ТекстЗапроса;
КонецПроцедуры
&НаСервере
Процедура СоздатьПанельСБуквами()
ПанельСБуквами = Элементы. Вставить( "ПанельСБуквами" , Тип( "ГруппаФормы" ) , ЭтаФорма, Элементы. Список) ;
ПанельСБуквами. Вид = ВидГруппыФормы. КоманднаяПанель;
КомандаФормы = Команды. Добавить( "Все" ) ;
КомандаФормы. Действие = "УдалитьФильтрПоПервойБукве" ;
КнопкаФормы = Элементы. Добавить( "Все" , Тип( "КнопкаФормы" ) , ПанельСБуквами) ;
КнопкаФормы. ИмяКоманды = "Все" ;
КнопкаФормы. Пометка = Истина ;
Для Сч = КодСимвола( "А" ) По КодСимвола( "Я" ) Цикл
ИмяКоманды = Символ( Сч) ;
Если Найти( "Ё,Й,Ъ,Ь" , ИмяКоманды) > 0 Тогда
Продолжить;
КонецЕсли ;
КомандаФормы = Команды. Добавить( ИмяКоманды) ;
КомандаФормы. Действие = "УстановитьФильтрПоПервойБукве" ;
КнопкаФормы = Элементы. Добавить( ИмяКоманды, Тип( "КнопкаФормы" ) , ПанельСБуквами) ;
КнопкаФормы. ИмяКоманды = ИмяКоманды;
КонецЦикла ;
КонецПроцедуры
&НаКлиенте
Процедура УстановитьФильтрПоПервойБукве(Команда)
Буква = Команда. Имя;
СписокБукв = Новый Массив;
СписокБукв. Добавить( Буква) ;
СписокБукв. Добавить( НРег( Буква) ) ;
Если Буква = "Е" Тогда
СписокБукв. Добавить( "Ё" ) ;
СписокБукв. Добавить( "ё" ) ;
КонецЕсли ;
Если Буква = "И" Тогда
СписокБукв. Добавить( "Й" ) ;
СписокБукв. Добавить( "й" ) ;
КонецЕсли ;
Список. Параметры. УстановитьЗначениеПараметра( "СписокБукв" , СписокБукв) ;
УстановитьПометку( Команда) ;
КонецПроцедуры
&НаКлиенте
Процедура УдалитьФильтрПоПервойБукве(Команда)
ПараметрКомпоновкиДанных = Новый ПараметрКомпоновкиДанных( "СписокБукв" ) ;
ЗначениеПараметраКомпоновкиДанных = Список. Параметры. НайтиЗначениеПараметра( ПараметрКомпоновкиДанных) ;
Если ЗначениеПараметраКомпоновкиДанных = Неопределено Тогда
Возврат ;
КонецЕсли ;
ЗначениеПараметраКомпоновкиДанных. Использование = Ложь ;
УстановитьПометку( Команда) ;
КонецПроцедуры
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
ПодготовитьДинамическийСписок( ) ;
СоздатьПанельСБуквами( ) ;
КонецПроцедуры
Данный текст необходимо вставить в модуль формы списка справочника.
Процедуру "ПриСозданииНаСервере" вручную назначить обработчиком одноименного события формы.
Если данному событию уже назначен обработчик, то необходимо дополнить его строками процедуры "ПриСозданииНаСервере" из листинга.
Реквизита формы "Список"
не должен содержать произвольного запроса. Если список формируется произвольным запросом, то в запрос необходимо дописать условие компоновки:
{ГДЕ (ПОДСТРОКА(ИмяТаблицы.Наименование, 1, 1) В (&СписокБукв))}
и удалить процедуру "ПодготовитьДинамическийСписок" и все ее вызовы.
Автор
Armando Категория:
Справочники