Имя: Пароль:
1C
 
Почему запрос возвращает пустую таблицу?
0 Sedych
 
19.10.23
17:27
Подскажите, почему не работает коррелированный запрос. В запросах довольно слаб, на форуме только зарегался. Имеется документ "ОтчетПоПродажам", в табличной части которого Номенклатура и Дата продажи. Пытаюсь найти множество документов, у которых номенклатура совпадает, а дата продажи меньше, каждый предыдущего. Возвращается пустой результат. Запрос
<query>
ВЫБРАТЬ                                                  
    ОтчетПоПродажамПродажи.Ссылка КАК Ссылка,
    ОтчетПоПродажамПродажи.Номенклатура КАК Номенклатура,
    ОтчетПоПродажамПродажи.ДатаПродажи КАК ДатаПродажи,
ИЗ
    Документ.ОтчетПоПродажам.Продажи КАК ОтчетПоПродажамПродажи
ГДЕ
    ОтчетПоПродажамПродажи.Ссылка В (
        ВЫБРАТЬ
            ОтчетПоПродажамКорр.Ссылка КАК Ссылка
        ИЗ
            Документ.ОтчетПоПродажам.Продажи КАК ОтчетПоПродажамКорр
        ГДЕ
            ОтчетПоПродажамПродажи.Номенклатура = ОтчетПоПродажамКорр.Номенклатура
            И ОтчетПоПродажамПродажи.ДатаПродажи < ОтчетПоПродажамКорр.ДатаПродажи)

</query>
Документы есть, например условно есть документы состава:
Номенкл ДатаПродажи   Ссылка
Т1      01.10.23       0001
Т5      10.10.23       0001
Т4      25.09.23       0001
Т1      01.06.23       0002
Т2      01.03.23       0003
Т5      01.03.23       0003
Т1      01.01.23       0004
Т5      01.01.23       0004

Если делаю соединение таблицы самой с собой, то нужный результат получается, но хочу понять логику решения коррелированным запросом
1 Donkey_hot
 
19.10.23
17:32
(0) Вы уверены, что он возвращает пустую таблицу, а не валится где-то с ошибкой? Откуда вложенный (в Вашей терминологии - коррелированный) может знать о псевдонимах внешнего запроса? Конструктором этот запрос открывается?
2 Tatitutu
 
19.10.23
17:35
Какая конфигурация !


вот это выбросить и переписать:

что вернет

ВЫБРАТЬ
            ОтчетПоПродажамКорр.Ссылка КАК Ссылка
        ИЗ
            Документ.ОтчетПоПродажам.Продажи КАК ОтчетПоПродажамКорр
        ГДЕ
            ОтчетПоПродажамПродажи.ДатаПродажи > НачалоГода(текущаяДата())

на пальцах :

ОтчетПоПродажамКорр.Номенклатура - откуда ?
3 Donkey_hot
 
19.10.23
17:40
(1) Кстати, любопытно, но этот очевидно некорректный запрос открывается конструктором. При этом если попытаться открыть конструктором только вложенный запрос - ожидаемо получаем ошибку.
4 shuhard
 
19.10.23
18:15
(2) [ОтчетПоПродажамКорр.Номенклатура - откуда ?]
запрос коррелированный, это тот же Документ.ОтчетПоПродажам.Продажи
5 shuhard
 
19.10.23
18:16
(1) [Откуда вложенный (в Вашей терминологии - коррелированный) ]
это не вложенный, это именно коррелированный, в нем внутренний запрос обращается к внешнему
6 shuhard
 
19.10.23
18:23
(5) + 1 классический пример
Вопрос о лицензиях
7 shuhard
 
19.10.23
18:24
(6) Есть задача, в запросе с группировками по организациям и контрагентам (акционерам) нужно рассчитать показатель (нераспределенную прибыль) для каждой организации.
Задача осложнена тем, что есть еще группировка по периодам :(
Расчет нераспределенной прибыли - это один запрос, поэтому идеальным решением был бы вложенный запрос, возвращающий значение для каждой организации для каждого из периодов.
Проблема лишь в том, что 1С не поддерживает, как я понял, коррелированных запросов, то есть обращения из вложенного запроса к полям родительского запроса, кроме варианта с условием "В", пример есть в файле V8adddoc807.htm, приведен ниже.

Есть конструктивные идеи, КРОМЕ выгрузки в ТЗ или ручной обработки результата запроса?

===ПРИМЕР ИЗ ФАЙЛА V8adddoc807.htm===
Заметим, что из запроса операции В возможно обращение к полям таблиц, которые встречались во внешнем запросе до появления операции.

Пример:

// Выбрать названия товаров, которые присутствовали в расходных накладных
ВЫБРАТЬ
Товары.Наименование
ИЗ
Справочник.Товары КАК Товары
ГДЕ
Товары.Ссылка В
(
    ВЫБРАТЬ
      РасхНаклСостав.Товар
    ИЗ
      Документ.РасхНакл.Состав КАК РасхНаклСостав
    ГДЕ
      РасхНаклСостав.Товар = Товары.Ссылка
)
===КОНЕЦ ПРИМЕРА ИЗ ФАЙЛА V8adddoc807.htm===
8 Donkey_hot
 
19.10.23
18:31
(5) Воистину... век живи - век учись...
9 Sedych
 
20.10.23
14:07
Кажется немного разобрался с коррелированными запросами. Почему то в голове засело, что "В" в данном случае это Select from select. Но это конечно не так. Для отладки выполнил внутренний запрос отдельно для каждой строки внешнего. И увидел (а так и должно быть), что нет ни одной строки внешнего, для которой она возвращается в составе внутреннего. И "В" всегда возвратит Ложь, а значит результат будет пустой. А другие возможности корреляции в 1С не возможны. Поэтому коррелированный запрос имеет смысл применять только для задач, в которых внешняя запись войдет в результат исполнения внутреннего, хотя бы для части строк. Может быть кто то будет тоже с этим разбираться, прочитает)
AdBlock убивает бесплатный контент. 1Сергей