Динамическая группировка в СКД или "Закат солнца вручную"

10.10.24

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

Группировки в СКД - легко!

Стояла задача вывести отчет в СКД в зависимости от того, какие группировки выберет пользователь.

Группировки, выводимые по умолчанию:

 

 

Группировки, что может выбрать пользователь:

 

 

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

Начнем:

1. Используем компоновщик настроек, загрузив туда настройки по умолчанию

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

 

2. Нужно очистить текущие группировки, хранятся они здесь:

 

 

КомпоновщикНастроек.Настройки.Структура.Очистить();

 

3.  Необходимо заполнить структуру новых группировок, для этого нужно определить первую группировку родителя, чтобы присвоить ее родителем для остальных группировок, и у нее также отсутствует родитель (то есть каждая предыдущая группировка является родителем для следующей, не добавив одну, не добавим другую)

Далее прикрепляем детальные записи к отчету.

И в конце завершаем закат солнца вручную.

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

Функция ДобавитьГруппировку(ГруппировкаРодитель, ИмяПоля, ЭтоПерваяГруппировка)
	
	Если ЭтоПерваяГруппировка Тогда
		ТекущаяГруппировка = ГруппировкаРодитель; 
	Иначе
		ТекущаяГруппировка = ГруппировкаРодитель.Структура.Добавить(Тип("ГруппировкаКомпоновкиДанных"));
	КонецЕсли;
	
	ТекущаяГруппировка.Имя = ИмяПоля;
	ТекущаяГруппировка.Использование = Истина;

	ПолеГруппировкиТекущая = ТекущаяГруппировка.ПоляГруппировки.Элементы.Добавить(Тип("ПолеГруппировкиКомпоновкиДанных"));      
	ПолеГруппировкиТекущая.Использование      = Истина;
	ПолеГруппировкиТекущая.Поле               = Новый ПолеКомпоновкиДанных(ИмяПоля);
	ПолеГруппировкиТекущая.ТипГруппировки = ТипГруппировкиКомпоновкиДанных.Элементы;
	ПолеГруппировкиТекущая.ТипДополнения      = ТипДополненияПериодаКомпоновкиДанных.БезДополнения;
	
	МассивПолейГруппировок = ВернутьПоляГруппировок(ИмяПоля);
	
	Для Каждого Поле Из МассивПолейГруппировок Цикл
		ВыбранноеПоле = ТекущаяГруппировка.Выбор.Элементы.Добавить(Тип("ВыбранноеПолеКомпоновкиДанных"));    
		ВыбранноеПоле.Поле = Новый ПолеКомпоновкиДанных(Поле);	
	КонецЦикла;
	
	Возврат ТекущаяГруппировка;
	
КонецФункции

Функция ВернутьПоляГруппировок(ДобавляемоеПолеГруппировки)
	
	МассивГруппировок = Новый Массив;
	МассивГруппировок.Добавить(ДобавляемоеПолеГруппировки);
	
	Если ДобавляемоеПолеГруппировки = "Проформа" Тогда
		МассивГруппировок.Добавить("БалансПо");
		МассивГруппировок.Добавить("ВалютаДокумента");
		МассивГруппировок.Добавить("БалансПоставщика");
		МассивГруппировок.Добавить("ДатаПроформы");
		МассивГруппировок.Добавить("СпособДоставки");
		МассивГруппировок.Добавить("ГородОтгрузки");
		МассивГруппировок.Добавить("СкладНазначения");
		МассивГруппировок.Добавить("УсловиеПоставки");
		МассивГруппировок.Добавить("УсловиеОплаты");
		МассивГруппировок.Добавить("КредитнаяЛиния");
		МассивГруппировок.Добавить("Покупатель"); 
		МассивГруппировок.Добавить("УсловиеRMA");
		МассивГруппировок.Добавить("ОсталосьОплатить");
		МассивГруппировок.Добавить("ДнейОтСоздания");
		МассивГруппировок.Добавить("ДнейДоОтгрузки");		
		
	КонецЕсли;
	
	Если ДобавляемоеПолеГруппировки = "НомерОтгрузки" Тогда
		МассивГруппировок.Добавить("ДатаОтгрузки");
		МассивГруппировок.Добавить("АвторКомментарияКОтгрузке");
		МассивГруппировок.Добавить("КомментарийКОтгрузке");
		МассивГруппировок.Добавить("ДнейДоОтгрузки");
	КонецЕсли;
	
	МассивГруппировок.Добавить("ЧекБокс");	
	МассивГруппировок.Добавить("КоличествоВЗаказе");
	МассивГруппировок.Добавить("НеотгруженныйОстаток");
	МассивГруппировок.Добавить("НеотгруженныйОстатокRMA");
	МассивГруппировок.Добавить("СуммаКОплате");
	МассивГруппировок.Добавить("СистемныеПоля.Уровень");
	МассивГруппировок.Добавить("НакладнаяПоставщика");
	
	
	МассивГруппировок.Добавить("ЗаявкаНаКастомизацию");
	МассивГруппировок.Добавить("КонтрольКачества");
	МассивГруппировок.Добавить("Сертификация");
	МассивГруппировок.Добавить("ЗаявкаНаДобавлениеФабрики");
	МассивГруппировок.Добавить("ЗаявкаНаОтгрузку");                 
	МассивГруппировок.Добавить("ЗаявкаНаСтикеровку");
	МассивГруппировок.Добавить("ЗаявкаНаКлассификацию");
	МассивГруппировок.Добавить("ТребованиеОбОплате");         
	МассивГруппировок.Добавить("ПустаяЗнСп");
	
	Возврат МассивГруппировок;
	
КонецФункции 

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

 

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

Вступайте в нашу телеграмм-группу Инфостарт

См. также

Инструментарий разработчика Роли и права Запросы СКД Программист Руководитель проекта 1С:Предприятие 8 Платные (руб)

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

16500 руб.

02.09.2020    246481    1353    419    

1131

Инструментарий разработчика СКД Программист 1С 8.3 Бесплатно (free)

В этой статье представлен СКДБилдер — общий модуль-обёртка над объектной моделью СКД, который сокращает код в 3-4 раза и делает его читаемым.

29.01.2026    5084    286    shapa_pro    25    

66

СКД Программист 1С:Предприятие 8 Бесплатно (free)

Статья написана по результатам проведенного внутреннего обучающего вебинара для разработчиков ГК «СофтБаланс». Если осилить 25 000 знаков - задача для вас непосильная, где-то на бескрайних просторах интернета видео есть (или будет). Но здесь информация точнее. Разберем, чем запрос для СКД принципиально отличается от обычного запроса и как модифицируется в зависимости от настроек. Изучим «базовый рецепт» написания запроса для СКД, сформируем чек-лист. Полезно будет всем – от стажеров до тех. лидов. Всем, кто не снимает галку «автозаполнение» и пишет запросы для отчетов в консоли запросов – читать (вдумчиво) обязательно.

29.10.2025    15819    ovetgana    112    

105

СКД Программист 1С:Предприятие 8 Бесплатно (free)

Описан способ заполнения списка доступных значений для полей наборов данных и параметров в схеме компоновки данных для любых конфигураций (с использованием БСП или без).

01.07.2025    9221    krasnoshchekovpavel    5    

67

СКД Программист Стажер 1С:Предприятие 8 Россия Бесплатно (free)

Несколько способов управления формами выбора параметров и отборов СКД.

10.04.2025    8405    Neti    0    

41

СКД Программист 1С:Предприятие 8 Бесплатно (free)

Хорошая отчетная форма - сродни искусству. Есть какое-то невероятное эстетическое удовольствие в том, чтобы разобраться в логике учета и анализируемых показателях, спроектировать архитектуру хранения данных так, чтобы оптимально собрать эти показатели вместе с аналитическими разрезами в запросе, а затем настроить отображение так, чтобы, глядя на результат, сразу было понятно, что это за отчет и какие задачи он призван решать. Система компоновки данных - это моя первая, главная и, наверное, единственная "рабочая" любовь. Ее я использую везде, где только можно и где нельзя тоже. Хочу поделиться с вами некоторыми практическими приемами в работе с отчетами на СКД, которые, надеюсь, будут полезны.

27.02.2025    15560    ovetgana    50    

93

СКД Программист 1С:Предприятие 8 Бесплатно (free)

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

24.12.2024    13131    Akcium    17    

46

СКД Механизмы типовых конфигураций Запросы Программист 1С:Предприятие 8 1С:Зарплата и кадры государственного учреждения 3 1С:Зарплата и Управление Персоналом 3.x Россия Бесплатно (free)

Работая с типовыми отчетами в конфигурациях «Зарплата и управление персоналом, редакция 3», «Зарплата и кадры государственного учреждения, редакция 3» и подобных, в схемах компоновки данных можно встретить конструкции запросов, которые обращаются к некоторым виртуальным таблицам.

20.08.2024    9611    AlexeyPROSTO_1C    1    

32
Для отправки сообщения требуется регистрация/авторизация