Имя: Пароль:
1C
1С v8
Построитель запроса. Отбор по списку значений
0 Zixxx
 
27.02.20
08:23
Не получается заставить построитель запроса отбирать по списку значений. При установленном отборе все равно выводятся все строки таблицы значений.

// Сектора
СектораНабор1 = Новый СписокЗначений;
СектораНабор1.Добавить(1);
СектораНабор1.Добавить(2);
    
СектораНабор2 = Новый СписокЗначений;
СектораНабор2.Добавить(3);
СектораНабор2.Добавить(4);
    
// Таблица клиентов
ТаблицаКлиентов = Новый ТаблицаЗначений;
ТаблицаКлиентов.Колонки.Добавить("Наименование",    Новый ОписаниеТипов("Строка"));
ТаблицаКлиентов.Колонки.Добавить("Сектора",            Новый ОписаниеТипов("СписокЗначений"));

ТаблицаКлиентов.Индексы.Добавить("Сектора");

// Заполним таблицу
НоваяСтрока = ТаблицаКлиентов.Добавить();
НоваяСтрока.Наименование    = "Иван";
НоваяСтрока.Сектора            = СектораНабор1;

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

НовыйОтбор = Построитель.Отбор.Добавить("Сектора");
НовыйОтбор.ВидСравнения        = ВидСравнения.ВСписке;
НовыйОтбор.Значение            = СектораНабор2;
НовыйОтбор.Использование    = Истина;

// Результат
Построитель.Выполнить();
ТаблицаРезультат = Построитель.Результат.Выгрузить();

Сообщить(ТаблицаРезультат.Количество());
1 Конструктор1С
 
27.02.20
08:28
И зачем тебе устаревший построитель запроса? Используй СКД
2 novichok79
 
27.02.20
08:34
(0) а зачем делать список значений в таблице. как-то непрозрачно.
почему нельзя развернуть список и нормально сравнить?
каким образом, по вашему, система должна сравнить списки значений?
порядок записи + значение или просто по значению без учета порядка?
3 catena
 
27.02.20
08:37
(2)Какое сравнение списков, вы о чем?
4 novichok79
 
27.02.20
08:45
(3) код почитайте

ТаблицаКлиентов.Колонки.Добавить("Сектора",            Новый ОписаниеТипов("СписокЗначений"));
....
НовыйОтбор = Построитель.Отбор.Добавить("Сектора");
НовыйОтбор.ВидСравнения        = ВидСравнения.ВСписке;
НовыйОтбор.Значение            = СектораНабор2;
НовыйОтбор.Использование    = Истина;
5 Галахад
 
гуру
27.02.20
08:50
Тоже хочу отбирать по списку...
6 catena
 
27.02.20
08:50
(4)А, пропустила))) Действительно, оргинально
7 catena
 
27.02.20
08:50
*оригинально
8 Zixxx
 
28.02.20
08:24
(1) В СКД как предлагаешь сделать отбор по списку значений? Источник данных у нас же ТЗ, одна колонка содержит список значений.
Если устанавливать отбор через построитель отчета, то ничего не происходит, а если установить такой отбор через СКД где источник ТЗ то ничего не выводит

Пока так и не получилось отбор по тз по списку значений, наверное нельзя такое сделать, хотя отборы в построителе и СКД устанавливаются, но почему-то не реагируют
9 novichok79
 
28.02.20
11:49
зачем вообще так организовывать информацию? система явно дает понять, что не надо так.
10 Zixxx
 
28.02.20
12:14
(9) Она как раз не дает это явно понять, СКД спокойно съедает ТЗ со списком значений и выдает его обратно в виде ТЗ со списком, в СКД в режиме пользователя можно указать отбор в виде списка значений. И если бы такой отбор работал то информация была бы правильно организована, это бы упростило ее обработку и вывод, есть же дерево значений есть же иерархия, есть табличные части у объектов, что это разве не правильно?
11 Конструктор1С
 
28.02.20
12:15
(8) так разверни до нормальной таблицы, и будет тебе щасте

Вместо

Наим1, {Знач1,Знач2,Знач3}

сделай

Наим1, Знач1
Наим1, Знач2
Наим1, Знач3
12 novichok79
 
28.02.20
13:00
(10) одно дело табличная часть, а другое дело - список значений в реквизите.
тем более, логичнее хранить данные так, чтобы можно было в БД сохранить простым переносом значений.
список значений разве можно в реквизите хранить?
Компьютеры — прекрасное средство для решения проблем, которых до их появления не было.