Найти последний введённый на оснвоании документ имея лишь родителя

1. user1500067 16.07.21 08:01 Сейчас в теме
Доброго времени суток! Столкнулся с такой проблемой: Есть Документ.ТелефонныйЗвонок, на его основании можно создать ещё один ТелефонныйЗвонок, и на его основании тоже можно ввести ТелефонныйЗвонок и т.д. У меня вопрос: как имея лишь первый Документ.ТелефонныйЗвонок (родитель) найти самый последний ТелефонныйЗвонок созданный по такой цепочке?
Вознаграждение за ответ
Показать полностью
Найденные решения
28. user1500067 20.07.21 07:01 Сейчас в теме +0.29 $m
Итак, решение было найдено с помощью вот такого кода

Для каждого Элемент из СписокЗнач Цикл
		Основание = Элемент;  
		Пока Основание <> 0 Цикл
			//ПредопределенноеЗначение("Документ.ТелефонныйЗвонок.ПустаяСсылка") Цикл
			Запрос = Новый Запрос;
			Запрос.Текст = "ВЫБРАТЬ РАЗЛИЧНЫЕ
			               |	ТелефонныйЗвонок.Ссылка КАК Ссылка,
			               |	ЕСТЬNULL(МАКСИМУМ(ТелефонныйЗвонок1.Ссылка), 0) КАК Потомок
			               |ИЗ
			               |	Документ.ТелефонныйЗвонок КАК ТелефонныйЗвонок
			               |		ЛЕВОЕ СОЕДИНЕНИЕ Документ.ТелефонныйЗвонок КАК ТелефонныйЗвонок1
			               |		ПО ТелефонныйЗвонок.Ссылка = ТелефонныйЗвонок1.ВзаимодействиеОснование
			               |ГДЕ
			               |	ТелефонныйЗвонок.Ссылка = &Ссылка
			               |
			               |СГРУППИРОВАТЬ ПО
			               |	ТелефонныйЗвонок.Ссылка,
			               |	ТелефонныйЗвонок1.Ссылка";
			Если Основание = Элемент Тогда 
				НужнаяСсылка = Основание.Значение;
			Иначе
				НужнаяСсылка = Основание;
			КонецЕсли;
			
			Запрос.УстановитьПараметр("Ссылка", НужнаяСсылка);
			Выборка = Запрос.Выполнить().Выбрать();
			Если Выборка.Следующий() Тогда
				Основание  = Выборка.Потомок;
			КонецЕсли;
		КонецЦикла;
		ПоследнийДокумент = Выборка.Ссылка;
		Если ПустаяСтрока(ОбщегоНазначения.ЗначениеРеквизитаОбъекта(ПоследнийДокумент, "Описание")) = Ложь Тогда
			Основание = Основание;
		Иначе
			СписокЗнач.Удалить(Элемент);
			Продолжить;	
		КонецЕсли;
	КонецЦикла;
	Возврат СписокЗнач;
КонецФункции
Показать
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
24. Kolesonik 13 16.07.21 13:01 Сейчас в теме
(1)https://infostart.ru/1c/articles/205090/
Полученный список отсортировать по дате и взять последний
27. dandykry 10 19.07.21 13:02 Сейчас в теме
(1)
--Документ 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
Показать


Какой документ нужно найти?
30. user1500067 20.07.21 07:31 Сейчас в теме
(27) Реализован линейный ввод на основании: из Док1 создаётся на основании Док2, из Док2 вводится Док3. Из каждого Док-та можно ввести только один документ
28. user1500067 20.07.21 07:01 Сейчас в теме +0.29 $m
Итак, решение было найдено с помощью вот такого кода

Для каждого Элемент из СписокЗнач Цикл
		Основание = Элемент;  
		Пока Основание <> 0 Цикл
			//ПредопределенноеЗначение("Документ.ТелефонныйЗвонок.ПустаяСсылка") Цикл
			Запрос = Новый Запрос;
			Запрос.Текст = "ВЫБРАТЬ РАЗЛИЧНЫЕ
			               |	ТелефонныйЗвонок.Ссылка КАК Ссылка,
			               |	ЕСТЬNULL(МАКСИМУМ(ТелефонныйЗвонок1.Ссылка), 0) КАК Потомок
			               |ИЗ
			               |	Документ.ТелефонныйЗвонок КАК ТелефонныйЗвонок
			               |		ЛЕВОЕ СОЕДИНЕНИЕ Документ.ТелефонныйЗвонок КАК ТелефонныйЗвонок1
			               |		ПО ТелефонныйЗвонок.Ссылка = ТелефонныйЗвонок1.ВзаимодействиеОснование
			               |ГДЕ
			               |	ТелефонныйЗвонок.Ссылка = &Ссылка
			               |
			               |СГРУППИРОВАТЬ ПО
			               |	ТелефонныйЗвонок.Ссылка,
			               |	ТелефонныйЗвонок1.Ссылка";
			Если Основание = Элемент Тогда 
				НужнаяСсылка = Основание.Значение;
			Иначе
				НужнаяСсылка = Основание;
			КонецЕсли;
			
			Запрос.УстановитьПараметр("Ссылка", НужнаяСсылка);
			Выборка = Запрос.Выполнить().Выбрать();
			Если Выборка.Следующий() Тогда
				Основание  = Выборка.Потомок;
			КонецЕсли;
		КонецЦикла;
		ПоследнийДокумент = Выборка.Ссылка;
		Если ПустаяСтрока(ОбщегоНазначения.ЗначениеРеквизитаОбъекта(ПоследнийДокумент, "Описание")) = Ложь Тогда
			Основание = Основание;
		Иначе
			СписокЗнач.Удалить(Элемент);
			Продолжить;	
		КонецЕсли;
	КонецЦикла;
	Возврат СписокЗнач;
КонецФункции
Показать
29. user1500067 20.07.21 07:11 Сейчас в теме
(28) Хотя меня не покидает ощущение, что что-то не так
31. dandykry 10 20.07.21 07:41 Сейчас в теме
(29) какая-то дичь

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

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

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

UP: Перечитал - там всё дичь
2. puzo50 16.07.21 08:05 Сейчас в теме
циклом по документ.основание, пока он не будет равен документ.телефонныйзвонок.пустаяссылка() ?
4. user1500067 16.07.21 08:10 Сейчас в теме
(2) Думал об этом, сейчас попробую
9. FatPanzer 16.07.21 09:11 Сейчас в теме
(2) Это если наоборот - от последнего искать первого.
3. stein13 9 16.07.21 08:08 Сейчас в теме
циклом прогнать всех подчиненных, записывать в некую переменную. Как цикл закончится переменная вернет последнее значение.
5. user1500067 16.07.21 08:11 Сейчас в теме
(3) Буду пробовать. Я думал, может в 1с есть готовая функция например, которая может такое сделать
6. user1500067 16.07.21 08:22 Сейчас в теме
(3) Я несколько не понял, как это можно реализовать, можете пример дать пожалуйста?
7. Xershi 1486 16.07.21 08:35 Сейчас в теме
(6)
Пока истина цикл
Массив = Функция поиска подчинённых 
Если массив количество = 0 тогда
//Перебираем родителей на максимум
Прервать
Конец если 
Конец Цикла


Можно лучше предумать.
8. Nata_GND 16.07.21 08:54 Сейчас в теме
11. FatPanzer 16.07.21 09:12 Сейчас в теме
(8) Да, запросы в рекурсивном цикле, только так.
14. user1500067 16.07.21 09:37 Сейчас в теме
(11) Пока что-то не выходит
10. FatPanzer 16.07.21 09:12 Сейчас в теме
А если на основании первого звонка введены три звонка? А потом из этих трех - еще по два...
12. puzo50 16.07.21 09:20 Сейчас в теме
(9) а точно. неверно прочитал условие. извините. пятница.
13. user1500067 16.07.21 09:37 Сейчас в теме
(12) Я пока так и не понял, как сделать. Есть варианты?)
15. puzo50 16.07.21 09:55 Сейчас в теме
итс рекомендует вот так
я бы сооружал монстра на вот этой основе
21. FatPanzer 16.07.21 10:49 Сейчас в теме
(15) При чем тут иерархия справочников? Речь идет совсем о другом! О цепочке документов "на основании"
16. stein13 9 16.07.21 10:14 Сейчас в теме
не претендую на лучший ответ, но все же идею попытаюсь донести (хоть и костыли):

&НаСервере
Процедура ВыполнитьНаСервере()
	
	Родитель = ТелефонныйЗвонок.Ссылка;
	
	ПоследнийЭлемент = Неопределено;
	
	РазузловкаЭлементовШаг1(Родитель, ПоследнийЭлемент);
	
        // при выходе из данной процедуры мы получим последний элемент в переменной ПоследнийЭлемент

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

&НаСервере
Процедура РазузловкаЭлементовШаг1(Родитель, ПоследнийЭлемент)
	
	Подчиненный = ПолучитьПодчиненныйЭлемент(Родитель, ПоследнийЭлемент);
	
	Если Подчиненный <> Неопределено Тогда
		
	    ПоследнийЭлемент = Подчиненный;
		
		РазузловкаЭлементовШаг2(Подчиненный, ПоследнийЭлемент);
		
	Иначе
		
		Возврат;
		
	КонецЕсли;
	
КонецПроцедуры

&НаСервере
Процедура РазузловкаЭлементовШаг2(Родитель, ПоследнийЭлемент)
	
	Подчиненный = ПолучитьПодчиненныйЭлемент(Родитель, ПоследнийЭлемент);
	
	Если Подчиненный <> Неопределено Тогда
		
		ПоследнийЭлемент = Подчиненный;
		
		РазузловкаЭлементовШаг1(Подчиненный, ПоследнийЭлемент);
		
	Иначе
		
		Возврат;
		
	КонецЕсли;
	
КонецПроцедуры

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

	Запрос = Новый Запрос;
	Запрос.Текст =
	"ВЫБРАТЬ
	|ТелефонныйЗвонок.Ссылка КАК Подчиненный
	|ИЗ
	|	Справочник.ТелефонныйЗвонок КАК ТелефонныйЗвонок
	|ГДЕ
	|	ТелефонныйЗвонок.Родитель = &Родитель";
	
	Запрос.УстановитьПараметр("Родитель", Родитель);
	
	Выборка = Запрос.Выполнить().Выбрать();
	
	Подчиненный = Неопределено;
	
	Пока Выборка.Следующий() Цикл
		
		Подчиненный = Выборка.Подчиненный;
		
	КонецЦикла;
	
	Возврат Подчиненный;
	
КонецФункции
Показать
17. FatPanzer 16.07.21 10:39 Сейчас в теме
(16) Ужас. Вместо одной функции из пары строчек...
18. user1500067 16.07.21 10:43 Сейчас в теме
(17) А есть такая? Можете написать?
20. FatPanzer 16.07.21 10:46 Сейчас в теме
(18) Легко
Функция ПолучитьПоследнегоПодчиненного(Заказ)
	
	Запрос = Новый Запрос;
	Запрос.Текст =
	"ВЫБРАТЬ
	|	ЗаказКлиента.Ссылка КАК ЗаказПодчиненный
	|ИЗ
	|	Документ.ЗаказКлиента КАК ЗаказКлиента
	|ГДЕ
	|	ЗаказКлиента.ДокументОснование = &ЗаказВладелец";
	Запрос.УстановитьПараметр("ЗаказВладелец", Заказ);
	
	РезультатЗапроса = Запрос.Выполнить();
	Если РезультатЗапроса.Пустой() Тогда
		Возврат Заказ;
	Иначе
		Выборка = РезультатЗапроса.Выбрать();
		Выборка.Следующий();
		Возврат ПолучитьПоследнегоПодчиненного(Выборка.ЗаказПодчиненный);
	КонецЕсли;
	
КонецФункции
Показать

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

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

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

Возврат ТекущийРодитель
Показать
23. FatPanzer 16.07.21 12:09 Сейчас в теме
(22) Можно и так. Но я люблю рекурсию ))) Прям любовь!
19. stein13 9 16.07.21 10:44 Сейчас в теме
(17)
одной функции из пар

зато рабочий "ужас" =)
25. JohnGalt 57 16.07.21 17:37 Сейчас в теме
А запросом с условием "В ИЕРАРХИИ" не подойдет?
26. FatPanzer 16.07.21 17:46 Сейчас в теме
(25)
А запросом с условием "В ИЕРАРХИИ" не подойдет?
Конечно! У документов иерархия - это же важнейшая особенность!
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот