Имя: Пароль:
1C
1С v8
Запрос по остаткам с обходом по иерархии
0 yur4egg
 
11.09.15
09:12
Первоначальный вариант запроса:
0)

ТекстЗапроса=
    "ВЫБРАТЬ
    |    ОстаткиОстатки.Номенклатура КАК Товар,
    |    ОстаткиОстатки.Склад КАК Склад,
    |    ОстаткиОстатки.КоличествоОстаток КАК Остаток
    |ИЗ
    |    РегистрНакопления.Остатки.Остатки КАК ОстаткиОстатки
    |        
    |ИТОГИ
    |    СУММА(Остаток)
    |ПО
    |    Товар ТОЛЬКО ИЕРАРХИЯ,
    |";

................

        ТЗ = Запрос.Выполнить().Выгрузить(ОбходРезультатаЗапроса.ПоГруппировкамСИерархией);

В ТЗ возвращает дерево значений с иерархией по группам справочника.

Если добавить в эту же таблицу остатки резерва, тогда запрос такой:

1)

ТекстЗапроса=
    "ВЫБРАТЬ
    |    ОстаткиОстатки.Номенклатура КАК Товар,
    |    ОстаткиОстатки.Склад КАК Склад,
    |    ОстаткиОстатки.КоличествоОстаток КАК Остаток,
        |    РезервыОстатки.КоличествоОстаток КАК Резерв
    |ИЗ
    |    РегистрНакопления.Остатки.Остатки КАК ОстаткиОстатки
    |        ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.Резервы.Остатки КАК РезервыОстатки
    |        ПО ОстаткиОстатки.Номенклатура = РезервыОстатки.Номенклатура
    |            И ОстаткиОстатки.Склад = РезервыОстатки.Склад
    |        
    |ИТОГИ
    |    СУММА(Остаток)
    |ПО
    |    Товар ТОЛЬКО ИЕРАРХИЯ,
    |";
    
И тут все правильно выгружается. Но проблема в том, что в запрос не попадают позиции зарезервированные, но отсутствующие на остатках. Заменяю соединение ЛЕВОЕ на ПОЛНОЕ, дерево формируется, но зарезервированные позиции появляются с пустыми значениями там, где нет остатков. Ставлю проверку на NULL и окончательный вид запроса такой:

2)

        ТекстЗапроса=
    "ВЫБРАТЬ
    |    ЕСТЬNULL(ОстаткиОстатки.Номенклатура, РезервыОстатки.Номенклатура) КАК Товар,
    |    ОстаткиОстатки.Склад КАК Склад,
    |    ОстаткиОстатки.КоличествоОстаток КАК Остаток,
    |    РезервыОстатки.КоличествоОстаток КАК Резерв
    |ИЗ
    |    РегистрНакопления.Остатки.Остатки КАК ОстаткиОстатки
    |        ПОЛНОЕ СОЕДИНЕНИЕ РегистрНакопления.Резервы.Остатки КАК РезервыОстатки
    |        ПО ОстаткиОстатки.Номенклатура = РезервыОстатки.Номенклатура
    |            И ОстаткиОстатки.Склад = РезервыОстатки.Склад
    |ИТОГИ
    |    СУММА(Остаток)
    |ПО
    |    Товар ТОЛЬКО ИЕРАРХИЯ,
    |;

Все наименования попадают правильно, но сбивается иерархия, в дереве только первая запись - это пустая группа, а внутри идут все подряд позиции. Пробовал помещать все во временную таблицу, а вторым запросом брать данные из нее, иерархия вернулась, но содержимое - как при ЛЕВОМ соединении, хотя указано ПОЛНОЕ.
Подскажите, у меня больше идей нет (((
1 DimGan
 
11.09.15
10:32
Закинь в подзапрос.
Требовать и эффективности, и гибкости от одной и той же программы — все равно, что искать очаровательную и скромную жену... по-видимому, нам следует остановиться на чем-то одном из двух. Фредерик Брукс-младший