Набор данных Объект в СКД для решения задач сортировки, нумерации и вывода в отчет произвольных наборов данных

04.07.16

Разработка - СКД

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

Задача, которую я решил используя набор данных Объект, состояла в следующем:

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

Решение задачи.

1. Для начала в отчет необходимо добавить новый набор данных - Объект и описать его поля:

 

Зададим нашему набору данных Имя объекта, содержащего данные тзПорядок.

2. Не забудем задать связь наборов данных:

 

 Тут все очень просто, в качестве источника связи указываем основной набор данных (НаборДанных1), в качестве приемника связи наш дополнительный набор данных (НаборДанных2), выражения источника/приемника - это те поля по которым мы связываем наши наборы данных, в нашем примере это Номенклатурная группа.

3. Добавляем условие отбора на основной запрос:

 

Это условие можно реализовать и другими способами, например, определив отбор компоновки данных, но мне показалось, что получать в дальнейшем значение параметра проще, чем отыскивать необходимый отбор из настроек схемы компоновки данных. 

4.  Укажем для нашего параметра &НоменклатурныеГруппы доступность ввода списка значений:

 

 5. На данном этапе работа с конструктором схемы компоновки данных заканчивается и мы перемещаемся в модуль объекта, нашего отчета. Для дальнейшей реализации поставленной задачи, придется формировать отчет программно. Для этого реализуем процедуру ПриКомпоновкеРезультата.

6. Сразу добавляем в эту процедуру стандартные строки по формированию отчета программно со стандартными настройками, т.е. так как, если бы он формировался без нашего вмешательства в процедуру ПриКомпоновкеРезультата. Для этого копируем в процедуру следующий код:

	//Программно формируем отчет
	//Отменяем стандартную обработку
	СтандартнаяОбработка = Ложь;
	//Получаем схему
	Схема = ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных");
	
	//...и настройки
	Настройки = КомпоновщикНастроек.ПолучитьНастройки();
	ДанныеРасшифровки = Новый ДанныеРасшифровкиКомпоновкиДанных;
	
	//Создаем компоновщик макета и получаем макет компоновки
	КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
	МакетКомпоновки = КомпоновщикМакета.Выполнить(Схема, Настройки, ДанныеРасшифровки);
	
	//Инициализируем процессор компоновки
	ПроцессорКомпоновкиДанных = Новый ПроцессорКомпоновкиДанных;
	ПроцессорКомпоновкиДанных.Инициализировать(МакетКомпоновки, , ДанныеРасшифровки, Истина);
	
	//Очищаем документ результата
	ДокументРезультат.Очистить();
	
	//Выводим отчет в документ
	ПроцессорВывода = Новый
	ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
	ПроцессорВывода.УстановитьДокумент(ДокументРезультат);
	ПроцессорВывода.Вывести(ПроцессорКомпоновкиДанных);

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

7. Для этого мы вносим изменения в уже внесенный код в процедуре ПриКомпоновкеРезультата:

	//Программно формируем отчет
	//Отменяем стандартную обработку
	СтандартнаяОбработка = Ложь;
	//Получаем схему
	Схема = ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных");
	
	//...и настройки
	Настройки = КомпоновщикНастроек.ПолучитьНастройки();
	ДанныеРасшифровки = Новый ДанныеРасшифровкиКомпоновкиДанных;
	
	//Создаем компоновщик макета и получаем макет компоновки
	КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
	МакетКомпоновки = КомпоновщикМакета.Выполнить(Схема, Настройки, ДанныеРасшифровки);
	//<--------------------------------------------------------------------------------------->//
	ПараметрНоменклатурныеГруппы = Настройки.ПараметрыДанных.НайтиЗначениеПараметра(Новый ПараметрКомпоновкиДанных("НоменклатурныеГруппы"));
	
	СписокНоменклатурныхГрупп = ПараметрНоменклатурныеГруппы.Значение;
	
	тзПорядок= Новый ТаблицаЗначений;
	тзПорядок.Колонки.Добавить("НоменклатурнаяГруппа");
	тзПорядок.Колонки.Добавить("Порядок");
	
	Для Сч = 0 По СписокНоменклатурныхГрупп.Количество() - 1 Цикл
		НоваяСтрока = тзПорядок.Добавить();
		НоваяСтрока.НоменклатурнаяГруппа = СписокНоменклатурныхГрупп[Сч].Значение;
		НоваяСтрока.Порядок = Сч;
	КонецЦикла;
	
	ВнешниеНаборыДанных = Новый Структура;
	ВнешниеНаборыДанных.Вставить("тзПорядок",тзПорядок);
	
	//Инициализируем процессор компоновки
	ПроцессорКомпоновкиДанных = Новый ПроцессорКомпоновкиДанных;
	ПроцессорКомпоновкиДанных.Инициализировать(МакетКомпоновки, ВнешниеНаборыДанных, ДанныеРасшифровки, Истина);
	//<--------------------------------------------------------------------------------------->//
	//Очищаем документ результата
	ДокументРезультат.Очистить();
	
	//Выводим отчет в документ
	ПроцессорВывода = Новый
	ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
	ПроцессорВывода.УстановитьДокумент(ДокументРезультат);
	ПроцессорВывода.Вывести(ПроцессорКомпоновкиДанных);
 

После получения макета компоновки данных и перед процессом компоновки данных, мы производим определение нашего Набора данных. Для этого, создается структура ВнешниеНаборыДанных и в неё добавляется в качестве таблицы значений элемент, которому присваивается имя тзПорядок, ранее мы указывали это имя при создании набора данных.

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

Инициализацию Процессора компоновки данных необходимо производить с передачей Внешних наборов данных(второй параметр метода Инициализировать).

8. Теперь вернемся в конструктор Схемы компоновки данных и настроим сортировку для нашего отчета. Для начала укажем наше поле Порядок в качестве ресурса отчета:

 

После перейдем на вкладку Настройки и в настройках отчета(группировки) перейдем на вкладку Сортировка. Выберем в качестве поля сортировки поле Порядок. Не забываем снять галочку с Авто

 

Хочу сделать замечание по настройке сортировки в моем примере. Так как мойотчет формировался в виде таблицы и сортировку необходимо было произвести для столбцов, то сортировку я настраивал не для всего отчета, а для конкретной группировки, .т.е. в настройках необходимо переключиться к настройкам группировки, а не отчета. Выбрать нужную группировку в структуре отчета и ниже переключиться с кнопки Отчет на кнопку с именем группировки (НоменклатурнаяГруппа).

9. Проверим результат формирования нашего отчета.

Запустим наш отчет. Зададим значения параметра используемого в качестве отбора(выбирать значения в список необходимо из расширенного режима редактирования параметрам, потому что простой режим редактирования настроек отчета, автоматически отсортировывает параметры в списке по алфавиту):

И сформируем отчет.

 

Мы видим, что столбцы Номенклатурных групп выстроились в том порядке, в каком мы их выбрали(в отчет не вывелись номенклатурные группы по которым не было оборотов за период). Не сложно увидеть, что Ячмень без пленок встал на первое место, потому что мы так выбрали его в параметр. Хотя согласно алфавиту наименования на Я должны были бы идти в конце списка, следовательно наша сортировка заработала.

СКД сортировка наборы данных объект внешние источники данных отчеты

См. также

SALE! 20%

Infostart Toolkit: Инструменты разработчика 1С 8.3 на управляемых формах

Инструментарий разработчика Роли и права Запросы СКД Платформа 1С v8.3 Управляемые формы Запросы Система компоновки данных Конфигурации 1cv8 Платные (руб)

Набор инструментов программиста и специалиста 1С для всех конфигураций на управляемых формах. В состав входят инструменты: Консоль запросов, Консоль СКД, Консоль кода, Редактор объекта, Анализ прав доступа, Метаданные, Поиск ссылок, Сравнение объектов, Все функции, Подписки на события и др. Редактор запросов и кода с раскраской и контекстной подсказкой. Доработанный конструктор запросов тонкого клиента. Продукт хорошо оптимизирован и обладает самым широким функционалом среди всех инструментов, представленных на рынке.

13000 10400 руб.

02.09.2020    122069    670    389    

712

Генератор схемы компоновки данных (СКД), написание кода схемы программно

Инструментарий разработчика СКД Платформа 1С v8.3 Конфигурации 1cv8 1С:Зарплата и Управление Персоналом 3.x Абонемент ($m)

По выбранной схеме компоновки данных генерирует программный код, который генерирует СКД, аналогичную исходной схеме. Есть дополнительные инструменты для просмотра дерева схемы, сравнение исходной схемы и полученной по коду, а также сравнение изменений в сгенерированном коде для исходной схемы и для измененной.

3 стартмани

05.02.2024    4035    25    obmailok    17    

63

Набор-объект для СКД по тексту или запросу

Запросы СКД Платформа 1С v8.3 Управляемые формы Конфигурации 1cv8 Абонемент ($m)

Есть список полей в виде текста, или запрос - закидываем в набор СКД.

1 стартмани

31.01.2024    2000    2    Yashazz    0    

29

СКД на JavaScript в 1С

СКД WEB-интеграция Платформа 1С v8.3 Конфигурации 1cv8 Абонемент ($m)

Долгое время поддерживаю web-портал, в котором появилась необходимость создавать отчеты. Просмотрев различные фреймворки на js, я решил сделать свое решение, которое позволяло бы быстро разрабатывать и добавлять новые отчеты на web-портал.

2 стартмани

11.12.2023    8155    20    John_d    25    

123

Использование менеджера временных таблиц в СКД

СКД Платформа 1С v8.3 Система компоновки данных Конфигурации 1cv8 Бесплатно (free)

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

05.12.2023    4652    PROSTO-1C    13    

61

Модель СКД

Инструментарий разработчика СКД Платформа 1С v8.3 Система компоновки данных Абонемент ($m)

DSL для работы с СКД.

1 стартмани

15.11.2023    5805    15    kalyaka    5    

86

Пользовательские настройки отчетов 1С. Часть 1. Простые и расширенные настройки

СКД Инструкции пользователю Платформа 1С v8.3 Конфигурации 1cv8 1С:Бухгалтерия 3.0 Россия Бесплатно (free)

Простые приемы работы с отчетами на СКД. Что нужно знать пользователю про настройку отчетов, чтобы использовать их на полную катушку.

18.09.2023    6697    accounting_cons    5    

29

Разрыв страницы в СКД. Легко!

СКД Платформа 1С v8.3 Система компоновки данных Бесплатно (free)

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

01.09.2023    4518    KVIKS    15    

80
Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. Synoecium 778 07.07.16 09:55 Сейчас в теме
Можно сделать попроще, программно формировать текст пользовательского поля в виде конструкции когда..тогда..., расставив приоритет согласно порядку отбора, и по этому полю поставить сортировку в СКД.
2. lopatin 680 07.07.16 10:05 Сейчас в теме
(1) Synoecium, Не думаю, что программное редактирование запроса проще. К тому же НаборДанных это стандартное средство, а программное ковыряние запроса это изобретение велосипеда. И компоновка данных сама наилучшим образом сформирует запрос, из всех наборов данных, как ей надо.
user1007695; DimaKors; +2 Ответить
3. Synoecium 778 07.07.16 11:01 Сейчас в теме
(2) причем здесь редактирование запроса, у вас лишнее соединение средствами СКД, а так пользовательское поле с выражением, что однозначно быстрее.
4. lopatin 680 07.07.16 11:11 Сейчас в теме
(3) Synoecium, Не очень не понимаю, как в пользовательском получить номер порядка для текущего значения в строке?
5. lopatin 680 07.07.16 11:13 Сейчас в теме
(3) Synoecium, Понял, вы программно предлагаете заполнять заранее добавленное пользовательское поле.
6. lopatin 680 07.07.16 12:05 Сейчас в теме
(1) Synoecium, Если будет возможность, хотелось бы увидеть реализацию предложенного варианта
7. Mortiferus 362 07.07.16 15:37 Сейчас в теме
(1) Synoecium, как раз наоборот - в статье метод проще некуда.
8. Synoecium 778 08.07.16 08:32 Сейчас в теме
(7) Mortiferus, подправить текст по формированию отчета:
ПараметрНоменклатурныеГруппы = Настройки.ПараметрыДанных.НайтиЗначениеПараметра(Новый ПараметрКомпоновкиДанных("НоменклатурныеГруппы"));	
	СписокНоменклатурныхГрупп = ПараметрНоменклатурныеГруппы.Значение;
	полеПорядка = Схема.ВычисляемыеПоля.Найти("ПорядокНГ");
	текстПорядка = "Выбор ";
	индПорядка = 1;
	Для каждого элСписка ИЗ СписокНоменклатурныхГрупп Цикл
		НГ = элСписка.Значение;
		текстПорядка = текстПорядка+"Когда НоменклатурнаяГруппа.Код = "+НГ.Код+" Тогда "+индПорядка+" ";
		индПорядка = индПорядка + 1;
	КонецЦикла;
	текстПорядка = текстПорядка + "Иначе "+индПорядка+" Конец";
	Если СписокНоменклатурныхГрупп.Количество()>0 Тогда
		полеПорядка.Выражение = текстПорядка;
	КонецЕсли;
Показать

и убрать лишние наборы данных вообще, куда уж проще то.
Kostt; PLAstic; Montirey; +3 Ответить
10. logarifm 1117 19.11.18 20:52 Сейчас в теме
(8)
ВычисляемыеПоля.Найти("ПорядокНГ");
текстПорядка = "Выбо


Не мсоглашусь . У автора отчет будет работать быстрее чем с этими программными приколами и уж тем более сортировкой на скд
11. Synoecium 778 20.11.18 05:59 Сейчас в теме
(10) замерьте, тогда будет понятно кто прав. Я привел пример кода не оптимального с точки зрения быстродействия, а простого и понятного в написании и поддержке. Быстродействие будет определяться данными, на которых запускается отчёт.
9. 0x00 07.05.18 15:33 Сейчас в теме
Нормально, не понял только, зачем "Порядок" делать ресурсом. СКД по полю "не-ресурсу" прекрасно сортирует
12. kets-84@bk.ru 29.03.19 10:48 Сейчас в теме
13. Madabuda 21.02.22 12:36 Сейчас в теме
А как сделать так, чтобы после нажатия кнопки сформировать, вызывался прелоудер, и чтобы ничего не зависало?
Оставьте свое сообщение