Найти последний введённый на оснвоании документ имея лишь родителя
Доброго времени суток! Столкнулся с такой проблемой: Есть Документ.ТелефонныйЗвонок, на его основании можно создать ещё один ТелефонныйЗвонок, и на его основании тоже можно ввести ТелефонныйЗвонок и т.д. У меня вопрос: как имея лишь первый Документ.ТелефонныйЗвонок (родитель) найти самый последний ТелефонныйЗвонок созданный по такой цепочке?
Найденные решения
Итак, решение было найдено с помощью вот такого кода
Для каждого Элемент из СписокЗнач Цикл
Основание = Элемент;
Пока Основание <> 0 Цикл
//ПредопределенноеЗначение("Документ.ТелефонныйЗвонок.ПустаяСсылка") Цикл
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ РАЗЛИЧНЫЕ
| ТелефонныйЗвонок.Ссылка КАК Ссылка,
| ЕСТЬNULL(МАКСИМУМ(ТелефонныйЗвонок1.Ссылка), 0) КАК Потомок
|ИЗ
| Документ.ТелефонныйЗвонок КАК ТелефонныйЗвонок
| ЛЕВОЕ СОЕДИНЕНИЕ Документ.ТелефонныйЗвонок КАК ТелефонныйЗвонок1
| ПО ТелефонныйЗвонок.Ссылка = ТелефонныйЗвонок1.ВзаимодействиеОснование
|ГДЕ
| ТелефонныйЗвонок.Ссылка = &Ссылка
|
|СГРУППИРОВАТЬ ПО
| ТелефонныйЗвонок.Ссылка,
| ТелефонныйЗвонок1.Ссылка";
Если Основание = Элемент Тогда
НужнаяСсылка = Основание.Значение;
Иначе
НужнаяСсылка = Основание;
КонецЕсли;
Запрос.УстановитьПараметр("Ссылка", НужнаяСсылка);
Выборка = Запрос.Выполнить().Выбрать();
Если Выборка.Следующий() Тогда
Основание = Выборка.Потомок;
КонецЕсли;
КонецЦикла;
ПоследнийДокумент = Выборка.Ссылка;
Если ПустаяСтрока(ОбщегоНазначения.ЗначениеРеквизитаОбъекта(ПоследнийДокумент, "Описание")) = Ложь Тогда
Основание = Основание;
Иначе
СписокЗнач.Удалить(Элемент);
Продолжить;
КонецЕсли;
КонецЦикла;
Возврат СписокЗнач;
КонецФункции
ПоказатьОстальные ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
(1)https://infostart.ru/1c/articles/205090/
Полученный список отсортировать по дате и взять последний
Полученный список отсортировать по дате и взять последний
Итак, решение было найдено с помощью вот такого кода
Для каждого Элемент из СписокЗнач Цикл
Основание = Элемент;
Пока Основание <> 0 Цикл
//ПредопределенноеЗначение("Документ.ТелефонныйЗвонок.ПустаяСсылка") Цикл
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ РАЗЛИЧНЫЕ
| ТелефонныйЗвонок.Ссылка КАК Ссылка,
| ЕСТЬNULL(МАКСИМУМ(ТелефонныйЗвонок1.Ссылка), 0) КАК Потомок
|ИЗ
| Документ.ТелефонныйЗвонок КАК ТелефонныйЗвонок
| ЛЕВОЕ СОЕДИНЕНИЕ Документ.ТелефонныйЗвонок КАК ТелефонныйЗвонок1
| ПО ТелефонныйЗвонок.Ссылка = ТелефонныйЗвонок1.ВзаимодействиеОснование
|ГДЕ
| ТелефонныйЗвонок.Ссылка = &Ссылка
|
|СГРУППИРОВАТЬ ПО
| ТелефонныйЗвонок.Ссылка,
| ТелефонныйЗвонок1.Ссылка";
Если Основание = Элемент Тогда
НужнаяСсылка = Основание.Значение;
Иначе
НужнаяСсылка = Основание;
КонецЕсли;
Запрос.УстановитьПараметр("Ссылка", НужнаяСсылка);
Выборка = Запрос.Выполнить().Выбрать();
Если Выборка.Следующий() Тогда
Основание = Выборка.Потомок;
КонецЕсли;
КонецЦикла;
ПоследнийДокумент = Выборка.Ссылка;
Если ПустаяСтрока(ОбщегоНазначения.ЗначениеРеквизитаОбъекта(ПоследнийДокумент, "Описание")) = Ложь Тогда
Основание = Основание;
Иначе
СписокЗнач.Удалить(Элемент);
Продолжить;
КонецЕсли;
КонецЦикла;
Возврат СписокЗнач;
КонецФункции
Показать
не претендую на лучший ответ, но все же идею попытаюсь донести (хоть и костыли):
&НаСервере
Процедура ВыполнитьНаСервере()
Родитель = ТелефонныйЗвонок.Ссылка;
ПоследнийЭлемент = Неопределено;
РазузловкаЭлементовШаг1(Родитель, ПоследнийЭлемент);
// при выходе из данной процедуры мы получим последний элемент в переменной ПоследнийЭлемент
КонецПроцедуры
&НаСервере
Процедура РазузловкаЭлементовШаг1(Родитель, ПоследнийЭлемент)
Подчиненный = ПолучитьПодчиненныйЭлемент(Родитель, ПоследнийЭлемент);
Если Подчиненный <> Неопределено Тогда
ПоследнийЭлемент = Подчиненный;
РазузловкаЭлементовШаг2(Подчиненный, ПоследнийЭлемент);
Иначе
Возврат;
КонецЕсли;
КонецПроцедуры
&НаСервере
Процедура РазузловкаЭлементовШаг2(Родитель, ПоследнийЭлемент)
Подчиненный = ПолучитьПодчиненныйЭлемент(Родитель, ПоследнийЭлемент);
Если Подчиненный <> Неопределено Тогда
ПоследнийЭлемент = Подчиненный;
РазузловкаЭлементовШаг1(Подчиненный, ПоследнийЭлемент);
Иначе
Возврат;
КонецЕсли;
КонецПроцедуры
&НаСервере
Функция ПолучитьПодчиненныйЭлемент(Родитель, Подчиненный)
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
|ТелефонныйЗвонок.Ссылка КАК Подчиненный
|ИЗ
| Справочник.ТелефонныйЗвонок КАК ТелефонныйЗвонок
|ГДЕ
| ТелефонныйЗвонок.Родитель = &Родитель";
Запрос.УстановитьПараметр("Родитель", Родитель);
Выборка = Запрос.Выполнить().Выбрать();
Подчиненный = Неопределено;
Пока Выборка.Следующий() Цикл
Подчиненный = Выборка.Подчиненный;
КонецЦикла;
Возврат Подчиненный;
КонецФункции
Показать
(18) Легко
Примените свою логику - поменяйте имена таблиц и реквизитов на свои, и пользуйте на здоровье.
Предупреждаю - не работает в ситуации, описанной в (10)
Функция ПолучитьПоследнегоПодчиненного(Заказ)
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ЗаказКлиента.Ссылка КАК ЗаказПодчиненный
|ИЗ
| Документ.ЗаказКлиента КАК ЗаказКлиента
|ГДЕ
| ЗаказКлиента.ДокументОснование = &ЗаказВладелец";
Запрос.УстановитьПараметр("ЗаказВладелец", Заказ);
РезультатЗапроса = Запрос.Выполнить();
Если РезультатЗапроса.Пустой() Тогда
Возврат Заказ;
Иначе
Выборка = РезультатЗапроса.Выбрать();
Выборка.Следующий();
Возврат ПолучитьПоследнегоПодчиненного(Выборка.ЗаказПодчиненный);
КонецЕсли;
КонецФункции
ПоказатьПримените свою логику - поменяйте имена таблиц и реквизитов на свои, и пользуйте на здоровье.
Предупреждаю - не работает в ситуации, описанной в (10)
(20) Можно еще проще, в цикле
Запрос = Новый Запрос(
"ВЫБРАТЬ ПЕРВЫЕ 1
| ТелефонныйЗвонок.Ссылка КАК Ссылка
|ИЗ
| Документ.ТелефонныйЗвонок КАК ТелефонныйЗвонок
|ГДЕ
| ТелефонныйЗвонок.ВзаимодействиеОснование = &Основание
| И ТелефонныйЗвонок.Проведен
|
|УПОРЯДОЧИТЬ ПО
| ТелефонныйЗвонок.Дата УБЫВ");
ТекущийРодитель = Родитель;
Пока Истина Цикл
Запрос.УстановитьПараметр("Основание", ТекущийРодитель);
РезультатЗапроса = Запрос.Выполнить();
Если РезультатЗапроса.Пустой() Тогда
Прервать
КонецЕсли;
Выборка = РезультатЗапроса.Выбрать();
Выборка.Следующий();
ТекущийРодитель = Выборка.Ссылка;
КонецЦикла;
Возврат ТекущийРодитель
Показать
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот