[СКД] Программное создание схемы компоновки данных

15.01.20

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

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

Создаем отчет и без создания макета ОсновнаяСхемаКомпоновкиДанных. Переходим в модуль отчета и создаем Процедуру ПриКомпоновкеРезультата, СтандартнаяОбработка = Ложь.

1. Добавляем Источник данных.

 

 

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

ИсточникДанных = СхемаКомпоновкиДанных.ИсточникиДанных.Добавить();
ИсточникДанных.Имя = "ИсточникДанных1";
ИсточникДанных.ТипИсточникаДанных = "Local";

НаборДанныхОбъектСхемыКомпоновкиДанных = СхемаКомпоновкиДанных.НаборыДанных.Добавить(Тип("НаборДанныхОбъектСхемыКомпоновкиДанных"));
НаборДанныхОбъектСхемыКомпоновкиДанных.Имя = "НаборДанных1";
НаборДанныхОбъектСхемыКомпоновкиДанных.ИмяОбъекта = "ТаблицаОстатков";
НаборДанныхОбъектСхемыКомпоновкиДанных.ИсточникДанных = "ИсточникДанных1";

2. Добавляем поля набора данных

 

 

ПолеНабораДанныхСхемыКомпоновкиДанных = НаборДанныхОбъектСхемыКомпоновкиДанных.Поля.Добавить(Тип("ПолеНабораДанныхСхемыКомпоновкиДанных"));
ПолеНабораДанныхСхемыКомпоновкиДанных.Поле = "Номенклатура";
ПолеНабораДанныхСхемыКомпоновкиДанных.ПутьКДанным = "Номенклатура";
ПолеНабораДанныхСхемыКомпоновкиДанных.Заголовок = "Номенклатура";

ПолеНабораДанныхСхемыКомпоновкиДанных = НаборДанныхОбъектСхемыКомпоновкиДанных.Поля.Добавить(Тип("ПолеНабораДанныхСхемыКомпоновкиДанных"));
ПолеНабораДанныхСхемыКомпоновкиДанных.Поле = "Склад";
ПолеНабораДанныхСхемыКомпоновкиДанных.ПутьКДанным = "Склад";
ПолеНабораДанныхСхемыКомпоновкиДанных.Заголовок = "Склад";

ПолеНабораДанныхСхемыКомпоновкиДанных = НаборДанныхОбъектСхемыКомпоновкиДанных.Поля.Добавить(Тип("ПолеНабораДанныхСхемыКомпоновкиДанных"));
ПолеНабораДанныхСхемыКомпоновкиДанных.Поле = "ВНаличииОстаток";
ПолеНабораДанныхСхемыКомпоновкиДанных.ПутьКДанным = "ВНаличииОстаток";
ПолеНабораДанныхСхемыКомпоновкиДанных.Заголовок = "ВНаличииОстаток";

3. Добавляем группировки данных

 

 

ГруппировкаКомпоновкиДанных1 = НастройкиКомпоновки.Структура.Добавить(Тип("ГруппировкаКомпоновкиДанных"));
ГруппировкаКомпоновкиДанных1.Использование = Истина;
ПолеГруппировкиКомпоновкиДанных = ГруппировкаКомпоновкиДанных1.ПоляГруппировки.Элементы.Добавить(Тип("ПолеГруппировкиКомпоновкиДанных"));
ПолеГруппировкиКомпоновкиДанных.Использование = Истина;
ПолеГруппировкиКомпоновкиДанных.Поле = Новый ПолеКомпоновкиДанных("Склад");

ГруппировкаКомпоновкиДанных2 = ГруппировкаКомпоновкиДанных1.Структура.Добавить(Тип("ГруппировкаКомпоновкиДанных"));
ГруппировкаКомпоновкиДанных2.Использование = Истина;
ПолеГруппировкиКомпоновкиДанных2 = ГруппировкаКомпоновкиДанных2.ПоляГруппировки.Элементы.Добавить(Тип("ПолеГруппировкиКомпоновкиДанных"));
ПолеГруппировкиКомпоновкиДанных2.Использование = Истина;
ПолеГруппировкиКомпоновкиДанных2.Поле = Новый ПолеКомпоновкиДанных("Номенклатура");

4. Добавляем авто поля в группировки.

 

 

АвтоВыбранноеПолеКомпоновкиДанных = ГруппировкаКомпоновкиДанных1.Выбор.Элементы.Добавить(Тип("АвтоВыбранноеПолеКомпоновкиДанных"));
АвтоВыбранноеПолеКомпоновкиДанных.Использование = Истина;

АвтоВыбранноеПолеКомпоновкиДанных = ГруппировкаКомпоновкиДанных2.Выбор.Элементы.Добавить(Тип("АвтоВыбранноеПолеКомпоновкиДанных"));
АвтоВыбранноеПолеКомпоновкиДанных.Использование = Истина;

5. Добавляем выбранные поля

 

 

ВыбранноеПолеКомпоновкиДанных = НастройкиКомпоновки.Выбор.Элементы.Добавить(Тип("ВыбранноеПолеКомпоновкиДанных"));
ВыбранноеПолеКомпоновкиДанных.Использование = Истина;
ВыбранноеПолеКомпоновкиДанных.Поле = Новый ПолеКомпоновкиДанных("В наличии остаток");

6. Добавляем отбор (ВНаличииОстаток > 500)

 

 

ЭлементОтбораКомпоновкиДанных = НастройкиКомпоновки.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ЭлементОтбораКомпоновкиДанных.Использование = Истина;
ЭлементОтбораКомпоновкиДанных.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("ВНаличииОстаток");
ЭлементОтбораКомпоновкиДанных.ВидСравнения = ВидСравненияКомпоновкиДанных.Больше;
ЭлементОтбораКомпоновкиДанных.ПравоеЗначение = 500;

7. Добавляем Сортировку

 

 

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

8. Добавляем оформление (Выделять желтым поля ВНаличииОстаток и Номенклатура, если ВНаличииОстаток > 1000).

 

 

УсловноеОформление = НастройкиКомпоновки.УсловноеОформление.Элементы.Добавить();
УсловноеОформление.Использование = Истина;
ВыбранноеПолеКомпоновкиДанных = УсловноеОформление.Поля.Элементы.Добавить();
ВыбранноеПолеКомпоновкиДанных.Использование = Истина;
ВыбранноеПолеКомпоновкиДанных.Поле = Новый ПолеКомпоновкиДанных("ВНаличииОстаток");

ВыбранноеПолеКомпоновкиДанных = УсловноеОформление.Поля.Элементы.Добавить();
ВыбранноеПолеКомпоновкиДанных.Использование = Истина;
ВыбранноеПолеКомпоновкиДанных.Поле = Новый ПолеКомпоновкиДанных("Номенклатура");

УсловноеОформление.ИспользоватьВЗаголовке 		= ИспользованиеУсловногоОформленияКомпоновкиДанных.НеИспользовать;
УсловноеОформление.ИспользоватьВЗаголовкеПолей  = ИспользованиеУсловногоОформленияКомпоновкиДанных.НеИспользовать;
УсловноеОформление.ИспользоватьВОбщемИтоге 		= ИспользованиеУсловногоОформленияКомпоновкиДанных.НеИспользовать;

ЭлементОтбораКомпоновкиДанных = УсловноеОформление.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ЭлементОтбораКомпоновкиДанных.Использование = Истина;
ЭлементОтбораКомпоновкиДанных.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("ВНаличииОстаток");
ЭлементОтбораКомпоновкиДанных.ВидСравнения = ВидСравненияКомпоновкиДанных.Больше;
ЭлементОтбораКомпоновкиДанных.ПравоеЗначение = 1000;
		
УсловноеОформление.Оформление.УстановитьЗначениеПараметра(Новый ПараметрКомпоновкиДанных("ЦветФона"), WebЦвета.Желтый);

В результате получаем отчет.

 

 

Полный текст процедуры.

 

 


Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
	
	СтандартнаяОбработка = Ложь;
	
	СхемаКомпоновкиДанных = Новый СхемаКомпоновкиДанных;
	
	ИсточникДанных = СхемаКомпоновкиДанных.ИсточникиДанных.Добавить();
	ИсточникДанных.Имя = "ИсточникДанных1";
	ИсточникДанных.ТипИсточникаДанных = "Local";
	
	НаборДанныхОбъектСхемыКомпоновкиДанных = СхемаКомпоновкиДанных.НаборыДанных.Добавить(Тип("НаборДанныхОбъектСхемыКомпоновкиДанных"));
	НаборДанныхОбъектСхемыКомпоновкиДанных.Имя = "НаборДанных1";
	НаборДанныхОбъектСхемыКомпоновкиДанных.ИмяОбъекта = "ТаблицаОстатков";
	НаборДанныхОбъектСхемыКомпоновкиДанных.ИсточникДанных = "ИсточникДанных1";
	
	ПолеНабораДанныхСхемыКомпоновкиДанных = НаборДанныхОбъектСхемыКомпоновкиДанных.Поля.Добавить(Тип("ПолеНабораДанныхСхемыКомпоновкиДанных"));
	ПолеНабораДанныхСхемыКомпоновкиДанных.Поле = "Номенклатура";
	ПолеНабораДанныхСхемыКомпоновкиДанных.ПутьКДанным = "Номенклатура";
	ПолеНабораДанныхСхемыКомпоновкиДанных.Заголовок = "Номенклатура";
	
	ПолеНабораДанныхСхемыКомпоновкиДанных = НаборДанныхОбъектСхемыКомпоновкиДанных.Поля.Добавить(Тип("ПолеНабораДанныхСхемыКомпоновкиДанных"));
	ПолеНабораДанныхСхемыКомпоновкиДанных.Поле = "Склад";
	ПолеНабораДанныхСхемыКомпоновкиДанных.ПутьКДанным = "Склад";
	ПолеНабораДанныхСхемыКомпоновкиДанных.Заголовок = "Склад";
	
	ПолеНабораДанныхСхемыКомпоновкиДанных = НаборДанныхОбъектСхемыКомпоновкиДанных.Поля.Добавить(Тип("ПолеНабораДанныхСхемыКомпоновкиДанных"));
	ПолеНабораДанныхСхемыКомпоновкиДанных.Поле = "ВНаличииОстаток";
	ПолеНабораДанныхСхемыКомпоновкиДанных.ПутьКДанным = "ВНаличииОстаток";
	ПолеНабораДанныхСхемыКомпоновкиДанных.Заголовок = "В наличии остаток";
	
	Ресурс = СхемаКомпоновкиДанных.ПоляИтога.Добавить();
	Ресурс.ПутьКДанным = "ВНаличииОстаток";
	Ресурс.Выражение = "Сумма(ВНаличииОстаток)";
	
	НастройкиКомпоновки = КомпоновщикНастроек.Настройки;
	
	Если НастройкиКомпоновки.Структура.Количество() = 0 Тогда
		
		ГруппировкаКомпоновкиДанных1 = НастройкиКомпоновки.Структура.Добавить(Тип("ГруппировкаКомпоновкиДанных"));
		ГруппировкаКомпоновкиДанных1.Использование = Истина;
		ПолеГруппировкиКомпоновкиДанных = ГруппировкаКомпоновкиДанных1.ПоляГруппировки.Элементы.Добавить(Тип("ПолеГруппировкиКомпоновкиДанных"));
		ПолеГруппировкиКомпоновкиДанных.Использование = Истина;
		ПолеГруппировкиКомпоновкиДанных.Поле = Новый ПолеКомпоновкиДанных("Склад");
		
		АвтоВыбранноеПолеКомпоновкиДанных = ГруппировкаКомпоновкиДанных1.Выбор.Элементы.Добавить(Тип("АвтоВыбранноеПолеКомпоновкиДанных"));
		АвтоВыбранноеПолеКомпоновкиДанных.Использование = Истина;
		
		ГруппировкаКомпоновкиДанных2 = ГруппировкаКомпоновкиДанных1.Структура.Добавить(Тип("ГруппировкаКомпоновкиДанных"));
		ГруппировкаКомпоновкиДанных2.Использование = Истина;
		ПолеГруппировкиКомпоновкиДанных2 = ГруппировкаКомпоновкиДанных2.ПоляГруппировки.Элементы.Добавить(Тип("ПолеГруппировкиКомпоновкиДанных"));
		ПолеГруппировкиКомпоновкиДанных2.Использование = Истина;
		ПолеГруппировкиКомпоновкиДанных2.Поле = Новый ПолеКомпоновкиДанных("Номенклатура"); 
		
		АвтоВыбранноеПолеКомпоновкиДанных = ГруппировкаКомпоновкиДанных2.Выбор.Элементы.Добавить(Тип("АвтоВыбранноеПолеКомпоновкиДанных"));
		АвтоВыбранноеПолеКомпоновкиДанных.Использование = Истина;
		
		ВыбранноеПолеКомпоновкиДанных = НастройкиКомпоновки.Выбор.Элементы.Добавить(Тип("ВыбранноеПолеКомпоновкиДанных"));
		ВыбранноеПолеКомпоновкиДанных.Использование = Истина;
		ВыбранноеПолеКомпоновкиДанных.Поле = Новый ПолеКомпоновкиДанных("ВНаличииОстаток");
		
		ЭлементОтбораКомпоновкиДанных = НастройкиКомпоновки.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
		ЭлементОтбораКомпоновкиДанных.Использование = Истина;
		ЭлементОтбораКомпоновкиДанных.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("ВНаличииОстаток");
		ЭлементОтбораКомпоновкиДанных.ВидСравнения = ВидСравненияКомпоновкиДанных.Больше;
		ЭлементОтбораКомпоновкиДанных.ПравоеЗначение = 500;
		
		ЭлементПорядкаКомпоновкиДанных = НастройкиКомпоновки.Порядок.Элементы.Добавить(Тип("ЭлементПорядкаКомпоновкиДанных"));
		ЭлементПорядкаКомпоновкиДанных.Использование = Истина;
		ЭлементПорядкаКомпоновкиДанных.Поле = Новый ПолеКомпоновкиДанных("Номенклатура");
		ЭлементПорядкаКомпоновкиДанных.ТипУпорядочивания = НаправлениеСортировкиКомпоновкиДанных.Возр;
		
		УсловноеОформление = НастройкиКомпоновки.УсловноеОформление.Элементы.Добавить();
		УсловноеОформление.Использование = Истина;
		ВыбранноеПолеКомпоновкиДанных = УсловноеОформление.Поля.Элементы.Добавить();
		ВыбранноеПолеКомпоновкиДанных.Использование = Истина;
		ВыбранноеПолеКомпоновкиДанных.Поле = Новый ПолеКомпоновкиДанных("ВНаличииОстаток");
		
		ВыбранноеПолеКомпоновкиДанных = УсловноеОформление.Поля.Элементы.Добавить();
		ВыбранноеПолеКомпоновкиДанных.Использование = Истина;
		ВыбранноеПолеКомпоновкиДанных.Поле = Новый ПолеКомпоновкиДанных("Номенклатура");
		
		УсловноеОформление.ИспользоватьВЗаголовке 		= ИспользованиеУсловногоОформленияКомпоновкиДанных.НеИспользовать;
		УсловноеОформление.ИспользоватьВЗаголовкеПолей  = ИспользованиеУсловногоОформленияКомпоновкиДанных.НеИспользовать;
		УсловноеОформление.ИспользоватьВОбщемИтоге 		= ИспользованиеУсловногоОформленияКомпоновкиДанных.НеИспользовать;
		
		ЭлементОтбораКомпоновкиДанных = УсловноеОформление.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
		ЭлементОтбораКомпоновкиДанных.Использование = Истина;
		ЭлементОтбораКомпоновкиДанных.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("ВНаличииОстаток");
		ЭлементОтбораКомпоновкиДанных.ВидСравнения = ВидСравненияКомпоновкиДанных.Больше;
		ЭлементОтбораКомпоновкиДанных.ПравоеЗначение = 1000;
		
		УсловноеОформление.Оформление.УстановитьЗначениеПараметра(Новый ПараметрКомпоновкиДанных("ЦветФона"), WebЦвета.Желтый);
		
	КонецЕсли;	
	
	КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
	МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, НастройкиКомпоновки);
	
	Запрос = Новый Запрос;
	Запрос.Текст = 
	"ВЫБРАТЬ
	|	ТоварыНаСкладах.Номенклатура КАК Номенклатура,
	|	ТоварыНаСкладах.Склад,
	|	ТоварыНаСкладах.ВНаличииОстаток КАК ВНаличииОстаток
	|ИЗ
	|	РегистрНакопления.ТоварыНаСкладах.Остатки КАК ТоварыНаСкладах";
	
	ТаблицаОстатков = Запрос.Выполнить().Выгрузить();
	
	ВнешниеНаборы = Новый Структура("ТаблицаОстатков", ТаблицаОстатков);
	
	ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
	ПроцессорКомпоновки.Инициализировать(МакетКомпоновки, ВнешниеНаборы);
	
	ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
	ПроцессорВывода.УстановитьДокумент(ДокументРезультат);
	ПроцессорВывода.Вывести(ПроцессорКомпоновки);
	
КонецПроцедуры

Тестировал на платформе 1С:Предприятие 8.3 (8.3.15.1747).

См. также

SALE! 15%

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

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

10000 руб.

02.09.2020    159260    872    399    

861

Запросы СКД Программист Стажер Система компоновки данных Россия Бесплатно (free)

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

15.05.2024    8660    implecs_team    6    

47

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

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

3 стартмани

05.02.2024    6983    56    obmailok    21    

79

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

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

1 стартмани

31.01.2024    3143    5    Yashazz    1    

34

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

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

2 стартмани

11.12.2023    10792    23    John_d    25    

124

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

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

05.12.2023    8003    PROSTO-1C    15    

68
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. serg-lom89 76 15.01.20 10:26 Сейчас в теме
однозначно плюс!Спасибо
как шпаргалка по некоторым пунктам в закладки!
jarinat; ikalmykia; movled; Mi4man; zif74; Михаська; Drivingblind; user712426; lic_avenger; user1537184; jONES1979; Yan_Malyakov; aleks.public; ritd; rainspb; user1012671; alanto23; A_Max; sergey512; +19 Ответить
2. Dzenn 894 15.01.20 10:49 Сейчас в теме
Молодец, хорошо разобрался в этой теме :-) Хардкорно использую СКД — с несколькими источниками данных, внешними наборами, переносом настроек, скд в скд и так далее, поэтому такие статьи однозначно должны быть в шпаргалках :-)
jarinat; ikalmykia; zif74; Михаська; jONES1979; aleks.public; alanto23; A_Max; +8 Ответить
3. sansys 76 15.01.20 11:16 Сейчас в теме
Очень хорошая статья!!! Ещё-бы такую-же но с использованием БСП. Евгений, огромное спасибо за полезную статью, беру себе в базу знаний.
ikalmykia; zif74; Михаська; aleks.public; ritd; alanto23; A_Max; +7 Ответить
4. Aleksey81 1186 15.01.20 11:18 Сейчас в теме
5. yalex9 110 15.01.20 11:46 Сейчас в теме
Лучшая статья из тех, что видел на эту тему. Спасибо!
ikalmykia; Михаська; rpgshnik; alanto23; frkbvfnjh; +5 Ответить
6. uno-c 264 15.01.20 12:06 Сейчас в теме
Только хотел поискать что-то подобное, оно само в уведомлении пришло, спасибо.
7. vik070777 273 15.01.20 13:09 Сейчас в теме
Спасибо, познавательно.
8. Uvk_05 15.01.20 17:27 Сейчас в теме
Спасибо! Очень актуально.
9. VGHOST 168 16.01.20 10:40 Сейчас в теме
10. jko 17.01.20 08:17 Сейчас в теме
11. rwn_driver 9 17.01.20 09:40 Сейчас в теме
Спасибо БОЛЬШОЕ! Очень полезно для лентяя, код готовый...
12. paybaseme 14 17.01.20 09:47 Сейчас в теме
13. Jimbo 10 17.01.20 16:47 Сейчас в теме
Основы прописаны, но зачем делать объект вместо запроса ? А потом все таки делать запрос, но без отборов.
14. EvgeniuXP 17.01.20 20:18 Сейчас в теме
У хрусталевой это есть - просто надо открыть книжку :) за работу плюсую.
Yashazz; sapervodichka; +2 Ответить
15. alanto23 35 21.01.20 11:11 Сейчас в теме
Респект и уважуха! Спасибо!!!
16. Kuzmin_A 21.01.20 16:52 Сейчас в теме
Может пригодится кому
.Оформление выводимого заголовка:
Процедура ОформитьЗаголовок(МакетКомпоновки, СтрокиПоискаИсключаемыхИзЗаголовкаГруппировок = Неопределено, ЗаменяемыеЗначения = Неопределено)
	//	-->	исключение из заголовка группировки верхнего уровня строк,
	//		в ячейках которых присутствуют указанные значения. Исключается
	//		только одна строка, соответствующая значению. 
	
	Если СтрокиПоискаИсключаемыхИзЗаголовкаГруппировок = Неопределено Тогда
		Возврат;
	КонецЕсли; 
	
	КоличествоОбластей = МакетКомпоновки.Тело.Количество();
	
	Если КоличествоОбластей > 0 Тогда
		ПоследнийМакетОбласти = Неопределено;
		н = 0;
		
		Пока н < КоличествоОбластей Цикл
			Элемент = МакетКомпоновки.Тело[н];
			
			Если ТипЗнч(Элемент) = Тип("МакетОбластиМакетаКомпоновкиДанных") Тогда
				ПоследнийМакетОбласти = МакетКомпоновки.Макеты[Элемент.Макет];		
			ИначеЕсли ТипЗнч(Элемент) = Тип("ГруппировкаМакетаКомпоновкиДанных") Тогда
				Прервать;
			КонецЕсли;
			
			н = н + 1;
		КонецЦикла;
		
		Если ПоследнийМакетОбласти = Неопределено Тогда
			Возврат;
		КонецЕсли;	
		
		МакетЗаголовка = ПоследнийМакетОбласти.Макет;
		
		н = МакетЗаголовка.Количество() - 1;
		
		Пока н >= 0 Цикл
			СтрокаТаблицы = МакетЗаголовка[н];
			
			Если СтрокаТаблицыОбластиКомпоновкиДанныхСодержитОдноИзЗначений(СтрокаТаблицы, СтрокиПоискаИсключаемыхИзЗаголовкаГруппировок) Тогда
				МакетЗаголовка.Удалить(СтрокаТаблицы);		
			КонецЕсли;
			
			Если ТипЗнч(ЗаменяемыеЗначения) = Тип("Соответствие") Тогда
				ЗаменитьЗначениеВСтрокеТаблицыОбластиКомпоновкиДанных(СтрокаТаблицы, ЗаменяемыеЗначения);	
			КонецЕсли;	
			
			н = н - 1;
		КонецЦикла;
	КонецЕсли;
	
	//	<--	исключение из заголовка группировки верхнего уровня строк
	
КонецПроцедуры

Функция СтрокаТаблицыОбластиКомпоновкиДанныхСодержитОдноИзЗначений(СтрокаТаблицы, Значения)
	Для Каждого Ячейка Из СтрокаТаблицы.Ячейки Цикл
		Для Каждого Элемент Из Ячейка.Элементы Цикл
			н = Значения.Количество() - 1;
			
			Пока н >= 0 Цикл
				Если Элемент.Значение = Значения[н] Тогда
					Значения.Удалить(н);
					
					Возврат Истина;	
				КонецЕсли;
				
				н = н - 1;
			КонецЦикла;	
		КонецЦикла;	
	КонецЦикла;
	
	Возврат Ложь;
КонецФункции

Процедура ЗаменитьЗначениеВСтрокеТаблицыОбластиКомпоновкиДанных(СтрокаТаблицы, ЗаменяемыеЗначения)
	Для Каждого Ячейка Из СтрокаТаблицы.Ячейки Цикл
		Для Каждого Элемент Из Ячейка.Элементы Цикл
			Для Каждого ЗаменяемоеЗначение Из ЗаменяемыеЗначения Цикл
				Если Элемент.Значение = ЗаменяемоеЗначение.Ключ Тогда
					Элемент.Значение = ЗаменяемоеЗначение.Значение;
					Возврат;
				КонецЕсли;	
			КонецЦикла;	
		КонецЦикла;	
	КонецЦикла;
КонецПроцедуры	
Показать


Вызов после выполнения компоновщика макета и до инициализации процессора.

Пытался освоить коллекцию элементов параметров скд, пока не получается
17. John_d 5891 21.01.20 16:59 Сейчас в теме
(16) вот тут можно еще посмотреть
https://infostart.ru/public/967277/
Kuzmin_A; +1 Ответить
18. Kuzmin_A 21.01.20 17:17 Сейчас в теме
(17) Допустим, вы про заголовок, тогда под заголовком я имею в виду шапку отчета с именами полей, возможно мы по-разному поняли.
Если про параметры, то с НайтиЗначениеПараметра() и УстановитьЗначениеПараметра() нет проблем,а вот с добавлением новых…
19. Prometeus2011 215 27.01.20 15:02 Сейчас в теме
А это код построения макета из произвольного запроса.

&НаСервере
Функция Команда1НаСервере()
	
	СхемаКомпоновкиДанных = Новый СхемаКомпоновкиДанных;
	
	// определим источник данных для схемы 
	Источник = СхемаКомпоновкиДанных.ИсточникиДанных.Добавить();
	Источник.Имя = "ЛокальнаяБаза";
	Источник.СтрокаСоединения = "";
	Источник.ТипИсточникаДанных = "Local"; 
	
	НаборДанных = СхемаКомпоновкиДанных.НаборыДанных.Добавить(Тип("НаборДанныхЗапросСхемыКомпоновкиДанных"));
	НаборДанных.Имя = "НаборДанных1";
	НаборДанных.ИсточникДанных = "ЛокальнаяБаза";
	НаборДанных.АвтоЗаполнениеДоступныхПолей = Истина;
	НаборДанных.Запрос = "ВЫБРАТЬ
	|	ОприходованиеИзлишковТоваров.Ссылка КАК Ссылка,
	|	ОприходованиеИзлишковТоваров.Дата КАК Дата,
	|	ОприходованиеИзлишковТоваров.Номер КАК Номер
	|ИЗ
	|	Документ.ОприходованиеИзлишковТоваров КАК ОприходованиеИзлишковТоваров";
	НаборДанных.АвтоЗаполнениеДоступныхПолей = Истина;
	
	//Если так сделать, то на клиент настройки не приедут.
	//ИсточникДоступныхНастроек = 
	//Новый ИсточникДоступныхНастроекКомпоновкиДанных(СхемаКомпоновкиДанных);
	
	
	ИсточникДоступныхНастроек = 
	Новый ИсточникДоступныхНастроекКомпоновкиДанных(ПоместитьВоВременноеХранилище(СхемаКомпоновкиДанных, УникальныйИдентификатор));
	
	ЭтаФорма.КомпоновщикНастроек_Форма.Инициализировать(ИсточникДоступныхНастроек);		
	ЭтаФорма.КомпоновщикНастроек_Форма.ЗагрузитьНастройки(СхемаКомпоновкиДанных.НастройкиПоУмолчанию);
	
	
	
	//Группировки
	ГруппировкаСсылки = ЭтаФорма.КомпоновщикНастроек_Форма.Настройки.Структура.Добавить(Тип("ГруппировкаКомпоновкиДанных"));
	
	Для каждого стрТЗПолей из КомпоновщикНастроек_Форма.Настройки.ДоступныеПоляГруппировок.Элементы цикл
		ПолеГруппировки1 = ГруппировкаСсылки.ПоляГруппировки.Элементы.Добавить(Тип("ПолеГруппировкиКомпоновкиДанных"));
		ПолеГруппировки1.Использование = Истина;
		ПолеГруппировки1.Поле = стрТЗПолей.Поле;
	КонецЦикла;
	
	АвтоПоле = ГруппировкаСсылки.Выбор.Элементы.Добавить(Тип("АвтоВыбранноеПолеКомпоновкиДанных"));
	АвтоПоле.Использование = Истина;
	
	
	КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
	Макет = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, КомпоновщикНастроек_Форма.ПолучитьНастройки());
	
	
	//====================== ВЫВОД В ТЗ
	//МакетКомпоновки = 
	//КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных,КомпоновщикНастроек_Форма.ПолучитьНастройки(),
	//ИнформацияРасшифровки,,Тип("ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений"));
	//
	//ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
	//ПроцессорКомпоновки.Инициализировать(МакетКомпоновки,,ИнформацияРасшифровки,Истина);
	//
	//ТЗ = Новый ТаблицаЗначений;
	//ПроцессорВыводаВКоллекцию = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений;
	//ПроцессорВыводаВКоллекцию.УстановитьОбъект(ТЗ);
	//ПроцессорВыводаВКоллекцию.Вывести(ПроцессорКомпоновки,Истина);
	
	
	//====================== ВЫВОД В ТД
	ДокументРезультат = новый ТабличныйДокумент;
	МакетКомпоновки = 
	КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных,КомпоновщикНастроек_Форма.ПолучитьНастройки());
	
	
	ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
	ПроцессорКомпоновки.Инициализировать(МакетКомпоновки, , , Истина);
	
	ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
	ПроцессорВывода.УстановитьДокумент(ДокументРезультат);
	
	
	//Обозначим начало вывода
	ПроцессорВывода.НачатьВывод();
	ТаблицаЗафиксирована = Ложь;
	
	ДокументРезультат.ФиксацияСверху = 0;
	//Основной цикл вывода отчета
	Пока Истина Цикл
		//Получим следующий элемент результата компоновки
		ЭлементРезультата = ПроцессорКомпоновки.Следующий();
		
		Если ЭлементРезультата = Неопределено Тогда
			//Следующий элемент не получен - заканчиваем цикл вывода
			Прервать;
		Иначе
			// Зафиксируем шапку
			Если  Не ТаблицаЗафиксирована 
				И ЭлементРезультата.ЗначенияПараметров.Количество() > 0 
				И ТипЗнч(КомпоновщикНастроек_Форма.Настройки.Структура[0]) <> Тип("ДиаграммаКомпоновкиДанных") Тогда
				
				ТаблицаЗафиксирована = Истина;
				ДокументРезультат.ФиксацияСверху = ДокументРезультат.ВысотаТаблицы;
				
			КонецЕсли;
			//Элемент получен - выведем его при помощи процессора вывода
			ПроцессорВывода.ВывестиЭлемент(ЭлементРезультата);
		КонецЕсли;
	КонецЦикла;
	
	ПроцессорВывода.ЗакончитьВывод();
	
	Возврат ДокументРезультат;
	
КонецФункции
Показать
Igor_KL; jarinat; Hagaro; SagittariusA; user1058740; TimVG; Михаська; СаморезикРу; Yan_Malyakov; atl1884; Silver0030; Cyberhawk; Kuzmin_A; John_d; +14 Ответить
20. 2vadmaster 40 17.02.20 13:58 Сейчас в теме
21. Yashazz 4790 20.02.20 09:55 Сейчас в теме
"лучшая статья"... "уважуха"... "круто"...
я чего-то не понимаю.

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

Я ещё могу понять, когда статьи Пермитина плюсят, там действительно грамотное изложение. Но этот набор кода...

Нет, я действительно не понимаю.
МихаилМ; CnupT; +2 1 Ответить
22. s22 22 02.04.20 11:43 Сейчас в теме
Добавьте обработку которая по схеме создает ее программное создание
Altez50; Михаська; kote; eeeio; kuzyara; +5 Ответить
23. pstrig 18.04.22 09:45 Сейчас в теме
24. tugushev98 23.08.22 22:32 Сейчас в теме
программно работать с скд - это какой то мазохизм мне кажется
29. yhor 27.07.23 16:31 Сейчас в теме
(24) Два расширения, каждое добавляет свою ТЧ к одному и тому же справочнику. Отчёт собирает инфу из обеих ТЧ.
Попробуйте сделать не-программно.
34. DELOVOYDOM 19.02.24 14:54 Сейчас в теме
(24) а если у вас источник скд задает пользователь или вообще машина в зависимости от условий? и вам нужно получать реакцию системы после прогона через скд на сервере вообще без клиента? СКД это не про отчеты, скд это обработку данных для принятия решения, отчеты это так - бонусом для любителей электронной бюрократии. Чего там в отчете человек наглядит только этому человеку известно) машина четче сработает
25. Aleksandr_prof 197 06.02.23 09:49 Сейчас в теме
Откуда в сроке ГруппировкаКомпоновкиДанных1 = НастройкиКомпоновки.Структура.Добавить(Тип("ГруппировкаКомпоновкиДанных")) взялась переменная НастройкиКомпоновки?
26. John_d 5891 06.02.23 10:00 Сейчас в теме
(25) НастройкиКомпоновки = КомпоновщикНастроек.Настройки;
27. surr 27.02.23 10:54 Сейчас в теме
Как при таком раскладе наложить отбор на вложенные реквизиты? Например "Номенклатура.Родитель В группе из списка" итд... Не могу ума дать, как типизировать результирующие поля
28. Алексей777 100 28.02.23 01:52 Сейчас в теме
Доступные поля у меня не появляются )
30. Xershi 1555 18.10.23 17:00 Сейчас в теме
(28) в одной из тем писал, что загвоздка в тексте запроса. Используется конструктор (текст запроса в фигурных скобках). Если туда добавить все заработает.
31. elite 14.11.23 07:08 Сейчас в теме
Готовый отчет можно выложить?!
32. John_d 5891 14.11.23 09:55 Сейчас в теме
(31) полный текст процедуры, который есть в конце статьи скопируйте в модуль объекта пустого отчета и сохраните. Это и будет готовый отчет.
33. lvictor58 137 16.02.24 10:57 Сейчас в теме
Да, действительно очень хорошее подспорье когда надо от чего то оттолкнуться, используя сие творение как некий паттерн. Но не удержусь, что бы плеснуть сюда ложку дегтя.
1. Подобные шаблоны 1 в 1 гуляют по просторам интернета только по разному обернуты. Здесь в этом плане все норм.
2. Для выполнения подобного функционала не обязательно СКД использовать. Его возможности типа отборы или выводимые в итоговый отчет поля можно использовать только для результирующей таблицы куда исполняемый запрос выложит 100500 строк из которых нам в итоге потребуется лишь 123.
Поэтому пример бы был на ВАХ-ВАХ-ВАХ если бы отрабатывал объект типа ЗАПРОС с прописанными параметрами и отборами!
35. user1389814 04.03.24 09:00 Сейчас в теме
36. Alexwarsis 08.08.24 09:17 Сейчас в теме
А никто не знает когда делаешь запрос как найти "серые галки" в наборе полей? которые в любом случае недоступы для выбора / отбора
37. sys1c 15.08.24 10:39 Сейчас в теме
Подскажите что делаю не так, сделал простейший код.
Програмно формируемый запрос, с отбором по произвольной номенклатуре, но в КомпоновщикНастроекСКД поле Номенклатура горит с красным крестом.

&НаСервере
Функция ТекстЗапроса()
	
	Возврат 
	 "ВЫБРАТЬ
	 |	Номенклатура.Ссылка КАК Ссылка
	 |ИЗ
	 |	Справочник.Номенклатура КАК Номенклатура";
	
КонецФункции	

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
	
	СхемаКомпоновкиДанных = Новый СхемаКомпоновкиДанных;
	
	ИсточникДанных = СхемаКомпоновкиДанных.ИсточникиДанных.Добавить();
	ИсточникДанных.Имя = "ИсточникДанных1";
	ИсточникДанных.ТипИсточникаДанных = "Local";
	
	НаборДанныхОбъектСхемыКомпоновкиДанных = СхемаКомпоновкиДанных.НаборыДанных.Добавить(Тип("НаборДанныхЗапросСхемыКомпоновкиДанных"));
	НаборДанныхОбъектСхемыКомпоновкиДанных.Имя = "НаборДанных1";                             
	НаборДанныхОбъектСхемыКомпоновкиДанных.ИсточникДанных = "ИсточникДанных1";
	НаборДанныхОбъектСхемыКомпоновкиДанных.Запрос = ТекстЗапроса();
	

	ПолеНабораДанныхСхемыКомпоновкиДанных = НаборДанныхОбъектСхемыКомпоновкиДанных.Поля.Добавить(Тип("ПолеНабораДанныхСхемыКомпоновкиДанных"));
	ПолеНабораДанныхСхемыКомпоновкиДанных.Поле = "Номенклатура";
	ПолеНабораДанныхСхемыКомпоновкиДанных.ПутьКДанным = "Номенклатура";
	ПолеНабораДанныхСхемыКомпоновкиДанных.Заголовок = "Номенклатура";	

	КомпоновщикНастроекСКД.Инициализировать(Новый ИсточникДоступныхНастроекКомпоновкиДанных(СхемаКомпоновкиДанных));
	
	ГруппировкаКомпоновкиДанных1 = КомпоновщикНастроекСКД.Настройки.Структура.Добавить(Тип("ГруппировкаКомпоновкиДанных"));
	ГруппировкаКомпоновкиДанных1.Использование = Истина;
	ПолеГруппировкиКомпоновкиДанных = ГруппировкаКомпоновкиДанных1.ПоляГруппировки.Элементы.Добавить(Тип("ПолеГруппировкиКомпоновкиДанных"));
	ПолеГруппировкиКомпоновкиДанных.Использование = Истина;
	ПолеГруппировкиКомпоновкиДанных.Поле = Новый ПолеКомпоновкиДанных("Номенклатура");	
	
	АвтоВыбранноеПолеКомпоновкиДанных = ГруппировкаКомпоновкиДанных1.Выбор.Элементы.Добавить(Тип("АвтоВыбранноеПолеКомпоновкиДанных"));
	АвтоВыбранноеПолеКомпоновкиДанных.Использование = Истина;
		
	ЭлементОтбораКомпоновкиДанных = КомпоновщикНастроекСКД.Настройки.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
	ЭлементОтбораКомпоновкиДанных.Использование = Истина;
	ЭлементОтбораКомпоновкиДанных.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Номенклатура");
	ЭлементОтбораКомпоновкиДанных.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;

КонецПроцедуры
Показать
38. Baturskii 19.09.24 11:15 Сейчас в теме
Все мусолят одну и уже схему, и никто ни разу не описал, как сделать программно группировки в таблице(
39. user1120691 15 18.10.24 08:11 Сейчас в теме
(38)
ГруппировкаКомпоновкиДанныхТаблица = Настройки.Структура.Добавить(Тип("ТаблицаКомпоновкиДанных"));
	ГруппировкаКомпоновкиДанныхТаблица.Использование = Истина;
	
	ГруппировкаКомпоновкиДанныхСтрока = ГруппировкаКомпоновкиДанныхТаблица.Строки.Добавить();
	ГруппировкаКомпоновкиДанныхСтрока .Использование = Истина;
	ПолеГруппировкиКомпоновкиДанных = ГруппировкаКомпоновкиДанныхСтрока .ПоляГруппировки.Элементы.Добавить(Тип("ПолеГруппировкиКомпоновкиДанных"));
	ПолеГруппировкиКомпоновкиДанных.Использование = Истина;
	ПолеГруппировкиКомпоновкиДанных.Поле = Новый ПолеКомпоновкиДанных("Поле1");
	
	ГруппировкаКомпоновкиДанныхПодСтрока = ГруппировкаКомпоновкиДанныхРаздел.Структура.Добавить();
	ГруппировкаКомпоновкиДанныхПодСтрока .Использование = Истина;
	ПолеГруппировкиКомпоновкиДанных = ГруппировкаКомпоновкиДанныхПодСтрока .ПоляГруппировки.Элементы.Добавить(Тип("ПолеГруппировкиКомпоновкиДанных"));
	ПолеГруппировкиКомпоновкиДанных.Использование = Истина;
	ПолеГруппировкиКомпоновкиДанных.Поле = Новый ПолеКомпоновкиДанных("Поле2");
	ПолеГруппировкиКомпоновкиДанных.ТипГруппировки = ТипГруппировкиКомпоновкиДанных.Иерархия;
	
	ГруппировкаКомпоновкиДанныхКолонка = ГруппировкаКомпоновкиДанныхТаблица.Колонки.Добавить();
	ГруппировкаКомпоновкиДанныхКолонка .Использование = Истина;
	ПолеГруппировкиКомпоновкиДанных = ГруппировкаКомпоновкиДанныхКолонка .ПоляГруппировки.Элементы.Добавить(Тип("ПолеГруппировкиКомпоновкиДанных"));
	ПолеГруппировкиКомпоновкиДанных.Использование = Истина;
	ПолеГруппировкиКомпоновкиДанных.Поле = Новый ПолеКомпоновкиДанных("Поле3");
Показать
40. Doomer 27.10.24 20:48 Сейчас в теме
Скопировал 1 в 1 в УНФ 3 текст из статьи. Отчет сформировался но вышла ошибка:
"Ошибка создания источника доступных настроек компоновки данных"
Что не так делаю?
Прикрепленные файлы:
41. John_d 5891 28.10.24 09:10 Сейчас в теме
(40) может нет в конфигурации РегистрНакопления.ТоварыНаСкладах
42. Doomer 28.10.24 10:06 Сейчас в теме
(41) Естественно адаптировал запрос под УНФ.
Прикрепленные файлы:
Оставьте свое сообщение