Форум 1С
Программистам, бухгалтерам, администраторам, пользователям
Задай вопрос - получи решение проблемы
07 июн 2023, 01:49

Две схемы компоновки данных в одном отчете

Автор Петя Эндюков, 25 мар 2020, 11:27

0 Пользователей и 1 гость просматривают эту тему.

Петя Эндюков

Добрый день. Возникла ситуаций, сделать в одном отчете две схемы компоновки данных, так как заказчика не устраивает, что в одном отчете, есть 2 набора данных ( потому, что в пользовательском режиме, в настройках , при выборе полей, отражаются поля из 1 запроса и второго ). Внешний отчет делать для "них тоже не вариант", решил разбить на две схемы компоновки данных.

Итог, создал условие, что при выборке "номер скд 1" - грузит одну схему, а при выборе другой другую.
Вот код.

Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)

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

НД = Новый ИсточникДоступныхНастроекКомпоновкиДанных (СхемаКомпоновкиДанных);
КомпоновщикНастроек.Инициализировать(НД);
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, КомпоновщикНастроек.Настройки,  ДанныеРасшифровки);

ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновки.Инициализировать(МакетКомпоновки, ,ДанныеРасшифровки);


ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
ПроцессорВывода.УстановитьДокумент(ДокументРезультат);
ПроцессорВывода.Вывести(ПроцессорКомпоновки);



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

КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, КомпоновщикНастроек.Настройки,  ДанныеРасшифровки);

ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновки.Инициализировать(МакетКомпоновки, ,ДанныеРасшифровки);

ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
ПроцессорВывода.УстановитьДокумент(ДокументРезультат);
ПроцессорВывода.Вывести(ПроцессорКомпоновки);





КонецЕсли;

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



Всё отлично, отчеты формируются, но в настройках, доступные поля пустые, а выбранные поля помечаются крестом. (скрин во вложении).
Буду рад любой помощи, заранее спасибо


LexaK

ЦитироватьИтог, создал условие, что при выборке "номер скд 1" - грузит одну схему, а при выборе другой другую.
ну ведь почти все правильно сделали!!!
попробуйте такой вариант
сделайте ДВА ОТДЕЛЬНЫХ ОТЧЕТА, каждый со своим СКД.
и в вашей форме
Цитироватьпри выборке "номер скд 1" или "номер скд 2"
просто запускайте тот или другой отчет, это всего пара строчек кода, что бы запустить нужный отчет!!! :befhbt:
если помогло нажмите: Спасибо!

wise

(0)как можно связать между собой схему компоновки данных с компоновщиком настроек компоновки данных

Профессия - 1С » Схема компоновки данных и компоновщик настроек

рубрики: СКД | Дата: 15 ноября, 2016
Скачать обработку с примерами из статьи: SKD+DCSC.epf
Платформа: 8.3; Тип формы: управляемая.

В этой статье рассмотрим как можно связать между собой схему компоновки данных с
компоновщиком настроек компоновки данных. Как обычно рассмотрим это на простейшем
практическом примере.
Допустим, что у нас есть два справочника: Склады
и Товары. В справочнике товаров есть табличная часть ПереченьСкладов
в которой указывается на каких складах может храниться товар и его максимальное
количество для каждого склада.

Допустим нам потребовалась групповая обработка для записи максимального количества
товаров на складах. Табличная часть у нас будет в виде дерева значений, плюс заполнение
ее надо реализовать с возможностью отборов как по складам, так и по товару.
Реализовывать ее будем на управляемых формах. В общем вот так должен выглядеть итоговый вариант
обработки в режиме 1С:Предприятия после установки отборов и заполнения табличной части.

А теперь подумаем как можно это реализовать.
Поскольку нам необходимы отборы, то сразу напрашивается использование схемы
компоновки данных. Поэтому создаем обработку и добавляем макет с типом
Схема компоновки данных и форму.

В схему компоновки данных вставляем вот такой запрос:



ВЫБРАТЬ
ТоварыПереченьСкладов.Ссылка КАК Товар,
ТоварыПереченьСкладов.Склад,
ТоварыПереченьСкладов.МаксимальноеКоличество КАК Количество
ИЗ
Справочник.Товары.ПереченьСкладов КАК ТоварыПереченьСкладов

и настраиваем ее следующим образом

Переходим к проектированию формы.
Первым делом попробуем реализовать отбор. Добавляем реквизит формы и смотрим доступные
типы для него. Видим, что кроме типа КомпоновщикНастроекКомпоновкиДанных
у нас нет ничего более подходящего, чтобы реализовать отбор.

После выбора этого типа видим, что у него есть три подчиненных элемента. Нас
интересуют Настройки с типом НастройкиКомпоновкиДанных.
Раскрываем Настройки, находим в них Отбор, и перетаскиваем его
на форму.
Далее добавляем реквизит с типом ДеревоЗначений и создаем колонки согласно
схеме компоновки данных. Создание и заполнение дерева значений уже рассматривалось
в статье про дерево значений на форме.
В результате этих манипуляций получаем следующую картину

Теперь нам предстоит программно заполнить отбор из настроек компоновщика настроек
на основании отбора схемы компоновки данных. И потом реализовать заполнение дерева
значений с учетом этого отбора. Приведу сразу итоговый код, а потом уже его
прокомментирую.



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

ФормаОбъект = РеквизитФормыВЗначение("Объект");
СхемаКД = ФормаОбъект.ПолучитьМакет("СКД_ТоварыСклады");

ВременноеХранилищеСКД = ПоместитьВоВременноеХранилище(СхемаКД, УникальныйИдентификатор);

КомпоновщикНастроекКД.Инициализировать(Новый ИсточникДоступныхНастроекКомпоновкиДанных(ВременноеХранилищеСКД));
КомпоновщикНастроекКД.ЗагрузитьНастройки(СхемаКД.НастройкиПоУмолчанию);

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

&НаСервере
Процедура ЗаполнитьДеревоНаСервере()

ФормаОбъект = РеквизитФормыВЗначение("Объект");
СхемаКД = ФормаОбъект.ПолучитьМакет("СКД_ТоварыСклады");

НастройкиКД = КомпоновщикНастроекКД.Настройки;

КомпоновщикМакетаКД = Новый КомпоновщикМакетаКомпоновкиДанных;
МакетКД = КомпоновщикМакетаКД.Выполнить(СхемаКД, НастройкиКД,,,Тип("ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений"));

ПроцессорКД = Новый ПроцессорКомпоновкиДанных;
ПроцессорКД.Инициализировать(МакетКД);

ДеревоСкладТовар = Новый ДеревоЗначений;
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений;
ПроцессорВывода.УстановитьОбъект(ДеревоСкладТовар);
ПроцессорВывода.Вывести(ПроцессорКД);

ЗначениеВРеквизитФормы(ДеревоСкладТовар, "ДеревоСкладыТовары");

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

&НаКлиенте
Процедура ЗаполнитьДерево(Команда)
ЗаполнитьДеревоНаСервере();
КонецПроцедуры

В процедуре ПриСозданииНаСервере() у нас реализовано заполнение отбора
компоновщика настроек. В статье Вывод отчета СКД программно
тоже использовался компоновщик настроек. Но там все было гораздо проще, т.к. там
я рассматривал внешний отчет. И компоновщик настроек там присутствует по умолчанию.
А здесь мы имеем дело с обработкой. И здесь при инициализации компоновщика настроек
из схемы компоновки данных сталкиваемся с неочевидным моментом. Дело в том, что
схему компоновки данных надо предварительно поместить во временное хранилище с
помощью метода ПоместитьВоВременноеХранилище()
После установки нужных нам отборов, заполняем табличную часть с деревом значений.
Здесь стоит сказать пару слов про формирование макета компоновки данных. Вот про
эти три строчки кода



НастройкиКД = КомпоновщикНастроекКД.Настройки;

КомпоновщикМакетаКД = Новый КомпоновщикМакетаКомпоновкиДанных;
МакетКД = КомпоновщикМакетаКД.Выполнить(СхемаКД, НастройкиКД,,,Тип("ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений"));

Как известно макет формируется на основании схемы компоновки данных и настроек
компоновки данных. Но поскольку отбор на форме у нас принадлежит не схеме компоновки,
а компоновщику настроек, то и настройки берем из компоновщика настроек, которые
впрочем как мы помним заполнялись ПриСозданииНаСервере() из настроек схемы компоновки.
Поэтому по структуре они идентичны, за исключением значений отбора. И последнее, что
хочется отметить, в методе Выполнить() при генерации макета необходимо
указать в качестве параметра Тип(«ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений»)

Представьте себе, какая была бы тишина, если бы люди говорили только то, что знают

Теги:

Похожие темы (5)

Рейтинг@Mail.ru Rambler's Top100

Поиск