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

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).

INFOSTART TOOLKIT

Самый продвинутый набор инструментов для управляемых форм 1С:8.3


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

См. также

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

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

16500 руб.

02.09.2020    247853    1365    421    

1134

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

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

29.01.2026    5336    296    shapa_pro    25    

66

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

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

29.10.2025    16383    ovetgana    112    

106

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

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

01.07.2025    9470    krasnoshchekovpavel    5    

67

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

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

10.04.2025    8682    Neti    0    

41

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

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

27.02.2025    15712    ovetgana    50    

93

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

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

24.12.2024    13288    Akcium    17    

46

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

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

20.08.2024    9818    AlexeyPROSTO_1C    1    

32
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. serg-lom89 82 15.01.20 10:26 Сейчас в теме
однозначно плюс!Спасибо
как шпаргалка по некоторым пунктам в закладки!
jarinat; ikalmykia; movled; Mi4man; zif74; Михаська; Drivingblind; katod1985; lic_avenger; user1537184; jONES1979; Yan_Malyakov; aleks.public; ritd; rainspb; user1012671; alanto23; A_Max; sergey512; +19 Ответить
2. Dzenn 928 15.01.20 10:49 Сейчас в теме
Молодец, хорошо разобрался в этой теме :-) Хардкорно использую СКД — с несколькими источниками данных, внешними наборами, переносом настроек, скд в скд и так далее, поэтому такие статьи однозначно должны быть в шпаргалках :-)
Nior; svetanik; jarinat; ikalmykia; zif74; Михаська; jONES1979; aleks.public; alanto23; A_Max; +10 Ответить
3. sansys 75 15.01.20 11:16 Сейчас в теме
Очень хорошая статья!!! Ещё-бы такую-же но с использованием БСП. Евгений, огромное спасибо за полезную статью, беру себе в базу знаний.
svetanik; ikalmykia; zif74; Михаська; aleks.public; ritd; alanto23; A_Max; +8 Ответить
4. Aleksey81 1194 15.01.20 11:18 Сейчас в теме
Спасибо, пригодится.
5. yalex9 114 15.01.20 11:46 Сейчас в теме
Лучшая статья из тех, что видел на эту тему. Спасибо!
ikalmykia; Михаська; top_1c; alanto23; frkbvfnjh; +5 Ответить
6. uno-c 272 15.01.20 12:06 Сейчас в теме
Только хотел поискать что-то подобное, оно само в уведомлении пришло, спасибо.
7. vik070777 276 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 13 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;
			КонецЦикла;	
		КонецЦикла;	
	КонецЦикла;
	
	Возврат Ложь;
КонецФункции

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


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

Пытался освоить коллекцию элементов параметров скд, пока не получается
svetanik; adamx; +2 Ответить
17. John_d 6092 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 176 27.01.20 15:02 Сейчас в теме
А это код построения макета из произвольного запроса.

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

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

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

Нет, я действительно не понимаю.
МихаилМ; CnupT; +2 1 Ответить
22. s22 23 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 208 06.02.23 09:49 Сейчас в теме
Откуда в сроке ГруппировкаКомпоновкиДанных1 = НастройкиКомпоновки.Структура.Добавить(Тип("ГруппировкаКомпоновкиДанных")) взялась переменная НастройкиКомпоновки?
26. John_d 6092 06.02.23 10:00 Сейчас в теме
(25) НастройкиКомпоновки = КомпоновщикНастроек.Настройки;
27. surr 27.02.23 10:54 Сейчас в теме
Как при таком раскладе наложить отбор на вложенные реквизиты? Например "Номенклатура.Родитель В группе из списка" итд... Не могу ума дать, как типизировать результирующие поля
28. Алексей777 103 28.02.23 01:52 Сейчас в теме
Доступные поля у меня не появляются )
30. Xershi 1545 18.10.23 17:00 Сейчас в теме
(28) в одной из тем писал, что загвоздка в тексте запроса. Используется конструктор (текст запроса в фигурных скобках). Если туда добавить все заработает.
adhocprog; +1 Ответить
31. elite 14.11.23 07:08 Сейчас в теме
Готовый отчет можно выложить?!
32. John_d 6092 14.11.23 09:55 Сейчас в теме
(31) полный текст процедуры, который есть в конце статьи скопируйте в модуль объекта пустого отчета и сохраните. Это и будет готовый отчет.
33. lvictor58 139 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. AmTa 15 18.10.24 08:11 Сейчас в теме
(38)
ГруппировкаКомпоновкиДанныхТаблица = Настройки.Структура.Добавить(Тип("ТаблицаКомпоновкиДанных"));
	ГруппировкаКомпоновкиДанныхТаблица.Использование = Истина;
	
	ГруппировкаКомпоновкиДанныхСтрока = ГруппировкаКомпоновкиДанныхТаблица.Строки.Добавить();
	ГруппировкаКомпоновкиДанныхСтрока .Использование = Истина;
	ПолеГруппировкиКомпоновкиДанных = ГруппировкаКомпоновкиДанныхСтрока .ПоляГруппировки.Элементы.Добавить(Тип("ПолеГруппировкиКомпоновкиДанных"));
	ПолеГруппировкиКомпоновкиДанных.Использование = Истина;
	ПолеГруппировкиКомпоновкиДанных.Поле = Новый ПолеКомпоновкиДанных("Поле1");
	
	ГруппировкаКомпоновкиДанныхПодСтрока = ГруппировкаКомпоновкиДанныхРаздел.Структура.Добавить();
	ГруппировкаКомпоновкиДанныхПодСтрока .Использование = Истина;
	ПолеГруппировкиКомпоновкиДанных = ГруппировкаКомпоновкиДанныхПодСтрока .ПоляГруппировки.Элементы.Добавить(Тип("ПолеГруппировкиКомпоновкиДанных"));
	ПолеГруппировкиКомпоновкиДанных.Использование = Истина;
	ПолеГруппировкиКомпоновкиДанных.Поле = Новый ПолеКомпоновкиДанных("Поле2");
	ПолеГруппировкиКомпоновкиДанных.ТипГруппировки = ТипГруппировкиКомпоновкиДанных.Иерархия;
	
	ГруппировкаКомпоновкиДанныхКолонка = ГруппировкаКомпоновкиДанныхТаблица.Колонки.Добавить();
	ГруппировкаКомпоновкиДанныхКолонка .Использование = Истина;
	ПолеГруппировкиКомпоновкиДанных = ГруппировкаКомпоновкиДанныхКолонка .ПоляГруппировки.Элементы.Добавить(Тип("ПолеГруппировкиКомпоновкиДанных"));
	ПолеГруппировкиКомпоновкиДанных.Использование = Истина;
	ПолеГруппировкиКомпоновкиДанных.Поле = Новый ПолеКомпоновкиДанных("Поле3");
Показать
40. Doomer 27.10.24 20:48 Сейчас в теме
Скопировал 1 в 1 в УНФ 3 текст из статьи. Отчет сформировался но вышла ошибка:
"Ошибка создания источника доступных настроек компоновки данных"
Что не так делаю?
Прикрепленные файлы:
41. John_d 6092 28.10.24 09:10 Сейчас в теме
(40) может нет в конфигурации РегистрНакопления.ТоварыНаСкладах
42. Doomer 28.10.24 10:06 Сейчас в теме
(41) Естественно адаптировал запрос под УНФ.
Прикрепленные файлы:
43. Miket78 55 11.02.25 11:54 Сейчас в теме
Друзья, выручайте! Надо сформировать программно штатный отчет из УТ 11.5, но со своими настройками.

Вот код который я вызываю

	ПараметрыОткрытия = Новый Структура;
	ПараметрыОткрытия.Вставить("ВидимостьКомандВариантовОтчетов",истина);
	ПараметрыОткрытия.Вставить("СформироватьПриОткрытии",Истина);
	
	Отбор = Новый Структура;
	Отбор.Вставить("ПодотчетноеЛицо",ФизическоеЛицо);
	ПараметрыОткрытия.Вставить("Отбор",Отбор);
	
	ОткрытьФорму("Отчет.ВедомостьПоДенежнымСредствамУПодотчетныхЛиц.Форма", ПараметрыОткрытия,ЭтаФорма,Истина);
Показать


В результате отчет формируется, отбор работает. Но как добавить дополнительную группировку по регистратору?
Или как вариант как сформировать отчет по заранее сохраненной настройке?
Для отправки сообщения требуется регистрация/авторизация