Получение полного пути к товару через запрос 1С
Сделал себе в качестве памятки. Запрос должен выглядеть так:
ВЫБРАТЬ
Т.Ссылка.Наименование КАК Наименование,
ВЫБОР КОГДА ЕСТЬNULL(Т.Ссылка.Родитель.Родитель.Родитель.Родитель.Родитель, ЗНачение(Справочник.Номенклатура.ПустаяСсылка)) = ЗНачение(Справочник.Номенклатура.ПустаяСсылка) ТОГДА "" ИНАЧЕ Т.Ссылка.Родитель.Родитель.Родитель.Родитель.Родитель.Наименование + "\" КОНЕЦ +
ВЫБОР КОГДА ЕСТЬNULL(Т.Ссылка.Родитель.Родитель.Родитель.Родитель, ЗНачение(Справочник.Номенклатура.ПустаяСсылка)) = ЗНачение(Справочник.Номенклатура.ПустаяСсылка) ТОГДА "" ИНАЧЕ Т.Ссылка.Родитель.Родитель.Родитель.Родитель.Наименование + "\" КОНЕЦ +
ВЫБОР КОГДА ЕСТЬNULL(Т.Ссылка.Родитель.Родитель.Родитель, ЗНачение(Справочник.Номенклатура.ПустаяСсылка)) = ЗНачение(Справочник.Номенклатура.ПустаяСсылка) ТОГДА "" ИНАЧЕ Т.Ссылка.Родитель.Родитель.Родитель.Наименование + "\" КОНЕЦ +
ВЫБОР КОГДА ЕСТЬNULL(Т.Ссылка.Родитель.Родитель, ЗНачение(Справочник.Номенклатура.ПустаяСсылка)) = ЗНачение(Справочник.Номенклатура.ПустаяСсылка) ТОГДА "" ИНАЧЕ Т.Ссылка.Родитель.Родитель.Наименование + "\" КОНЕЦ +
ВЫБОР КОГДА ЕСТЬNULL(Т.Ссылка.Родитель, ЗНачение(Справочник.Номенклатура.ПустаяСсылка)) = ЗНачение(Справочник.Номенклатура.ПустаяСсылка) ТОГДА "" ИНАЧЕ Т.Ссылка.Родитель.Наименование КОНЕЦ
КАК ПолныйПуть
ИЗ Справочник.Номенклатура КАК Т ГДЕ НЕ Т.ЭтоГруппа
Без обработки NULL корректно не работает.
Результата на типовой УНФ выглядит так:

Мне понадобилось для переноса из старой базы УПП в новую УНФ, моя обработка загрузки номенклатуры умеет подгружать папки по полному пути.
UPD: добавил готовый кусок для вставки в запрос в коде модуля:
| ВЫБОР КОГДА ЕСТЬNULL(Т.Ссылка.Родитель.Родитель.Родитель.Родитель.Родитель, ЗНачение(Справочник.Номенклатура.ПустаяСсылка)) = ЗНачение(Справочник.Номенклатура.ПустаяСсылка) ТОГДА """" ИНАЧЕ Т.Ссылка.Родитель.Родитель.Родитель.Родитель.Родитель.Наименование + ""\"" КОНЕЦ +
| ВЫБОР КОГДА ЕСТЬNULL(Т.Ссылка.Родитель.Родитель.Родитель.Родитель, ЗНачение(Справочник.Номенклатура.ПустаяСсылка)) = ЗНачение(Справочник.Номенклатура.ПустаяСсылка) ТОГДА """" ИНАЧЕ Т.Ссылка.Родитель.Родитель.Родитель.Родитель.Наименование + ""\"" КОНЕЦ +
| ВЫБОР КОГДА ЕСТЬNULL(Т.Ссылка.Родитель.Родитель.Родитель, ЗНачение(Справочник.Номенклатура.ПустаяСсылка)) = ЗНачение(Справочник.Номенклатура.ПустаяСсылка) ТОГДА """" ИНАЧЕ Т.Ссылка.Родитель.Родитель.Родитель.Наименование + ""\"" КОНЕЦ +
| ВЫБОР КОГДА ЕСТЬNULL(Т.Ссылка.Родитель.Родитель, ЗНачение(Справочник.Номенклатура.ПустаяСсылка)) = ЗНачение(Справочник.Номенклатура.ПустаяСсылка) ТОГДА """" ИНАЧЕ Т.Ссылка.Родитель.Родитель.Наименование + ""\"" КОНЕЦ +
| ВЫБОР КОГДА ЕСТЬNULL(Т.Ссылка.Родитель, ЗНачение(Справочник.Номенклатура.ПустаяСсылка)) = ЗНачение(Справочник.Номенклатура.ПустаяСсылка) ТОГДА """" ИНАЧЕ Т.Ссылка.Родитель.Наименование КОНЕЦ
| КАК ПолныйПуть



Ну уж раз решил продолжать говнокодить, то хотя бы так:
ВЫБОР КОГДА Т.Родитель.Родитель.Наименование есть null ТОГДА «» ИНАЧЕ Т.Родитель.Родитель.Наименование + «\» КОНЕЦ
а в чем разница с моим кодом?
В целом и то и то говнокод, но здесь лаконичнее. Ну и писать Т.Ссылка.Родитель это зашквар
если у элемента пустой родитель, будет пустая ссылка, а не NULL. у вас может получиться опять же \A\B\C вместо A\B\C
но можете написать запрос целиком, я его проверю на демо-базе.
предвижу ваш отказ — действительно, если код запроса работает, зачем переписывать? да?
Если это плохой код, то расскажите, как выглядит хороший, на ваш взгляд, а то усматриваю тут классическую манипуляцию «поза гуру».
Если родитель пустая ссылка, то
наименование родителя будет null, пора бы уже знать, гений
это не принципиальные нюансы
Да что же все так криво так.
Особенно после опусов Сергея о невиданной красоте его кода.
Вы мне напоминаете симбиоз персонажей из Незнайки: Пончик и Пачкуля Пёстренький.
ВЫБРАТЬ
ЕСТЬNULL(Р5.Наименование + «\», «»)
+ ЕСТЬNULL(Р4.Наименование + «\», «»)
+ ЕСТЬNULL(Р3.Наименование + «\», «»)
+ ЕСТЬNULL(Р2.Наименование + «\», «»)
+ ЕСТЬNULL(Р1.Наименование + «\», «»)
+ Склады.Наименование КАК Наименование
ИЗ
Справочник.Склады КАК Склады
ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Склады КАК Р1
ПО Р1.Ссылка = Склады.Родитель
ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Склады КАК Р2
ПО Р2.Ссылка = Р1.Родитель
ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Склады КАК Р3
ПО Р3.Ссылка = Р2.Родитель
ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Склады КАК Р4
ПО Р4.Ссылка = Р3.Родитель
ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Склады КАК Р5
ПО Р5.Ссылка = Р4.Родитель
УПОРЯДОЧИТЬ ПО
Наименование
а не из пушки ли по воробьям это?
Извините, а вы точно понимаете, как работает доступ к реквизитам через точку?
да. вопрос в том, понимает ли это оптимизатор запросов 1с.
в любом случае я написал, что использовал этот запрос для передачи остатков. Тут не требуются чудеса производительности.
Гений такой гений. Очень уверен в своей правоте. Это самые проблемные сотрудники. Не даром гений на фрилансе.
да, тут я приношу максимум пользы клиентам, что выражается в том числе и в максимуме суммы дохода.
а в найме я не был проблемным, ведь я приносил большие деньги своим работодателям.
Каким образом приносил большие деньги?
На сколько помню из опубликованной вами же биографии, то с работы были уволены за созданные проблемы и профнепригодность. Тех, кто приносит большие деньги не увольняют, а держат всеми силами.
у вас проблемы с статистикой и формальной логикой.
Я работал где-то в дюжине мест, а увольняли меня только из трех.
В остальных местах я был «курицей, несущей золотые яйца».
По-моему, здесь код на 10 строк пытается победить отсутствие обычного цикла 😄
Путь ведь можно собрать гораздо проще и без жёсткого ограничения по уровням вложенности:
Функция ПолучитьПолныйПутьНоменклатуры(Ссылка)
МассивПути = Новый Массив;
Родитель = Ссылка.Родитель;
Пока ЗначениеЗаполнено(Родитель) Цикл
МассивПути.Вставить(0, Родитель.Наименование);
Родитель = Родитель.Родитель;
КонецЦикла;
Возврат СтрСоединить(МассивПути, "\");
КонецФункции
можно. но зачем? я выгружаю данные для переноса в таблицу Excel. Мне достаточно выполнить запрос в консоли запросов. А вы предлагаете мне еще костылить в этот запрос вызовы функций 1С?
Надо исходить из применения задачи. А не из «мира во всем мире».