Имя: Пароль:
1C
 
Как сформировать отчет на СКД по заполненным данным табличной части с тремя колонками
0 kenzori
 
05.06.25
08:22
используя параметры текущего документа сформировать отчет на скд по данным тч
1 Ненавижу 1С
 
гуру
05.06.25
08:25
задача с собеседования?
2 Мультук
 
гуру
05.06.25
08:34
(0)

Если документ сохранен, то  тривиально.
Если НЕ сохранён, то придется строить отчёт СКД программно

Примерно вот так.
Отборы здесь передаются как "НастройкиОтбор", но их тоже можно формировать программно

В функции "ПолучитьОписаниеПолей" ничего сложного нет, но там комментарии,
а чистить мне лень


тзДанные = Объект.Товары.Выгрузить(, "тут пишем нужные поля");
СтруктураОписаниеПолей = ПолучитьОписаниеПолей(тзДанные);

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


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

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

Процедура ЗаполнитьВыбранныеПоляОтчета(СКД, СтруктураОписаниеПолей)
	
	Для каждого строка из СтруктураОписаниеПолей Цикл
		ВыбранноеПоле = СКД.ВариантыНастроек[0].Настройки.Выбор.Элементы.Добавить(Тип("ВыбранноеПолеКомпоновкиДанных"));
		ВыбранноеПоле.Использование = Истина;
		ВыбранноеПоле.Поле = Новый ПолеКомпоновкиДанных(строка.Ключ);
	КонецЦикла;
	
КонецПроцедуры
3 toypaul
 
гуру
05.06.25
08:34
(2) а может документ и данные записаны. тогда это все конечно интересно, но совсем не нужно :)
4 Мультук
 
гуру
05.06.25
08:39
(3)

Увы мне, у меня была задача принять решение ДО  записи.
Конечно же, когда код был написан и оттестирован, всё переиграли.

P.S.
Хотя, наверное, не стоило городить огород и нужно было проверять в приЗаписи и кидать Отказ = Истина, но что было сделано, то было сделано.
5 kenzori
 
05.06.25
09:20
(4) Если записаны данные, не сработает?
6 Shurjk
 
05.06.25
09:21
(1) Вопрос на вакансию в 500 тыщ 🤣
7 toypaul
 
гуру
05.06.25
09:42
(5) сработает. но если записаны, то все гораздо проще чем в (2)
8 kenzori
 
05.06.25
10:14
(7) Можете сказать, примерно куда копать? Если второй сложнее
9 toypaul
 
гуру
05.06.25
10:00
Ну как-то так https://www.youtube.com/watch?v=0TrFvHoKh8Q&t=286s и тут наверное https://infostart.ru/1c/reports/89516/

Короче смысл в том, что создаешь отчет (или обработку - точно не скажу) со схемой СКД (тут-то вопросов надеюсь нет?) и цепляешь ее к печатным формам, если вопрос был про то как это к документу потом прицепить.
10 Мультук
 
гуру
05.06.25
10:03
(8)

Для начала напишите внешний отчёт на СКД, который будет выводить нужную информацию.
Отбор по документу через параметры или отборы.

Если всё что я написал выше непонятно, то

https://курсы-по-1с.рф/1c-v8/skd/

Не обязательно к этим парням, возможно нужен курс попроще.
У этих же ребят есть бесплатный курс по СКД, где прямо разжевывают,
что такое СКД.
11 kenzori
 
05.06.25
13:00
(9) мне печатные формы не подходят мне нужен отчет на скд, где группировки итоги, ну отчет я сделал, может как-то можно адаптировать такой отбор в скд через запрос? или как-то еще Чтобы формировать отчет исходя из этого отбора?
Для Каждого СтрокаПродукции Из Объект.Продукция Цикл
		СтрокаПродукции.Показывать = Ложь;
		
		Если Лев(СтрокаПродукции.Номенклатура.Наименование, 2) = "ВП" Тогда
			
			Если СтрокаПродукции.Спецификация = Неопределено Тогда
				СтрокаПродукции.Показывать = Истина;
			Иначе
				СтрокаПродукции.Показывать = Истина;				 
				Для каждого Комплектующее Из СтрокаПродукции.Спецификация.ИсходныеКомплектующие Цикл
					Если Лев(Комплектующее.Номенклатура.Наименование, 26) = "Диафрагма вулканизационная" 
						ИЛИ Лев(Комплектующее.Номенклатура.Наименование, 2) = "ВД"
						ИЛИ Лев(Комплектующее.Номенклатура.Наименование, 20) = "Диафрагма ""10"" х 355"
						ИЛИ Лев(Комплектующее.Номенклатура.Наименование, 20) = "Диафрагма ""9"" х 355"
						ИЛИ Лев(Комплектующее.Номенклатура.Наименование, 20) = "Диафрагма 11""х345"
						ИЛИ Лев(Комплектующее.Номенклатура.Наименование, 20) = "Диафрагма ""12"" х 370"
						ИЛИ Лев(Комплектующее.Номенклатура.Наименование, 20) = "Диафрагма 12х340" 
						ИЛИ Лев(Комплектующее.Номенклатура.Наименование, 30) = "Вулканизационные диафрагмы"
						Тогда
						
						
						СтрокаПродукции.Показывать = Ложь;
						Прервать;										
					КонецЕсли;
				КонецЦикла;								  
			КонецЕсли;
		КонецЕсли;
	КонецЦикла;
	
	ПрименитьОтбор(); 

Процедура ПрименитьОтбор();
	Элементы.Продукция.ОтборСтрок = Новый ФиксированнаяСтруктура("Показывать", Истина);
	Элементы.Продукция.Обновить();
КонецПроцедуры;
12 kenzori
 
05.06.25
13:05
(10) у меня есть отчет который заполняется по параметрам документам и выводит данные по этим параметрам, но мне нужно отбор сделать как я ниже описал, возможно ли это в скд , в запросе ЛЕВ и т.д. не нашел, не знаю подобно ли подойдет, или такое в запросе не реализуемо? как тогда по другому в скд можно
13 toypaul
 
гуру
05.06.25
13:05
(11) Недавно взяли котенка. Когда он сделал лужу, пришлось его натыкать мордой в эту лужу. Судя по коду, учиться и учиться еще. И не на форуме, а на курсах где-то или у старших товарищей.

А то будут тыкать на форуме мордой в лужу.
14 craxx
 
05.06.25
12:15
(11) не показывай никому этот код больше.
15 Волшебник
 
05.06.25
13:06
(12) в запросе есть ПОДСТРОКА
ВЫБРАТЬ ПОДСТРОКА("Привет, мир!", 9, 3)
16 lucky_
 
05.06.25
14:04
(12) "в запросе ЛЕВ и т.д. не нашёл".
обнови платформу до "8.3.20" или ищи лучше.
Есть два вида языков, одни постоянно ругают, а вторыми никто не пользуется.