Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Номенклатура и её родители
Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7 > Программисту > Программирование в 1С Предприятие 8.3
Bon Jovi
Конфигурация: Trade (10.3.29.1) (http://v8.1c.ru/trade/), версия: 8.3.11.2867, обычные формы.
Добрый день. Подскажите пожалуйста в следующем. Нужно запросом получить номенклатуру, родитель которой (или родитель родителя, или родитель родителя родителя и т.д.) имеет установленную галка (некий признак). В инете много тем есть о получении всех родителей номенклатуры (через Итоги по только иерархия), но как наложить условие (отбор)?
denis84
Bon Jovi @ Сегодня, 13:37 необходимо зарегистрироваться для просмотра ссылки ,
необходимо зарегистрироваться для просмотра ссылки

необходимо зарегистрироваться для просмотра ссылки

Добавить в условии что - то типа того
                   
                |ГДЕ
                | Номенклатура.Признак = &ТекущийЭлементНоменклатуры";

                  Запрос.УстановитьПараметр("ТекущийЭлементНоменклатуры", Признак);
Bon Jovi
denis84 @ Сегодня, 14:31 необходимо зарегистрироваться для просмотра ссылки ,
Мне признак нужен не как параметр, а как Истина (всегда). А если его задать в условии как вы написали, то он будет фильтровать только по прямому родителю номенклатуры и поэтому не покажет номенклатуру, у которой (грубо говоря) родитель.родитель.родитель имеет признак истина.

Плюс мне также не подходит вариант, где количество уровней иерархии ограничено (не подходит вариант: номенклатура.родитель.родитель.родитель и т.д.)

Вариант с "Итоги по только иерархия" показывает очень подробно что я хочу:

1 - Л
1.1 - И
1.1.1
1.1.2
1.2 - Л
1.2.1
2 - И
2.1 - Л
2.1.1

И если правильно наложить условие (отбор), то должны остаться:

1.1.1
1.1.2
2.1.1
Vofka
Обычно уровень вложенности номенклатуры заранее известный, поэтому можно в запросе сразу выбрать всех родителей и сделать соответствующее условие.

|ВЫБРАТЬ
|   Номенклатура.Ссылка
|   Номенклатура.Родитель,
|   Номенклатура.Родитель.Родитель,
|   Номенклатура.Родитель.Родитель.Родитель
|ГДЕ
|   Номенклатура.Родитель.МойПризнак = 1
|   ИЛИ Номенклатура.Родитель.Родитель.МойПризнак = 1
|   ИЛИ Номенклатура.Родитель.Родитель.Родитель.МойПризнак = 1


Если хочется универсально, можно программно узнать сколько уровней вложенности может быть в справочнике и сгенерировать текст запроса программно.
Bon Jovi
Vofka @ Сегодня, 16:10 необходимо зарегистрироваться для просмотра ссылки ,
Согласен. Уровень заранее известен, но нужно сделать универсально и не программно, а сразу запросом. На сколько я знаю, это возможно и довольно просто. Вот только прийти к этому не получается.

Получилось решить следующим образом:
1) отбираю все существующие родители с признаком Истина и помещаю их в ВТ
2) во втором пакете задаю условие : КакойТоОбъект.Родитель В ИЕРАРХИИ (Выбрать ВТ.Родитель Из ВТ)
volodya1122
Цитата(Bon Jovi @ 04.08.20, 16:59) необходимо зарегистрироваться для просмотра ссылки
Согласен. Уровень заранее известен, но нужно сделать универсально и не программно, а сразу запросом


Так это все и будет запросом (програмно)
Вот как-то так можно сформировать запрос (добавить до того что предложил Vofka

ВсегоУровней=99999;
Если Метаданные.Справочники.МойСправочник.ОграничиватьКоличествоУровней  тогда
ВсегоУровней= Метаданные.Справочники.МойСправочник.КоличествоУровней;
КонецЕсли;
// запрос
|ГДЕ
|   Номенклатура.Родитель.МойПризнак = 1";

ДобавкаЗапроса="|   ИЛИ Номенклатура.";
Суфикс="";
Если ВсегоУровней>1 тогда
    Для уровней=2 по ВсегоУровней цикл
        Суфикс=Суфикс+"Родитель.";
        Запрос.Текст = Запрос.Текст + Символы.ПС+"
        ДобавкаЗапроса+Суфикс+"МойПризнак = 1 ";
    КонецЦикла;
КонецЕсли;
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.