В ячейке таблицы показать всех родителей номенклатуры.

1. user1004898 28 16.05.19 09:31 Сейчас в теме
В запрос добавил новое поле Родитель.
Своим кодом вывожу в это поле первого родителя номенклатуры. Если его нет - второго, если нет второго - то третьего.
А если хочется вывести всех Родителей: и первого и второго и третьего?
Никак? Или через функции как-то можно ?


ВЫБОР
	КОГДА СпрНоменклатура.Родитель = ""
		ТОГДА СпрНоменклатура.Родитель.Родитель
	КОГДА СпрНоменклатура.Родитель.Родитель = ""
		ТОГДА СпрНоменклатура.Родитель.Родитель.Родитель
	КОГДА СпрНоменклатура.Родитель.Родитель.Родитель = ""
		ТОГДА СпрНоменклатура.Родитель.Родитель.Родитель.Родитель
	КОГДА СпрНоменклатура.Родитель.Родитель.Родитель.Родитель = ""
		ТОГДА СпрНоменклатура.Родитель.Родитель.Родитель.Родитель.Родитель
	ИНАЧЕ СпрНоменклатура.Родитель
КОНЕЦ
Показать


Пример ячейки:
Стул / Кухонная мебель / Мебель / Для дома.
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. ErshKUS 2 16.05.19 09:42 Сейчас в теме
(1) если отвечать прямо на вопрос, то:
СпрНоменклатура.Родитель.Наименование + " / " + СпрНоменклатура.Родитель.Родитель.Наименование + " / " + СпрНоменклатура.Родитель.Родитель.Родитель.Наименование

и так далее сколько нужно

Но у вас в запросе есть проблемы:
1. мне не ясно зачем проверять ссылочный тип на пустую строку СпрНоменклатура.Родитель = "", правильно брать Наименование (как в примере выше)
2. если первое условие будет пустым, то возьмётся СпрНоменклатура.Родитель.Родитель и не важно пустое оно или нет
9. ErshKUS 2 16.05.19 10:06 Сейчас в теме
Если нужно чтоб из запроса уже выходил Стул / Кухонная мебель / Мебель, то тут наверно только (2)
3. SlavaKron 16.05.19 09:42 Сейчас в теме
Если допускается обработка результата запроса во внутреннем языке, то:
ВЫБРАТЬ
	Номенклатура.Ссылка КАК Ссылка
ИЗ
	Справочник.Номенклатура КАК Номенклатура
ГДЕ
	Номенклатура.Ссылка = &Ссылка
ИТОГИ ПО
	Ссылка ТОЛЬКО ИЕРАРХИЯ
7. user1004898 28 16.05.19 09:53 Сейчас в теме
(3)
не совсем понял, как это внедряется в мой запрос?

ВЫБРАТЬ
	СпрНоменклатура.Ссылка КАК Ссылка,
	СпрНоменклатура.Код КАК Код,
	СпрНоменклатура.Артикул КАК Артикул,
	СпрНоменклатура.ВидНоменклатуры КАК ВидНоменклатуры,
	СпрНоменклатура.ЕдиницаИзмерения КАК ЕдиницаИзмерения,
	СпрНоменклатура.СтавкаНДС КАК СтавкаНДС,
	ВЫБОР
		КОГДА ТоварыОрганизацийОстатки.КоличествоОстаток = ""
			ТОГДА "0"
		ИНАЧЕ ТоварыОрганизацийОстатки.КоличествоОстаток
	КОНЕЦ КАК КоличествоОстаток,
	СпрНоменклатура.Родитель
ИЗ
	Справочник.Номенклатура КАК СпрНоменклатура
		ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыОрганизаций.Остатки КАК ТоварыОрганизацийОстатки
		ПО СпрНоменклатура.Ссылка = ТоварыОрганизацийОстатки.АналитикаУчетаНоменклатуры.Номенклатура.Ссылка
ГДЕ
	НЕ СпрНоменклатура.ЭтоГруппа
Показать
8. SlavaKron 16.05.19 10:04 Сейчас в теме
(7) Видимо никак, раз вы хотите решить задачу только в рамках запроса. Делайте как в (2)
ВЫБОР
	КОГДА СпрНоменклатура.Родитель = &Пустая
		ТОГДА СпрНоменклатура.Наименование
	КОГДА СпрНоменклатура.Родитель.Родитель = &Пустая
		ТОГДА СпрНоменклатура.Наименование + " / " + СпрНоменклатура.Родитель.Наименование
	КОГДА СпрНоменклатура.Родитель.Родитель.Родитель = &Пустая
		ТОГДА СпрНоменклатура.Наименование + " / " + СпрНоменклатура.Родитель.Наименование + " / " + СпрНоменклатура.Родитель.Родитель.Наименование
	КОГДА СпрНоменклатура.Родитель.Родитель.Родитель.Родитель = &Пустая
		ТОГДА СпрНоменклатура.Наименование + " / " + СпрНоменклатура.Родитель.Наименование + " / " + СпрНоменклатура.Родитель.Родитель.Наименование + " / " + СпрНоменклатура.Родитель.Родитель.Родитель.Наименование
	ИНАЧЕ СпрНоменклатура.Наименование + " / " + СпрНоменклатура.Родитель.Наименование + " / " + СпрНоменклатура.Родитель.Родитель.Наименование + " / " + СпрНоменклатура.Родитель.Родитель.Родитель.Наименование + " / " + СпрНоменклатура.Родитель.Родитель.Родитель.Родитель.Наименование
КОНЕЦ КАК ПолноеНаименование
Показать
13. user1004898 28 16.05.19 11:29 Сейчас в теме
(8)
тура.Родитель.Родитель.Родитель.Родитель = &Пустая
ТОГДА СпрНоменклатура.Наименование + " / " + СпрНоменклатура.Родитель.Наименование + " / " + СпрНоменклатура.Родитель.Родитель.Наименование + " / " + СпрНоменклатура.Родитель.Родитель.Родитель.Наименование
ИНАЧЕ СпрНоменклатура.Наименование + " / " + СпрНоменклатура.Родитель.Наименование + " / " + СпрНоменклатура.Родитель.Родитель.Наименование + " / " + СпрНоменклатура.Родитель.Родитель.Родитель.Наименование + " / " + СпрНоменклатура.Родитель.Родитель.Родитель.Родитель.Наименование
КОНЕЦ КАК ПолноеНаименование

Оказывается мне нужен какой то цикл.
Так как в одной номенклатуры уровень родителей может быть Один, а в некоторых до 5.
И данный рекомендованный, да и мой код, выводит либо всех родителей пятого уровня, либо первого.
Второго, третьего - нет.
14. SlavaKron 16.05.19 11:37 Сейчас в теме
(13) Вы что-то путаете. Данное выражение будет выводить ровно столько родителей, сколько есть, но не более 4.
16. user1004898 28 16.05.19 11:43 Сейчас в теме
(14)
нет, не путаю. если номенклатура как раз с родителем четвертого уровня - то выводит и наименование и родителей.
но если это товар в группе, который как второй родитель, то ячейка пустая.
19. SlavaKron 16.05.19 11:47 Сейчас в теме
(16) Ясно, вы должно быть не верно указали параметр &Пустая. Мне не известно в каком контексте вы используете запрос. Если нет возможности задать параметр, можете заменить &Пустая на ЗНАЧЕНИЕ(Справочник.Номенклатура.ПустаяСсылка)
20. user1004898 28 16.05.19 11:49 Сейчас в теме
(19)
ЗНАЧЕНИЕ(Справочник.Номенклатура.ПустаяСсылка)

я использовал
 = ""
вместо
= &Пустая
21. SlavaKron 16.05.19 11:52 Сейчас в теме
(20) В (2) вам уже указали что сравнивать ссылочный тип со строкой не верно – результат всегда будет ложь, всегда будет выполняться только код после "ИНАЧЕ".
22. user1004898 28 16.05.19 11:57 Сейчас в теме
(21)
да, пожалуй тут и была моя не внимательность.
тогда беру слова обратно. код годный.
убираю только СпрНоменклатура.Наименование, так как мне нужны именно Родители
24. ErshKUS 2 16.05.19 12:28 Сейчас в теме
(22) по мне, использовать
ЗНАЧЕНИЕ(Справочник.Номенклатура.ПустаяСсылка)
даже предпочтительней, проще запрос скопировать и воткнуть в консоль, если надо что то проверить.
4. independ 1520 16.05.19 09:44 Сейчас в теме
Номенклатура.Родитель.ПолноеНаименование()
5. ErshKUS 2 16.05.19 09:50 Сейчас в теме
(4) с ремаркой что это код 1с, а не для запроса. (судя по запросу, человек может не понять этого)
6. user1004898 28 16.05.19 09:51 Сейчас в теме
(5) мне для запроса.
вижу, что не мое
10. x_x 2 16.05.19 10:31 Сейчас в теме
Вообще ваша задача решаема и не сильно сложная. попытаюсь объяснить.
Для начала вам потребует две схемы компоновки данных в 1 вы собираете данные а во второй анализаируйте отбираете и выводите.
Пример самый простой:
задача вывести в отчет полное наименование номенклатуры и ссылку.
1. создадим основную компоновку:

"ОсновнаяСхемаКомпоновкиДанных"
ВЫБРАТЬ
Номенклатура.Ссылка
ИЗ
Справочник.Номенклатура КАК Номенклатура

все по умолчанию.
2. создадим основную схему компоновки и в ней уже настроим при необходимости отборы таблица группировки и тд.:
а) набор данных у нас будет не запрос а объект.
б) имя объекта, содержащего данные "ВнешнийНаборДанных"
в) тут уже указываем все поля что нам необходимы с первой компоновки и те что мы создадим для вывода в данном примере "ссылка" и
"полноенаименование".
г) указываем типы полей.
д) указываем отборы, ипрочие примочки.

3. обработаем теперь это все в модуле нашего отчета
а) создадим процедуру "ПриКомпоновкеРезультата"


СтандартнаяОбработка = Ложь;

КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;

МакетКомпоновки = КомпоновщикМакета.Выполнить(
ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных"), // Первая схема компоновки
ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных").НастройкиПоУмолчанию, // Получаем настройки из первой схемы компоновки
ДанныеРасшифровки,
,
Тип("ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений")
);

ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновки.Инициализировать(МакетКомпоновки,,ДанныеРасшифровки);

ДокументРезультат.Очистить();

ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений;
ТаблицаРезультат = Новый ТаблицаЗначений;
ПроцессорВывода.УстановитьОбъект(ТаблицаРезультат);
ПроцессорВывода.Вывести(ПроцессорКомпоновки);

// Выгрузили результат компоновки в таблицу значений. Теперь можем делать с ней все, что хотим:
ТаблицаРезультат.Колонки.Добавить("ПолноеНаименование"); // Не забываем добавить поле "НоваяКолонка" и в набор данных схемы "СхемаКомпоновкиДанныхВнешняя"

Если ТаблицаРезультат.Колонки.Найти("Ссылка") <> Неопределено Тогда
Для каждого СтрокаТЗ Из ТаблицаРезультат Цикл
СтрокаТЗ.ПолноеНаименование = СтрокаТЗ.Ссылка.ПолноеНаименование();

КонецЦикла;
КонецЕсли;

// Возвращаем модифицированную таблицу значений обратно в СКД, но в другую схему
ВнешнийНаборДанных = Новый Структура;
ВнешнийНаборДанных.Вставить("ВнешнийНаборДанных", ТаблицаРезультат);

МакетКомпоновки = КомпоновщикМакета.Выполнить(
ПолучитьМакет("Макет"), // Вторая схема компоновки
КомпоновщикНастроек.ПолучитьНастройки(), // Текущие настройки отчета
ДанныеРасшифровки,
);
ПроцессорКомпоновки.Инициализировать(МакетКомпоновки, ВнешнийНаборДанных, ДанныеРасшифровки);
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
ПроцессорВывода.УстановитьДокумент(ДокументРезультат);
ПроцессорВывода.Вывести(ПроцессорКомпоновки);


задача выполнена. пирожки я знаю где;)
Прикрепленные файлы:
11. user1004898 28 16.05.19 10:45 Сейчас в теме
(10)
Спасибо за совет, но это не по моей идее.
15. SlavaKron 16.05.19 11:42 Сейчас в теме
(10) Вы уверены, что в первую схему следует подставлять настройки по умолчанию? Если в справочнике 100к элементов, ваш код будет выполнять весьма тяжелую функцию ПолноеНаименование() для всех 100к элементов, даже если по результатам отборов, нужно обработать только один элемент. Логичнее брать КомпоновщикНастроек.ПолучитьНастройки(). Да и обработка ДанныхРасшифровки во вспомогательной схеме ни к чему.
17. x_x 2 16.05.19 11:44 Сейчас в теме
(15) да вы верно говорите, но перепутал :) лучше канешно в первую отборы, во второй схеме лучше в результатом. быстрее писал чем думал.
12. x_x 2 16.05.19 10:54 Сейчас в теме
почему?
С элементом строки вы работаете уже через объект.
нужны родители, ок - отсеките последний уровень, или нужен последний родитель ок сделайте маленькую рекурсию и по максимальному вложению работайте с ней.
Тут вы можете даже получить у элемента строки максимальное количество подуровней и уже оттолкнутся от этого.
18. x_x 2 16.05.19 11:47 Сейчас в теме
так полноенаименование() выедет всю цепочку родителей что есть х/р*(н+1).../имя
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот