Имя: Пароль:
1C
 
Как найти верхний элемент справочника Номенклатура
0 pro3ri
 
21.08.15
13:44
Добрый день!
Можно ли это сделать запросом?

ВЫБРАТЬ РАЗЛИЧНЫЕ
    ПриходныйОрдерНаТоварыТовары.Номенклатура,
    ПриходныйОрдерНаТоварыТовары.Ссылка,
    ПриходныйОрдерНаТоварыТовары.Номенклатура.БазоваяЕдиницаИзмерения,
    ПриходныйОрдерНаТоварыТовары.Номенклатура.Родитель
ИЗ
    Документ.ПриходныйОрдерНаТовары.Товары КАК ПриходныйОрдерНаТоварыТовары
ГДЕ
    ПриходныйОрдерНаТоварыТовары.Ссылка.Дата МЕЖДУ &ДатаНачала И &ДатаОкончания
    И ПриходныйОрдерНаТоварыТовары.Номенклатура.Родитель = ЗНАЧЕНИЕ(Справочник.Номенклатура.ПустаяСсылка)

так не выходит справочник многоуровневой, не все же риходныйОрдерНаТоварыТовары.Номенклатура.Родитель.Родитель.Родитель.Родитель = ЗНАЧЕНИЕ(Справочник.Номенклатура.ПустаяСсылка) писать... Есть универсальное решение?
1 ДенисЧ
 
21.08.15
13:45
Нет.
Транзитивное замыкание в рамках языка запросов неразрешимо
2 butterbean
 
21.08.15
13:46
(0) можешь добавить реквизит родительВерхнегоУровня в справочник и поддерживать его в актуальном состоянии
3 DCKiller
 
21.08.15
13:51
Я знаю, как это сделать 2-мя запросами, с выгрузкой в ТЗ, а вот чтоб через 1... вряд ли.
4 Enterprise
 
21.08.15
13:54
А так не взлетит что ли?

ВЫБРАТЬ РАЗЛИЧНЫЕ
    ПриходныйОрдерНаТоварыТовары.Номенклатура,
    ПриходныйОрдерНаТоварыТовары.Ссылка,
    ПриходныйОрдерНаТоварыТовары.Номенклатура.БазоваяЕдиницаИзмерения,
    ПриходныйОрдерНаТоварыТовары.Номенклатура.Родитель
ИЗ
    Документ.ПриходныйОрдерНаТовары.Товары КАК ПриходныйОрдерНаТоварыТовары
ГДЕ
    ПриходныйОрдерНаТоварыТовары.Ссылка.Дата МЕЖДУ &ДатаНачала И &ДатаОкончания
ИТОГИ ПО
    Номенклатура ТОЛЬКО ИЕРАРХИЯ
5 pro3ri
 
21.08.15
14:05
(4) нет, в поле ПриходныйОрдерНаТоварыТовары.Номенклатура.Родитель показывает промежуточные папки иерархии
6 За1СьЭтотМир
 
21.08.15
14:08
(0) Сформируй предварительно соответствие
"Любая папка в группе " - "Самая верхняя папка"

И запихни её в свой запрос. Самое простое ИМХО.
7 Enterprise
 
21.08.15
14:08
(5) Родитель там не нужен, надо убрать.
8 Enterprise
 
21.08.15
14:13
(5) Если обходить результат запроса по группировкам, то получишь желаемое
9 pro3ri
 
21.08.15
14:36
написал ЗапросАгрегат = Новый Запрос;
    ЗапросАгрегат.Текст = "ВЫБРАТЬ РАЗЛИЧНЫЕ
     |    ПриходныйОрдерНаТоварыТовары.Номенклатура КАК Номенклатура,
     |    ПриходныйОрдерНаТоварыТовары.Ссылка,
     |    ПриходныйОрдерНаТоварыТовары.Номенклатура.БазоваяЕдиницаИзмерения
     |ИЗ
     |    Документ.ПриходныйОрдерНаТовары.Товары КАК ПриходныйОрдерНаТоварыТовары
     |ГДЕ
     |    ПриходныйОрдерНаТоварыТовары.Ссылка.Дата МЕЖДУ &ДатаНачала И &ДатаОкончания
     |ИТОГИ ПО
     |    Номенклатура ТОЛЬКО ИЕРАРХИЯ";
    
     ЗапросАгрегат.УстановитьПараметр("ДатаНачала", НачПериода);
     ЗапросАгрегат.УстановитьПараметр("ДатаОкончания", КонецДня(КонПериода));
    
     РезультатЗапроса = ЗапросАгрегат.Выполнить();
     ВыборкаУровень1 = РезультатЗапроса.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкамСИерархией);
     Пока ВыборкаУровень1.Следующий() Цикл
    
         сообщить(ВыборкаУровень1);
    
     КонецЦикла;

так работает. благодарю.
10 User_Agronom
 
21.08.15
15:07
(0) Была подобная задача недавно.
Пришел к выводу, что запросом нельзя. Тестировал разные циклы. Самым оптимальным (по скорости работы) получился такой вариант:

Функция НайтиВерхнийУровень(Элемент)
  Если Элемент.Родитель = Справочники.Номенклатура.ПустаяСсылка() тогда
    Возврат Элемент
  Иначе
    Возврат НайтиВерхнийУровень(Элемент.Родитель)
  КонецЕсли;
КонецФункции

Алгоритм был такой: получал список элементов (по условиям) запросом. Выгружал в ТЗ. Добавлял колонку "Верхний уровень". Циклом пробегал по ТЗ, заполнял колонку с помощью функции. Полученную ТЗ передавал в итоговый запрос параметром.

(9) Но мне нужно было соответствие: элемент - верхний уровень.
11 Enterprise
 
21.08.15
15:21
(10) "Но мне нужно было соответствие: элемент - верхний уровень".
В чем сложность после запроса сделать соответствие?
12 User_Agronom
 
21.08.15
15:40
(11) Я после запроса и сделал. ТЗ из двух колонок.
И ТЗ передал в итоговый запрос параметром.
13 Enterprise
 
21.08.15
16:01
(12) После запроса в (4) надо просто обойти результат запроса и заполнить соответствие, вот я про что)
14 Sserj
 
21.08.15
16:05
(10) Да ну. Когда это рекурсия стала быстрее обычного цикла?
Неужели это будет медленнее:

Пока Истина Цикл
Если Элемент.Родитель = Справочники.Номенклатура.ПустаяСсылка() тогда
Прервать;
Иначе
Элемент = Элемент.Родитель;
КонецЕсли;
КонецЦикла
15 User_Agronom
 
21.08.15
16:09
(13) Я не это имел ввиду. Мне для итогового запроса нужны были пары. Нужно было выстроить элементы по иерархии, но исключив промежуточные уровни.

И было именно так:
Первый запрос возвращал список ссылок (без итогов и прочих вещей). Затем цикл и полученная ТЗ передавалась в итоговый запрос.

(14) Сам был удивлён. Мы с коллегой несколько раз тестировали. Хотя может частный случай был.
16 Ildarovich
 
21.08.15
16:10
Избитая тема. Решение есть. Вот статья раз:
http://catalog.mista.ru/public/158512/.
Вот статья два:
http://catalog.mista.ru/public/160707/. В ней пример 3 (прародители).
Вот обсуждение с примером запроса:
Как получить родителя верхней группы спр.подразделенияорганизаций зуп 2.5 .
17 pro3ri
 
22.08.15
09:34
(16) ок благодарствую