Имя: Пароль:
1C
1C 7.7
v7: Обращение внутри запроса к данным уже им собранным
0 SSDDRR
 
27.04.17
13:47
Приветствую!

У меня возник, по-видимому, наивно-риторический вопрос: можно ли в запросе обращаться к уже собранным к тому времени данным?

Допустим, я хочу пройтись одновременно по справочникам "ГТД" и "Партии" и получить на выходе выборку элементов справочника "Партии" так, чтобы в неё попали только элементы с непустными ГТД, ещё в такую выборку не попадавшие.

Для этого к запросу-основе
____________________________________________________________

ТекстЗапроса = "
|Обрабатывать НеПомеченныеНаУдаление;
|ГТД = Справочник.ГТД.ТекущийЭлемент;
|Партия = Справочник.Партии.ТекущийЭлемент;
|ГТДПартии = Справочник.Партии.ГТД;
|СтранаПроисхожденияПартии = Справочник.Партии.СтранаПроисхождения;
|Группировка ГТД без групп;
|Группировка Партия без групп;
|Условие (ПустоеЗначение(ГТДПартии) + ПустоеЗначение(СтранаПроисхожденияПартии) = 0);
|Условие (ГТД в ГТДПартии);";
____________________________________________________________

Надо было бы добавить что-то вроде "|Условие (НЕ (ГТДПартии в [Группировка ГТД]));"

Скорее всего, так нельзя, но можно ли такое, например, в языке запросов "8.3"?
1 SSDDRR
 
27.04.17
13:56
Поправка: "... чтобы в неё попали только элементы с непустными ГТД, ещё в такую выборку не попадавшими". То есть речь идёт о выборке партий с ГТД, которые ни в одной ранее выбранной партии ещё не встречались, чтобы в итоге во всех выбранных партиях были только уникальные ГТД.
2 Ёпрст
 
27.04.17
14:03
(0) дык, у тебя запрос в (0) такие и возвращает
3 Ёпрст
 
27.04.17
14:05
точнее, нужно переписать вот так и привет:

|Обрабатывать НеПомеченныеНаУдаление;
|Партия = Справочник.Партии.ТекущийЭлемент;
|ГТД = Справочник.Партии.ГТД;
|СтранаПроисхожденияПартии = Справочник.Партии.СтранаПроисхождения;
|Группировка ГТД без групп;
|Группировка Партия без групп;
|Условие (ПустоеЗначение(ГТД) + ПустоеЗначение(СтранаПроисхожденияПартии) = 0);
4 vladko
 
27.04.17
14:05
(0)
Вариант решения задачи:
1. надо получить список значений ГТД у существующих партий, для этого делаем запрос по существующим партиям и заполняем ими список значений
2 Делаем запрос по гтд, с условием, что ГТД не в нашем списке значений.
5 SSDDRR
 
27.04.17
14:16
(3) Запрос в (0) сваливает все партии, а в них ГТД повторяются. Много партий товара может быть с одним и тем же ГТД.

(4) Да, но список значений становится крайне медленным, если в нём уже тысячи значений. Хочется через запрос всё сделать.
6 Ёпрст
 
27.04.17
14:22
(5) запрос в (3) <> запросу в (0) , смотри внимательнее
7 Ёпрст
 
27.04.17
14:25
+ если тебе нужна первая попавшаяся партия с уникальным ГТД, то при обходе второй группировки просто бери первую партию из группировки и всё:


Пока Группировка(1)=1 Цикл
   ГТД = Запрос.ГТД;
   Партия="";
   Если  Группировка(2)=1 Тогда
       Партия = Запрос.партия;
   КонецЕсли;
КонецЦикла;
8 SSDDRR
 
27.04.17
14:41
(7) Спасибо. А в чём отличие (3) от (0)? Почему он работает лучше?
9 SSDDRR
 
27.04.17
14:57
Кроме того, всё-таки, хотелось бы узнать, есть ли доступ внутри запроса к данным, уже им собранным, хотя в на платформе "8.3"? Или и там такого нет?
10 Ёпрст
 
27.04.17
15:02
(9) можешь обращаться к результату запроса, что в снеговике, что в клюшках и осуществлять прямое позиционирование в выборке.
В 7.7 через Получить, в 8.3 через
НайтиСледующий,СледующийПоЗначениюПоля и т.д
11 SSDDRR
 
27.04.17
15:21
(10) Имею ввиду доступ ещё внутри самого запроса, пока он до конца не выполнен.

Допустим, условие, что новая партия не должна попадать в выборку, если одной из предыдущих добавленных по выборке партий уже попадался такой же ГТД.

Без такой возможности придётся пользоваться способом (7), а хотелось бы её иметь. Вот я и спрашиваю, что, может, в "8.3" добавили в движок обработки запросов доступ к группировкам прямо ещё во время исполнения самого запроса.
12 SSDDRR
 
27.04.17
15:56
(3) Мне надо получить и те ГТД, которые в партиях не участвуют. То есть убирать "ГТД = Справочник.ГТД.ТекущийЭлемент;" всё таки нельзя?
13 Ёпрст
 
27.04.17
16:02
(11) в 7.7 можно сделать прямым запросом, там есть и подзапросы в селекте, и коррелированные подзапросы в селекте и группировки и оконные функции, для реализации обращения к промежуточным результатам, в 8.3 - проблематично.
14 SSDDRR
 
27.04.17
16:30
(13) Спасибо. А что это за команды в запросах, которыми можно такое сделать в "7.7"?
15 slowpoke1C
 
29.04.17
23:30
(14) Это внешняя компонента 1С++ (1cpp.dll)с сайта 1cpp.ru.
Очень сильная штука, и там используется SQL, приправленный обычными для 1С именами объектов.