Доброго времени суток! Столкнулся с такой проблемой: Есть Документ.ТелефонныйЗвонок, на его основании можно создать ещё один ТелефонныйЗвонок, и на его основании тоже можно ввести ТелефонныйЗвонок и т.д. У меня вопрос: как имея лишь первый Документ.ТелефонныйЗвонок (родитель) найти самый последний ТелефонныйЗвонок созданный по такой цепочке?
---
Итак, решение было найдено с помощью вот такого кода

```1c
    Для каждого Элемент из СписокЗнач Цикл
    Основание = Элемент;
    Пока Основание <> 0 Цикл
    //ПредопределенноеЗначение("Документ.ТелефонныйЗвонок.ПустаяСсылка") Цикл
    Запрос = Новый Запрос;
    Запрос.Текст = "ВЫБРАТЬ РАЗЛИЧНЫЕ
    | ТелефонныйЗвонок.Ссылка КАК Ссылка,
    | ЕСТЬNULL(МАКСИМУМ(ТелефонныйЗвонок1.Ссылка), 0) КАК Потомок
    |ИЗ
    | Документ.ТелефонныйЗвонок КАК ТелефонныйЗвонок
    | ЛЕВОЕ СОЕДИНЕНИЕ Документ.ТелефонныйЗвонок КАК ТелефонныйЗвонок1
    | ПО ТелефонныйЗвонок.Ссылка = ТелефонныйЗвонок1.ВзаимодействиеОснование
    |ГДЕ
    | ТелефонныйЗвонок.Ссылка = &Ссылка
    |
    |СГРУППИРОВАТЬ ПО
    | ТелефонныйЗвонок.Ссылка,
    | ТелефонныйЗвонок1.Ссылка";
    Если Основание = Элемент Тогда
    НужнаяСсылка = Основание.Значение;
    Иначе
    НужнаяСсылка = Основание;
    КонецЕсли;

    Запрос.УстановитьПараметр("Ссылка", НужнаяСсылка);
    Выборка = Запрос.Выполнить().Выбрать();
    Если Выборка.Следующий() Тогда
    Основание = Выборка.Потомок;
    КонецЕсли;
    КонецЦикла;
    ПоследнийДокумент = Выборка.Ссылка;
    Если ПустаяСтрока(ОбщегоНазначения.ЗначениеРеквизитаОбъекта(ПоследнийДокумент, "Описание")) = Ложь Тогда
    Основание = Основание;
    Иначе
    СписокЗнач.Удалить(Элемент);
    Продолжить;
    КонецЕсли;
    КонецЦикла;
    Возврат СписокЗнач;
    КонецФункции
```
---
https://infostart.ru/1c/articles/205090/
Полученный список отсортировать по дате и взять последний
---
```1c
    --Документ 01.01.21
    --Документ 02.01.21
    --Документ 30.01.21
    --Документ 03.01.21
    --Документ 03.01.21
    --Документ 10.01.21
    --Документ 11.01.21
    --Документ 04.01.21
    --Документ 12.01.21
    --Документ 31.01.21
```

Какой документ нужно найти?
---
Реализован линейный ввод на основании: из Док1 создаётся на основании Док2, из Док2 вводится Док3. Из каждого Док-та можно ввести только один документ
---
Итак, решение было найдено с помощью вот такого кода

```1c
    Для каждого Элемент из СписокЗнач Цикл
    Основание = Элемент;
    Пока Основание <> 0 Цикл
    //ПредопределенноеЗначение("Документ.ТелефонныйЗвонок.ПустаяСсылка") Цикл
    Запрос = Новый Запрос;
    Запрос.Текст = "ВЫБРАТЬ РАЗЛИЧНЫЕ
    | ТелефонныйЗвонок.Ссылка КАК Ссылка,
    | ЕСТЬNULL(МАКСИМУМ(ТелефонныйЗвонок1.Ссылка), 0) КАК Потомок
    |ИЗ
    | Документ.ТелефонныйЗвонок КАК ТелефонныйЗвонок
    | ЛЕВОЕ СОЕДИНЕНИЕ Документ.ТелефонныйЗвонок КАК ТелефонныйЗвонок1
    | ПО ТелефонныйЗвонок.Ссылка = ТелефонныйЗвонок1.ВзаимодействиеОснование
    |ГДЕ
    | ТелефонныйЗвонок.Ссылка = &Ссылка
    |
    |СГРУППИРОВАТЬ ПО
    | ТелефонныйЗвонок.Ссылка,
    | ТелефонныйЗвонок1.Ссылка";
    Если Основание = Элемент Тогда
    НужнаяСсылка = Основание.Значение;
    Иначе
    НужнаяСсылка = Основание;
    КонецЕсли;

    Запрос.УстановитьПараметр("Ссылка", НужнаяСсылка);
    Выборка = Запрос.Выполнить().Выбрать();
    Если Выборка.Следующий() Тогда
    Основание = Выборка.Потомок;
    КонецЕсли;
    КонецЦикла;
    ПоследнийДокумент = Выборка.Ссылка;
    Если ПустаяСтрока(ОбщегоНазначения.ЗначениеРеквизитаОбъекта(ПоследнийДокумент, "Описание")) = Ложь Тогда
    Основание = Основание;
    Иначе
    СписокЗнач.Удалить(Элемент);
    Продолжить;
    КонецЕсли;
    КонецЦикла;
    Возврат СписокЗнач;
    КонецФункции
```
---
Хотя меня не покидает ощущение, что что-то не так
---
какая-то дичь

                         ВЫБРАТЬ
                               ТелефонныйЗвонок.Ссылка КАК Потомок,

                           ИЗ
                               Документ.ТелефонныйЗвонок КАК ТелефонныйЗвонок
                          ГДЕ
                               ТелефонныйЗвонок.ВзаимодействиеОснование = &Ссылка

Почему не просто вот так?

UP: Перечитал - там всё дичь
---
циклом по документ.основание, пока он не будет равен документ.телефонныйзвонок.пустаяссылка() ?
---
Думал об этом, сейчас попробую
---
Это если наоборот - от последнего искать первого.
---
циклом прогнать всех подчиненных, записывать в некую переменную. Как цикл закончится переменная вернет последнее значение.
---
Буду пробовать. Я думал, может в 1с есть готовая функция например, которая может такое сделать
---
Я несколько не понял, как это можно реализовать, можете пример дать пожалуйста?
---
```1c
    Пока истина цикл
    Массив = Функция поиска подчинённых
    Если массив количество = 0 тогда
    //Перебираем родителей на максимум
    Прервать
    Конец если
    Конец Цикла
```

Можно лучше предумать.
---
Рекурсия)
---
Да, запросы в рекурсивном цикле, только так.
---
Пока что-то не выходит
---
А если на основании первого звонка введены три звонка? А потом из этих трех - еще по два...
---
а точно. неверно прочитал условие. извините. пятница.
---
Я пока так и не понял, как сделать. Есть варианты?)
---
итс рекомендует вот так
я бы сооружал монстра на вот этой основе
---
При чем тут иерархия справочников? Речь идет совсем о другом! О цепочке документов "на основании"
---
не претендую на лучший ответ, но все же идею попытаюсь донести (хоть и костыли):

```1c
    &НаСервере
    Процедура ВыполнитьНаСервере()

    Родитель = ТелефонныйЗвонок.Ссылка;

    ПоследнийЭлемент = Неопределено;

    РазузловкаЭлементовШаг1(Родитель, ПоследнийЭлемент);

    // при выходе из данной процедуры мы получим последний элемент в переменной ПоследнийЭлемент

    КонецПроцедуры

    &НаСервере
    Процедура РазузловкаЭлементовШаг1(Родитель, ПоследнийЭлемент)

    Подчиненный = ПолучитьПодчиненныйЭлемент(Родитель, ПоследнийЭлемент);

    Если Подчиненный <> Неопределено Тогда

    ПоследнийЭлемент = Подчиненный;

    РазузловкаЭлементовШаг2(Подчиненный, ПоследнийЭлемент);

    Иначе

    Возврат;

    КонецЕсли;

    КонецПроцедуры

    &НаСервере
    Процедура РазузловкаЭлементовШаг2(Родитель, ПоследнийЭлемент)

    Подчиненный = ПолучитьПодчиненныйЭлемент(Родитель, ПоследнийЭлемент);

    Если Подчиненный <> Неопределено Тогда

    ПоследнийЭлемент = Подчиненный;

    РазузловкаЭлементовШаг1(Подчиненный, ПоследнийЭлемент);

    Иначе

    Возврат;

    КонецЕсли;

    КонецПроцедуры

    &НаСервере
    Функция ПолучитьПодчиненныйЭлемент(Родитель, Подчиненный)

    Запрос = Новый Запрос;
    Запрос.Текст =
    "ВЫБРАТЬ
    |ТелефонныйЗвонок.Ссылка КАК Подчиненный
    |ИЗ
    | Справочник.ТелефонныйЗвонок КАК ТелефонныйЗвонок
    |ГДЕ
    | ТелефонныйЗвонок.Родитель = &Родитель";

    Запрос.УстановитьПараметр("Родитель", Родитель);

    Выборка = Запрос.Выполнить().Выбрать();

    Подчиненный = Неопределено;

    Пока Выборка.Следующий() Цикл

    Подчиненный = Выборка.Подчиненный;

    КонецЦикла;

    Возврат Подчиненный;

    КонецФункции
```
---
Ужас. Вместо одной функции из пары строчек...
---
А есть такая? Можете написать?
---
Легко

```1c
    Функция ПолучитьПоследнегоПодчиненного(Заказ)

    Запрос = Новый Запрос;
    Запрос.Текст =
    "ВЫБРАТЬ
    | ЗаказКлиента.Ссылка КАК ЗаказПодчиненный
    |ИЗ
    | Документ.ЗаказКлиента КАК ЗаказКлиента
    |ГДЕ
    | ЗаказКлиента.ДокументОснование = &ЗаказВладелец";
    Запрос.УстановитьПараметр("ЗаказВладелец", Заказ);

    РезультатЗапроса = Запрос.Выполнить();
    Если РезультатЗапроса.Пустой() Тогда
    Возврат Заказ;
    Иначе
    Выборка = РезультатЗапроса.Выбрать();
    Выборка.Следующий();
    Возврат ПолучитьПоследнегоПодчиненного(Выборка.ЗаказПодчиненный);
    КонецЕсли;

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

Примените свою логику - поменяйте имена таблиц и реквизитов на свои, и пользуйте на здоровье.
Предупреждаю - не работает в ситуации, описанной в (10)
---
Можно еще проще, в цикле
```1c
    Запрос = Новый Запрос(
    "ВЫБРАТЬ ПЕРВЫЕ 1
    | ТелефонныйЗвонок.Ссылка КАК Ссылка
    |ИЗ
    | Документ.ТелефонныйЗвонок КАК ТелефонныйЗвонок
    |ГДЕ
    | ТелефонныйЗвонок.ВзаимодействиеОснование = &Основание
    | И ТелефонныйЗвонок.Проведен
    |
    |УПОРЯДОЧИТЬ ПО
    | ТелефонныйЗвонок.Дата УБЫВ");

    ТекущийРодитель = Родитель;

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

    Выборка = РезультатЗапроса.Выбрать();
    Выборка.Следующий();

    ТекущийРодитель = Выборка.Ссылка;
    КонецЦикла;

    Возврат ТекущийРодитель
```
---
Можно и так. Но я люблю рекурсию ))) Прям любовь!
---
одной функции из пар
зато рабочий "ужас" =)
---
А запросом с условием "В ИЕРАРХИИ" не подойдет?
---
А запросом с условием "В ИЕРАРХИИ" не подойдет? Конечно! У документов иерархия - это же важнейшая особенность!