Использование схемы компоновки данных в 1С для расчетов, программное формирование СКД, вывод результата компоновки в дерево значений, использование таблицы значений как источника данных СКД
Kirill T.
27.03.2018
13 понравилось
236 просмотров

Использование схемы компоновки данных в 1С для расчетов, программное формирование СКД, вывод результата компоновки в дерево значений, использование таблицы значений как источника данных СКД

 

Рассмотрим пример создания отчета на СКД, источником данных для которого, является заранее подготовленная таблица значений.

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

Для начала, создадим  внешний отчет с такой табличной частью:

Номер респондента – число (15, 0) – порядковый номер респондента, остальные поля строковые, неограниченной длины.

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

Установим полям типы значений и доступные значения. Доступные значения нужны нам для того, чтобы было легко настраивать отбор в отчете, так как список выбора в настройках будет ограничен только доступными значениями. Например, так:

У нас созданы 3 поля с ответами: ОтветНаВопрос1, ОтветНаВопрос2, ОтветНаВопрос3. Это сделано для того, чтобы ограничить доступные поля для отбора по-разному, так как для разных вопросов у нас будут разные варианты ответов, но в отчет будет выводиться одно поле «Ответ», так как у нас создано для него вычисляемое поле с такой формулой:

Ресурсы по группировкам у нас будут считаться по-разному, поэтому настроим их так:

В группировке «Вопрос» будет выводиться среднее количество ответивших на вопрос по вариантам ответа, например, было высказано два варианта ответа, один выбрали  5 респондентов, а другой 8, тогда в группировке «Ответ» будет стоять: (5+8) / 2 = 6,5.

В группировке по ответу будет просто количество респондентов, выбравших этот вариант по этому вопросу.

Настройки основного варианта отчета сделаны так:

Полю «Номер респондента» присвоен заголовок, чтобы было понятнее смотреть отчет.

Настройка СКД завершена, теперь перейдем в модуль объекта этого отчета и создадаим там процедуру «ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)». Код процедуры такой:

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

               

                СтандартнаяОбработка = Ложь;

                              

                ТаблицаДанных = РезультатыОпроса.Выгрузить();

               

                ДанныеРасшифровки = Новый ДанныеРасшифровкиКомпоновкиДанных;

               

                НаборыДанных = Новый Структура("ТаблицаРезультатовОпроса", ТаблицаДанных);

                СКД = ЭтотОбъект.СхемаКомпоновкиДанных;

               

                КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;

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

                ПроцессорКомпДанных = Новый ПроцессорКомпоновкиДанных;

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

               

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

                Вывод.УстановитьДокумент(ДокументРезультат);

                Вывод.Вывести(ПроцессорКомпДанных, Истина);   

               

                //Создание дерева с результатом вывода СКД

                ***Вот тут мы после вывода отчета еще раз получаем результат СКД, но уже в дерево значений, для дальнейшего использования, если оно, конечно предполагается. Группировки строк дерева будут такими же как группировки строк в настройках компоновки, с которой мы выполнили формирование результата нашей схемы. Вывод в коллекцию значений невозможен при использовании таблиц в настройках компоновки данных.***

ДеревоРезультата = Новый ДеревоЗначений;

                КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;

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

                               Тип("ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений"));

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

                ВыводДерева = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений;

                ВыводДерева.УстановитьОбъект(ДеревоРезультата);

                ВыводДерева.Вывести(ПроцессорКомпДанных, Истина);   

               

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

 

Создадим форму отчета и на форме создадим реквизит с типом «Таблица значений», чтобы заполнять нашу табличную часть, для последующей передачи ее в СКД:

Для удобства заполнения, я прописал полям с вопросами и ответами список выбора, для вопросов он фиксированный, указан в свойствах элемента формы, а для ответов он формируется программно, при выборе вопроса, т.к. варианты ответов разные для разных вопросов:

В модуле формы следующий код для этого:

&НаСервере

Процедура РезультатыОпросаПриИзмененииНаСервере(СтруктураПоиска, Ответ)

 

У вас есть вопрос, нужна помощь консультанта?

Оставьте номер телефона и мы перезвоним!

                НайденныеСтроки = Отчет.РезультатыОпроса.НайтиСтроки(СтруктураПоиска);

               

                Если НайденныеСтроки.Количество() = 1 Тогда

                                СтрокаТаблицы = НайденныеСтроки[0];

                Иначе

                               СтрокаТаблицы = Отчет.РезультатыОпроса.Добавить();

                               ЗаполнитьЗначенияСвойств(СтрокаТаблицы, СтруктураПоиска);

                КонецЕсли;

               

                Если СтруктураПоиска.Вопрос = "Вы пойдете на выборы?" Тогда

                               СтрокаТаблицы.ОтветНаВопрос1 = Ответ;

                ИначеЕсли СтруктураПоиска.Вопрос = "За кого вы будете голосовать если бы пошли?" Тогда

                               СтрокаТаблицы.ОтветНаВопрос2 = Ответ;

                ИначеЕсли СтруктураПоиска.Вопрос = "За кого вы никогда не будете голосовать?" Тогда

                               СтрокаТаблицы.ОтветНаВопрос3 = Ответ;

                КонецЕсли;

               

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

 

&НаКлиенте

Процедура РезультатыОпросаПриИзменении(Элемент)

               

                ТекущиеДанные = Элементы.РезультатыОпроса.ТекущиеДанные;

               

                Если РезультатыОпроса.Количество() = 0 Тогда

                               Отчет.РезультатыОпроса.Очистить();

                КонецЕсли;

               

                Если ТекущиеДанные <> Неопределено Тогда

                               Если ЗначениеЗаполнено(ТекущиеДанные.НомерРеспондента)

                                                               И ЗначениеЗаполнено(ТекущиеДанные.Вопрос) Тогда

                                               СтруктураПоиска = Новый Структура("НомерРеспондента, Вопрос", ТекущиеДанные.НомерРеспондента, ТекущиеДанные.Вопрос);

                                               РезультатыОпросаПриИзмененииНаСервере(СтруктураПоиска, ТекущиеДанные.Ответ);

                               КонецЕсли;

                КонецЕсли;

               

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

 

&НаКлиенте

Процедура РезультатыОпросаВопросПриИзменении(Элемент)

               

                Элементы.РезультатыОпросаОтвет.СписокВыбора.Очистить();

                ТекущиеДанные = Элементы.РезультатыОпроса.ТекущиеДанные;

               

                Если ТекущиеДанные.Вопрос = "Вы пойдете на выборы?" Тогда

                               Элементы.РезультатыОпросаОтвет.СписокВыбора.Добавить("Да");

                               Элементы.РезультатыОпросаОтвет.СписокВыбора.Добавить("Нет");

                Иначе

                               Элементы.РезультатыОпросаОтвет.СписокВыбора.Добавить("Владимир Пуговкин");

                               Элементы.РезультатыОпросаОтвет.СписокВыбора.Добавить("Павел Грудко");

                               Элементы.РезультатыОпросаОтвет.СписокВыбора.Добавить("Ксения Овсянникова");

                               Элементы.РезультатыОпросаОтвет.СписокВыбора.Добавить("Владилена Жирковская");

                КонецЕсли;

               

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

 

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

Результат выполнения выглядит так:

А так, как мы настроили доступные значения в полях компоновки, удобно настроить отборы по вопросу или ответу:

 

Эта статья помогла вам?

Теги:

Комментарии ( 0 )

Оставить комментарий