Найти родителя в запросе?

1. plasmoid 16.09.09 13:58 Сейчас в теме
Как найти самого верхнего родителя в запросе(в справочнике номенклатура существует такой параметр как схема целевого товарного запаса указывается она в днях).Проблема возникает когда в группе создается еще несколько подгрупп и значение которое должно передаваться для этих подгрупп(потому как они уже входят в состав группы) им не передается...
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
8. Borisych 503 17.09.09 14:56 Сейчас в теме
(1),(3) подходит такой вариант-то?
2. WiseSnake 1519 16.09.09 14:46 Сейчас в теме
Никак.
Можно извратится, но это будет работать только для ограниченного числа вложенности....
3. plasmoid 16.09.09 18:47 Сейчас в теме
хмммм значит про использование СКД мона забыть...
4. anig99 2843 16.09.09 21:21 Сейчас в теме
нет, не забудем (: решим (:
5. plasmoid 16.09.09 23:03 Сейчас в теме
саня на тебя как всегда одна надежда =)))
6. Borisych 503 16.09.09 23:26 Сейчас в теме
Код
ВЫБРАТЬ
   ВЫБОР
      КОГДА ВашСправочник.Родитель = ЗНАЧЕНИЕ(Справочник.ВашСправочник.ПустаяСсылка)
         ТОГДА ВашСправочник.Ссылка
      ИНАЧЕ ВЫБОР
            КОГДА ВашСправочник.Родитель.Родитель = ЗНАЧЕНИЕ(Справочник.ВашСправочник.ПустаяСсылка)
               ТОГДА ВашСправочник.Родитель.Ссылка
            ИНАЧЕ ВЫБОР
                  КОГДА ВашСправочник.Родитель.Родитель.Родитель = ЗНАЧЕНИЕ(Справочник.ВашСправочник.ПустаяСсылка)
                     ТОГДА ВашСправочник.Родитель.Родитель.Ссылка
                  ИНАЧЕ ВЫБОР
                        КОГДА ВашСправочник.Родитель.Родитель.Родитель.Родитель = ЗНАЧЕНИЕ(Справочник.ВашСправочник.ПустаяСсылка)
                           ТОГДА ВашСправочник.Родитель.Родитель.Родитель.Ссылка
                        ИНАЧЕ ВЫБОР
                              КОГДА ВашСправочник.Родитель.Родитель.Родитель.Родитель.Родитель = ЗНАЧЕНИЕ(Справочник.ВашСправочник.ПустаяСсылка)
                                 ТОГДА ВашСправочник.Родитель.Родитель.Родитель.Родитель.Ссылка
                              ИНАЧЕ ВЫБОР
                                    КОГДА ВашСправочник.Родитель.Родитель.Родитель.Родитель.Родитель.Родитель = ЗНАЧЕНИЕ(Справочник.ВашСправочник.ПустаяСсылка)
                                       ТОГДА ВашСправочник.Родитель.Родитель.Родитель.Родитель.Родитель.Ссылка
                                    ИНАЧЕ ЗНАЧЕНИЕ(Справочник.ВашСправочник.ПустаяСсылка)
                                 КОНЕЦ
                           КОНЕЦ
                     КОНЕЦ
               КОНЕЦ
         КОНЕЦ
   КОНЕЦ КАК РодительВерхнегоУровня
ИЗ
   Справочник.ВашСправочник КАК ВашСправочник
Показать полностью
7. WiseSnake 1519 16.09.09 23:55 Сейчас в теме
(6) Именно этот "изврат" я и имел ввиду, в данном случае ограничение вложенности = 6, а вообще можно забомбить 50-100 и тогда будет работать в 99,9 % случаев ))))))
21. WKBAPKA 214 19.09.09 22:10 Сейчас в теме
2(20: насчет временной таблицы не знаю, не работал с ними. Чем тебя не устраивает приведенный код в 18, пожалуста, одним запросом получили то что хотели... где тут постобработка запроса? все равно нужно запрос выполнить и выбрать результат? или по твоему код в (6) лучше и оптимальнее ?
9. plasmoid 17.09.09 15:17 Сейчас в теме
вот именно о таком варианте я тоже начал задумываться при изучении справочника нмоенклатуры в приципе в моем случае больше 5 родителей там не буит
10. plasmoid 17.09.09 15:18 Сейчас в теме
ситуация начала развиваться еще тупее логист придумал фишку чтобы один родителе перекрывал друого даже при заполненном значении...
11. WKBAPKA 214 19.09.09 14:41 Сейчас в теме
а не проще сделать запрос с иерархией и уже в выборке искать то что нужно?
14. Borisych 503 19.09.09 17:48 Сейчас в теме
(11)-(13) код в студию, пожалуйста!
12. WKBAPKA 214 19.09.09 14:42 Сейчас в теме
т.е. делаем запрос к справочнику по искомому элементу, получаем его иерархию, и в результате уже получаем его родителя!
13. WKBAPKA 214 19.09.09 14:43 Сейчас в теме
Еще как вариант, если уж в запросе, использовать виртуальную таблицу, новую фичу в 8.1. Делаем первый запрос, как я уже описал, помещаем его в виртуальную таблицу, делаем второй запрос ;)
15. WKBAPKA 214 19.09.09 20:15 Сейчас в теме
ВЫБРАТЬ
	Контрагенты.Ссылка КАК Ссылка
ИЗ
	Справочник.Контрагенты КАК Контрагенты
ГДЕ
	Контрагенты.Ссылка = &Ссылка
ИТОГИ ПО
	Ссылка ИЕРАРХИЯ

Показать
20. Borisych 503 19.09.09 21:14 Сейчас в теме
(15)-(19) как я понял (1) суть (15)-(19) не решает поставленную задачу, по ходу требовалось получить самого верхнего родителя одним полем в запросе, а не постобработкой результата запроса. К тому же запрос с иерархией ( (13) ) нельзя поместить во временную таблицу
16. WKBAPKA 214 19.09.09 20:15 Сейчас в теме
в итоге получаем иерархию выбранного элемента. А дальше дело техники
17. WKBAPKA 214 19.09.09 20:21 Сейчас в теме
если конечно я правильно понял вопрос. т.е. стоит задача получить первого родителя конкретного элемента. вот так мы получаем всех родителей данного элемента. просто с виртуальными таблицами еще не работал, хотя зачем они нужны в этом случае?
18. WKBAPKA 214 19.09.09 20:27 Сейчас в теме
потом пишем:
Запрос = Новый Запрос;
Запрос.Текст = ТекстЗапроса;
Выборка = Запрос.Выполнить.Выбраьб();
Выборка.Следующий();
Родитель = Выборка.Ссылка;
19. WKBAPKA 214 19.09.09 20:27 Сейчас в теме
опять же, если я правильно понял задачу
22. WKBAPKA 214 19.09.09 22:40 Сейчас в теме
я перепробывал все варианты, это единственный
23. Ish_2 1104 20.09.09 00:10 Сейчас в теме
Сформулируем так : как получить из иерархического справочника таблицу с двумя колонками :
Элемент, СтаршийРодитель ?
Только запросом обойтись не удастся.
Решение :
Запрос = Новый Запрос ("Выбрать Номенклатура.Ссылка как Элемент,
                                    | Номенклатура.Родитель    как СтаршийРодитель                        
                                    |из Справочник.Номенклатура
                                    | Где Номенклатура.ЭтоГруппа = Ложь Итоги По Ссылка Только Иерархия");
Таблица = Запрос.Выполнить().Выгрузить();
Для каждого Строка из Таблица Цикл
      Если Не ЗначениеЗаполнено(Строка.СтаршийРодитель) Тогда
             ТекГруппа = Строка.Элемент;
      КонецЕсли;
      Если ТекГруппа <> Строка.Элемент Тогда
             Строка.Старшийродитель = ТекГруппа;
      КонецЕсли;
КОнецЦикла;
Запрос = Новый Запрос("Выбрать Элемент,СтаршийРодитель Поместить ВремТаблица Из &ВнешнийИсточник");
Запрос.УстановитьПараметр("ВнешнийИсточник", Таблица);
Запрос.Выполнить() 
Показать


Писал вручную , но думаю правильно. Необходимы , конечно, проверка на пустой запрос .
Возможно также, ВремТаблицу отфильтровать , чтобы в ней не осталось групп в колонке Элемент.
24. WKBAPKA 214 20.09.09 00:24 Сейчас в теме
ну скажем так, что что то подобное я и писал:
13.
WKBAPKA 19.09.09 14:43

Еще как вариант, если уж в запросе, использовать виртуальную таблицу, новую фичу в 8.1. Делаем первый запрос, как я уже описал, помещаем его в виртуальную таблицу, делаем второй запрос ;)

(23) привел код. но все же, мое мнение, зачем городить огород, когда можно обойтись :
Запрос = Новый Запрос; 
Запрос.Текст = ТекстЗапроса; 
Выборка = Запрос.Выполнить.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкамСИерархией); 
Выборка.Следующий(); 
Родитель = Выборка.Ссылка;
25. Ish_2 1104 20.09.09 00:47 Сейчас в теме
(24) Ты решаешь задачу получения Старшего родителя для ОДНОГО элемента. Задача же формулируется : получить врем.таблицу для некоторого множества элементов, чтобы в дальнейшем её использовать в пакете запросов.
33. Ish_2 1104 20.09.09 01:20 Сейчас в теме
А ты создай простейшую обработку с текстом (23) . Если 1с8 под рукой . Пройдись отладчиком. Всё поймешь.
И меня проверишь. Мало ли ..
37. WKBAPKA 214 20.09.09 10:46 Сейчас в теме
2(33): я так и сделал... .получил таблицу с двумя колонками. попробую сегодня еще, самому интересно.
26. WKBAPKA 214 20.09.09 00:50 Сейчас в теме
Саша 16.09.09 13:58

Как найти самого верхнего родителя в запросе(в справочнике номенклатура существует такой параметр как схема целевого товарного запаса указывается она в днях).Проблема возникает когда в группе создается еще несколько подгрупп и значение которое должно передаваться для этих подгрупп(потому как они уже входят в состав группы) им не передается...

где тут про временную таблицу?
27. WKBAPKA 214 20.09.09 00:52 Сейчас в теме
Задача, если верить автору, состоит в следующем: при создании нового элемента справочника нужно передать ему значения установленные для главного родителя. где тут
>получить врем.таблицу для некоторого множества элементов, чтобы в дальнейшем её использовать в пакете запросов.

или нужно читать между строк?
28. WKBAPKA 214 20.09.09 00:54 Сейчас в теме
в дополнение,
| Номенклатура.Родитель как СтаршийРодитель
всегда будет как непосредственный родитель элемента справочника, а никак не старший родитель. я проверял в консоли. иерархия в 1С организована по принципу динамических списков, похоже.
29. Ish_2 1104 20.09.09 01:06 Сейчас в теме
(28) Конечно. В первом запросе мы получаем не старшего родителя. Лишь после дальнейшей обработки таблицы значений в каждой строке получим саму ссылку и её старшего родителя.

Если же говорить о получении старшего родителя для одного элемента справочника , то конечно лучше создать функцию, на входе которой Ссылка справочника , на выходе старший родитель , а внутри приведенный тобой запрос (24) только с фильтром.
30. Ish_2 1104 20.09.09 01:13 Сейчас в теме
(28) Мало того , приведенный тобой вариант определения старшего родителя для ссылки справочника через запрос,
является самым оптимальным из всех возможных , на мой взгляд.
31. WKBAPKA 214 20.09.09 01:14 Сейчас в теме
и всеже, не могу врубиться, используя "только иерархия" получаем просто список групп, как найти старшего родителя для множества элементов?
32. WKBAPKA 214 20.09.09 01:19 Сейчас в теме
вот что имеем для многоуровнего справочника в результате:
Элемент СтаршийРодитель
Материалы
МАТЕРИАЛ !!!!! Материалы
МАТЕРИАЛ 222 МАТЕРИАЛ !!!!!

т.е. для группы МАТЕРИАЛ 222 старшим родителем все равно группа МАТЕРИАЛ !!!!!
т.е. как я и говорил, имеем ссылку только на непосредственного родителя.
34. plasmoid 20.09.09 08:48 Сейчас в теме
Дело в том что изначально данный отчет был расчина на использование СКД по ходу развития ситуация выяснилось что хотел в логист оказывается нужен ему не самый верхний родитель скажем так а самый последний родитель у которого заполнена схема цтз, т.е как я понял анпример естьу номенклатуры 3 родителя, по логике если мы получаем верхнего то он будит 3-им, но фишка может быть в том что схему цтз могут для 3-го не задать а задать для 2-го...вроде атк
35. Borisych 503 20.09.09 09:36 Сейчас в теме
(34) Схема ЦТЗ хранится в регистре сведений? или как? Напиши про неё - что за объект метаданных
36. Borisych 503 20.09.09 10:01 Сейчас в теме
Я думаю что СхемаЦТЗ - это справочник, подчиненный группам Справочника "Номенклатура". Есть вариант решить поставленную задачу в одном запросе, без постобработки. Опиши поподробнее задачу и структуру и связи исходных объектов
38. WKBAPKA 214 20.09.09 10:51 Сейчас в теме
2(Саша): Пошли ты этого логиста на..., и если хочешь что бы тебе помогли опиши корректно задачу!
39. Ish_2 1104 20.09.09 11:20 Сейчас в теме
(38) Только сейчас смог проверить. В коде есть синтаксические ошибки, но после исправления всё верно :

Запрос = Новый Запрос ("Выбрать Номенклатура.Ссылка как Элемент, 
                                    | Номенклатура.Родитель    как СтаршийРодитель                         
                                    |из Справочник.Номенклатура  как Номенклатура
                                    | Где Номенклатура.ЭтоГруппа = Ложь Итоги По Ссылка Только Иерархия"); 
Таблица = Запрос.Выполнить().Выгрузить(); 
Для каждого Строка из Таблица Цикл 
      Если Не ЗначениеЗаполнено(Строка.СтаршийРодитель) Тогда 
             ТекГруппа = Строка.Элемент; 
      КонецЕсли; 
      Если ТекГруппа <> Строка.Элемент Тогда 
             Строка.Старшийродитель = ТекГруппа; 
      КонецЕсли; 
КОнецЦикла; 
Запрос = Новый Запрос("Выбрать Элемент,СтаршийРодитель Поместить ВремТаблица Из &ВнешнийИсточник как ВнешнийИсточник ");
Запрос.МенеджерВременныхТаблиц = Новый МенеджерВременныхТаблиц;
Запрос.УстановитьПараметр("ВнешнийИсточник", Таблица); 
Запрос.Выполнить()  
Показать
40. WKBAPKA 214 20.09.09 12:04 Сейчас в теме
2(39):я вчера проверял запрос в консоли. ошибки я исправил. а сколько уровней у тебя в справочнике?
41. Ish_2 1104 20.09.09 12:18 Сейчас в теме
(40) Я проверял обработку используя справочник "Номенклатура" в демо - конфигурации БП 1.6.
Обработка должна правильно работать при любом уровне иерархии справочника.
Как же ты в консоли проверял строки кода , которые сканируют таблицу значений "Таблица" ? Странно.
45. plasmoid 21.09.09 07:59 Сейчас в теме
(38)
К сожалению послать его я пока не могу.Задачу ставит именно логист, у него планы меняются по несколько раз задень...В данный момент мы остановились на поиске последнего родителя с заполненной схемой цтз, т.е верхний родитель пока не актуален...
46. Ish_2 1104 21.09.09 08:20 Сейчас в теме
(45) Если у родителя(группы) самого верхнего(старшего) уровня для данного элемента справочника - Схема ЦТЗ № 4, а у родителя более нижнего уровня СхемаЦТЗ №2. То тогда действующей схемой для данного элемента справочника будет считаться СхемаЦТЗ № 2. Так ?

РодительА СхемаЦТЗ № 4
РодительВ ..............
РодительС СхемаЦТЗ 2

ЭлементСправочника ....

Есть ли регистр сведений с измерением Номенклатура и ресурсом Схема ЦТЗ ? Или где хранятся эти данные ?
47. Borisych 503 21.09.09 09:12 Сейчас в теме
(45) ну так мы узнаем что есть "Схема ЦТЗ" или нет? // см.(35)-(36)
49. Borisych 503 21.09.09 11:59 Сейчас в теме
Ты по существу (47) дашь когда-нибудь ответ?
42. WKBAPKA 214 20.09.09 13:17 Сейчас в теме
Я в консоли не проверял таблицу значений. :)
я тестировал на УТП. В демо-версии в справочнике "Номенклатура" иерархия 2 уровня. Я добавил еще один уровень, получил результат запроса в виде таблицы с двумя колонками: Элемент, Старший родитель.
В итоге получил:
Элемент СтаршийРодитель
Материалы
МАТЕРИАЛ !!!!! Материалы
МАТЕРИАЛ 222 МАТЕРИАЛ !!!!!

Где Материалы - это старший родитель, внутри этой группы группа "МАТЕРИАЛ !!!", а внутри этой группы "МАТЕРИАЛ 222".
Т.е. если выгрузить в таблицу значений результат, получим последнюю строку без прямой ссылки на Материалы. В этом случае лучше уже выгружать в дерево значений, тогда можно будет получить самый верхний уровень.
43. Ish_2 1104 20.09.09 13:29 Сейчас в теме
(42) Я толкую про то , что итоговая ТЗ с правильным заполнением колонок получается в результате последующей за запросом обработки(см. код (39) после строки "Таблица= Запрос.Выполнить().Получить();");

Ты же мне толкуешь , что после выполнения первого запроса таблица - неверная. Она и не должна быть верной
Скопируй код в (39) в обработку , пройдись отладчиком и всё поймешь.
44. WKBAPKA 214 20.09.09 13:35 Сейчас в теме
2(43): ок, я попробую в обработке. тема интересная
48. plasmoid 21.09.09 11:35 Сейчас в теме
Ситуация следующая если у родителя старшего уровня для элемента Схема ЦТЗ №4, а у родителя а у родителя более нижнего уровня Схема ЦТЗ №2 то действующей схемой будит схма ЦТЗ №4.
52. Ish_2 1104 21.09.09 12:12 Сейчас в теме
(48) Я , конечно , всё понимаю : логисты , как и программисты, бывают разные. Но то, что Вы написали в (48) противоречит здравому и любому другому иерархическому смыслу .
Параметр СхемаЦТЗ для старшего родителя должен задавать по умолчанию некоторое значение (например №4) для всех подчиненных нижестоящих элементов. Если родитель более низкого уровня задает другое значение , то действующим для нижестоящих элементов считается именно оно (№2).
Это логичная распространенная иерархическая схема назначения параметров нижестоящим элементам в дереве.
Действующая ,кстати , в типовых конфигурациях (в БП 1.6 назначение счета номенклатуре).

Вы всё-таки поговорите с логистом поподробнее. Здесь что-то не так.
50. Borisych 503 21.09.09 11:59 Сейчас в теме
желание помочь уменьшается катастрофически...
51. WiseSnake 1519 21.09.09 12:11 Сейчас в теме
Тут для СКД есть такой вариант решения, как мне кажеться:
1. Делаешь запрос к номенклатуре
2. В отдельной процедурке собираешь все твои схемы и данные
3. Запихиваешь все это хозяйство в СКД виртуальной таблицей и там юзаеш.
57. anig99 2843 21.09.09 17:11 Сейчас в теме
Нагородили-то, нагородили-то... (: Короч, спасибо в любом случае. Пришли к решению (51), которое я ему ещё на прошлой неделе проталкивал (: Ну надеялся человек, что не придется ему Хрусталеву читать (: Сейчас он как раз добивает вариант через виртуальную таблицу. По результатам, наверное, сюда доложится.
58. Ish_2 1104 21.09.09 17:17 Сейчас в теме
(57) Передай ему , что он при пытках держался стойко , как партизан.
59. anig99 2843 21.09.09 17:25 Сейчас в теме
(58) ща мы его будем ещё более зверски пытать - учить рекурсии
61. Ish_2 1104 21.09.09 17:47 Сейчас в теме
(59) Я тоже извиняюсь. Но если Вы будете пытать человека рекурсией , не забудьте сказать :
каждое обращение в процедуре через точку ".Родитель" есть запрос к базе.
Вот почему в данном случае лучше обойтись без рекурсии.
70. WiseSnake 1519 21.09.09 20:24 Сейчас в теме
(57) Хм... Вас Александр Медведев я чет в ветке не нашел..
(60) А Вы, уважаемый WKBAPKA, говорили только о том чтобы получить ВТ только иерархию номенклатуры. Это только пункт 1 в 51. В Ваших суждениях нет пункта 2 вообще... Без пункта 2 Вы не сможете связать ВТ и запрос чтобы получить верхнего родителя...

P.S. Рекурсия это круто...
71. anig99 2843 21.09.09 21:02 Сейчас в теме
(70) я с автор ветки по аське общаюсь (: и тема поднялась ещё на прошлой неделе.
73. WiseSnake 1519 21.09.09 21:34 Сейчас в теме
(71) Можно было и тут общаться :)... для будущих поколений ;)
74. anig99 2843 21.09.09 22:50 Сейчас в теме
(73) Да тут и так к этому решению пришли...просто не хотелось мешать, вдруг чего другое придумали бы...да и основная тема развилась, когда болел
79. WKBAPKA 214 22.09.09 08:43 Сейчас в теме
2(70): Процетировать первое сообщение в этой ветке? какой был вопрос, такой и ответ. Эт уже по ходу дела начали вырисовываться подробности.
Вопрос был однозначный, как найти самого верхнего родителя, что и было предложено без всяких там ВЫБОР и КОГДА
53. plasmoid 21.09.09 13:03 Сейчас в теме
тааак все вроде консенсус найден нужна первая заполненая схема цтз, т.е например стародвор владимир колбаса если схема задана для колбасы тогда берем от туда если для кбасы пусто тогда смотрим владимир и т.д
54. Ish_2 1104 21.09.09 13:38 Сейчас в теме
(53) А если схемы заданы и для "колбасы" - №6 и для "владимир" - №8.
Стародвор
Владимир № 8
Колбаса № 6
колбаса такая, сякая

То какая схема будет действующей для "колбасы такая сякая" ?
55. plasmoid 21.09.09 13:41 Сейчас в теме
56. Ish_2 1104 21.09.09 13:45 Сейчас в теме
(55) Слава богу.
Теперь где хранятся значения схем для групп справочника "номенклатура" ? В регистре сведений ?
60. WKBAPKA 214 21.09.09 17:41 Сейчас в теме
я конечно сильно извиняюсь. но если брать эту ветку, то про виртуальную таблицу говорил я, эт, для справедливости :)
62. anig99 2843 21.09.09 17:58 Сейчас в теме
(60) на что я указал, только идея проталкивалась ещё до появления ветки
(61) А чего ещё делать... пока так... оптимизация - это второй этап... Я так понял, получить все связки Номенклатура - Родитель -ЦТЗ в таблицу и уже по ней искать родителей и ЦТЗ рекурсивно. Вообще работать со структурами неизвестной глубины вложенности без рекурсии сложно. И тут неважно с чем работает - с базой или таблицей.
Алгоритм такой. Идем по списку номенклатуры, проверяем только не группы. Для каждого элемента проверяется родитель на наличие ЦТЗ, если такого нет запускаем поиск в таблице по данному родителю для нахождения его родителя и ЦТЗ соответсвенно...алогоритм повторять пока не дойдем до самого верха или пока не найдем ЦТЗ... возвращаем номенклатуру и ЦТЗ в новую таблицу... И так до конца, пока не переберем всю номенклатуру. В результата будем иметь таблицу номенклатура-ЦТЗ, которую как параметр загоняем в СКД виртуальную таблицу...
Можно реализовать и через цикл, но мне проще через рекурсию сделать...Это как чай и молоко... Кто-то лъет сначала молоко, потом заварку и воду, кто-то сначала заварку, воду, а потом молоко, а кто пьет без молока....
63. Ish_2 1104 21.09.09 18:17 Сейчас в теме
(62) А я бы получил временную таблицу из справочника с итогами по "Только Иерархия" , соединил бы её левым соединением с таблицей (регистр ?), сод.значения схем , затем выгрузил бы результат запроса в ТЗ.
И затем одним циклом присвоил бы всем строкам таблицы нужные значения "СхемаЦТЗ". После этого ТЗ можно отправить во временную таблицу.
65. anig99 2843 21.09.09 18:21 Сейчас в теме
(63) вопрос в том, что не для всех родителей есть ЦТЗ. Нужно найти ближаешего родителя с ЦТЗ. Поэтому можно сразу в одном запросе получуить Таблицу с тремя колонками Номенклатура(группа) - Родитель - ЦТЗгруппы и уже циклом (рекурсией) для номенклатуры искать ближайшее ЦТЗгруппы.
66. Ish_2 1104 21.09.09 18:25 Сейчас в теме
(65) Естестественно не для всех . ЕСЛИ СВЕДЕНИЯ ХРАНЯТСЯ В РЕГИСТРЕ то это узнается в левом соединении.
Лучше ответьте на (64).
64. Ish_2 1104 21.09.09 18:21 Сейчас в теме
(62) Так Всё-таки в регистре хранятся значения "СхемаЦТЗ" для каждой группы или нет ? (вопрос задается в 4 раз)
67. anig99 2843 21.09.09 18:29 Сейчас в теме
(64) Нет. Это вообще справочник. А у группы добавлен новый реквизит для связи с ЦТЗ(он заполнен не для всех) В результате имеем некий элемент номенклатуры у которого есть неизвестное число вышестоящих родителей (групп) Нужно найти ближайшего родителя этого элемента с ЦТЗ. Если для непосредственного родителя ЦТЗ можно посмотреть без проблем, то вот дальше надо ...ну я там написал
68. Ish_2 1104 21.09.09 18:38 Сейчас в теме
(67) Вы там как -нибудь поделикатнее растолкуйте , чтобы такую структуру хранения значений СхемаЦТЗ никому больше не показывали. Есть люди всякие , злословить будут... Подождем Вашего решения. Я (63) не отменяю.
69. anig99 2843 21.09.09 20:22 Сейчас в теме
(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
72. Ish_2 1104 21.09.09 21:14 Сейчас в теме
(69) Сейчас сделаю код. Он очень небольшой. Посмотрим.
75. plasmoid 21.09.09 23:35 Сейчас в теме
отче в процессе завершения =) как только все будит готово, рабочий код с подробным описанием будет выложен в ветке =)) для всеобщего пользования =) я думаю Саша не будит против. Основная заслуга в реализации этого решения его мне остается следовать только четким инструкциям....
76. Ish_2 1104 22.09.09 01:48 Сейчас в теме
Я извиняюсь. Задержался с " небольшим кодом" .

В справочнике Номенклатура определен реквизит "СхемаЦТЗ" только для групп. Тип реквизита "Справочник.СхемыЦТЗ"
Значение "СхемыЦТЗ" для каждого элемента справочника берется из заполненного реквизита ближайшего нижестоящего
родителя .
Нужно получить таблицу значений с колонками "Ссылка","СхемаЦТЗ" .
Данное решение ставит целью - минимальное обращение к базе данных.
Применена рекурсия (к сожалению). Текст скопирован из модуля тестировавшейся обработки.

Перем ВыходнаяТаблица ;
Процедура КнопкаВыполнитьНажатие(Кнопка)
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
               |	Номенклатура.Ссылка КАК Ссылка,
               |	Номенклатура.ЭтоГруппа
               |ИЗ
               |	Справочник.Номенклатура КАК Номенклатура
               |ГДЕ
               |	Номенклатура.ЭтоГруппа = ЛОЖЬ
               |ИТОГИ ПО
               |	Ссылка ТОЛЬКО ИЕРАРХИЯ";
Дерево= Запрос.Выполнить().Выгрузить(ОбходРезультатаЗапроса.ПоГруппировкамСИерархией);
// Получили правильное дерево справочника
СтрокаСNULL =Дерево.Строки.Найти(NULL,"ЭтоГруппа",Истина);
Если СтрокаСNULL <> НеОпределено Тогда
	 // исправили для итога по элементам с уровнем 0
	 СтрокаСNULL.ЭтоГруппа = Истина;
КонецЕсли;	 
ВыходнаяТаблица = Новый ТаблицаЗначений;
ВыходнаяТаблица.Колонки.Добавить("Ссылка");
ВыходнаяТаблица.Колонки.Добавить("СхемаЦТЗ");
РаскрутитьСтроки(Дерево.Строки,Справочники.СхемыЦТЗ.ПустаяСсылка());	
КонецПроцедуры
Процедура РаскрутитьСтроки(Строки,ПарСхемаЦТЗ)
	Для каждого Строка из Строки Цикл
		Если Строка.ЭтоГруппа Тогда
			 // единств. место где происходит запрос к базе
			 // но и это можно обойти выгрузив справочник в ТЗ
		     СхемаЦТЗ = Строка.Ссылка.СхемаЦТЗ; 
		     ТекСхемаЦТЗ = ?(ЗначениеЗаполнено(СхемаЦТЗ),СхемаЦТЗ,ПарСхемаЦТЗ);
			 РаскрутитьСтроки(Строка.Строки, ТекСхемаЦТЗ);
		Иначе	 
			 НовСтрока = ВыходнаяТаблица.Добавить();
			 НовСтрока.Ссылка = Строка.Ссылка;
			 НовСтрока.СхемаЦТЗ = ПарСхемаЦТЗ;
		КонецЕсли;
	КонецЦикла	
Конецпроцедуры	
Показать


Если запросом к справочнику "Номенклатура" получить вспомогательную ТЗ1 с колонками "Ссылка,СхемаЦТЗ", то в рекурсивной процедуре можно избежать обращений (запросов к базе) : "Строка.Ссылка.СхемаЦТЗ".
77. anig99 2843 22.09.09 06:54 Сейчас в теме
(76) о чем я и говорил... без рекурсии сложно, но можно вые...ся..
78. WiseSnake 1519 22.09.09 07:11 Сейчас в теме
(76) Что и требовалось доказать ))
80. WKBAPKA 214 22.09.09 08:49 Сейчас в теме
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

в итоге получаем иерархию выбранного элемента. А дальше дело техники
81. WKBAPKA 214 22.09.09 08:50 Сейчас в теме
а уже "дело техники", можно использовать дерево значений, можно просто выборку обрабатывать, разницы нет.
82. plasmoid 30.09.09 12:06 Сейчас в теме
Как и обещал финальный вариант по поиску родителя в запросе 2 функции:

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

 Возврат(СтрокаВыборки.ЦТЗ);

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

Показать


и вторая
Функция ВовзратЦТЗ(Дата)
	
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
               |	Номенклатура.Ссылка КАК Номенклатура,
               |	ЕСТЬNULL(СхемыЦТЗ.ЦТЗ, ""нет"") КАК ЦТЗ,
               |	Номенклатура.Родитель КАК Родитель,
               |	Номенклатура.ЭтоГруппа КАК ЭтоГруппа
               |ИЗ
               |	Справочник.Номенклатура КАК Номенклатура
               |		ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
               |			СхемыЦТЗ.Ссылка КАК Ссылка,
               |			ВЫБОР
               |				КОГДА ДЕНЬНЕДЕЛИ(&КонецПериода) = 1
               |					ТОГДА СхемыЦТЗ.Понедельник
               |				ИНАЧЕ ВЫБОР
               |						КОГДА ДЕНЬНЕДЕЛИ(&КонецПериода) = 2
               |							ТОГДА СхемыЦТЗ.Вторник
               |						ИНАЧЕ ВЫБОР
               |								КОГДА ДЕНЬНЕДЕЛИ(&КонецПериода) = 3
               |									ТОГДА СхемыЦТЗ.Среда
               |								ИНАЧЕ ВЫБОР
               |										КОГДА ДЕНЬНЕДЕЛИ(&КонецПериода) = 4
               |											ТОГДА СхемыЦТЗ.Четверг
               |										ИНАЧЕ ВЫБОР
               |												КОГДА ДЕНЬНЕДЕЛИ(&КонецПериода) = 5
               |													ТОГДА СхемыЦТЗ.Пятница
               |												ИНАЧЕ ВЫБОР
               |														КОГДА ДЕНЬНЕДЕЛИ(&КонецПериода) = 6
               |															ТОГДА СхемыЦТЗ.Суббота
               |														ИНАЧЕ ВЫБОР
               |																КОГДА ДЕНЬНЕДЕЛИ(&КонецПериода) = 7
               |																	ТОГДА СхемыЦТЗ.Воскресение
               |															КОНЕЦ
               |													КОНЕЦ
               |											КОНЕЦ
               |									КОНЕЦ
               |							КОНЕЦ
               |					КОНЕЦ
               |			КОНЕЦ КАК ЦТЗ
               |		ИЗ
               |			Справочник.СхемыЦТЗ КАК СхемыЦТЗ
               |		ГДЕ
               |			СхемыЦТЗ.ПометкаУдаления = ЛОЖЬ) КАК СхемыЦТЗ
               |		ПО Номенклатура.Родитель.СхемаЦТЗ.Ссылка = СхемыЦТЗ.Ссылка
               |ГДЕ
               |	Номенклатура.ПометкаУдаления = ЛОЖЬ";

Запрос.УстановитьПараметр("КонецПериода",Дата);		   
ВыборкаУник=Запрос.Выполнить().Выгрузить();

ТаблицаВирт=Новый ТаблицаЗначений();
Тип=Новый ОписаниеТипов("СправочникСсылка.Номенклатура");
ТаблицаВирт.Колонки.Добавить("Номенклатура",Тип);
Тип=Новый ОписаниеТипов("Число");
ТаблицаВирт.Колонки.Добавить("ЦТЗ",Тип);

Для Каждого СтрокаВыборки из ВыборкаУник Цикл 
    ОбработкаПрерыванияПользователя(); 
  Если СтрокаВыборки.ЭтоГруппа Тогда
   Продолжить;
  КонецЕсли;
    виртСтрока=ТаблицаВирт.Добавить();
    виртСтрока.Номенклатура=СтрокаВыборки.Номенклатура;
    ЦТЗ=ПолучитьСтрокуЦТЗ(СтрокаВыборки);
  виртСтрока.ЦТЗ=?(ТипЗнч(ЦТЗ)=Тип("Число"),ЦТЗ,0);
 КонецЦикла;
Возврат(ТаблицаВирт);
КонецФункции
Показать

Огромное спасибо Медведеву Александру за помощь и поддержку!!!!!!!!!
83. anig99 2843 30.09.09 12:27 Сейчас в теме
в начале модуля
Перем ВыборкаУник
85. Ish_2 1104 30.09.09 17:05 Сейчас в теме
(83),(84) Если этот текст приводится для того , чтобы его читали,
то нужно вначале описать используемые объекты конфигурации.
Затем постановку задачи. Затем текст модуля целиком.
(Извиняюсь за азбуку)
87. anig99 2843 30.09.09 19:33 Сейчас в теме
(85) постановка действительно была в начале. Шло обсуждение алгоритма, к этому обсуждение и выложен код - достаточно прозрачный и понятный...
Одна рекурсивная функция по поиску данных у родителей и самих родителей и одна функция формирующая первичную таблицу, вызывающая рекурсивную и возвращающая заполненную.
84. plasmoid 30.09.09 13:05 Сейчас в теме
86. plasmoid 30.09.09 19:26 Сейчас в теме
постановка задачи была указана в самом начале моего поста, если надо могу выложить полностью готовый отчет. который у мну работает в УТ.
88. Ish_2 1104 30.09.09 19:33 Сейчас в теме
(86) Мда... Пожалуй, не надо.
89. prog1c_vl 24 21.02.24 18:09 Сейчас в теме
ВЫБОР
	КОГДА ПродажиОбороты.Номенклатура.Родитель.Родитель = ЗНАЧЕНИЕ(Справочник.Номенклатура.ПустаяСсылка)
		ТОГДА ПродажиОбороты.Номенклатура.Родитель
	КОГДА ПродажиОбороты.Номенклатура.Родитель.Родитель.Родитель = ЗНАЧЕНИЕ(Справочник.Номенклатура.ПустаяСсылка)
		ТОГДА ПродажиОбороты.Номенклатура.Родитель.Родитель
	КОГДА ПродажиОбороты.Номенклатура.Родитель.Родитель.Родитель.Родитель = ЗНАЧЕНИЕ(Справочник.Номенклатура.ПустаяСсылка)
		ТОГДА ПродажиОбороты.Номенклатура.Родитель.Родитель.Родитель
	КОГДА ПродажиОбороты.Номенклатура.Родитель.Родитель.Родитель.Родитель.Родитель = ЗНАЧЕНИЕ(Справочник.Номенклатура.ПустаяСсылка)
		ТОГДА ПродажиОбороты.Номенклатура.Родитель.Родитель.Родитель.Родитель
	КОГДА ПродажиОбороты.Номенклатура.Родитель.Родитель.Родитель.Родитель.Родитель.Родитель = ЗНАЧЕНИЕ(Справочник.Номенклатура.ПустаяСсылка)
		ТОГДА ПродажиОбороты.Номенклатура.Родитель.Родитель.Родитель.Родитель.Родитель
	КОГДА ПродажиОбороты.Номенклатура.Родитель.Родитель.Родитель.Родитель.Родитель.Родитель.Родитель = ЗНАЧЕНИЕ(Справочник.Номенклатура.ПустаяСсылка)
		ТОГДА ПродажиОбороты.Номенклатура.Родитель.Родитель.Родитель.Родитель.Родитель.Родитель
	КОГДА ПродажиОбороты.Номенклатура.Родитель.Родитель.Родитель.Родитель.Родитель.Родитель.Родитель.Родитель = ЗНАЧЕНИЕ(Справочник.Номенклатура.ПустаяСсылка)
		ТОГДА ПродажиОбороты.Номенклатура.Родитель.Родитель.Родитель.Родитель.Родитель.Родитель.Родитель
КОНЕЦ
Показать
90. dehro 5 22.02.24 11:13 Сейчас в теме
Это про подразделения, но сути не меняет. Для использования в СКД такой проблемы не возникало, но наверное бы попробовал разные наборы данных: один запрос, второй объект - куда передал бы таблицу значений.

Процедура ДобавитьВсеСтрокиПодразделения(аТаблицаРезультат, аИсходнаяТаблица, аПодразделение, аРодитель)

	НоваяСтрока = аТаблицаРезультат.Добавить();
	НоваяСтрока.Подразделение 	= аПодразделение;

	Если аРодитель = Справочники.ПодразделенияОрганизаций.ПустаяСсылка() тогда
		НоваяСтрока.Родитель 		= аПодразделение;
	Иначе	
		НоваяСтрока.Родитель 		= аРодитель;
		
        СтруктураПоиска = Новый Структура("Подразделение", аРодитель);
		СтрокиПоПодразделению = аИсходнаяТаблица.НайтиСтроки(СтруктураПоиска);
		Если СтрокиПоПодразделению.Количество() = 1 Тогда
			ДобавитьВсеСтрокиПодразделения(аТаблицаРезультат, аИсходнаяТаблица, аПодразделение, СтрокиПоПодразделению[0].Родитель);
		КонецЕсли;
	КонецЕсли;
		
КонецПроцедуры

Процедура  ДобавитьВТПодразделенияРодители(аМенеджерВременныхТаблиц)
	Запрос = Новый Запрос("ВЫБРАТЬ
	                      |	ПодразделенияОрганизаций.Ссылка КАК Подразделение,
	                      |	ЕСТЬNULL(ВышестоящееПодразделение.Ссылка, ЗНАЧЕНИЕ(Справочник.ПодразделенияОрганизаций.ПустаяСсылка)) КАК Родитель
	                      |ИЗ
	                      |	Справочник.ПодразделенияОрганизаций КАК ПодразделенияОрганизаций
	                      |		ЛЕВОЕ СОЕДИНЕНИЕ Справочник.ПодразделенияОрганизаций КАК ВышестоящееПодразделение
	                      |		ПО ПодразделенияОрганизаций.Родитель = ВышестоящееПодразделение.Ссылка");
	РезЗапроса = запрос.Выполнить().Выгрузить();
	Результат = РезЗапроса.СкопироватьКолонки();
	Для Каждого Запись из РезЗапроса цикл
		ДобавитьВсеСтрокиПодразделения(Результат, РезЗапроса, Запись.Подразделение, Запись.Родитель);
	КонецЦикла;	
	
	Запрос.МенеджерВременныхТаблиц = аМенеджерВременныхТаблиц;
	Запрос.УстановитьПараметр("Табло", Результат);
	
	Запрос.Текст = "Выбрать Таб.Подразделение, Таб.Родитель Поместить ВТПодразделенияРодители из &Табло как Таб";
	Запрос.Выполнить();
КонецПроцедуры

Показать
Оставьте свое сообщение

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