Получение полного пути к товару через запрос 1С

Сделал себе в качестве памятки. Запрос должен выглядеть так:

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

Без обработки NULL корректно не работает.

Результата на типовой УНФ выглядит так:

Мне понадобилось для переноса из старой базы УПП в новую УНФ, моя обработка загрузки номенклатуры умеет подгружать папки по полному пути.

UPD: добавил готовый кусок для вставки в запрос в коде модуля:

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

fixin

Программирую на 1С с 1999 года. В 1С просто Гений. В 2020 году ушел из офиса на вольные хлеба фриланса. Принимаю заказы.

Вам может также понравиться...

комментариев 16

  1. rzd:

    Ну уж раз решил продолжать говнокодить, то хотя бы так:

    ВЫБОР КОГДА Т.Родитель.Родитель.Наименование есть null ТОГДА «» ИНАЧЕ Т.Родитель.Родитель.Наименование + «\» КОНЕЦ

    • а в чем разница с моим кодом?

      • rzd:

        В целом и то и то говнокод, но здесь лаконичнее. Ну и писать Т.Ссылка.Родитель это зашквар

        • если у элемента пустой родитель, будет пустая ссылка, а не NULL. у вас может получиться опять же \A\B\C вместо A\B\C
          но можете написать запрос целиком, я его проверю на демо-базе.
          предвижу ваш отказ — действительно, если код запроса работает, зачем переписывать? да?
          Если это плохой код, то расскажите, как выглядит хороший, на ваш взгляд, а то усматриваю тут классическую манипуляцию «поза гуру».

          • rzd:

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

          • это не принципиальные нюансы

  2. fedignat:

    Да что же все так криво так.
    Особенно после опусов Сергея о невиданной красоте его кода.

    Вы мне напоминаете симбиоз персонажей из Незнайки: Пончик и Пачкуля Пёстренький.

    ВЫБРАТЬ
    ЕСТЬNULL(Р5.Наименование + «\», «»)
    + ЕСТЬNULL(Р4.Наименование + «\», «»)
    + ЕСТЬNULL(Р3.Наименование + «\», «»)
    + ЕСТЬNULL(Р2.Наименование + «\», «»)
    + ЕСТЬNULL(Р1.Наименование + «\», «»)
    + Склады.Наименование КАК Наименование
    ИЗ
    Справочник.Склады КАК Склады
    ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Склады КАК Р1
    ПО Р1.Ссылка = Склады.Родитель
    ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Склады КАК Р2
    ПО Р2.Ссылка = Р1.Родитель
    ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Склады КАК Р3
    ПО Р3.Ссылка = Р2.Родитель
    ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Склады КАК Р4
    ПО Р4.Ссылка = Р3.Родитель
    ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Склады КАК Р5
    ПО Р5.Ссылка = Р4.Родитель
    УПОРЯДОЧИТЬ ПО
    Наименование

    • а не из пушки ли по воробьям это?

      • fedignat:

        Извините, а вы точно понимаете, как работает доступ к реквизитам через точку?

        • да. вопрос в том, понимает ли это оптимизатор запросов 1с.
          в любом случае я написал, что использовал этот запрос для передачи остатков. Тут не требуются чудеса производительности.

  3. Вова Соколовский:

    Гений такой гений. Очень уверен в своей правоте. Это самые проблемные сотрудники. Не даром гений на фрилансе.

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

      • Вова Соколовский:

        Каким образом приносил большие деньги?
        На сколько помню из опубликованной вами же биографии, то с работы были уволены за созданные проблемы и профнепригодность. Тех, кто приносит большие деньги не увольняют, а держат всеми силами.

        • у вас проблемы с статистикой и формальной логикой.
          Я работал где-то в дюжине мест, а увольняли меня только из трех.
          В остальных местах я был «курицей, несущей золотые яйца».

  4. Виталий:

    По-моему, здесь код на 10 строк пытается победить отсутствие обычного цикла 😄
    Путь ведь можно собрать гораздо проще и без жёсткого ограничения по уровням вложенности:


    Функция ПолучитьПолныйПутьНоменклатуры(Ссылка)

    МассивПути = Новый Массив;

    Родитель = Ссылка.Родитель;

    Пока ЗначениеЗаполнено(Родитель) Цикл
    МассивПути.Вставить(0, Родитель.Наименование);
    Родитель = Родитель.Родитель;
    КонецЦикла;

    Возврат СтрСоединить(МассивПути, "\");

    КонецФункции

    • можно. но зачем? я выгружаю данные для переноса в таблицу Excel. Мне достаточно выполнить запрос в консоли запросов. А вы предлагаете мне еще костылить в этот запрос вызовы функций 1С?
      Надо исходить из применения задачи. А не из «мира во всем мире».

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *