Имя: Пароль:
1C
1С v8
Вопрос Мидл+ (Программное использование СКД)
0 Maestro2020
 
24.10.25
16:38
Добрый день.
Пытаюсь по аналогии с типовыми решениями сделать программную выборку данных с помощью механизма СКД.
Получаю пустую выборку на простом примере:

    ТекстЗапроса="
    |ВЫБРАТЬ
    |*
    |ИЗ
    |    Документ.РеализацияТоваровУслуг КАК ПсевдонимЗаданнойТаблицы";
    
    
    СхемаКомпоновкиДанных = Новый СхемаКомпоновкиДанных;
    ИсточникДанных = СхемаКомпоновкиДанных.ИсточникиДанных.Добавить();
    ИсточникДанных.Имя = "ИсточникДанных1";
    ИсточникДанных.ТипИсточникаДанных = "local";
    
    НаборДанных = СхемаКомпоновкиДанных.НаборыДанных.Добавить(Тип("НаборДанныхЗапросСхемыКомпоновкиДанных"));
    НаборДанных.ИсточникДанных = "ИсточникДанных1";
    НаборДанных.АвтоЗаполнениеДоступныхПолей = Истина;
    НаборДанных.Запрос = ТекстЗапроса;
    НаборДанных.Имя = "НаборДанных1";
    
    КомпоновщикНастроекКомпоновкиДанных = Новый КомпоновщикНастроекКомпоновкиДанных;
    АдресСхемы = ПоместитьВоВременноеХранилище(СхемаКомпоновкиДанных, УникальныйИдентификатор);
    КомпоновщикНастроекКомпоновкиДанных.Инициализировать(Новый ИсточникДоступныхНастроекКомпоновкиДанных(АдресСхемы));
        
    Результат = Новый ДеревоЗначений;
    КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
    МакетКомпоновкиДанных = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных,
                КомпоновщикНастроекКомпоновкиДанных.Настройки, , , Тип("ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений"));
            
    ПроцессорКомпоновкиДанных = Новый ПроцессорКомпоновкиДанных;
    ПроцессорКомпоновкиДанных.Инициализировать(МакетКомпоновкиДанных);

    ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений;
    ПроцессорВывода.УстановитьОбъект(Результат);
    ПроцессорВывода.Вывести(ПроцессорКомпоновкиДанных);

    Сообщить(Результат.Строки.Количество());


Подскажите, пожалуйста, что я делаю не так?
1 craxx
 
24.10.25
16:43
(0) а где структура? варианты (как минимум Основной)?что ему выводить?
2 Maestro2020
 
24.10.25
16:43
(1) Как добавить структуру? (Детальные записи)
3 craxx
 
24.10.25
16:47
(2) Тут https://infostart.ru/1c/articles/1185890/
есть пример, про структуру тоже.
4 Garykom
 
гуру
24.10.25
16:47
(0) Нафуя тут СКД?
5 Garykom
 
гуру
24.10.25
16:49
Вывод через СКД в ТЗ/ДЗ обычно требуется когда надо применять пользовательские отборы и прочие извраты
А если просто данные отобрать то просто используй запрос и все
6 Maestro2020
 
24.10.25
16:52
(5) Вот именно. Задача сделать пользовательский отбор на любом типе документов. Пример выше я упростил. Запрос без условий. И нифуя. )
7 Maestro2020
 
24.10.25
16:54
(3) Спасибо, попробую добавить. Но в типовых это не используется...
Очень понравился абзац:

Что же касается Фиксированных настроек, описание на этот счет никакого нет. Опыты показывают, что группировки добавленные в фиксированные настройки никак не влияют на результирующую структуру.

На этом все, спасибо за внимание. Успехов Вам в программной работе с СКД!
8 Homer
 
24.10.25
16:54
9 d4rkmesa
 
24.10.25
16:54
(0) Насколько я помню, нужно добавить поля и хотя бы элемент детальных записей. По текущим настройкам сейчас это как отчет СКД без структуры и каких-либо выбранных полей.
10 Garykom
 
гуру
24.10.25
16:56
Вроде не хватает установки настроек по умолчанию или как то так
11 Maestro2020
 
24.10.25
17:01
(8) Таких примеров много. Но везде схема компоновки в макете!
12 Maestro2020
 
24.10.25
16:58
(9) НаборДанных.АвтоЗаполнениеДоступныхПолей = Истина;
13 Maestro2020
 
24.10.25
16:58
(10) Не влияет. Пробовал.
14 Timon1405
 
24.10.25
17:06
15 Мультук
 
гуру
24.10.25
17:08
(0)

Что мешает сделать всё это сначала в обычном отчёте
-- запрос
-- настроить поля
-- сформировать отчёт "кнопочкой"
-- программно сформировать отчёт в "ПриКомпановке.."
Там же в "ПриКомпановке.." посмотреть что и как и где лежит ?
16 Garykom
 
гуру
24.10.25
17:10
(11) Я делал и полностью программно все
Но помню долго провозился, целый день любился

Попробуй найти пример где все программно, без макета и без настроек на форме
Вроде вот но не уверен
https://www.koderline.ru/expert/narabotki/article-programmnoe-sozdanie-skd-shpargalka/
17 Maestro2020
 
24.10.25
17:16
(14) Спасибо. Но устарело для текущих версий платформы. Попробовал. Сплошные ошибки.
18 Maestro2020
 
24.10.25
17:17
(15) Что это мне даст? Где можно посмотреть пример добавления/установки параметров схемы компоновки программно?
19 Maestro2020
 
24.10.25
17:24
(16) Спасибо. Попробую. Этот материал видел. Но **ка в типовых текст в моем примере. Просто где-то недокументированная "галочка"...
20 Timon1405
 
24.10.25
17:24
(17) возможно надо доработать, но плохим обработкам там 300 плюсов не ставят...
а что поменялось в СКД в текущих версиях платформы?
21 Маленький Вопросик
 
24.10.25
17:26
(0) вот эту посмотри... по-моему ты спросил об этом https://infostart.ru/1c/tools/2147140/
22 Maestro2020
 
24.10.25
17:32
(20) Для детальных записей не проходит:
НастройкиПоУмолчанию=СхемаКомпоновкиДанных.НастройкиПоУмолчанию;
Группировка=НастройкиПоУмолчанию.Структура.Добавить(Тип("ГруппировкаКомпоновкиДанных""));
Ошибка - Несоответствие типов

Все меняется. Там есть свежие комментарии.
23 Maestro2020
 
24.10.25
17:31
(21) Совсем не читаем вопрос? Мне надо без макета - схемы компоновки.
24 Timon1405
 
24.10.25
17:33
(22)     
так у вас кавычка лишняя.
вот так должно работать
Группировка = НастройкиПоУмолчанию.Структура.Добавить(Тип("ГруппировкаКомпоновкиДанных"));
Группировка.Использование = Истина;            
АвтоПоле = Группировка.Выбор.Элементы.Добавить(Тип("АвтоВыбранноеПолеКомпоновкиДанных"));
АвтоПоле.Использование = Истина;
25 craxx
 
24.10.25
17:33
(7) Зачем тебе фиксированные настройки? у тебя схема пустая
26 Maestro2020
 
24.10.25
17:36
(24) Извините. Написал с экрана рабочего ПК. Ваш синтаксис правильный. Уходит в ошибку - выше...
27 Maestro2020
 
24.10.25
17:37
(25) Просто для примера привел выдержку статьи. В типовых никаких структур нет!
28 Timon1405
 
24.10.25
17:43
(26) возможно слово Группировка стало системным, и надо переименовать в
МояГруппировка = НастройкиПоУмолчанию.Структура.Добавить(Тип("ГруппировкаКомпоновкиДанных"));
29 Maestro2020
 
24.10.25
17:48
(28) Вы правы. Группировка стало системным. Ошибки ушли. Результат тот же. Пусто.
30 Garykom
 
гуру
24.10.25
18:07
Надеюсь нет ошибки с копированием настроек отбора?
Их надо пересоздавать в цикле, причем не забывая про группы (рекурсия)

В смысле без пользовательских отборов данные то есть?
31 lEvGl
 
гуру
24.10.25
18:15
а точно мидл+?
такое делали в бородатых годах, на заре скд, правда надо (16)
но на просторах 100500 примеров
32 Maestro2020
 
24.10.25
18:17
(31)  Приведите рабочий пример без схемы компоновки в макете.
33 Maestro2020
 
24.10.25
18:19
(30) Какой смысл пересоздавать настройки отбора, если он пустой? Я пробовал присваивать отбор по умолчанию и отбор, размещенный на форме. Итог тот же.
34 lEvGl
 
гуру
24.10.25
18:21
(32) что в вашем понимании "рабочий"?
https://infostart.ru/1c/articles/1179039/
но придется переписать под себя, может у вас таких регистров нет, как там используют
35 Maestro2020
 
24.10.25
18:21
(34) Скопирую в форму чистой обработки и посмотрю результат.
36 lEvGl
 
гуру
24.10.25
18:24
(35) это и проблема, вы хотите скопировать и получить результат. Пока, к счастью, до такого не дошли, иногда и самому подумать надо
37 Maestro2020
 
24.10.25
19:01
(36) Мой личный программный текст в сообщении (0). Наставлять на путь истинный словами, что надо подумать и будет просветление, и я могу.
Я сюда обратился, когда исчерпал все варианты подсказок из инета.
38 lEvGl
 
гуру
24.10.25
18:36
в вашем коде нет ни одной группировки или поля, он не выведет ничего, в (1) же сказали

зы. а что, собеседуетесь?
39 Maestro2020
 
24.10.25
18:40
(38) Нет. Просто есть задача - сделать на форме универсальный отбор по любому типу документов. И неожиданно для себя словил "затык"... Уже неделю.
Добавление группировок и автополей не помогает.
(В типовых этого нет)
40 Timon1405
 
24.10.25
18:43
(39) может быть тогда посмотреть как работает отчет "УниверсальныйОтчет" в ERP? там по произвольному выбранному объекту схема строится.
41 lEvGl
 
гуру
24.10.25
18:51
(39) если так, то кажется, что надо начать с выбора типа на форме, денамический запрос под него, детальные записи, то есть перестройка схемы "налету", чтобы отборы этого типа появились, инициализация и должен подхватить и вывести. то есть - не в один сеанс выполнения кода
42 Maestro2020
 
24.10.25
18:52
(40) Спасибо. Видимо придется лезть совсем в "дебри"...
43 Maestro2020
 
24.10.25
18:55
(41) Есть типовая обработка "Групповое изменение реквизитов". Там два режима включается. 1 - как Вы написали динамический запрос на "лету", 2 - подсчет количества выбранных объектов.
Я пытаюсь сделать 2 вариант. И ничего. Уже упростил до невозможности. В (0) текст в пустой внешней обработке. Как получить список документов без условий с помощью СКД?
44 lEvGl
 
гуру
24.10.25
19:16
Как получить список документов без условий с помощью СКД?

реквизит составного типа, скд тут не нужно
45 Maestro2020
 
24.10.25
19:21
(44) Еще раз, я для Senior упростил задачу, которая у меня не получается, получить список документов без условий с помощью программного механизма СКД.
46 lEvGl
 
гуру
24.10.25
19:37
(45) хз о чем ты
про почесать свой турнепс?
47 d4rkmesa
 
24.10.25
19:41
(12) Это не то, АвтоЗаполнениеДоступныхПолей - это "галочка" Автозаполнение на "закладке" НаборыДанных. Я про ВыбранныеПоля и настройки. Впрочем, в (24) написали.
48 Maestro2020
 
24.10.25
20:02
(47) Материал (24) попробовал. Не помогает. В типовой этого нет..
49 Maestro2020
 
24.10.25
20:03
(46) Понятно с Вами. Спасибо.
50 craxx
 
25.10.25
11:12
(31) вот и я тоже засомневался, что мидл+
Больше на джун+ (и то, плюс такой, неявный).
51 Garykom
 
гуру
25.10.25
13:28
Довели, заставили вспомнить, точнее заново повторить
Пример вывода на СКД полностью программно
&НаСервере
Процедура ПримерСКДНаСервере()
	
	ТекстЗапроса = 
	"ВЫБРАТЬ
	|	Контрагенты.Ссылка КАК Ссылка,
	|	Контрагенты.Наименование КАК Наименование,
	|	Контрагенты.ИНН КАК ИНН,
	|	Контрагенты.КПП КАК КПП
	|ИЗ
	|	Справочник.Контрагенты КАК Контрагенты";
	
	ТаблицаЗначений = Новый ТаблицаЗначений;
	
	СКД = Новый СхемаКомпоновкиДанных();
	
	Источник = СКД.ИсточникиДанных.Добавить();
	Источник.Имя = "ИсточникДанных";
	Источник.ТипИсточникаДанных = "Local";
	
	НаборДанных = СКД.НаборыДанных.Добавить(Тип("НаборДанныхЗапросСхемыКомпоновкиДанных"));
	НаборДанных.Имя = "НаборДанных1";
	НаборДанных.Запрос = ТекстЗапроса;
	НаборДанных.ИсточникДанных = "ИсточникДанных";
	НаборДанных.АвтоЗаполнениеДоступныхПолей = Истина;
	
	НастройкиПоУмолчанию = СКД.НастройкиПоУмолчанию;
	
	НоваяГруппировка = НастройкиПоУмолчанию.Структура.Добавить(Тип("ГруппировкаКомпоновкиДанных"));
	НоваяГруппировка.Использование = Истина;
	
	АвтоПоле = НоваяГруппировка.Выбор.Элементы.Добавить(Тип("АвтоВыбранноеПолеКомпоновкиДанных"));
	АвтоПоле.Использование = Истина;
	
	КоллекцияКолонок = Новый ТаблицаЗначений;
	КоллекцияКолонок.Колонки.Добавить("Имя");
	КоллекцияКолонок.Колонки.Добавить("ТипЗначения");
	КоллекцияКолонок.Колонки.Добавить("Заголовок");
	
	ПостроительЗапроса = Новый ПостроительЗапроса;
	ПостроительЗапроса.Текст = ТекстЗапроса;
	ПостроительЗапроса.ЗаполнитьНастройки();
	
	Для Каждого ПолеОтбора Из ПостроительЗапроса.ВыбранныеПоля Цикл
		НоваяКолонка = КоллекцияКолонок.Добавить();
		НоваяКолонка.Имя = ПолеОтбора.Имя;
		НоваяКолонка.ТипЗначения = ПостроительЗапроса.ДоступныеПоля[ПолеОтбора.ПутьКДанным].ТипЗначения;
		НоваяКолонка.Заголовок = ПолеОтбора.Представление
	КонецЦикла;
	
	Для Каждого НоваяКолонка Из КоллекцияКолонок Цикл
		ПолеНабора = НаборДанных.Поля.Добавить(Тип("ПолеНабораДанныхСхемыКомпоновкиДанных"));
		ПолеНабора.Заголовок = СокрЛП(НоваяКолонка.Заголовок);
		ПолеНабора.Поле = СокрЛП(НоваяКолонка.Имя);
		ПолеНабора.ПутьКДанным = СокрЛП(НоваяКолонка.Имя);
		
		// Удалим Неопределено и NULL
		Массив = Новый Массив;
		Для Каждого ТекущийТип Из НоваяКолонка.ТипЗначения.Типы() Цикл
			Если ТекущийТип = Тип("Неопределено") ИЛИ ТекущийТип = Тип("NULL") ИЛИ
				ТекущийТип = Неопределено ИЛИ ТекущийТип = Null Тогда
				Продолжить;
			КонецЕсли;
			Массив.Добавить(ТекущийТип);
		КонецЦикла;
		ПолеНабора.ТипЗначения = Новый ОписаниеТипов(Массив, НоваяКолонка.ТипЗначения.КвалификаторыЧисла,
		НоваяКолонка.ТипЗначения.КвалификаторыСтроки,
		НоваяКолонка.ТипЗначения.КвалификаторыДаты);
		
		ВыбранноеПолеКомпоновкиДанных = НастройкиПоУмолчанию.Выбор.Элементы.Добавить(Тип("ВыбранноеПолеКомпоновкиДанных"));
		ВыбранноеПолеКомпоновкиДанных.Поле = Новый ПолеКомпоновкиДанных(ПолеНабора.ПутьКДанным);
		ВыбранноеПолеКомпоновкиДанных.Использование = Истина;
	КонецЦикла;
	
	ТипГенератора = Тип("ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений");
	КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
	МакетКомпоновки = КомпоновщикМакета.Выполнить(СКД, НастройкиПоУмолчанию, , , ТипГенератора);
	
	ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
	ПроцессорКомпоновки.Инициализировать(МакетКомпоновки);
	
	ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений;
	ПроцессорВывода.УстановитьОбъект(ТаблицаЗначений);
	ПроцессорВывода.Вывести(ПроцессорКомпоновки, Истина);
	
КонецПроцедуры


Сваяно на основе https://infostart.ru/1c/articles/575659/ из (14)
У меня все выводит прекрасно для ТЗ, для ДЗ уже сами
52 Garykom
 
гуру
25.10.25
13:26
(51)+ И да ТС явный джун, даже комменты в (14) не смог прочитать сам
53 craxx
 
25.10.25
14:25
(52) Содержание вопросов тут не соответствует уровню мидла. Нормальный крепкий мидл идет в отладку, смотрит какие у компоновщика свойства, потом идет в СП и смотрит какие у свойств методы и как они работать должны. А еще лучше читает книжку по СКД до дырок. После либо сам уже пишет либо ищет примеры рабочие с этим свойствами и методами и сам уже пишет. Тут просто выньте да положите готовое. Ну и вопрос из (2) это явно не мидл, и уж тем более не плюс.
54 Maestro2020
 
25.10.25
15:41
(50) Вы о чем? В названии темы "Вопрос Мидл+" - это вопрос для спецов уровня Мидл+
55 Maestro2020
 
25.10.25
15:53
(51) Спасибо за пример. Реально работает.
56 Maestro2020
 
25.10.25
16:02
Всем спасибо, в т.ч. за критику. Первый раз столкнулся с задачей формирования данных на полном программном использовании механизма СКД.
57 Valdis2007
 
25.10.25
16:11
(53) а что делает "крекий" сейнер тогда?))
58 Maestro2020
 
25.10.25
16:39
Как "вишенка на торте" для решения вопроса в (0) требовалось добавить:

    ГруппировкаКомпоновкиДанных = Настройки.Структура.Добавить(Тип("ГруппировкаКомпоновкиДанных"));
    ГруппировкаКомпоновкиДанных.Выбор.Элементы.Добавить(Тип("АвтоВыбранноеПолеКомпоновкиДанных"));
    ГруппировкаКомпоновкиДанных.Использование = Истина;
    
    ПолеГруппировки = ГруппировкаКомпоновкиДанных.ПоляГруппировки.Элементы.Добавить(Тип("ПолеГруппировкиКомпоновкиДанных"));
    ПолеГруппировки.Поле = Новый ПолеКомпоновкиДанных("Ссылка");
    ПолеГруппировки.Использование = Истина;
    
    ПолеВыбора = Настройки.Выбор.Элементы.Добавить(Тип("ВыбранноеПолеКомпоновкиДанных"));
    ПолеВыбора.Поле = Новый ПолеКомпоновкиДанных("Ссылка");
    ПолеВыбора.Использование = Истина;
59 Maestro2020
 
25.10.25
16:46
(53) Как оказалось решение простое, но уровень отписавшихся в данной теме (кроме нескольких человек) по вашей оценке даже не тянет на джун+.))