Имя: Пароль:
1C
1С v8
Выбрать ближайших предков по иерархии
0 mistеr
 
29.07.13
12:33
Объясню на примере Номенклатуры и РС СчетаУчетаНоменклатуры. Есть список номенклатуры, например, выбираем из ТЧ документа. Для каждой позиции нужно получить счета учета из регистра СчетаУчетаНоменклатуры. Они могут быть заданы как для элементов, так и для групп любого уровня. Приоритет имеет запись, ближайшая по иерархии.

В типовых, если кто ковырялся, это реализуется запросами в цикле. Мне же нужно только запросом, так как это будет только часть большого и сложного запроса.

У самого идеи есть, но хочется послушать тех, кто уже реализовывал.
1 IШаман
 
29.07.13
12:35
Выбирай их в отдельную таблицу, и из нее уже выбирай.
2 mistеr
 
29.07.13
13:07
(1) Не понял, поясни кодом, пожалуйста.
3 Feunoir
 
29.07.13
13:15
Тут не счета учета, но принцип хранения точно такой-же.



    Запрос.Текст =
        "ВЫБРАТЬ
        |    Номенклатура.Ссылка КАК Номенклатура,
        |    Номенклатура.Ссылка КАК Родитель,
        |    1 КАК ПорядокСортировки
        |ПОМЕСТИТЬ вт_ИерархияНоменклатуры
        |ИЗ
        |    Справочник.Номенклатура КАК Номенклатура
        |ГДЕ
        |    Номенклатура.Ссылка = &Номенклатура
        |
        |ОБЪЕДИНИТЬ
        |
        |ВЫБРАТЬ
        |    Номенклатура.Ссылка,
        |    Номенклатура.Родитель,
        |    2
        |ИЗ
        |    Справочник.Номенклатура КАК Номенклатура
        |ГДЕ
        |    Номенклатура.Ссылка = &Номенклатура
        |
        |ОБЪЕДИНИТЬ
        |
        |ВЫБРАТЬ
        |    Номенклатура.Ссылка,
        |    Номенклатура.Родитель.Родитель,
        |    3
        |ИЗ
        |    Справочник.Номенклатура КАК Номенклатура
        |ГДЕ
        |    Номенклатура.Ссылка = &Номенклатура
        |
        |ОБЪЕДИНИТЬ
        |
        |ВЫБРАТЬ
        |    Номенклатура.Ссылка,
        |    Номенклатура.Родитель.Родитель.Родитель,
        |    4
        |ИЗ
        |    Справочник.Номенклатура КАК Номенклатура
        |ГДЕ
        |    Номенклатура.Ссылка = &Номенклатура
        |
        |ОБЪЕДИНИТЬ
        |
        |ВЫБРАТЬ
        |    Номенклатура.Ссылка,
        |    Номенклатура.Родитель.Родитель.Родитель.Родитель,
        |    5
        |ИЗ
        |    Справочник.Номенклатура КАК Номенклатура
        |ГДЕ
        |    Номенклатура.Ссылка = &Номенклатура
        |
        |ИНДЕКСИРОВАТЬ ПО
        |    Родитель,
        |    Номенклатура
        |;
        |
        |////////////////////////////////////////////////////////////////////////////////
        |ВЫБРАТЬ РАЗРЕШЕННЫЕ
        |    вт_ИерархияНоменклатуры.Номенклатура КАК Номенклатура,
        |    вт_ИерархияНоменклатуры.Родитель,
        |    вт_ИерархияНоменклатуры.ПорядокСортировки КАК ПорядокСортировки,
        |    гт_СоответствиеЭтаповТЦП.Этап
        |ПОМЕСТИТЬ вт_СоответствиеЭтапов
        |ИЗ
        |    вт_ИерархияНоменклатуры КАК вт_ИерархияНоменклатуры
        |        ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.гт_СоответствиеЭтаповТЦП КАК гт_СоответствиеЭтаповТЦП
        |        ПО вт_ИерархияНоменклатуры.Родитель = гт_СоответствиеЭтаповТЦП.Номенклатура
        |
        |ИНДЕКСИРОВАТЬ ПО
        |    Номенклатура,
        |    ПорядокСортировки
        |;
        |
        |////////////////////////////////////////////////////////////////////////////////
        |ВЫБРАТЬ РАЗРЕШЕННЫЕ
        |    вт_СоответствиеЭтапов.Номенклатура КАК Номенклатура,
        |    МИНИМУМ(вт_СоответствиеЭтапов.ПорядокСортировки) КАК ПорядокСортировки
        |ПОМЕСТИТЬ вт_МинимумЭтапы
        |ИЗ
        |    вт_СоответствиеЭтапов КАК вт_СоответствиеЭтапов
        |
        |СГРУППИРОВАТЬ ПО
        |    вт_СоответствиеЭтапов.Номенклатура
        |
        |ИНДЕКСИРОВАТЬ ПО
        |    Номенклатура,
        |    ПорядокСортировки
        |;
        |
        |////////////////////////////////////////////////////////////////////////////////
        |ВЫБРАТЬ РАЗРЕШЕННЫЕ
        |    Спр.Ссылка КАК Номенклатура,
        |    ЕСТЬNULL(вт_СоответствиеЭтапов.Родитель, ЗНАЧЕНИЕ(Справочник.Номенклатура.ПустаяСсылка)) КАК Регистр,
        |    ЕСТЬNULL(вт_СоответствиеЭтапов.Этап, ЗНАЧЕНИЕ(Перечисление.гт_ЭтапыРабот.ПустаяСсылка)) КАК Этап
        |ИЗ
        |    Справочник.Номенклатура КАК Спр
        |        ЛЕВОЕ СОЕДИНЕНИЕ вт_СоответствиеЭтапов КАК вт_СоответствиеЭтапов
        |            ВНУТРЕННЕЕ СОЕДИНЕНИЕ вт_МинимумЭтапы КАК вт_МинимумЭтапы
        |            ПО вт_СоответствиеЭтапов.ПорядокСортировки = вт_МинимумЭтапы.ПорядокСортировки
        |                И вт_СоответствиеЭтапов.Номенклатура = вт_МинимумЭтапы.Номенклатура
        |        ПО Спр.Ссылка = вт_СоответствиеЭтапов.Номенклатура
        |ГДЕ
        |    Спр.Ссылка = &Номенклатура
        |;
        |
        |////////////////////////////////////////////////////////////////////////////////
        |УНИЧТОЖИТЬ вт_СоответствиеЭтапов
        |;
        |
        |////////////////////////////////////////////////////////////////////////////////
        |УНИЧТОЖИТЬ вт_МинимумЭтапы
        |;
        |
        |////////////////////////////////////////////////////////////////////////////////
        |УНИЧТОЖИТЬ вт_ИерархияНоменклатуры";

4 mistеr
 
29.07.13
13:47
(3) Спасибо, это вариант. Хотя ограничивать число уровней конечно не хотелось бы. вт_ИерархияНоменклатуры можно и кодом построить, но... хочется запросом.
5 Feunoir
 
29.07.13
14:06
(4) К сожалению синтаксис языка запросов 1С не позволяет построить запрос к неограниченной иерархии.
6 ИС-2
 
naïve
29.07.13
14:18
(5) отчего же. Итоги только иерархия. Д
ругое дело, что автору не подходит т.к ему надо все в одном запросе сделать