Вход | Регистрация
 

Поиск ближайщего значения В ИЕРАРХИИ

Поиск ближайщего значения В ИЕРАРХИИ
Я
   Shark_2000
 
13.08.20 - 20:18
Уважаемые участники форума. Нужна ваша помощь.

Суть вопроса следующая:
Есть два справочника и регистр сведений.
1-й справочник иерархический(ОбъектПоставки), 2-й (ЦенаПоставки) подчинен товару.

Регистр сведений с измерениями: "ОбъектПоставки", "ТипЦены" и ресурсом: "Значение"

В регистре сведений Измерение Объект может принимать значение и группы и элемента, таким образом Цена устанавливается на Группу объектов и при добавлении объекта нет необходимости устанавливать значение для него отдельно.

Вопрос: Как в запросе получить Значение которое установлено для ближайшей группы в которой находится нужный Объект и нужный тип цены.
   Shark_2000
 
1 - 13.08.20 - 20:29
ТипЦены это справочник ЦенаПоставки
   vde69
 
2 - 13.08.20 - 21:12
читайте про денормализацию данных...

то есть нужно заполнить регистр всеми возможными к выборке значениями а потом уже получать без выпендрежа...
   lodger
 
3 - 13.08.20 - 21:31
прям в запросе? вангую - получится километровый запрос.
дешевле пред или пост обработкой.
   МихаилМ
 
4 - 13.08.20 - 22:19
(0) придумавшие и реализовавшие это должны быть уволены.
   Shark_2000
 
5 - 13.08.20 - 22:19
(3) Вы правы, уже решил следующим весьма простым способом:

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

КонецФункции
   Shark_2000
 
6 - 13.08.20 - 22:20
(4) Ха - Ха
   Кулибин
 
7 - 13.08.20 - 22:22
Моветон - устанавливать параметры до текста запроса, сложно читать - не стал, работает - хорошо, молодец.
   Shark_2000
 
8 - 13.08.20 - 22:23
(4) Наверняка ВЫ "ГЕНИЙ"
   Shark_2000
 
9 - 13.08.20 - 22:25
(7) Не так давно начал это делать, зато когда заходишь в конструктор не надо их писать, они сами подтягиваются
   Кулибин
 
10 - 13.08.20 - 22:30
Спасибо, открыл для меня, беру обратно, молодец. Две запятые пропустил только.
   МихаилМ
 
11 - 13.08.20 - 22:36
(0)
на этом форуме проблемы при использовании иерархии для работы с ценами обсуждались раз 30.
на других - тоже много тем.
   Shark_2000
 
12 - 13.08.20 - 22:50
(11) Друг да у меня вообще другая отрасль!!! и мне не цены нужны и нет у меня товаров и номенклатуры тоже, просто людям проще понимать когда им задают вопрос "Цена, номенклатура" и т.д. вы мысль не уловили, простите я забыл "ВЫ ГЕНИЙ"
   Shark_2000
 
13 - 13.08.20 - 22:52
(11) И из всех ответивших в данной теме Ваш "ОТВЕТ" "САМЫЙ ПОЛЕЗНЫЙ" без него я бы не справился спасибо!
   МихаилМ
 
14 - 13.08.20 - 23:05
(13)
я дал не правильный не формальный ответ.

ответ на Ваш вопрос  в (0)

https://yandex.ru/search/?text=транзитивное%20замыкание%20запрсом&lr=213
   palsergeich
 
15 - 13.08.20 - 23:13
(5) Акуительно.
Запрос в цикле и даже не стесняется)
   palsergeich
 
16 - 13.08.20 - 23:16
(15) А не это не запрос в цикле, а просто цикл просто так)
Скажи мне друг зачем этот цикл Пока Цены.Количество() = 0 Цикл
И как он выполняется в первый прогон, когда переменная Цены еще не инициирована?
   palsergeich
 
17 - 13.08.20 - 23:17
А да и запрос в цикле это тоже
   palsergeich
 
18 - 13.08.20 - 23:17
ой всё
   Shark_2000
 
19 - 14.08.20 - 00:51
(16) Извини не изменил в сообщении но где "Тарифы = Запрос.Выполнить().Выгрузить();" там "Цены = Запрос.Выполнить().Выгрузить();"
теперь НОРМ?
   Shark_2000
 
20 - 14.08.20 - 00:53
Друзья, Форум чтобы помогать друг другу а не "ВЫСМЕИВАТЬ"
   Shark_2000
 
21 - 14.08.20 - 01:07
Вот умники! Жуть! нет бы сказать: "Вот на возьми, пользуйся на здоровье". Нет! надо "ОБОСРАТЬ", и главное ни чего не подсказать. Да как вы так живете? не стрёмно?
   Ёпрст
 
22 - 14.08.20 - 01:21
(21) срез последних (если не хранить его в виде итогов) не самый быстрый объект (точнее, виртуальная, рассчитываемая табличка). А ты его еще и в цикл по всей иерархии загоняешь, + тащишь объекты через точку.
Как бэ это, не быстро и..структуру надо по-другому делать, или заниматься денормализацией.
Что б вот такого кода, как в (5) не было.
   Ёпрст
 
23 - 14.08.20 - 01:22
и если у тебя только 2 измерения и один ресурс, то top 1 в запросе лишнее
   Shark_2000
 
24 - 14.08.20 - 17:17
(22) Иерархия в принципе это Контактная Информация, которая ограничена как ни крути, объектов будет: ну 1000, ну 10000 явно не более и пройти по 8 уровням иерархии, чепуха.
   Kesim
 
25 - 14.08.20 - 17:23
(0) запросом получаем только элементы  добавляем приоритет = 1 и объединением получаем только группы  добавляем приоритет 0  - все это в вт,
потом соединяем с таблицей рс, и аккуратно группируешь по макс приоритет
   Kesim
 
26 - 14.08.20 - 17:26
(0) "..Значение которое установлено для ближайшей группы в которой находится нужный.." не "ближайшей", а "родитель"


Список тем форума
Рекламное место пустует  Рекламное место пустует
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.