Имя: Пароль:
1C
 
УТ 11.5 Получение списка связанных документов
0 УТ_КА
 
16.08.24
13:48
Приветствую!

Столкнулся со следующей задачей в УТ 15.5:
Имеются документы типов РеализацияТоваровУслуг, ПриходныйКассовыйОрдер и ОперацияПоПлатежнойКарте. Из формы любого из этих документов можно выполнить команду "Связанные документы" и получить дерево, собственно, связанных документов.
Требуется сделать процедуру, которая принимает в себя документ любого из этих типов. Процедура должна получить список всех связанных с ним документов.

Получить связанные документы в случае с РеализацияТоваровУслуг - легко, можно воспользоваться КритерийОтбора и запросом получить все нужные документы. В случае с остальными типами - так не получается, запрос по КритерийОтбора не возвращает ничего. Как можно решить такую задачу?

Была мысль попробовать в случае ПриходныйКассовыйОрдер или ОперацияПоПлатежнойКарте получить основание (т. е. РеализацияТоваровУслуг) и потом делать запрос в КритерийОтбора по нему, что может сработать, но немного смущает.

Знает ли более опытный разработчик как это сделать оптимальнее всего?
1 maxab72
 
16.08.24
13:55
Универсальное решение - проанализировать метаданные документа, отобрать какие документы встречаются в его реквизитах, и строить автоматом запрос по ним. Можно сделать с неограниченной глубиной поиска, но это чуть сложнее.
2 Мультук
 
16.08.24
13:59
(0)

>>выполнить команду "Связанные документы"

А если взять и посмотреть код общей команды "СвязанныеДокументы" ?
А потом дальше и дальше. И увидеть, что 1С сейчас делает всё то, что описал (1)
3 maxab72
 
16.08.24
14:04
(2) В свое время столкнулся что критерий отбора "СвязанныеДокументы" с включенной RLS работал дико медленно, особенно когда в цепочке встречались запрещенные для просмотра пользователем документы. Пришлось ее переписать на прямой анализ и запросы, формируемые в цикле, без использования этого критерия. Получилось гораздо быстрее... хотя и сложнее по реализации.
4 steep1
 
19.08.24
13:38
(0) Запрос по КритерийОтбора
5 Мультук
 
16.08.24
14:16
(4)

Сам то проверил? Работает?

P.S.

У меня в ЕРП 2.5.17
Вот такой запрос ничего не возвращает
Для ПКО в связанных есть и РТУ и ЗаказКлиента.


ВЫБРАТЬ
	СвязанныеДокументы.Ссылка КАК Ссылка
ИЗ
	КритерийОтбора.СвязанныеДокументы(&ссылкаПКО) КАК СвязанныеДокументы
6 steep1
 
16.08.24
14:21
(5) у меня работает, посмотри форму связанных документов там точно такой же запрос и работает он на любом документе в цепочке
7 УТ_КА
 
19.08.24
13:27
Спасибо за ответы!
Как по итогу решил:

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

КонецЕсли;