Имя: Пароль:
1C
1С v8
v8: получить цепочку оснований в запросе
,
0 LAAry
 
26.11.12
18:52
Добрый день. Помогите советом:
Есть справочник, элементы которого могут вводиться на основании других элементов. Значение элемента-основания в новом элементе хранится в поле "Основание". Я хочу для каждого элемента справочника получить самый новый элемент. Если у элемента не заполнено основание, значит он и есть самый новый. Например, элементы вводили в такой связи:
Спр0 -> Спр1 -> Спр2 -> Спр3. Соответственно, для элементов Спр0-Спр2 самым новым будет Спр3

из такой таблицы:

Ссылка | Основание
Спр3   | Спр2
Спр2   | Спр1
Спр1   | Спр0

Получить такую:

Ссылка | Основание
Спр3   | Спр2
Спр3   | Спр1
Спр3   | Спр0

Запрос типа:

Выбрать
ЕстьNULL(СписокЭлементов2.Ссылка,СписокЭлементов1.Ссылка),
СписокЭлементов1.Основание
Из Справочник.Договоры КАК СписокЭлементов1
ЛевоеСоединение Справочник.Договоры КАК СписокЭлементов2
По СписокЭлементов1.Ссылка = СписокЭлементов2.Основание

Решит вопрос при "глубине" связи не более 2. Т.е. я получу такой результат:

Ссылка | Основание
Спр3   | Спр2
Спр3   | Спр1
Спр2   | Спр0

Можно ли в запросе без рекурсии получить нужную мне таблицу?
1 1C-band
 
26.11.12
18:53
Можно.
2 LAAry
 
26.11.12
18:54
(1) И?
3 1C-band
 
26.11.12
19:03
(2) Используй группировки и порядок.
4 LAAry
 
26.11.12
19:05
ОМГ :)
5 LAAry
 
26.11.12
19:10
(3) я наверно не очень понятно описал, ситуацию. Это не иерархия тут нет группировок.
6 H A D G E H O G s
 
26.11.12
19:24
(5) Посмотреть как сделано в типовых
7 H A D G E H O G s
 
26.11.12
19:24
Получения родителей у номенклатуры для простановки счета учета при установке галочки "БУ" в шапке документа.
8 H A D G E H O G s
 
26.11.12
19:25
Никогда бы не думал, что буду помнить типовые настолько.
9 kosts
 
26.11.12
19:30
Если количество вложений ограничено, как-то так можно


Выбор СписокЭлементов2.Основание.Основание Есть null и Не (СписокЭлементов2.Основание) Есть Null Тогда СписокЭлементов2.Основание
Иначе Выбор СписокЭлементов2.Основание.Основание.Основание Есть null и Не (СписокЭлементов2.Основание.Основание) Есть Null Тогда СписокЭлементов2.Основание.Основание
Иначе Выбор СписокЭлементов2.Основание.Основание.Основание.Основание Есть null и Не (СписокЭлементов2.Основание.Основание.Основание) Есть Null Тогда СписокЭлементов2.Основание.Основание.Основание
и т.д.
Иначе Null
Конец
Конец
Конец
Из Справочник.Договоры КАК СписокЭлементов2
10 H A D G E H O G s
 
26.11.12
19:35
11 kosts
 
26.11.12
19:51
12 LAAry
 
27.11.12
09:47
(7) Тут задача обратная. Я могу от текущего элемента дойти до самого первого. Но мне нужно для каждого элемента в цепочке установить в соответствие текущий элемент. Поясню: у меня был договор, по которому были движения. На основании 1-го договора создали 2-й, по которому тоже были движения. И т.д., например до 4-го договора. Теперь мне нужно получить все движения по всей цепочке договоров, но в отчете связать эти движения с 4-м договором.
(11) Видно придется делать рекурсию. Что не ускорит и так тяжелый отчет.
13 kosts
 
27.11.12
11:28
(12) Если конфа своя, то можно так реализовать:
В справочник добавить реквизит "исходный договор", куда для всей цепочки будет записываться ссылка на самый первый элемент.
И добавить реквизит "дата начала действия" (если такого еще нет).
Тогда запросом с группировкой по максимуму всегда можно получить последний или действующий на определенную дату если необходимо.
14 LAAry
 
27.11.12
11:37
(13) Своя, но суть в том, чтобы получать из родителя потомка. Хранение в потомке самого первого родителя ничего не упростит жизнь.
Можно сделать ссылку в родителе на прямого потомка и через точку получить актуальный, но опять таки без ограничений на уровень "вложенности" это можно сделать только рекурсией.
Сделал так:
ВЫБРАТЬ
   ЕСТЬNULL(Договоры1.Договор, Договоры.Договор) КАК Договор,
   Договоры.Договор.СР_Основание КАК Основание
ПОМЕСТИТЬ Договоры2
ИЗ
   Договоры КАК Договоры
       ЛЕВОЕ СОЕДИНЕНИЕ Договоры КАК Договоры1
       ПО Договоры.Договор = Договоры1.Договор.СР_Основание
           И Договоры.Договор.МС_Бренд = Договоры1.Договор.МС_Бренд
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
   ЕСТЬNULL(Договоры21.Договор, Договоры2.Договор) КАК Договор,
   Договоры2.Основание
ПОМЕСТИТЬ Договоры3
ИЗ
   Договоры2 КАК Договоры2
       ЛЕВОЕ СОЕДИНЕНИЕ Договоры2 КАК Договоры21
       ПО Договоры2.Договор = Договоры21.Основание
           И Договоры2.Договор.МС_Бренд = Договоры21.Договор.МС_Бренд
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
   ЕСТЬNULL(Договоры31.Договор, Договоры3.Договор) КАК Договор,
   Договоры3.Основание
ПОМЕСТИТЬ Договоры4
ИЗ
   Договоры3 КАК Договоры3
       ЛЕВОЕ СОЕДИНЕНИЕ Договоры3 КАК Договоры31
       ПО Договоры3.Договор = Договоры31.Основание
           И Договоры3.Договор.МС_Бренд = Договоры31.Договор.МС_Бренд
;

и так еще пару раз. Получается 2 в 5-й степени уровень "вложенности". найдется максимум 32-й потомок. Шит-код, но в разы быстрее рекурсии для каждого элемента.
15 kosts
 
27.11.12
12:49
(14) > Хранение в потомке самого первого родителя ничего не упростит жизнь.
Отчего же. Зная любой произвольный потомок или первый в цепочке можно найти любой другой на определенную дату или последний.


Выбрать ИсходныеДоговора.Ссылка как ИсходныйДоговор, Макс(Договора.ДатаНачалаДействия) Как ДатаПоследнегоВЦепочке
Из Справочник.Договора Как ИсходныеДоговора
Левое соединение Справочник.Договора как Договора по ИсходныеДоговора.Ссылка = Договора.ИсходныеДоговора
Где ИсходныеДоговора.ИсходныйДоговор = Значение (Справочник.Договора.ПустаяСсылка)

(Если реквизит Исходный не заполнено - считаем, что это первый)

p.s. Не обязательно конечно именно первый хранить, главное что-бы был какой-то идентификатор конкретной цепочки...
16 LAAry
 
27.11.12
13:07
Так я потеряю соответствие между промежуточными договорами и текущими. Получу только 1-й и последний.
17 kosts
 
27.11.12
13:21
(16) Нет никакой потери.
Можно вывести всю цепочку. Можно вывести предыдущий/следующий, то так же группировкой с доп условием по дате.
Главное что бы цепочка договоров шла строго календарно, тогда и ссылку на предыдущий/последующий хранить не нужно.
А так же появляется возможность при необходимости исключать звено из середины без лишней мороки с записью ссылок.
18 LAAry
 
27.11.12
13:29
(17) Думаю я сейчас не готов перелопачивать справочник договоров,чтобы создать ссылки. Но спасибо за совет, учту.
Есть два вида языков, одни постоянно ругают, а вторыми никто не пользуется.