helpf.pro
Регистрация
 +4 
Распечатать

1С 8.2 УП : Динамический отчет на СКД с разными вариантами

На днях делал несколько однотипных отчетов на СКД. 

Общий принцип: формируются все варианты отчета, указанные в настройках схемы и каждый вариант выводится на отдельной вкладке.

Потом возникла мысль попробовать объединить все схемы в один отчет, чтобы не плодить лишних объектов в конфигурации. При этом количество вариантов в этих схемах заранее неизвестно. Ok, challenge accepted.

В тестовой конфигурации создаю для отчета две схемы компоновки, "Склад" и "Заявки".

Запросы наборов данных приводить не буду, для каждой схемы в настройках добавляю несколько вариантов отчетов.

Теперь переходим к созданию формы. Практически все реквизиты формы будут создаваться при выборе необходимого макета отчета.

Код 1C v 8.2 УП
 &НаСервере
Процедура СоздатьПереченьОтчетов()


 Для Каждого Макет Из РеквизитФормыВЗначение("Отчет").Метаданные().Макеты Цикл
  Элементы.МакетОтчета.СписокВыбора.Добавить(Макет.Имя, Макет.Синоним);
 КонецЦикла;


КонецПроцедуры // СоздатьПереченьОтчетов()


&НаСервере
Процедура ОбработатьВыборМакета()


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


 КонецЦикла;
 
 РеквизитыКУдалению = ПоместитьВоВременноеХранилище(кУдалению, УникальныйИдентификатор);


КонецПроцедуры // ОбработатьВыборМакета()


&НаСервере
Процедура СформироватьОтчеты()


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


КонецПроцедуры // СформироватьОтчеты()


&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
 
 СоздатьПереченьОтчетов();
 
КонецПроцедуры


&НаКлиенте
Процедура МакетОтчетаПриИзменении(Элемент)
 
 ОбработатьВыборМакета();
 
КонецПроцедуры


&НаКлиенте
Процедура Сформировать(Команда)
 
 СформироватьОтчеты();
 
КонецПроцедуры

Смотрим, что получилось.

Выгрузка базы 1Cv8skd.rar 

Источник

Разместил:   Версии: | 8.2 УП | 8.3 |  Дата:   Прочитано: 41449
 +4 
Распечатать
Возможно, вас также заинтересует
Microsoft SQL Server Native Client Добавление значения в столбец "datetime" привело к переполнению 2
При формировании отчета на СКД получили ошибку: Microsoft SQL Server Native Client 11.0: Добавление значения в столбец "datetime" привело к переполнению Подробнее текст такой: ... по причине: Ошибка компоновки данных по причине: Ошибка получени
Блокировка записей, невозможно изменить или удалить из регистра. Конфликт блокировок MS SQL + 1C 4
При попытке удалить запись из регистра сведений - получаю ошибку: она заблокирована, ошибка блокировок и т.д. Отключил всех пользователей, перезапустил сервер, пробую удалить - опять ошибка блокировки :( Путем тестов было вяснено, что проблема
В отчет не попадают данные за последний день… Как исправить? 0
Пользователь выбрал период формирования отчета с 1июля по 31. Почему при формировании отчета в него не попадают данные за 31 число? На самом деле, это одна из самых распространенных ошибок при разработке отчетов. В 1С 8.х дата содержит время с точно
Внешние источники данных 0
Почему данная возможность вызывает такой интерес? Любой человек, который программировал в 1С при этом достаточно неплохо знаком с SQL и хотя бы в общих чертах знаком с архитектурой и принципами разработки других технологических платформ для бизнес пр
Временные таблицы в отчетах СКД 0
Нужно в отчете СКД Связать Данные из Регистра Накопления ВзаиморасчетыСРаботниками и Табличной Части Документа ЗарплатаКВыплате по Ссылке на Документ и ФизЛицу! И вывести полученные данные за указанный Период(с ДатаН по ДатаК) - Запрос будет такой:
Посмотреть все результаты поиска похожих
Вы не можете отправить комментарий анонимно, пожалуйста войдите или зарегистрируйтесь.