IE2017

Определение подчиненного или родительского документа

Программирование - Практика программирования

Простейший отчет, показывающий, какие у выбранного документа есть подчиненные или родительские документы. Может служить основой для более сложных

В процессе работы потребовалось получать иерархию документов. Для проверки работоспособности алгоритма (взят из УТ 10.3) написал примитивный отчет. Проверен в УТ 10.3. Может пригодиться как пример или фундамент при решении схожих задач.

Полный код:

Перем мУжеВСписке;

Процедура КнопкаСформироватьНажатие(Кнопка)
	мУжеВСписке.Очистить();
	Если Родители тогда
		ВывестиРодительскиеДокументы(ДокументСсылка);
	иначе
		ВывестиПодчиненныеДокументы(ДокументСсылка);
	КонецЕсли;
КонецПроцедуры//КнопкаСформироватьНажатие

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

/////////////////////////////////////////////////////////////////////////////////
//////////////////////////////Процедуры для показа родительских документов

// Процедура выполняет вывод родительских документов
Процедура ВывестиРодительскиеДокументы(ДокументСсылка)
	МетаданныеДокумента = ДокументСсылка.Метаданные();
	СписокРеквизитов = Новый СписокЗначений;
	
	Для Каждого Реквизит ИЗ МетаданныеДокумента.Реквизиты Цикл
		ТипыРеквизита = Реквизит.Тип.Типы();
		Для Каждого ТекущийТип ИЗ ТипыРеквизита Цикл
			МетаданныеРеквизита = Метаданные.НайтиПоТипу(ТекущийТип);
			
			Если МетаданныеРеквизита<>Неопределено И Метаданные.Документы.Содержит(МетаданныеРеквизита) 
				И ПравоДоступа("Чтение", МетаданныеРеквизита) Тогда
				Попытка
					ЗначениеРеквизита = ДокументСсылка[Реквизит.Имя];
				Исключение
					Прервать;
				КонецПопытки;
				ЕСли ЗначениеРеквизита<>Неопределено И НЕ ЗначениеРеквизита.Пустая() И ТипЗнч(ЗначениеРеквизита) = ТекущийТип 
					И мУжеВСписке[ЗначениеРеквизита] = Неопределено И СписокРеквизитов.НайтиПоЗначению(ДокументСсылка[Реквизит.Имя]) = Неопределено Тогда
					Попытка
						СписокРеквизитов.Добавить(ЗначениеРеквизита,Формат(ЗначениеРеквизита.Дата,"ДФ=yyyyMMddЧЧММсс"));
					Исключение
						ОтладкаТекстОшибки = ОписаниеОшибки();
					КонецПопытки;	
				КонецЕсли;
			КонецЕсли;			
			
		КонецЦикла;
	КонецЦикла;
	
	Для Каждого ТЧ Из МетаданныеДокумента.ТабличныеЧасти Цикл
		СтрРеквизитов = "";
		
		Попытка
			СодержимоеТЧ = ДокументСсылка[ТЧ.Имя].Выгрузить();
		Исключение
			Прервать;
		КонецПопытки;
		
		Для Каждого Реквизит ИЗ ТЧ.Реквизиты Цикл
			ТипыРеквизита = Реквизит.Тип.Типы();
			Для Каждого ТекущийТип ИЗ ТипыРеквизита Цикл
				МетаданныеРеквизита = Метаданные.НайтиПоТипу(ТекущийТип);				
				Если МетаданныеРеквизита<>Неопределено И Метаданные.Документы.Содержит(МетаданныеРеквизита) 
					И ПравоДоступа("Чтение", МетаданныеРеквизита) Тогда
					СтрРеквизитов = СтрРеквизитов + ?(СтрРеквизитов = "", "", ", ") + Реквизит.Имя;
					Прервать;
				КонецЕсли;						
			КонецЦикла;
		КонецЦикла;
		
		СодержимоеТЧ.Свернуть(СтрРеквизитов);
		Для Каждого КолонкаТЧ ИЗ СодержимоеТЧ.Колонки Цикл
			Для Каждого СтрокаТЧ ИЗ СодержимоеТЧ Цикл
				Попытка
					ЗначениеРеквизита = СтрокаТЧ[КолонкаТЧ.Имя];
				Исключение
					Продолжить;
				КонецПопытки;
				МетаданныеЗначения = Метаданные.НайтиПоТипу(ТипЗнч(ЗначениеРеквизита));
				Если МетаданныеЗначения = Неопределено Тогда
					// базовый тип
					Продолжить;
				КонецЕсли;
				
				ЕСли ЗначениеРеквизита<>Неопределено И НЕ ЗначениеРеквизита.Пустая()
					И Метаданные.Документы.Содержит(МетаданныеЗначения)
					И мУжеВСписке[ЗначениеРеквизита] = Неопределено Тогда
					Если СписокРеквизитов.НайтиПоЗначению(ЗначениеРеквизита) = Неопределено Тогда
						Попытка
							СписокРеквизитов.Добавить(ЗначениеРеквизита,Формат(ЗначениеРеквизита.Дата,"ДФ=yyyyMMddЧЧММсс"));
						Исключение
							ОтладкаТекстОшибки = ОписаниеОшибки();
						КонецПопытки;
					КонецЕсли;
				КонецЕсли;
			КонецЦикла;
		КонецЦикла;		
	КонецЦикла;
	СписокРеквизитов.СортироватьПоПредставлению();
	мУжеВСписке.Вставить(ДокументСсылка, Истина);
	
	Если СписокРеквизитов.Количество() = 1 Тогда
		ВывестиРодительскиеДокументы(СписокРеквизитов[0].Значение);
	ИначеЕсли СписокРеквизитов.Количество() > 1 Тогда		
		ВывестиБезРодителей(СписокРеквизитов);		
	КонецЕсли;
	
	Запрос = Новый Запрос("ВЫБРАТЬ РАЗРЕШЕННЫЕ Ссылка, Проведен, ПометкаУдаления, Представление, """ + МетаданныеДокумента.Имя + """ КАК Метаданные
	| ИЗ Документ."+МетаданныеДокумента.Имя + " ГДЕ Ссылка = &Ссылка");
	
	Запрос.УстановитьПараметр("Ссылка", ДокументСсылка);
	
	Выборка  = Запрос.Выполнить().Выбрать();
	Если Выборка.Следующий() Тогда
		Сообщить(Выборка.Ссылка);
	КонецЕсли;
	
КонецПроцедуры//ВывестиРодительскиеДокументы

//
Процедура ВывестиБезРодителей(СписокДокументов)
	
	Для Каждого ЭлементСписка Из СписокДокументов Цикл
		
		МетаданныеДокумента = ЭлементСписка.Значение.Метаданные();
		
		Запрос = Новый Запрос("ВЫБРАТЬ РАЗРЕШЕННЫЕ Ссылка, Проведен, ПометкаУдаления, Представление, """ + МетаданныеДокумента.Имя + """ КАК Метаданные
		| ИЗ Документ."+МетаданныеДокумента.Имя + " ГДЕ Ссылка = &Ссылка");
		
		Запрос.УстановитьПараметр("Ссылка", ЭлементСписка.Значение);
						
		Выборка  = Запрос.Выполнить().Выбрать();
		ЕСли Выборка.Следующий() Тогда		
			Если мУжеВСписке[Выборка.Ссылка] = Неопределено Тогда
				Сообщить(Выборка.Ссылка);
			КонецЕсли;
		КонецЕсли;		
	КонецЦикла;
	
КонецПроцедуры//ВывестиБезРодителей

мУжеВСписке = Новый Соответствие;

Скачать файлы

Наименование Файл Версия Размер
ДетиРодителиДокумента.erf
.erf 8,56Kb
08.02.16
1
.erf 8,56Kb 1 Скачать

См. также

В этой теме еще нет сообщений.
Оставьте свое сообщение