Как найти самого верхнего родителя в запросе(в справочнике номенклатура существует такой параметр как схема целевого товарного запаса указывается она в днях).Проблема возникает когда в группе создается еще несколько подгрупп и значение которое должно передаваться для этих подгрупп(потому как они уже входят в состав группы) им не передается...
По теме из базы знаний
- 115 полезностей по курсу СКД Евгения Гилёва
- Полная методичка к курсу "Программирование 8.2"
- Алгоритмы с решениями для экзамена Специалист УТ 11.1
- Программное создание динамического списка на управляемой форме. (Динамическое создание динамического списка). Готовая процедура + обработка - демонстрационный пример
- Обзор полезных методов БСП 3.1.4
Ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
Код |
---|
ВЫБРАТЬ
ВЫБОР
КОГДА ВашСправочник.Родитель = ЗНАЧЕНИЕ(Справочник.ВашСправочник.ПустаяСсылка)
ТОГДА ВашСправочник.Ссылка
ИНАЧЕ ВЫБОР
КОГДА ВашСправочник.Родитель.Родитель = ЗНАЧЕНИЕ(Справочник.ВашСправочник.ПустаяСсылка)
ТОГДА ВашСправочник.Родитель.Ссылка
ИНАЧЕ ВЫБОР
КОГДА ВашСправочник.Родитель.Родитель.Родитель = ЗНАЧЕНИЕ(Справочник.ВашСправочник.ПустаяСсылка)
ТОГДА ВашСправочник.Родитель.Родитель.Ссылка
ИНАЧЕ ВЫБОР
КОГДА ВашСправочник.Родитель.Родитель.Родитель.Родитель = ЗНАЧЕНИЕ(Справочник.ВашСправочник.ПустаяСсылка)
ТОГДА ВашСправочник.Родитель.Родитель.Родитель.Ссылка
ИНАЧЕ ВЫБОР
КОГДА ВашСправочник.Родитель.Родитель.Родитель.Родитель.Родитель = ЗНАЧЕНИЕ(Справочник.ВашСправочник.ПустаяСсылка)
ТОГДА ВашСправочник.Родитель.Родитель.Родитель.Родитель.Ссылка
ИНАЧЕ ВЫБОР
КОГДА ВашСправочник.Родитель.Родитель.Родитель.Родитель.Родитель.Родитель = ЗНАЧЕНИЕ(Справочник.ВашСправочник.ПустаяСсылка)
ТОГДА ВашСправочник.Родитель.Родитель.Родитель.Родитель.Родитель.Ссылка
ИНАЧЕ ЗНАЧЕНИЕ(Справочник.ВашСправочник.ПустаяСсылка)
КОНЕЦ
КОНЕЦ
КОНЕЦ
КОНЕЦ
КОНЕЦ
КОНЕЦ КАК РодительВерхнегоУровня
ИЗ
Справочник.ВашСправочник КАК ВашСправочник
Показать полностью |
(15)-(19) как я понял (1) суть (15)-(19) не решает поставленную задачу, по ходу требовалось получить самого верхнего родителя одним полем в запросе, а не постобработкой результата запроса. К тому же запрос с иерархией ( (13) ) нельзя поместить во временную таблицу
если конечно я правильно понял вопрос. т.е. стоит задача получить первого родителя конкретного элемента. вот так мы получаем всех родителей данного элемента. просто с виртуальными таблицами еще не работал, хотя зачем они нужны в этом случае?
Сформулируем так : как получить из иерархического справочника таблицу с двумя колонками :
Элемент, СтаршийРодитель ?
Только запросом обойтись не удастся.
Решение :
Писал вручную , но думаю правильно. Необходимы , конечно, проверка на пустой запрос .
Возможно также, ВремТаблицу отфильтровать , чтобы в ней не осталось групп в колонке Элемент.
Элемент, СтаршийРодитель ?
Только запросом обойтись не удастся.
Решение :
Запрос = Новый Запрос ("Выбрать Номенклатура.Ссылка как Элемент,
| Номенклатура.Родитель как СтаршийРодитель
|из Справочник.Номенклатура
| Где Номенклатура.ЭтоГруппа = Ложь Итоги По Ссылка Только Иерархия");
Таблица = Запрос.Выполнить().Выгрузить();
Для каждого Строка из Таблица Цикл
Если Не ЗначениеЗаполнено(Строка.СтаршийРодитель) Тогда
ТекГруппа = Строка.Элемент;
КонецЕсли;
Если ТекГруппа <> Строка.Элемент Тогда
Строка.Старшийродитель = ТекГруппа;
КонецЕсли;
КОнецЦикла;
Запрос = Новый Запрос("Выбрать Элемент,СтаршийРодитель Поместить ВремТаблица Из &ВнешнийИсточник");
Запрос.УстановитьПараметр("ВнешнийИсточник", Таблица);
Запрос.Выполнить()
ПоказатьПисал вручную , но думаю правильно. Необходимы , конечно, проверка на пустой запрос .
Возможно также, ВремТаблицу отфильтровать , чтобы в ней не осталось групп в колонке Элемент.
ну скажем так, что что то подобное я и писал:
13.
WKBAPKA 19.09.09 14:43
Еще как вариант, если уж в запросе, использовать виртуальную таблицу, новую фичу в 8.1. Делаем первый запрос, как я уже описал, помещаем его в виртуальную таблицу, делаем второй запрос ;)
(23) привел код. но все же, мое мнение, зачем городить огород, когда можно обойтись :
13.
WKBAPKA 19.09.09 14:43
Еще как вариант, если уж в запросе, использовать виртуальную таблицу, новую фичу в 8.1. Делаем первый запрос, как я уже описал, помещаем его в виртуальную таблицу, делаем второй запрос ;)
(23) привел код. но все же, мое мнение, зачем городить огород, когда можно обойтись :
Запрос = Новый Запрос;
Запрос.Текст = ТекстЗапроса;
Выборка = Запрос.Выполнить.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкамСИерархией);
Выборка.Следующий();
Родитель = Выборка.Ссылка;
Саша 16.09.09 13:58
Как найти самого верхнего родителя в запросе(в справочнике номенклатура существует такой параметр как схема целевого товарного запаса указывается она в днях).Проблема возникает когда в группе создается еще несколько подгрупп и значение которое должно передаваться для этих подгрупп(потому как они уже входят в состав группы) им не передается...
где тут про временную таблицу?
Как найти самого верхнего родителя в запросе(в справочнике номенклатура существует такой параметр как схема целевого товарного запаса указывается она в днях).Проблема возникает когда в группе создается еще несколько подгрупп и значение которое должно передаваться для этих подгрупп(потому как они уже входят в состав группы) им не передается...
где тут про временную таблицу?
Задача, если верить автору, состоит в следующем: при создании нового элемента справочника нужно передать ему значения установленные для главного родителя. где тут
>получить врем.таблицу для некоторого множества элементов, чтобы в дальнейшем её использовать в пакете запросов.
или нужно читать между строк?
>получить врем.таблицу для некоторого множества элементов, чтобы в дальнейшем её использовать в пакете запросов.
или нужно читать между строк?
в дополнение,
| Номенклатура.Родитель как СтаршийРодитель
всегда будет как непосредственный родитель элемента справочника, а никак не старший родитель. я проверял в консоли. иерархия в 1С организована по принципу динамических списков, похоже.
| Номенклатура.Родитель как СтаршийРодитель
всегда будет как непосредственный родитель элемента справочника, а никак не старший родитель. я проверял в консоли. иерархия в 1С организована по принципу динамических списков, похоже.
(28) Конечно. В первом запросе мы получаем не старшего родителя. Лишь после дальнейшей обработки таблицы значений в каждой строке получим саму ссылку и её старшего родителя.
Если же говорить о получении старшего родителя для одного элемента справочника , то конечно лучше создать функцию, на входе которой Ссылка справочника , на выходе старший родитель , а внутри приведенный тобой запрос (24) только с фильтром.
Если же говорить о получении старшего родителя для одного элемента справочника , то конечно лучше создать функцию, на входе которой Ссылка справочника , на выходе старший родитель , а внутри приведенный тобой запрос (24) только с фильтром.
вот что имеем для многоуровнего справочника в результате:
Элемент СтаршийРодитель
Материалы
МАТЕРИАЛ !!!!! Материалы
МАТЕРИАЛ 222 МАТЕРИАЛ !!!!!
т.е. для группы МАТЕРИАЛ 222 старшим родителем все равно группа МАТЕРИАЛ !!!!!
т.е. как я и говорил, имеем ссылку только на непосредственного родителя.
Элемент СтаршийРодитель
Материалы
МАТЕРИАЛ !!!!! Материалы
МАТЕРИАЛ 222 МАТЕРИАЛ !!!!!
т.е. для группы МАТЕРИАЛ 222 старшим родителем все равно группа МАТЕРИАЛ !!!!!
т.е. как я и говорил, имеем ссылку только на непосредственного родителя.
Дело в том что изначально данный отчет был расчина на использование СКД по ходу развития ситуация выяснилось что хотел в логист оказывается нужен ему не самый верхний родитель скажем так а самый последний родитель у которого заполнена схема цтз, т.е как я понял анпример естьу номенклатуры 3 родителя, по логике если мы получаем верхнего то он будит 3-им, но фишка может быть в том что схему цтз могут для 3-го не задать а задать для 2-го...вроде атк
Я думаю что СхемаЦТЗ - это справочник, подчиненный группам Справочника "Номенклатура". Есть вариант решить поставленную задачу в одном запросе, без постобработки. Опиши поподробнее задачу и структуру и связи исходных объектов
(38) Только сейчас смог проверить. В коде есть синтаксические ошибки, но после исправления всё верно :
Запрос = Новый Запрос ("Выбрать Номенклатура.Ссылка как Элемент,
| Номенклатура.Родитель как СтаршийРодитель
|из Справочник.Номенклатура как Номенклатура
| Где Номенклатура.ЭтоГруппа = Ложь Итоги По Ссылка Только Иерархия");
Таблица = Запрос.Выполнить().Выгрузить();
Для каждого Строка из Таблица Цикл
Если Не ЗначениеЗаполнено(Строка.СтаршийРодитель) Тогда
ТекГруппа = Строка.Элемент;
КонецЕсли;
Если ТекГруппа <> Строка.Элемент Тогда
Строка.Старшийродитель = ТекГруппа;
КонецЕсли;
КОнецЦикла;
Запрос = Новый Запрос("Выбрать Элемент,СтаршийРодитель Поместить ВремТаблица Из &ВнешнийИсточник как ВнешнийИсточник ");
Запрос.МенеджерВременныхТаблиц = Новый МенеджерВременныхТаблиц;
Запрос.УстановитьПараметр("ВнешнийИсточник", Таблица);
Запрос.Выполнить()
Показать
(40) Я проверял обработку используя справочник "Номенклатура" в демо - конфигурации БП 1.6.
Обработка должна правильно работать при любом уровне иерархии справочника.
Как же ты в консоли проверял строки кода , которые сканируют таблицу значений "Таблица" ? Странно.
Обработка должна правильно работать при любом уровне иерархии справочника.
Как же ты в консоли проверял строки кода , которые сканируют таблицу значений "Таблица" ? Странно.
(45) Если у родителя(группы) самого верхнего(старшего) уровня для данного элемента справочника - Схема ЦТЗ № 4, а у родителя более нижнего уровня СхемаЦТЗ №2. То тогда действующей схемой для данного элемента справочника будет считаться СхемаЦТЗ № 2. Так ?
РодительА СхемаЦТЗ № 4
РодительВ ..............
РодительС СхемаЦТЗ 2
ЭлементСправочника ....
Есть ли регистр сведений с измерением Номенклатура и ресурсом Схема ЦТЗ ? Или где хранятся эти данные ?
РодительА СхемаЦТЗ № 4
РодительВ ..............
РодительС СхемаЦТЗ 2
ЭлементСправочника ....
Есть ли регистр сведений с измерением Номенклатура и ресурсом Схема ЦТЗ ? Или где хранятся эти данные ?
Я в консоли не проверял таблицу значений. :)
я тестировал на УТП. В демо-версии в справочнике "Номенклатура" иерархия 2 уровня. Я добавил еще один уровень, получил результат запроса в виде таблицы с двумя колонками: Элемент, Старший родитель.
В итоге получил:
Элемент СтаршийРодитель
Материалы
МАТЕРИАЛ !!!!! Материалы
МАТЕРИАЛ 222 МАТЕРИАЛ !!!!!
Где Материалы - это старший родитель, внутри этой группы группа "МАТЕРИАЛ !!!", а внутри этой группы "МАТЕРИАЛ 222".
Т.е. если выгрузить в таблицу значений результат, получим последнюю строку без прямой ссылки на Материалы. В этом случае лучше уже выгружать в дерево значений, тогда можно будет получить самый верхний уровень.
я тестировал на УТП. В демо-версии в справочнике "Номенклатура" иерархия 2 уровня. Я добавил еще один уровень, получил результат запроса в виде таблицы с двумя колонками: Элемент, Старший родитель.
В итоге получил:
Элемент СтаршийРодитель
Материалы
МАТЕРИАЛ !!!!! Материалы
МАТЕРИАЛ 222 МАТЕРИАЛ !!!!!
Где Материалы - это старший родитель, внутри этой группы группа "МАТЕРИАЛ !!!", а внутри этой группы "МАТЕРИАЛ 222".
Т.е. если выгрузить в таблицу значений результат, получим последнюю строку без прямой ссылки на Материалы. В этом случае лучше уже выгружать в дерево значений, тогда можно будет получить самый верхний уровень.
(42) Я толкую про то , что итоговая ТЗ с правильным заполнением колонок получается в результате последующей за запросом обработки(см. код (39) после строки "Таблица= Запрос.Выполнить().Получить();");
Ты же мне толкуешь , что после выполнения первого запроса таблица - неверная. Она и не должна быть верной
Скопируй код в (39) в обработку , пройдись отладчиком и всё поймешь.
Ты же мне толкуешь , что после выполнения первого запроса таблица - неверная. Она и не должна быть верной
Скопируй код в (39) в обработку , пройдись отладчиком и всё поймешь.
(48) Я , конечно , всё понимаю : логисты , как и программисты, бывают разные. Но то, что Вы написали в (48) противоречит здравому и любому другому иерархическому смыслу .
Параметр СхемаЦТЗ для старшего родителя должен задавать по умолчанию некоторое значение (например №4) для всех подчиненных нижестоящих элементов. Если родитель более низкого уровня задает другое значение , то действующим для нижестоящих элементов считается именно оно (№2).
Это логичная распространенная иерархическая схема назначения параметров нижестоящим элементам в дереве.
Действующая ,кстати , в типовых конфигурациях (в БП 1.6 назначение счета номенклатуре).
Вы всё-таки поговорите с логистом поподробнее. Здесь что-то не так.
Параметр СхемаЦТЗ для старшего родителя должен задавать по умолчанию некоторое значение (например №4) для всех подчиненных нижестоящих элементов. Если родитель более низкого уровня задает другое значение , то действующим для нижестоящих элементов считается именно оно (№2).
Это логичная распространенная иерархическая схема назначения параметров нижестоящим элементам в дереве.
Действующая ,кстати , в типовых конфигурациях (в БП 1.6 назначение счета номенклатуре).
Вы всё-таки поговорите с логистом поподробнее. Здесь что-то не так.
Тут для СКД есть такой вариант решения, как мне кажеться:
1. Делаешь запрос к номенклатуре
2. В отдельной процедурке собираешь все твои схемы и данные
3. Запихиваешь все это хозяйство в СКД виртуальной таблицей и там юзаеш.
1. Делаешь запрос к номенклатуре
2. В отдельной процедурке собираешь все твои схемы и данные
3. Запихиваешь все это хозяйство в СКД виртуальной таблицей и там юзаеш.
Нагородили-то, нагородили-то... (: Короч, спасибо в любом случае. Пришли к решению (51), которое я ему ещё на прошлой неделе проталкивал (: Ну надеялся человек, что не придется ему Хрусталеву читать (: Сейчас он как раз добивает вариант через виртуальную таблицу. По результатам, наверное, сюда доложится.
(57) Хм... Вас Александр Медведев я чет в ветке не нашел..
(60) А Вы, уважаемый WKBAPKA, говорили только о том чтобы получить ВТ только иерархию номенклатуры. Это только пункт 1 в 51. В Ваших суждениях нет пункта 2 вообще... Без пункта 2 Вы не сможете связать ВТ и запрос чтобы получить верхнего родителя...
P.S. Рекурсия это круто...
(60) А Вы, уважаемый WKBAPKA, говорили только о том чтобы получить ВТ только иерархию номенклатуры. Это только пункт 1 в 51. В Ваших суждениях нет пункта 2 вообще... Без пункта 2 Вы не сможете связать ВТ и запрос чтобы получить верхнего родителя...
P.S. Рекурсия это круто...
(60) на что я указал, только идея проталкивалась ещё до появления ветки
(61) А чего ещё делать... пока так... оптимизация - это второй этап... Я так понял, получить все связки Номенклатура - Родитель -ЦТЗ в таблицу и уже по ней искать родителей и ЦТЗ рекурсивно. Вообще работать со структурами неизвестной глубины вложенности без рекурсии сложно. И тут неважно с чем работает - с базой или таблицей.
Алгоритм такой. Идем по списку номенклатуры, проверяем только не группы. Для каждого элемента проверяется родитель на наличие ЦТЗ, если такого нет запускаем поиск в таблице по данному родителю для нахождения его родителя и ЦТЗ соответсвенно...алогоритм повторять пока не дойдем до самого верха или пока не найдем ЦТЗ... возвращаем номенклатуру и ЦТЗ в новую таблицу... И так до конца, пока не переберем всю номенклатуру. В результата будем иметь таблицу номенклатура-ЦТЗ, которую как параметр загоняем в СКД виртуальную таблицу...
Можно реализовать и через цикл, но мне проще через рекурсию сделать...Это как чай и молоко... Кто-то лъет сначала молоко, потом заварку и воду, кто-то сначала заварку, воду, а потом молоко, а кто пьет без молока....
(61) А чего ещё делать... пока так... оптимизация - это второй этап... Я так понял, получить все связки Номенклатура - Родитель -ЦТЗ в таблицу и уже по ней искать родителей и ЦТЗ рекурсивно. Вообще работать со структурами неизвестной глубины вложенности без рекурсии сложно. И тут неважно с чем работает - с базой или таблицей.
Алгоритм такой. Идем по списку номенклатуры, проверяем только не группы. Для каждого элемента проверяется родитель на наличие ЦТЗ, если такого нет запускаем поиск в таблице по данному родителю для нахождения его родителя и ЦТЗ соответсвенно...алогоритм повторять пока не дойдем до самого верха или пока не найдем ЦТЗ... возвращаем номенклатуру и ЦТЗ в новую таблицу... И так до конца, пока не переберем всю номенклатуру. В результата будем иметь таблицу номенклатура-ЦТЗ, которую как параметр загоняем в СКД виртуальную таблицу...
Можно реализовать и через цикл, но мне проще через рекурсию сделать...Это как чай и молоко... Кто-то лъет сначала молоко, потом заварку и воду, кто-то сначала заварку, воду, а потом молоко, а кто пьет без молока....
(62) А я бы получил временную таблицу из справочника с итогами по "Только Иерархия" , соединил бы её левым соединением с таблицей (регистр ?), сод.значения схем , затем выгрузил бы результат запроса в ТЗ.
И затем одним циклом присвоил бы всем строкам таблицы нужные значения "СхемаЦТЗ". После этого ТЗ можно отправить во временную таблицу.
И затем одним циклом присвоил бы всем строкам таблицы нужные значения "СхемаЦТЗ". После этого ТЗ можно отправить во временную таблицу.
(63) вопрос в том, что не для всех родителей есть ЦТЗ. Нужно найти ближаешего родителя с ЦТЗ. Поэтому можно сразу в одном запросе получуить Таблицу с тремя колонками Номенклатура(группа) - Родитель - ЦТЗгруппы и уже циклом (рекурсией) для номенклатуры искать ближайшее ЦТЗгруппы.
(64) Нет. Это вообще справочник. А у группы добавлен новый реквизит для связи с ЦТЗ(он заполнен не для всех) В результате имеем некий элемент номенклатуры у которого есть неизвестное число вышестоящих родителей (групп) Нужно найти ближайшего родителя этого элемента с ЦТЗ. Если для непосредственного родителя ЦТЗ можно посмотреть без проблем, то вот дальше надо ...ну я там написал
(68) я там вообще без вмешательства в конфу предлагал... и вообще я только советчик (:
а к (63) у меня всё тот же вопрос - "затем одним циклом присвоил бы всем строкам таблицы нужные значения "СхемаЦТЗ". - самая слабая часть... Что будет в этом цикле? число вложений неизвестно, какая группа с ЦТЗ ближе к элементу...выражение "В иерархии" работает только с параметрами...Что-то в голову не приходит как запросе транслировать верхнее в иерархии на пустое значение на более низкое...
Предроложим так.
1 ур Конфеты - Есть ЦТЗ1
2 ур. Шоколадные - есть ЦТЗ2
2 ур. Ириски
3 ур. без обертки
3 ур. в обертке
1 ур Колбаса - есть ЦТЗ3
2 ур. Вареные
2 ур. Ветчина
Вот как из этой таблицы в запросе получить таблицу?
1 ур Конфеты - Есть ЦТЗ1
2 ур. Шоколадные - есть ЦТЗ2
2 ур. Ириски ЦТЗ1
3 ур. без обертки ЦТЗ1
3 ур. в обертке ЦТЗ1
1 ур Колбаса - есть ЦТЗ3
2 ур. Вареные ЦТЗ3
2 ур. Ветчина ЦТЗ3
а к (63) у меня всё тот же вопрос - "затем одним циклом присвоил бы всем строкам таблицы нужные значения "СхемаЦТЗ". - самая слабая часть... Что будет в этом цикле? число вложений неизвестно, какая группа с ЦТЗ ближе к элементу...выражение "В иерархии" работает только с параметрами...Что-то в голову не приходит как запросе транслировать верхнее в иерархии на пустое значение на более низкое...
Предроложим так.
1 ур Конфеты - Есть ЦТЗ1
2 ур. Шоколадные - есть ЦТЗ2
2 ур. Ириски
3 ур. без обертки
3 ур. в обертке
1 ур Колбаса - есть ЦТЗ3
2 ур. Вареные
2 ур. Ветчина
Вот как из этой таблицы в запросе получить таблицу?
1 ур Конфеты - Есть ЦТЗ1
2 ур. Шоколадные - есть ЦТЗ2
2 ур. Ириски ЦТЗ1
3 ур. без обертки ЦТЗ1
3 ур. в обертке ЦТЗ1
1 ур Колбаса - есть ЦТЗ3
2 ур. Вареные ЦТЗ3
2 ур. Ветчина ЦТЗ3
отче в процессе завершения =) как только все будит готово, рабочий код с подробным описанием будет выложен в ветке =)) для всеобщего пользования =) я думаю Саша не будит против. Основная заслуга в реализации этого решения его мне остается следовать только четким инструкциям....
Я извиняюсь. Задержался с " небольшим кодом" .
В справочнике Номенклатура определен реквизит "СхемаЦТЗ" только для групп. Тип реквизита "Справочник.СхемыЦТЗ"
Значение "СхемыЦТЗ" для каждого элемента справочника берется из заполненного реквизита ближайшего нижестоящего
родителя .
Нужно получить таблицу значений с колонками "Ссылка","СхемаЦТЗ" .
Данное решение ставит целью - минимальное обращение к базе данных.
Применена рекурсия (к сожалению). Текст скопирован из модуля тестировавшейся обработки.
Если запросом к справочнику "Номенклатура" получить вспомогательную ТЗ1 с колонками "Ссылка,СхемаЦТЗ", то в рекурсивной процедуре можно избежать обращений (запросов к базе) : "Строка.Ссылка.СхемаЦТЗ".
В справочнике Номенклатура определен реквизит "СхемаЦТЗ" только для групп. Тип реквизита "Справочник.СхемыЦТЗ"
Значение "СхемыЦТЗ" для каждого элемента справочника берется из заполненного реквизита ближайшего нижестоящего
родителя .
Нужно получить таблицу значений с колонками "Ссылка","СхемаЦТЗ" .
Данное решение ставит целью - минимальное обращение к базе данных.
Применена рекурсия (к сожалению). Текст скопирован из модуля тестировавшейся обработки.
Перем ВыходнаяТаблица ;
Процедура КнопкаВыполнитьНажатие(Кнопка)
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
| Номенклатура.Ссылка КАК Ссылка,
| Номенклатура.ЭтоГруппа
|ИЗ
| Справочник.Номенклатура КАК Номенклатура
|ГДЕ
| Номенклатура.ЭтоГруппа = ЛОЖЬ
|ИТОГИ ПО
| Ссылка ТОЛЬКО ИЕРАРХИЯ";
Дерево= Запрос.Выполнить().Выгрузить(ОбходРезультатаЗапроса.ПоГруппировкамСИерархией);
// Получили правильное дерево справочника
СтрокаСNULL =Дерево.Строки.Найти(NULL,"ЭтоГруппа",Истина);
Если СтрокаСNULL <> НеОпределено Тогда
// исправили для итога по элементам с уровнем 0
СтрокаСNULL.ЭтоГруппа = Истина;
КонецЕсли;
ВыходнаяТаблица = Новый ТаблицаЗначений;
ВыходнаяТаблица.Колонки.Добавить("Ссылка");
ВыходнаяТаблица.Колонки.Добавить("СхемаЦТЗ");
РаскрутитьСтроки(Дерево.Строки,Справочники.СхемыЦТЗ.ПустаяСсылка());
КонецПроцедуры
Процедура РаскрутитьСтроки(Строки,ПарСхемаЦТЗ)
Для каждого Строка из Строки Цикл
Если Строка.ЭтоГруппа Тогда
// единств. место где происходит запрос к базе
// но и это можно обойти выгрузив справочник в ТЗ
СхемаЦТЗ = Строка.Ссылка.СхемаЦТЗ;
ТекСхемаЦТЗ = ?(ЗначениеЗаполнено(СхемаЦТЗ),СхемаЦТЗ,ПарСхемаЦТЗ);
РаскрутитьСтроки(Строка.Строки, ТекСхемаЦТЗ);
Иначе
НовСтрока = ВыходнаяТаблица.Добавить();
НовСтрока.Ссылка = Строка.Ссылка;
НовСтрока.СхемаЦТЗ = ПарСхемаЦТЗ;
КонецЕсли;
КонецЦикла
Конецпроцедуры
ПоказатьЕсли запросом к справочнику "Номенклатура" получить вспомогательную ТЗ1 с колонками "Ссылка,СхемаЦТЗ", то в рекурсивной процедуре можно избежать обращений (запросов к базе) : "Строка.Ссылка.СхемаЦТЗ".
2(76): и где тут обращение к виртуальным таблицам, полностью построено на моих размышлениях:
11.
WKBAPKA 19.09.09 14:41
а не проще сделать запрос с иерархией и уже в выборке искать то что нужно?
WKBAPKA 19.09.09 14:42
т.е. делаем запрос к справочнику по искомому элементу, получаем его иерархию, и в результате уже получаем его родителя!
Андрей 19.09.09 17:48
(11)-(13) код в студию, пожалуйста!
Инфо ▼
15.
WKBAPKA 19.09.09 20:15
Код
ВЫБРАТЬ
Контрагенты.Ссылка КАК Ссылка
ИЗ
Справочник.Контрагенты КАК Контрагенты
ГДЕ
Контрагенты.Ссылка = &Ссылка
ИТОГИ ПО
Ссылка ИЕРАРХИЯ
Инфо ▼
16.
WKBAPKA 19.09.09 20:15
в итоге получаем иерархию выбранного элемента. А дальше дело техники
11.
WKBAPKA 19.09.09 14:41
а не проще сделать запрос с иерархией и уже в выборке искать то что нужно?
WKBAPKA 19.09.09 14:42
т.е. делаем запрос к справочнику по искомому элементу, получаем его иерархию, и в результате уже получаем его родителя!
Андрей 19.09.09 17:48
(11)-(13) код в студию, пожалуйста!
Инфо ▼
15.
WKBAPKA 19.09.09 20:15
Код
ВЫБРАТЬ
Контрагенты.Ссылка КАК Ссылка
ИЗ
Справочник.Контрагенты КАК Контрагенты
ГДЕ
Контрагенты.Ссылка = &Ссылка
ИТОГИ ПО
Ссылка ИЕРАРХИЯ
Инфо ▼
16.
WKBAPKA 19.09.09 20:15
в итоге получаем иерархию выбранного элемента. А дальше дело техники
Как и обещал финальный вариант по поиску родителя в запросе 2 функции:
и вторая
Огромное спасибо Медведеву Александру за помощь и поддержку!!!!!!!!!
Функция ПолучитьСтрокуЦТЗ(СтрокаВыборки)
ОбработкаПрерыванияПользователя();
Если СтрокаВыборки.ЦТЗ="нет" Тогда
НоваяСтрокаВыборки=ВыборкаУник.Найти(СтрокаВыборки.Родитель,"Номенклатура");
Если НоваяСтрокаВыборки<>Неопределено Тогда
СтрокаВыборки.ЦТЗ=ПолучитьСтрокуЦТЗ(НоваяСтрокаВыборки);
Иначе
СтрокаВыборки.ЦТЗ="совсем нет";
КонецЕсли;
КонецЕсли;
Возврат(СтрокаВыборки.ЦТЗ);
КонецФункции
Показатьи вторая
Функция ВовзратЦТЗ(Дата)
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
| Номенклатура.Ссылка КАК Номенклатура,
| ЕСТЬNULL(СхемыЦТЗ.ЦТЗ, ""нет"") КАК ЦТЗ,
| Номенклатура.Родитель КАК Родитель,
| Номенклатура.ЭтоГруппа КАК ЭтоГруппа
|ИЗ
| Справочник.Номенклатура КАК Номенклатура
| ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
| СхемыЦТЗ.Ссылка КАК Ссылка,
| ВЫБОР
| КОГДА ДЕНЬНЕДЕЛИ(&КонецПериода) = 1
| ТОГДА СхемыЦТЗ.Понедельник
| ИНАЧЕ ВЫБОР
| КОГДА ДЕНЬНЕДЕЛИ(&КонецПериода) = 2
| ТОГДА СхемыЦТЗ.Вторник
| ИНАЧЕ ВЫБОР
| КОГДА ДЕНЬНЕДЕЛИ(&КонецПериода) = 3
| ТОГДА СхемыЦТЗ.Среда
| ИНАЧЕ ВЫБОР
| КОГДА ДЕНЬНЕДЕЛИ(&КонецПериода) = 4
| ТОГДА СхемыЦТЗ.Четверг
| ИНАЧЕ ВЫБОР
| КОГДА ДЕНЬНЕДЕЛИ(&КонецПериода) = 5
| ТОГДА СхемыЦТЗ.Пятница
| ИНАЧЕ ВЫБОР
| КОГДА ДЕНЬНЕДЕЛИ(&КонецПериода) = 6
| ТОГДА СхемыЦТЗ.Суббота
| ИНАЧЕ ВЫБОР
| КОГДА ДЕНЬНЕДЕЛИ(&КонецПериода) = 7
| ТОГДА СхемыЦТЗ.Воскресение
| КОНЕЦ
| КОНЕЦ
| КОНЕЦ
| КОНЕЦ
| КОНЕЦ
| КОНЕЦ
| КОНЕЦ КАК ЦТЗ
| ИЗ
| Справочник.СхемыЦТЗ КАК СхемыЦТЗ
| ГДЕ
| СхемыЦТЗ.ПометкаУдаления = ЛОЖЬ) КАК СхемыЦТЗ
| ПО Номенклатура.Родитель.СхемаЦТЗ.Ссылка = СхемыЦТЗ.Ссылка
|ГДЕ
| Номенклатура.ПометкаУдаления = ЛОЖЬ";
Запрос.УстановитьПараметр("КонецПериода",Дата);
ВыборкаУник=Запрос.Выполнить().Выгрузить();
ТаблицаВирт=Новый ТаблицаЗначений();
Тип=Новый ОписаниеТипов("СправочникСсылка.Номенклатура");
ТаблицаВирт.Колонки.Добавить("Номенклатура",Тип);
Тип=Новый ОписаниеТипов("Число");
ТаблицаВирт.Колонки.Добавить("ЦТЗ",Тип);
Для Каждого СтрокаВыборки из ВыборкаУник Цикл
ОбработкаПрерыванияПользователя();
Если СтрокаВыборки.ЭтоГруппа Тогда
Продолжить;
КонецЕсли;
виртСтрока=ТаблицаВирт.Добавить();
виртСтрока.Номенклатура=СтрокаВыборки.Номенклатура;
ЦТЗ=ПолучитьСтрокуЦТЗ(СтрокаВыборки);
виртСтрока.ЦТЗ=?(ТипЗнч(ЦТЗ)=Тип("Число"),ЦТЗ,0);
КонецЦикла;
Возврат(ТаблицаВирт);
КонецФункции
ПоказатьОгромное спасибо Медведеву Александру за помощь и поддержку!!!!!!!!!
(85) постановка действительно была в начале. Шло обсуждение алгоритма, к этому обсуждение и выложен код - достаточно прозрачный и понятный...
Одна рекурсивная функция по поиску данных у родителей и самих родителей и одна функция формирующая первичную таблицу, вызывающая рекурсивную и возвращающая заполненную.
Одна рекурсивная функция по поиску данных у родителей и самих родителей и одна функция формирующая первичную таблицу, вызывающая рекурсивную и возвращающая заполненную.
ВЫБОР
КОГДА ПродажиОбороты.Номенклатура.Родитель.Родитель = ЗНАЧЕНИЕ(Справочник.Номенклатура.ПустаяСсылка)
ТОГДА ПродажиОбороты.Номенклатура.Родитель
КОГДА ПродажиОбороты.Номенклатура.Родитель.Родитель.Родитель = ЗНАЧЕНИЕ(Справочник.Номенклатура.ПустаяСсылка)
ТОГДА ПродажиОбороты.Номенклатура.Родитель.Родитель
КОГДА ПродажиОбороты.Номенклатура.Родитель.Родитель.Родитель.Родитель = ЗНАЧЕНИЕ(Справочник.Номенклатура.ПустаяСсылка)
ТОГДА ПродажиОбороты.Номенклатура.Родитель.Родитель.Родитель
КОГДА ПродажиОбороты.Номенклатура.Родитель.Родитель.Родитель.Родитель.Родитель = ЗНАЧЕНИЕ(Справочник.Номенклатура.ПустаяСсылка)
ТОГДА ПродажиОбороты.Номенклатура.Родитель.Родитель.Родитель.Родитель
КОГДА ПродажиОбороты.Номенклатура.Родитель.Родитель.Родитель.Родитель.Родитель.Родитель = ЗНАЧЕНИЕ(Справочник.Номенклатура.ПустаяСсылка)
ТОГДА ПродажиОбороты.Номенклатура.Родитель.Родитель.Родитель.Родитель.Родитель
КОГДА ПродажиОбороты.Номенклатура.Родитель.Родитель.Родитель.Родитель.Родитель.Родитель.Родитель = ЗНАЧЕНИЕ(Справочник.Номенклатура.ПустаяСсылка)
ТОГДА ПродажиОбороты.Номенклатура.Родитель.Родитель.Родитель.Родитель.Родитель.Родитель
КОГДА ПродажиОбороты.Номенклатура.Родитель.Родитель.Родитель.Родитель.Родитель.Родитель.Родитель.Родитель = ЗНАЧЕНИЕ(Справочник.Номенклатура.ПустаяСсылка)
ТОГДА ПродажиОбороты.Номенклатура.Родитель.Родитель.Родитель.Родитель.Родитель.Родитель.Родитель
КОНЕЦ
Показать
Это про подразделения, но сути не меняет. Для использования в СКД такой проблемы не возникало, но наверное бы попробовал разные наборы данных: один запрос, второй объект - куда передал бы таблицу значений.
Процедура ДобавитьВсеСтрокиПодразделения(аТаблицаРезультат, аИсходнаяТаблица, аПодразделение, аРодитель)
НоваяСтрока = аТаблицаРезультат.Добавить();
НоваяСтрока.Подразделение = аПодразделение;
Если аРодитель = Справочники.ПодразделенияОрганизаций.ПустаяСсылка() тогда
НоваяСтрока.Родитель = аПодразделение;
Иначе
НоваяСтрока.Родитель = аРодитель;
СтруктураПоиска = Новый Структура("Подразделение", аРодитель);
СтрокиПоПодразделению = аИсходнаяТаблица.НайтиСтроки(СтруктураПоиска);
Если СтрокиПоПодразделению.Количество() = 1 Тогда
ДобавитьВсеСтрокиПодразделения(аТаблицаРезультат, аИсходнаяТаблица, аПодразделение, СтрокиПоПодразделению[0].Родитель);
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Процедура ДобавитьВТПодразделенияРодители(аМенеджерВременныхТаблиц)
Запрос = Новый Запрос("ВЫБРАТЬ
| ПодразделенияОрганизаций.Ссылка КАК Подразделение,
| ЕСТЬNULL(ВышестоящееПодразделение.Ссылка, ЗНАЧЕНИЕ(Справочник.ПодразделенияОрганизаций.ПустаяСсылка)) КАК Родитель
|ИЗ
| Справочник.ПодразделенияОрганизаций КАК ПодразделенияОрганизаций
| ЛЕВОЕ СОЕДИНЕНИЕ Справочник.ПодразделенияОрганизаций КАК ВышестоящееПодразделение
| ПО ПодразделенияОрганизаций.Родитель = ВышестоящееПодразделение.Ссылка");
РезЗапроса = запрос.Выполнить().Выгрузить();
Результат = РезЗапроса.СкопироватьКолонки();
Для Каждого Запись из РезЗапроса цикл
ДобавитьВсеСтрокиПодразделения(Результат, РезЗапроса, Запись.Подразделение, Запись.Родитель);
КонецЦикла;
Запрос.МенеджерВременныхТаблиц = аМенеджерВременныхТаблиц;
Запрос.УстановитьПараметр("Табло", Результат);
Запрос.Текст = "Выбрать Таб.Подразделение, Таб.Родитель Поместить ВТПодразделенияРодители из &Табло как Таб";
Запрос.Выполнить();
КонецПроцедуры
Показать
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот