В ячейке таблицы показать всех родителей номенклатуры.
В запрос добавил новое поле Родитель.
Своим кодом вывожу в это поле первого родителя номенклатуры. Если его нет - второго, если нет второго - то третьего.
А если хочется вывести всех Родителей: и первого и второго и третьего?
Никак? Или через функции как-то можно ?
Пример ячейки:
Стул / Кухонная мебель / Мебель / Для дома.
Своим кодом вывожу в это поле первого родителя номенклатуры. Если его нет - второго, если нет второго - то третьего.
А если хочется вывести всех Родителей: и первого и второго и третьего?
Никак? Или через функции как-то можно ?
ВЫБОР
КОГДА СпрНоменклатура.Родитель = ""
ТОГДА СпрНоменклатура.Родитель.Родитель
КОГДА СпрНоменклатура.Родитель.Родитель = ""
ТОГДА СпрНоменклатура.Родитель.Родитель.Родитель
КОГДА СпрНоменклатура.Родитель.Родитель.Родитель = ""
ТОГДА СпрНоменклатура.Родитель.Родитель.Родитель.Родитель
КОГДА СпрНоменклатура.Родитель.Родитель.Родитель.Родитель = ""
ТОГДА СпрНоменклатура.Родитель.Родитель.Родитель.Родитель.Родитель
ИНАЧЕ СпрНоменклатура.Родитель
КОНЕЦ
ПоказатьПример ячейки:
Стул / Кухонная мебель / Мебель / Для дома.
По теме из базы знаний
Ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
(1) если отвечать прямо на вопрос, то:
и так далее сколько нужно
Но у вас в запросе есть проблемы:
1. мне не ясно зачем проверять ссылочный тип на пустую строку СпрНоменклатура.Родитель = "", правильно брать Наименование (как в примере выше)
2. если первое условие будет пустым, то возьмётся СпрНоменклатура.Родитель.Родитель и не важно пустое оно или нет
СпрНоменклатура.Родитель.Наименование + " / " + СпрНоменклатура.Родитель.Родитель.Наименование + " / " + СпрНоменклатура.Родитель.Родитель.Родитель.Наименование
и так далее сколько нужно
Но у вас в запросе есть проблемы:
1. мне не ясно зачем проверять ссылочный тип на пустую строку СпрНоменклатура.Родитель = "", правильно брать Наименование (как в примере выше)
2. если первое условие будет пустым, то возьмётся СпрНоменклатура.Родитель.Родитель и не важно пустое оно или нет
Если допускается обработка результата запроса во внутреннем языке, то:
ВЫБРАТЬ
Номенклатура.Ссылка КАК Ссылка
ИЗ
Справочник.Номенклатура КАК Номенклатура
ГДЕ
Номенклатура.Ссылка = &Ссылка
ИТОГИ ПО
Ссылка ТОЛЬКО ИЕРАРХИЯ
(3)
не совсем понял, как это внедряется в мой запрос?
не совсем понял, как это внедряется в мой запрос?
ВЫБРАТЬ
СпрНоменклатура.Ссылка КАК Ссылка,
СпрНоменклатура.Код КАК Код,
СпрНоменклатура.Артикул КАК Артикул,
СпрНоменклатура.ВидНоменклатуры КАК ВидНоменклатуры,
СпрНоменклатура.ЕдиницаИзмерения КАК ЕдиницаИзмерения,
СпрНоменклатура.СтавкаНДС КАК СтавкаНДС,
ВЫБОР
КОГДА ТоварыОрганизацийОстатки.КоличествоОстаток = ""
ТОГДА "0"
ИНАЧЕ ТоварыОрганизацийОстатки.КоличествоОстаток
КОНЕЦ КАК КоличествоОстаток,
СпрНоменклатура.Родитель
ИЗ
Справочник.Номенклатура КАК СпрНоменклатура
ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыОрганизаций.Остатки КАК ТоварыОрганизацийОстатки
ПО СпрНоменклатура.Ссылка = ТоварыОрганизацийОстатки.АналитикаУчетаНоменклатуры.Номенклатура.Ссылка
ГДЕ
НЕ СпрНоменклатура.ЭтоГруппа
Показать
(7) Видимо никак, раз вы хотите решить задачу только в рамках запроса. Делайте как в (2)
ВЫБОР
КОГДА СпрНоменклатура.Родитель = &Пустая
ТОГДА СпрНоменклатура.Наименование
КОГДА СпрНоменклатура.Родитель.Родитель = &Пустая
ТОГДА СпрНоменклатура.Наименование + " / " + СпрНоменклатура.Родитель.Наименование
КОГДА СпрНоменклатура.Родитель.Родитель.Родитель = &Пустая
ТОГДА СпрНоменклатура.Наименование + " / " + СпрНоменклатура.Родитель.Наименование + " / " + СпрНоменклатура.Родитель.Родитель.Наименование
КОГДА СпрНоменклатура.Родитель.Родитель.Родитель.Родитель = &Пустая
ТОГДА СпрНоменклатура.Наименование + " / " + СпрНоменклатура.Родитель.Наименование + " / " + СпрНоменклатура.Родитель.Родитель.Наименование + " / " + СпрНоменклатура.Родитель.Родитель.Родитель.Наименование
ИНАЧЕ СпрНоменклатура.Наименование + " / " + СпрНоменклатура.Родитель.Наименование + " / " + СпрНоменклатура.Родитель.Родитель.Наименование + " / " + СпрНоменклатура.Родитель.Родитель.Родитель.Наименование + " / " + СпрНоменклатура.Родитель.Родитель.Родитель.Родитель.Наименование
КОНЕЦ КАК ПолноеНаименование
Показать
(8)
Оказывается мне нужен какой то цикл.
Так как в одной номенклатуры уровень родителей может быть Один, а в некоторых до 5.
И данный рекомендованный, да и мой код, выводит либо всех родителей пятого уровня, либо первого.
Второго, третьего - нет.
тура.Родитель.Родитель.Родитель.Родитель = &Пустая
ТОГДА СпрНоменклатура.Наименование + " / " + СпрНоменклатура.Родитель.Наименование + " / " + СпрНоменклатура.Родитель.Родитель.Наименование + " / " + СпрНоменклатура.Родитель.Родитель.Родитель.Наименование
ИНАЧЕ СпрНоменклатура.Наименование + " / " + СпрНоменклатура.Родитель.Наименование + " / " + СпрНоменклатура.Родитель.Родитель.Наименование + " / " + СпрНоменклатура.Родитель.Родитель.Родитель.Наименование + " / " + СпрНоменклатура.Родитель.Родитель.Родитель.Родитель.Наименование
КОНЕЦ КАК ПолноеНаименование
ТОГДА СпрНоменклатура.Наименование + " / " + СпрНоменклатура.Родитель.Наименование + " / " + СпрНоменклатура.Родитель.Родитель.Наименование + " / " + СпрНоменклатура.Родитель.Родитель.Родитель.Наименование
ИНАЧЕ СпрНоменклатура.Наименование + " / " + СпрНоменклатура.Родитель.Наименование + " / " + СпрНоменклатура.Родитель.Родитель.Наименование + " / " + СпрНоменклатура.Родитель.Родитель.Родитель.Наименование + " / " + СпрНоменклатура.Родитель.Родитель.Родитель.Родитель.Наименование
КОНЕЦ КАК ПолноеНаименование
Оказывается мне нужен какой то цикл.
Так как в одной номенклатуры уровень родителей может быть Один, а в некоторых до 5.
И данный рекомендованный, да и мой код, выводит либо всех родителей пятого уровня, либо первого.
Второго, третьего - нет.
Вообще ваша задача решаема и не сильно сложная. попытаюсь объяснить.
Для начала вам потребует две схемы компоновки данных в 1 вы собираете данные а во второй анализаируйте отбираете и выводите.
Пример самый простой:
задача вывести в отчет полное наименование номенклатуры и ссылку.
1. создадим основную компоновку:
"ОсновнаяСхемаКомпоновкиДанных"
ВЫБРАТЬ
Номенклатура.Ссылка
ИЗ
Справочник.Номенклатура КАК Номенклатура
все по умолчанию.
2. создадим основную схему компоновки и в ней уже настроим при необходимости отборы таблица группировки и тд.:
а) набор данных у нас будет не запрос а объект.
б) имя объекта, содержащего данные "ВнешнийНаборДанных"
в) тут уже указываем все поля что нам необходимы с первой компоновки и те что мы создадим для вывода в данном примере "ссылка" и
"полноенаименование".
г) указываем типы полей.
д) указываем отборы, ипрочие примочки.
3. обработаем теперь это все в модуле нашего отчета
а) создадим процедуру "ПриКомпоновкеРезультата"
СтандартнаяОбработка = Ложь;
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
МакетКомпоновки = КомпоновщикМакета.Выполнить(
ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных"), // Первая схема компоновки
ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных").НастройкиПоУмолчанию, // Получаем настройки из первой схемы компоновки
ДанныеРасшифровки,
,
Тип("ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений")
);
ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновки.Инициализировать(МакетКомпоновки,,ДанныеРасшифровки);
ДокументРезультат.Очистить();
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений;
ТаблицаРезультат = Новый ТаблицаЗначений;
ПроцессорВывода.УстановитьОбъект(ТаблицаРезультат);
ПроцессорВывода.Вывести(ПроцессорКомпоновки);
// Выгрузили результат компоновки в таблицу значений. Теперь можем делать с ней все, что хотим:
ТаблицаРезультат.Колонки.Добавить("ПолноеНаименование"); // Не забываем добавить поле "НоваяКолонка" и в набор данных схемы "СхемаКомпоновкиДанныхВнешняя"
Если ТаблицаРезультат.Колонки.Найти("Ссылка") <> Неопределено Тогда
Для каждого СтрокаТЗ Из ТаблицаРезультат Цикл
СтрокаТЗ.ПолноеНаименование = СтрокаТЗ.Ссылка.ПолноеНаименование();
КонецЦикла;
КонецЕсли;
// Возвращаем модифицированную таблицу значений обратно в СКД, но в другую схему
ВнешнийНаборДанных = Новый Структура;
ВнешнийНаборДанных.Вставить("ВнешнийНаборДанных", ТаблицаРезультат);
МакетКомпоновки = КомпоновщикМакета.Выполнить(
ПолучитьМакет("Макет"), // Вторая схема компоновки
КомпоновщикНастроек.ПолучитьНастройки(), // Текущие настройки отчета
ДанныеРасшифровки,
);
ПроцессорКомпоновки.Инициализировать(МакетКомпоновки, ВнешнийНаборДанных, ДанныеРасшифровки);
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
ПроцессорВывода.УстановитьДокумент(ДокументРезультат);
ПроцессорВывода.Вывести(ПроцессорКомпоновки);
задача выполнена. пирожки я знаю где;)
Для начала вам потребует две схемы компоновки данных в 1 вы собираете данные а во второй анализаируйте отбираете и выводите.
Пример самый простой:
задача вывести в отчет полное наименование номенклатуры и ссылку.
1. создадим основную компоновку:
"ОсновнаяСхемаКомпоновкиДанных"
ВЫБРАТЬ
Номенклатура.Ссылка
ИЗ
Справочник.Номенклатура КАК Номенклатура
все по умолчанию.
2. создадим основную схему компоновки и в ней уже настроим при необходимости отборы таблица группировки и тд.:
а) набор данных у нас будет не запрос а объект.
б) имя объекта, содержащего данные "ВнешнийНаборДанных"
в) тут уже указываем все поля что нам необходимы с первой компоновки и те что мы создадим для вывода в данном примере "ссылка" и
"полноенаименование".
г) указываем типы полей.
д) указываем отборы, ипрочие примочки.
3. обработаем теперь это все в модуле нашего отчета
а) создадим процедуру "ПриКомпоновкеРезультата"
СтандартнаяОбработка = Ложь;
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
МакетКомпоновки = КомпоновщикМакета.Выполнить(
ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных"), // Первая схема компоновки
ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных").НастройкиПоУмолчанию, // Получаем настройки из первой схемы компоновки
ДанныеРасшифровки,
,
Тип("ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений")
);
ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновки.Инициализировать(МакетКомпоновки,,ДанныеРасшифровки);
ДокументРезультат.Очистить();
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений;
ТаблицаРезультат = Новый ТаблицаЗначений;
ПроцессорВывода.УстановитьОбъект(ТаблицаРезультат);
ПроцессорВывода.Вывести(ПроцессорКомпоновки);
// Выгрузили результат компоновки в таблицу значений. Теперь можем делать с ней все, что хотим:
ТаблицаРезультат.Колонки.Добавить("ПолноеНаименование"); // Не забываем добавить поле "НоваяКолонка" и в набор данных схемы "СхемаКомпоновкиДанныхВнешняя"
Если ТаблицаРезультат.Колонки.Найти("Ссылка") <> Неопределено Тогда
Для каждого СтрокаТЗ Из ТаблицаРезультат Цикл
СтрокаТЗ.ПолноеНаименование = СтрокаТЗ.Ссылка.ПолноеНаименование();
КонецЦикла;
КонецЕсли;
// Возвращаем модифицированную таблицу значений обратно в СКД, но в другую схему
ВнешнийНаборДанных = Новый Структура;
ВнешнийНаборДанных.Вставить("ВнешнийНаборДанных", ТаблицаРезультат);
МакетКомпоновки = КомпоновщикМакета.Выполнить(
ПолучитьМакет("Макет"), // Вторая схема компоновки
КомпоновщикНастроек.ПолучитьНастройки(), // Текущие настройки отчета
ДанныеРасшифровки,
);
ПроцессорКомпоновки.Инициализировать(МакетКомпоновки, ВнешнийНаборДанных, ДанныеРасшифровки);
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
ПроцессорВывода.УстановитьДокумент(ДокументРезультат);
ПроцессорВывода.Вывести(ПроцессорКомпоновки);
задача выполнена. пирожки я знаю где;)
Прикрепленные файлы:
(10) Вы уверены, что в первую схему следует подставлять настройки по умолчанию? Если в справочнике 100к элементов, ваш код будет выполнять весьма тяжелую функцию ПолноеНаименование() для всех 100к элементов, даже если по результатам отборов, нужно обработать только один элемент. Логичнее брать КомпоновщикНастроек.ПолучитьНастройки(). Да и обработка ДанныхРасшифровки во вспомогательной схеме ни к чему.
почему?
С элементом строки вы работаете уже через объект.
нужны родители, ок - отсеките последний уровень, или нужен последний родитель ок сделайте маленькую рекурсию и по максимальному вложению работайте с ней.
Тут вы можете даже получить у элемента строки максимальное количество подуровней и уже оттолкнутся от этого.
С элементом строки вы работаете уже через объект.
нужны родители, ок - отсеките последний уровень, или нужен последний родитель ок сделайте маленькую рекурсию и по максимальному вложению работайте с ней.
Тут вы можете даже получить у элемента строки максимальное количество подуровней и уже оттолкнутся от этого.
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот