Имя: Пароль:
1C
1С v8
v8: Запрос с фильтрацией из ТЗ
0 Zorba131
 
23.01.13
15:54
К примеру есть заполненный непериодический и независимый РегистрСведений со столбцами:

Договор | Тип | Дата

и есть,к примеру, заполненная ТЗ со столбцами:

Тип | Дата
1   | 10.01.2013
3   | 01.01.0001
7   | 01.01.0001

Как описать запрос, что бы на выходе был список договоров, у которых поля Тип и Дата соответствовали значению в ТЗ, причем, если в строке ТЗ поле Дата пустая, то значит фильтровать договора только по полю Тип.

Вот пример результата:

Договор | Тип | Дата
дгвр1   | 1   | 10.01.2013
дгвр2   | 3   | 23.04.2010
дгвр3   | 1   | 10.01.2013
дгвр4   | 7   | 02.06.2011


Должно получиться, что-то типа этого, но мой пример явно неправильный.

ВЫБРАТЬ
   Таб1.Договор,
   Таб1.Тип,
   Таб1.Дата
ИЗ
   РегистрСведений.РС КАК Таб1
ГДЕ
   Таб1.Тип В(&сз1)
   И Таб1.Дата В(&сз2)
1 Maxus43
 
23.01.13
15:56
что такое &сз1 и &сз2?
2 Wobland
 
23.01.13
15:57
соединить регистр с ТЗ что-ли?
3 salvator
 
23.01.13
15:58
(0) ТЗ во временную таблицу, потом соединяй РС с ней по нужным полям.
4 Zorba131
 
23.01.13
15:59
(1)
Запрос.УстановитьПараметр("сз1", ТЗ.ВыгрузитьКолонку("Тип"));
Запрос.УстановитьПараметр("сз2", ТЗ.ВыгрузитьКолонку("Дата"));
5 Maxus43
 
23.01.13
15:59
сз1 = ЗаполненаяТЗ.ВыгрузитьКолонку("Тип");
сз2 = ЗаполненаяТЗ.ВыгрузитьКолонку("Дата");
ГДЕ
   Таб1.Тип В(&сз1)

И (Таб1.Дата В(&сз2) ИЛИ Таб1.Дата = &пустаяДата)


или (2)(3)
6 Zorba131
 
23.01.13
16:06
(5)
И (Таб1.Дата В(&сз2) ИЛИ Таб1.Дата = &пустаяДата)
А разве тут не теряется соответствие определенных Тип+Дата и будут отображаться договора с Типом, не соответствующим требуемой от него Даты?
7 Maxus43
 
23.01.13
16:08
(6) это означает >>если в строке ТЗ поле Дата пустая, то значит фильтровать договора только по полю Тип
8 Maxus43
 
23.01.13
16:09
блин, хотя нет. делай вариант (2)(3), там проще будет
9 Zorba131
 
23.01.13
16:17
вот простейший пример кода, дающий этот результат, а нужно тоже самое, но в запросе:
представим, что РС это РегистрСведений, выгруженный в таблицу значений

Для Каждого стрРС Из РС Цикл
       Для Каждого стрТЗ Из ТЗ Цикл
           Если стрРС.Тип = стрТЗ.Тип Тогда
               Если стрРС.Дата = стрТЗ.Дата Или стрТЗ.Дата = Дата("00010101") Тогда
                   стрРез = Результат.Добавить();
                   стрРез.Договор = стрРС.Договор;
                   стрРез.Тип = стрРС.Тип;
                   стрРез.Дата = стрРС.Дата;
               КонецЕсли;
           КонецЕсли;
       КонецЦикла;
   КонецЦикла;
10 hhhh
 
23.01.13
16:22
ВЫБРАТЬ
   Таб1.Договор,
   Таб1.Тип,
   Таб1.Дата
ИЗ
   РегистрСведений.РС КАК Таб1
   ВНУТРЕННЕЕ СОЕДИНЕНИЕ Таб
   ПО Таб.Тип = Таб1.Тип И Таб.Дата = Таб1.Дата
11 Zorba131
 
23.01.13
16:27
(10)
А если в ТЗ(таблица фильтров) дата имеет пустое значение?
12 H A D G E H O G s
 
23.01.13
16:29
И
ВЫБОР КОГДА Таб1.Дата=ДатаВремя(1,1,1) ТОГДА
ИСТИНА
ИНАЧЕ
Таб.Дата = Таб1.Дата
КОНЕЦ
13 H A D G E H O G s
 
23.01.13
16:29
Ну или както так.
14 Zorba131
 
24.01.13
12:02
(12)
Спасибо, то что нужно!


ВЫБРАТЬ
   Таб1.Договор,
   Таб1.Тип,
   Таб1.Дата
ИЗ
   РегистрСведений.РС КАК Таб1
       ВНУТРЕННЕЕ СОЕДИНЕНИЕ ТЗ КАК ТЗ
       ПО (ТЗ.Тип = Таб1.Тип)
           И (ВЫБОР
               КОГДА ТЗ.Дата = ДАТАВРЕМЯ(1, 1, 1)
                   ТОГДА ИСТИНА
               ИНАЧЕ НАЧАЛОПЕРИОДА(ТЗ.Дата, ДЕНЬ) = НАЧАЛОПЕРИОДА(Таб1.Дата, ДЕНЬ)
           КОНЕЦ)
Компьютеры — прекрасное средство для решения проблем, которых до их появления не было.