Имя: Пароль:
1C
1С v8
Запрос с иерархией
0 Весенняя Мелисса
 
01.03.16
15:22
Есть РС в котором есть Измерение Подразделение..... и на каждое подразделение назначен свой режим работы. Действуют эти режимы иерархическим образом, т.е. если у нас подразделение нижнего уровня, то для этого подразделения действует режим работы первого верхнего уровня вышестоящего, для которго заполнено значение. Например, в РС Подразделение 2 - 8:00-18:00, Подразделение 3 - 9:00-19:00. Иерархия Подразделение 1 (не является родителем, детальная запись) - подразделение 2 (=Подразделение1.Родитель), подразделение 3 (=Подразделение2.Родитель или Подразделение 1.Родитель.Родитель). Не могу написать запрос
1 Весенняя Мелисса
 
01.03.16
15:23
Написала ВЫБРАТЬ
    АП_РежимРаботыПоСменамСрезПоследних.ПодразделениеСотрудник КАК ПодразделениеСотрудник,
    ПодразделенияОрганизаций.Ссылка КАК Ссылка,
    АП_РежимРаботыПоСменамСрезПоследних.ВремяНачалоРаботы КАК ВремяНачалоРаботы,
    АП_РежимРаботыПоСменамСрезПоследних.ВремяОкончанияРаботы КАК ВремяОкончанияРаботы
ИЗ
    Справочник.ПодразделенияОрганизаций КАК ПодразделенияОрганизаций
        ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.АП_РежимРаботыПоСменам.СрезПоследних(&КонецПериода, ПодразделениеСотрудник ССЫЛКА Справочник.ПодразделенияОрганизаций) КАК АП_РежимРаботыПоСменамСрезПоследних
        ПО (ВЫБОР
                КОГДА ПодразделенияОрганизаций.Ссылка = АП_РежимРаботыПоСменамСрезПоследних.ПодразделениеСотрудник
                    ТОГДА ПодразделенияОрганизаций.Ссылка = АП_РежимРаботыПоСменамСрезПоследних.ПодразделениеСотрудник
                ИНАЧЕ ВЫБОР
                        КОГДА ПодразделенияОрганизаций.Ссылка.Родитель = АП_РежимРаботыПоСменамСрезПоследних.ПодразделениеСотрудник
                            ТОГДА ПодразделенияОрганизаций.Ссылка.Родитель = АП_РежимРаботыПоСменамСрезПоследних.ПодразделениеСотрудник
                        ИНАЧЕ ВЫБОР
                                КОГДА ПодразделенияОрганизаций.Ссылка.Родитель.Родитель = АП_РежимРаботыПоСменамСрезПоследних.ПодразделениеСотрудник
                                    ТОГДА ПодразделенияОрганизаций.Ссылка.Родитель.Родитель = АП_РежимРаботыПоСменамСрезПоследних.ПодразделениеСотрудник
                            КОНЕЦ
                    КОНЕЦ
            КОНЕЦ)
ГДЕ
    ПодразделенияОрганизаций.Ссылка = &Ссылка
Но этот запрос возвращает мне два подразделения - Подразделение2 и подразделение3, когда должно возвращать только подразделение2. В настоящей задаче естественно соединять нужно не со справочником подразделения, а с другой таблицей.
2 Весенняя Мелисса
 
01.03.16
15:24
Еще был вариант условия
ВЫБОР
    КОГДА ПодразделенияОрганизаций.Ссылка = АП_РежимРаботыПоСменамСрезПоследних.ПодразделениеСотрудник
                    ТОГДА ПодразделенияОрганизаций.Ссылка = АП_РежимРаботыПоСменамСрезПоследних.ПодразделениеСотрудник
          
    КОГДА ПодразделенияОрганизаций.Ссылка.Родитель = АП_РежимРаботыПоСменамСрезПоследних.ПодразделениеСотрудник
                            ТОГДА ПодразделенияОрганизаций.Ссылка.Родитель = АП_РежимРаботыПоСменамСрезПоследних.ПодразделениеСотрудник
    КОГДА ПодразделенияОрганизаций.Ссылка.Родитель.Родитель = АП_РежимРаботыПоСменамСрезПоследних.ПодразделениеСотрудник
                                    ТОГДА ПодразделенияОрганизаций.Ссылка.Родитель.Родитель = АП_РежимРаботыПоСменамСрезПоследних.ПодразделениеСотрудник
      КОНЕЦ
Но этот вариант тоже возвращал два подразделения
3 Лефмихалыч
 
01.03.16
15:36
выбрать для всех имеющихся подразделений
отсортировать по иерархии
взять первые 1 из того, что получилось
4 НЕА123
 
01.03.16
15:37
ПО (ВЫБОР
                КОГДА ПодразделенияОрганизаций.Ссылка = АП_РежимРаботыПоСменамСрезПоследних.ПодразделениеСотрудник
                    ТОГДА ПодразделенияОрганизаций.Ссылка = АП_РежимРаботыПоСменамСрезПоследних.ПодразделениеСотрудник
                ИНАЧЕ ВЫБОР
                        КОГДА ПодразделенияОрганизаций.Ссылка.Родитель = АП_РежимРаботыПоСменамСрезПоследних.ПодразделениеСотрудник
                            ТОГДА ПодразделенияОрганизаций.Ссылка.Родитель = АП_РежимРаботыПоСменамСрезПоследних.ПодразделениеСотрудник
И
ПодразделенияОрганизаций.Ссылка <> АП_РежимРаботыПоСменамСрезПоследних.ПодразделениеСотрудник
                        ИНАЧЕ ВЫБОР
                                КОГДА ПодразделенияОрганизаций.Ссылка.Родитель.Родитель = АП_РежимРаботыПоСменамСрезПоследних.ПодразделениеСотрудник
                                    ТОГДА ПодразделенияОрганизаций.Ссылка.Родитель.Родитель = АП_РежимРаботыПоСменамСрезПоследних.ПодразделениеСотрудник
И
ПодразделенияОрганизаций.Ссылка <> АП_РежимРаботыПоСменамСрезПоследних.ПодразделениеСотрудник
И
ПодразделенияОрганизаций.Ссылка.Родитель <> АП_РежимРаботыПоСменамСрезПоследних.ПодразделениеСотрудник


                            КОНЕЦ
                    КОНЕЦ
            КОНЕЦ)
6 Весенняя Мелисса
 
01.03.16
15:56
(4)
ВЫБРАТЬ
    АП_РежимРаботыПоСменамСрезПоследних.ПодразделениеСотрудник КАК ПодразделениеСотрудник,
    ПодразделенияОрганизаций.Ссылка КАК Ссылка,
    АП_РежимРаботыПоСменамСрезПоследних.ВремяНачалоРаботы КАК ВремяНачалоРаботы,
    АП_РежимРаботыПоСменамСрезПоследних.ВремяОкончанияРаботы КАК ВремяОкончанияРаботы
ИЗ
    Справочник.ПодразделенияОрганизаций КАК ПодразделенияОрганизаций
        ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.АП_РежимРаботыПоСменам.СрезПоследних(&КонецПериода, ) КАК АП_РежимРаботыПоСменамСрезПоследних
        ПО (ВЫБОР
                КОГДА ПодразделенияОрганизаций.Ссылка = АП_РежимРаботыПоСменамСрезПоследних.ПодразделениеСотрудник
                    ТОГДА ПодразделенияОрганизаций.Ссылка = АП_РежимРаботыПоСменамСрезПоследних.ПодразделениеСотрудник
                ИНАЧЕ ВЫБОР
                        КОГДА ПодразделенияОрганизаций.Ссылка.Родитель = АП_РежимРаботыПоСменамСрезПоследних.ПодразделениеСотрудник
                            ТОГДА ПодразделенияОрганизаций.Ссылка.Родитель = АП_РежимРаботыПоСменамСрезПоследних.ПодразделениеСотрудник
                                    И ПодразделенияОрганизаций.Ссылка <> АП_РежимРаботыПоСменамСрезПоследних.ПодразделениеСотрудник
                        ИНАЧЕ ВЫБОР
                                КОГДА ПодразделенияОрганизаций.Ссылка.Родитель.Родитель = АП_РежимРаботыПоСменамСрезПоследних.ПодразделениеСотрудник
                                    ТОГДА ПодразделенияОрганизаций.Ссылка.Родитель.Родитель = АП_РежимРаботыПоСменамСрезПоследних.ПодразделениеСотрудник
                                            И ПодразделенияОрганизаций.Ссылка <> АП_РежимРаботыПоСменамСрезПоследних.ПодразделениеСотрудник
                                            И ПодразделенияОрганизаций.Ссылка.Родитель <> АП_РежимРаботыПоСменамСрезПоследних.ПодразделениеСотрудник
                            КОНЕЦ
                    КОНЕЦ
            КОНЕЦ)
ГДЕ
    ПодразделенияОрганизаций.Ссылка = &Ссылка

УПОРЯДОЧИТЬ ПО
    Ссылка ИЕРАРХИЯ
Возвращает все равно 2 значения из РС Подразделение 2 8-18 Подразделение 3 9-19 для подразделения 1.
(3) Выбрать первые 1 вернет мне только 1 запись
7 Лефмихалыч
 
01.03.16
16:16
(6) тогда выбрать максимум, а потом из максимума выбрать по равенству.

Короче - это срез последних, только не дата является критерием
8 PuhUfa
 
01.03.16
16:21
Справочник.ПодразделенияОрганизаций

подразделение 3
- подразделение 2
-- подразделение 1

Я правильно понял иерархию справочника?
9 Весенняя Мелисса
 
01.03.16
16:22
(8) да, все верно
10 PuhUfa
 
01.03.16
16:25
(9) Зачем тогда такое сложное соединение? Почему не просто:

ВЫБРАТЬ
    АП_РежимРаботыПоСменамСрезПоследних.ПодразделениеСотрудник КАК ПодразделениеСотрудник,
    ПодразделенияОрганизаций.Ссылка КАК Ссылка,
    АП_РежимРаботыПоСменамСрезПоследних.ВремяНачалоРаботы КАК ВремяНачалоРаботы,
    АП_РежимРаботыПоСменамСрезПоследних.ВремяОкончанияРаботы КАК ВремяОкончанияРаботы
ИЗ
    Справочник.ПодразделенияОрганизаций КАК ПодразделенияОрганизаций
        ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.АП_РежимРаботыПоСменам.СрезПоследних(&КонецПериода, ) КАК АП_РежимРаботыПоСменамСрезПоследних
        ПО ПодразделенияОрганизаций.Ссылка.Родитель = АП_РежимРаботыПоСменамСрезПоследних.ПодразделениеСотрудник
ГДЕ
    ПодразделенияОрганизаций.Ссылка = &Ссылка
11 Весенняя Мелисса
 
01.03.16
16:29
(10) ну потому что в регистре сведений не обязательно есть записи по нужным подразделениям, могут быть и для подразделений более высшего уровня, которые должны действовать на нижестоящие. Наверное придется, как в  (7) написано, просто это два раза соединять данные. Самое интересное, что раньше я подобные запросы писала оч. часто (в др. месте работала) , а сейчас не могу вспомнить (я про иерархию, и про ее действие на нижестоящие)
12 Весенняя Мелисса
 
01.03.16
16:35
(10)а, потому что не известно какое значение в РС будет указано, оно может быть указано и для Подразделения 3 с.... по.. тогда подразделение 3, так и для подразделения 2 и для подразделения 3, тогда нужно будет только значение с подразделением 2
13 PuhUfa
 
01.03.16
17:11
Как вариант.
Перед запросом, функцией собирать в СЗ Подразделение и его Родителей и запрос формировать уже непосредственно по РС с фильтром из этого СЗ