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

08.02.16

Разработка - Инструментарий разработчика

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

Файлы

ВНИМАНИЕ: Файлы из Базы знаний - это исходный код разработки. Это примеры решения задач, шаблоны, заготовки, "строительные материалы" для учетной системы. Файлы ориентированы на специалистов 1С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных. Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.

Наименование Скачано Купить файл
ДетиРодителиДокумента.erf
.erf 8,56Kb
6 2 500 руб. Купить

Подписка PRO — скачивайте любые файлы со скидкой до 85% из Базы знаний

Оформите подписку на компанию для решения рабочих задач

Оформить подписку и скачать решение со скидкой

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

Полный код:

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

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

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

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

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

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

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

Вступайте в нашу телеграмм-группу Инфостарт

иерахия документ подчинение родительский документ

См. также

Инструментарий разработчика Чистка данных Свертка базы Инструменты администратора БД Системный администратор Программист Руководитель проекта 1С:Предприятие 8 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Управление нашей фирмой 3.0 Россия Платные (руб)

Инструмент представляет собой обработку для проведения свёртки или обрезки баз данных. Работает на ЛЮБЫХ конфигурациях (УТ, БП, ERP, УНФ, КА и т.д.). Поддерживаются серверные и файловые базы, управляемые и обычные формы. Может выполнять свертку одновременно в несколько потоков. А так же автоматически, без непосредственного участия пользователя. Решение в Реестре отечественного ПО

24900 руб.

20.08.2024    64738    340    168    

300

Инструментарий разработчика Роли и права Запросы СКД Программист Руководитель проекта 1С:Предприятие 8 Платные (руб)

Инструменты для разработчиков 1С 8.3: Infostart Toolkit. Автоматизация и ускорение разработки на управляемых формах. Легкость работы с 1С.

16500 руб.

02.09.2020    253625    1402    421    

1152

Пакетная печать Печатные формы Инструментарий разработчика Программист 1С:Предприятие 8 Платные (руб)

Расширение для создания и редактирования печатных форм в системе 1С:Предприятие 8.3. Благодаря конструктору можно значительно снизить затраты времени на разработку печатных форм, повысить качество и прозрачность разработки, а также навести порядок в многообразии корпоративных печатных форм.

22570 руб.

06.10.2023    36966    97    40    

117

Инструментарий разработчика Нейросети Платные (руб)

Первые попытки разработки на 1С с использованием больших языковых моделей (LLM) могут разочаровать. LLMки сильно галлюцинируют, потому что не знают устройства конфигураций 1С, не знают нюансов синтаксиса. Но если дать им подсказки с помощью MCP, то результат получается кардинально лучше. Далее в публикации: MCP для поиска по метаданым 1С, справке синтакс-помошника и проверки синтаксиса.

15250 руб.

25.08.2025    49908    98    27    

114

Инструменты администратора БД Инструментарий разработчика Роли и права Программист 1С:Предприятие 8 1C:Бухгалтерия Россия Платные (руб)

Расширение позволяет без изменения кода конфигурации выполнять проверки при вводе данных, скрывать от пользователя недоступные ему данные, выполнять код в обработчиках. Не изменяет данные конфигурации, легко устанавливается практически на любую конфигурацию на управляемых формах.

17000 руб.

10.11.2023    24576    93    42    

101

Инструментарий разработчика Программист 1С:Предприятие 8 Платные (руб)

Инструмент для написания и отладки кода в режиме «1С:Предприятие». Представляет собой консоль кода с возможностью пошаговой отладки, просмотра значений переменных любых типов, использования процедур и функций, просмотра стека вызовов, вычисления произвольных выражений на встроенном языке в контексте точки останова, синтаксического контроля и остановки по ошибке. В консоли используется удобный редактор кода с подсветкой, контекстной подсказкой, возможностью вызова конструкторов запроса и форматной строки. 1.3.11 Доработан механизм контекстной подсказки по метаданным

9500 руб.

17.05.2024    51681    181    63    

213

Мастера заполнения Поиск данных Инструментарий разработчика Подбор и обработка объектов 1С 8.3 1С 8.5 Платные (руб)

Infostart MagicInput улучшает подбор в полях ввода 1С: ищет по любой части названия и по нескольким ключевым фрагментам, распознаёт ввод в другой раскладке и показывает иконки/статусы объектов прямо в списке. Поддерживает вставку навигационной ссылки/представления документа для автоподбора; для разработчиков доступны поиск по GUID и полному имени предопределённого. Работает в управляемых формах и подключается в большинстве конфигураций 1С 8.3/8.5.

5000 руб.

25.02.2026    2863    11    1    

14
Для отправки сообщения требуется регистрация/авторизация