Имя: Пароль:
1C
 
8.2 Как вытащить отбор программно созданной СКД на форму?
0 Bugmenot
 
22.03.10
13:57
В 8.1 можно было делать удобный отбор элементов из произвольного источника, т.е. на форму вытаскивалось табличное поле с типом Построитель.Отбор и затем делалось примерно так:

Построитель.Текст="ВЫБРАТЬ Ссылка ИЗ Справочник."+Источник;
Построитель.ЗаполнитьНастройки();

После чего пользователь получал возможность устанавливать нужные ему отборы в форме, а программист мог легко получить список элементов, удовлетворяющих отбору:

Построитель.Выполнить();
СписокЭлементов=Построитель.Результат.Выгрузить();

А вот как все это провернуть в 8.2, используя СКД?... У меня никак не получается заполнить доступные поля отбора, там пусто... Вот код:

&НаСервере
Процедура ИнициализироватьНастройки(Источник)
   ОписаниеМетаданных="Справочник.Номенклатура";
   СКД = Новый СхемаКомпоновкиДанных;
   ИД = СКД.ИсточникиДанных.Добавить();
   ИД.Имя = "Источник";
   ИД.ТипИсточникаДанных = "Local";
   НаборДанных = СКД.НаборыДанных.Добавить(Тип("НаборДанныхЗапросСхемыКомпоновкиДанных"));
   НаборДанных.Имя = "Запрос";
   НаборДанных.Запрос="ВЫБРАТЬ * ИЗ " + ОписаниеМетаданных;
   НаборДанных.ИсточникДанных="Источник";
   НаборДанных.АвтоЗаполнениеДоступныхПолей=Истина;
   
   НастройкиВыбора.Инициализировать(Новый ИсточникДоступныхНастроекКомпоновкиДанных(СКД));
КонецПроцедуры
1 Bugmenot
 
22.03.10
13:59
+(1) НастройкиВыбора - это реквизит типа "КомпоновщикНастроекКомпоновкиДанных"
2 Mort
 
22.03.10
14:04
Во-первых отбор в СКД может быть отдельный для различных группировок. В общем случае устанавливается для верхней.

По программному добавлению отбора:

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

// ТЕПЕРЬ ПО ПОЛЮ ССЫЛКА МОЖНО ДЕЛАТЬ ОТБОР
3 Bugmenot
 
22.03.10
14:16
(2) То есть получается, что имея просто текст запроса типа "ВЫБРАТЬ * ", доступные поля для отбора не заполнить автоматически никак? Только перебирать что-то?... Не очень понятно что, кстати.
4 Asmody
 
22.03.10
14:19
как-бэ идеологически неверно "заполнять" СКД программно. правильнее будет сделать несколько макетов и использовать нужный
5 Mort
 
22.03.10
14:20
(3) Запрос тут при чем? Это просто один из возможных источников данных. Чтобы задавать отбор, в группировку должны быть выбраны поля.
6 Mort
 
22.03.10
14:23
(4) А если запрос на "этапе компиляции" не определен?
7 Bugmenot
 
22.03.10
14:29
(5) А! Теперь понял о чем ты, торможу )
Добавил я выбранное поле:

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

Но вот в полях отбора (НастройкиВыбора.Настройки.Отбор) по прежнему пусто! Как мне туда автоматом все доступные поля загрузить (исходя из текста запроса)?...
8 Bugmenot
 
22.03.10
14:30
(4) В общем случае, я не знаю к какому объекту выполняется запрос...
9 Mort
 
22.03.10
14:33
(7) В отбор тож надо элементы добавлять.
10 Bugmenot
 
22.03.10
14:38
(9) А куда конкретно? Если в ДоступныеПоляОтбора - то они "только чтение"...
А если я в Отбор добавлю, то это не правильно. Мне не нужно устанавливать никакой отбор программно, мне нужно дать возможность пользователю это сделать из формы.
11 Asmody
 
22.03.10
14:43
(6) это как? или ты пытаешься сделать "супер-универсальный отчет"?
12 Asmody
 
22.03.10
14:44
(8) описывай тогда набор данных объект и заполняй его программно
13 Bugmenot
 
22.03.10
15:21
(11,12) Тут как бы отчет вовсе не причем ) Пользователем выбирается справочник, настраивается отбор (таб поле на форме) и получается список элементов по этому отбору, с которым я уже потом какие-то действия выполняю...
Как это сделать через Построитель, я в (0) описал, а вот с компоновкой не выходит!
В табличном поле (которое отбор) добавляем строку, а в доступных полях - пусто.
14 Bugmenot
 
22.03.10
15:33
ап?
15 Bugmenot
 
22.03.10
16:00
Добавил поле набора данных, добавил группировку, ничего не помогает (
16 Bugmenot
 
22.03.10
16:14
Не получается даже просто поле в отбор добавить

СКД = Новый СхемаКомпоновкиДанных;
   ИД = СКД.ИсточникиДанных.Добавить();
   ИД.Имя = "Источник";
   ИД.ТипИсточникаДанных = "Local";
   НаборДанных = СКД.НаборыДанных.Добавить(Тип("НаборДанныхЗапросСхемыКомпоновкиДанных"));
   НаборДанных.Имя = "Запрос";
   НаборДанных.Запрос = "ВЫБРАТЬ Ссылка ИЗ " + ОписаниеМетаданных;
   НаборДанных.ИсточникДанных = "Источник";
   НаборДанных.АвтоЗаполнениеДоступныхПолей = Истина;
   
   ПолеСсылка=НаборДанных.Поля.Добавить(Тип("ПолеНабораДанныхСхемыКомпоновкиДанных"));
   ПолеСсылка.Поле="Ссылка";
   ПолеСсылка.ПутьКДанным="Ссылка";
   ПолеСсылка.Заголовок="Ссылка";
   
   НастройкиВыбора.Инициализировать(Новый ИсточникДоступныхНастроекКомпоновкиДанных(СКД));
   Настройки = НастройкиВыбора.Настройки;
   
   ГруппировкаДетали = Настройки.Структура.Добавить(Тип("ГруппировкаКомпоновкиДанных"));
   ГруппировкаДетали.Использование = Истина;
   
   ВыбранноеПоле = Настройки.Выбор.Элементы.Добавить(Тип("ВыбранноеПолеКомпоновкиДанных"));
   ВыбранноеПоле.Использование = Истина;
   ВыбранноеПоле.Поле = Новый ПолеКомпоновкиДанных("Ссылка");
   
   ЭлементОтбора = Настройки.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
   ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Ссылка");
17 Bugmenot
 
22.03.10
16:41
Должны же сюда иногда заглядывать люди умеющие с компоновкой программно работать )
18 Bugmenot
 
22.03.10
17:05
^
19 mikecool
 
22.03.10
17:07
Выбрать Ссылка, Дата
{Выбрать Ссылка.*, Дата} - вот эти поля должны попасть в отбор
Из ...
20 Mort
 
22.03.10
17:09
(16) Я компоновщик настроек создавал и инициализировал в (2) не просто так.
21 Mort
 
22.03.10
17:10
+(20) Сори, не заметил. А что говорит?
22 Bugmenot
 
22.03.10
17:16
(21) А ни чё не говорит, поле в отбор добавляется, но оно "крестом" помечено - типа нет такого поля
(19) Тоже к сожалению, не помогает (

Последний вариант такой (мне кажется настройки все-таки надо загружать в КомпоновщикНастроек, а не Инициализировать):

СКД = Новый СхемаКомпоновкиДанных;
   ИД = СКД.ИсточникиДанных.Добавить();
   ИД.Имя = "Источник";
   ИД.ТипИсточникаДанных = "Local";
   НаборДанных = СКД.НаборыДанных.Добавить(Тип("НаборДанныхЗапросСхемыКомпоновкиДанных"));
   НаборДанных.Имя = "Запрос";
   НаборДанных.Запрос = "ВЫБРАТЬ Ссылка {ВЫБРАТЬ Ссылка.*} ИЗ " + ОписаниеМетаданных;
   НаборДанных.ИсточникДанных = "Источник";
   НаборДанных.АвтоЗаполнениеДоступныхПолей = Истина;
   
   ПолеСсылка=НаборДанных.Поля.Добавить(Тип("ПолеНабораДанныхСхемыКомпоновкиДанных"));
   ПолеСсылка.Поле="Ссылка";
   ПолеСсылка.ПутьКДанным="Ссылка";
   ПолеСсылка.Заголовок="Ссылка";
   
   Настройки = СКД.НастройкиПоУмолчанию;
   
   ГруппировкаДетали = Настройки.Структура.Добавить(Тип("ГруппировкаКомпоновкиДанных"));
   ГруппировкаДетали.Использование = Истина;
   
   ВыбранноеПоле = Настройки.Выбор.Элементы.Добавить(Тип("ВыбранноеПолеКомпоновкиДанных"));
   ВыбранноеПоле.Использование = Истина;
   ВыбранноеПоле.Поле = Новый ПолеКомпоновкиДанных("Ссылка");
   
   ЭлементОтбора = Настройки.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
   ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Ссылка");

   НастройкиВыбора.ЗагрузитьНастройки(СКД.НастройкиПоУмолчанию);
23 Bugmenot
 
22.03.10
17:24
+(22) Немножко не так:
НаборДанных.Запрос = "ВЫБРАТЬ Ссылка ИЗ {ГДЕ Ссылка.*}" + ОписаниеМетаданных;

Не помогает только, все-равно...
24 Bugmenot
 
22.03.10
17:25
+(23) Тьфу ты! )
НаборДанных.Запрос = "ВЫБРАТЬ Ссылка ИЗ " + ОписаниеМетаданных+" {ГДЕ Ссылка.*}";
25 5 Элемент
 
23.03.10
15:17
Посмотри как сделана консоль для 8.2
Компоновщик нужно инициализировать по схеме, которая помещена во временное хранилище.
26 WebTraveller
 
10.04.10
15:15
Бился с этой же проблемой полдня. как а основании просто текста запроса добавить доступные поля отборов, порядка и т.д. Оказывается очень просто :))

   СКД = ПолучитьМакет("СКД");
   
   ТекстЗапроса = СформироватьТекстЗапроса();
   
   НаборДанных = СКД.НаборыДанных.Найти("ОсновнойНаборДанных");
   НаборДанных.Запрос = ТекстЗапроса;
   
   НаборДанных.ИсточникДанных ="ОсновнойИсточникДанных";
   
   НаборДанных.АвтоЗаполнениеДоступныхПолей = Истина;
   
   КомпоновщикНастроек.Инициализировать(Новый ИсточникДоступныхНастроекКомпоновкиДанных(СКД));