Версия для печати темы (https://pro1c.org.ua/index.php?showtopic=60696)

Нажмите сюда для просмотра этой темы в обычном формате

Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7 _ Программирование в 1С Предприятие 8.3 _ Номенклатура и её родители

Автор: Bon Jovi 04.08.20, 12:37

Конфигурация: Trade (10.3.29.1) (http://v8.1c.ru/trade/), версия: 8.3.11.2867, обычные формы.
Добрый день. Подскажите пожалуйста в следующем. Нужно запросом получить номенклатуру, родитель которой (или родитель родителя, или родитель родителя родителя и т.д.) имеет установленную галка (некий признак). В инете много тем есть о получении всех родителей номенклатуры (через Итоги по только иерархия), но как наложить условие (отбор)?

Автор: denis84 04.08.20, 13:31

Bon Jovi @ Сегодня, 13:37 * ,
https://pro1c.org.ua/redirect.php?https://infostart.ru/public/102086/

https://pro1c.org.ua/redirect.php?https://forum.mista.ru/topic.php?id=807163

Добавить в условии что - то типа того

                   
                |ГДЕ
                | Номенклатура.Признак = &ТекущийЭлементНоменклатуры";

                  Запрос.УстановитьПараметр("ТекущийЭлементНоменклатуры", Признак);

Автор: Bon Jovi 04.08.20, 14:50

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 04.08.20, 15:10

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

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


Если хочется универсально, можно программно узнать сколько уровней вложенности может быть в справочнике и сгенерировать текст запроса программно.

Автор: Bon Jovi 04.08.20, 15:59

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

Получилось решить следующим образом:
1) отбираю все существующие родители с признаком Истина и помещаю их в ВТ
2) во втором пакете задаю условие : КакойТоОбъект.Родитель В ИЕРАРХИИ (Выбрать ВТ.Родитель Из ВТ)

Автор: volodya1122 05.08.20, 11:06

Цитата(Bon Jovi @ 04.08.20, 16:59) *
Согласен. Уровень заранее известен, но нужно сделать универсально и не программно, а сразу запросом


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

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

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

Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7
https://pro1c.org.ua