Доработка отчета "Связанные документы" (структура подчиненности) для вывода объектов из любого расширения

27.10.23

Задачи пользователя - Адаптация типовых решений

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

Скачать исходный код

Наименование Файл Версия Размер
Доработка отчета "Связанные документы" (структура подчиннености) для вывода объектов из любого расширения:
.cfe 11,72Kb
19
.cfe 11,72Kb 19 Скачать

 

Не раз приходилось дорабатывать возможности отчета "Связанные документы" ("Структура подчиненности" в девичестве). Для этого достаточно было изменить критерий отбора "Связанные документы", добавив новые типы, изменив состав. С появлением расширений и расширением их возможностей это стало сделать невозможно. На Инфостарте уже есть подобная статья //infostart.ru/1c/articles/1653703, в которой предлагается добавлять критерии отбора в расширение. Давайте попробуем доработать отчет "Связанные документы" в расширении с минимальными изменениями типового отчета и максимальными возможностями.

Более подробно изучив механизм работы отчета, стало понятно, что необходимо изменить только процедуру ВывестиРодительскиеОбъекты(), функцию ОбъектыПоКритериюОтбора(), реквизиты формы в общей форме СвязанныеДокументы и функцию ИндексТиповСвязанныхОбъектов() в общем модуле СтруктураПодчиненностиСлужебный.

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

&Вместо("ИндексТиповСвязанныхОбъектов")
Функция _ИндексТиповСвязанныхОбъектов()
	
	ИндексТипов = ПродолжитьВызов();
	
	ДобавленныеТипы = ОбщегоНазначения.ВыгрузитьКолонку(_ПолучитьДанныеСвязанныхДокументов(), "Тип");
	Для каждого Тип Из ДобавленныеТипы Цикл
		ИндексТипов.Вставить(Тип, Истина);
	КонецЦикла;
	
	Возврат ИндексТипов;
	
КонецФункции

Функция _ПолучитьДанныеСвязанныхДокументов() Экспорт

	СоставСвязанныеДокументы = _СоставСвязанныеДокументы();
	ДанныеСвязанныхДокументов = Новый Массив;
	Для каждого ОбъектМетаданных Из СоставСвязанныеДокументы Цикл
		
		ОбъектМетаданныхПолноеИмя = ОбъектМетаданных.ПолноеИмя();
		МетаданныеДерево = СтрРазделить(ОбъектМетаданныхПолноеИмя, ".");
		Тип = Тип(МетаданныеДерево[0] + "Ссылка." + МетаданныеДерево[1]);
		
		ДанныеСвязанныхДокументов.Добавить(Новый Структура("Тип, ПолноеИмя", Тип, ОбъектМетаданныхПолноеИмя));
	
	КонецЦикла;
	
	Возврат ДанныеСвязанныхДокументов

КонецФункции

Функция _СоставСвязанныеДокументы()

	ОбъектыМетаданных = Новый Массив;
	//ОбъектыМетаданных.Добавить(Метаданные.Документы.ЗаказКлиента.Реквизиты.ДокументОснование);
	
	Возврат ОбъектыМетаданных

КонецФункции

В процедуре ВывестиРодительскиеОбъекты() достаточно строку с проверкой принадлежности объекта метаданных составу критерия отбора заменить на специально обученную функцию

_СвязанныеДокументыСодержитРеквизит(), дополнительно передавая в неё переменную ДобавленныеМетаданные, в которой будут метаданные добавленные в СтруктураПодчиненностиСлужебный. При получении добавленных метаданных все необходимые данные для расширения возможностей отчета кэшируются в создаваемых реквизитах формы.

&НаСервере
&ИзменениеИКонтроль("ВывестиРодительскиеОбъекты")
Процедура _ВывестиРодительскиеОбъекты(ТекущийОбъект, ДеревоРодитель, ВыведенныеОбъекты, СлужебныеОбъекты, ИндексСвязейОбъектов)
	//..
    #Вставка
	Если СлужебныеОбъекты["_ДобавленныеМетаданные"] = Неопределено Тогда
		СлужебныеОбъекты.Вставить("_ДобавленныеМетаданные", _ПолучитьДобавленныеМетаданные());
	КонецЕсли;
	_ДобавленныеМетаданные = СлужебныеОбъекты["_ДобавленныеМетаданные"];
	#КонецВставки
	Для Каждого Реквизит Из МетаданныеОбъекта.Реквизиты Цикл
		
		#Удаление
		Если Не Метаданные.КритерииОтбора.СвязанныеДокументы.Состав.Содержит(Реквизит) Тогда
		#КонецУдаления
		#Вставка
		Если Не СвязанныеДокументыСодержитРеквизит(Реквизит, _ДобавленныеМетаданные) Тогда
		#КонецВставки
			Продолжить;
		КонецЕсли;
	//..
КонецПроцедуры

&НаСервере
Функция _ПолучитьДобавленныеМетаданные()

	_СоздатьДанныеСвязанныхДокументов();
	ДобавленныеМетаданные = Новый Массив;
	Для каждого ПолноеИмя Из ЭтаФорма._ДанныеСвязанныхДокументовМетаданные Цикл
		ДобавленныеМетаданные.Добавить(ОбщегоНазначения.ОбъектМетаданныхПоПолномуИмени(ПолноеИмя));
	КонецЦикла;
	
	Возврат ДобавленныеМетаданные

КонецФункции

&НаСервере
Функция _СвязанныеДокументыСодержитРеквизит(Реквизит, ДобавленныеМетаданные)
	
	Если Метаданные.КритерииОтбора.СвязанныеДокументы.Состав.Содержит(Реквизит) Тогда
		Возврат Истина
	Иначе
		
		ЕстьВСвязанныхДокументах = Не ДобавленныеМетаданные.Найти(Реквизит) = Неопределено;
		Возврат ЕстьВСвязанныхДокументах
		
	КонецЕсли;	
	
КонецФункции

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

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

 

В функции ОбъектыПоКритериюОтбора():

- проверку принадлежности типа критерию отбора заменим на  функцию _СвязанныеДокументыСодержитТип();

- дополним текст запроса поиска по объектам метаданных текстом запроса с добавленными объектами метаданных в функции _СоставСвязанныеДокументы() общего модуля СтруктураПодчиненностиСлужебный.

&НаСервере
&ИзменениеИКонтроль("ОбъектыПоКритериюОтбора")
Функция _ОбъектыПоКритериюОтбора(ЗначениеКритерияОтбора)

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

КонецФункции

&НаСервере
Функция _СвязанныеДокументыСодержитТип(Тип)
	
	Если Метаданные.КритерииОтбора.СвязанныеДокументы.Тип.СодержитТип(Тип) Тогда
		Возврат Истина
	Иначе
		
		ТипНайден = Не ЭтаФорма._ДанныеСвязанныхДокументовТипы.НайтиПоЗначению(Тип) = Неопределено;
		Возврат ТипНайден
		
	КонецЕсли;
	
КонецФункции

 

И последним пунктом нужно изменить тип реквизитов на Произвольный формы "СвязанныеДокументы", в которых будут содержатся ссылки объектов.

 

 

В итоге были изменены: 1 процедура, 1 функция и 4 реквизита. Ни один новый объект метаданных не был добавлен в расширение. Такая реализация позволяет добавлять в отчет "Связанные документы" объекты метаданных из основной конфигурации и любых расширений одной строкой. Теперь, как и раньше, необходимо изменить только "состав" критерия отбора (функцию _СоставСвязанныеДокументы()
 в СтруктураПодчиненностиСлужебный).

Буду рад вашим предложениям по улучшению получившегося функционала.

Тестировал на УТ 11.5.8.410, платформа 8.3.23.1739.

 

UPD 31.10.2023: Благодарю tedweb за дополнение в комментариях. Доработал функционал для большей универсальности. Теперь новые объекты метаданных к механизму "Связанные документы" подключаются полностью программно. Все кто уже скачал расширение могут написать в личку и я вышлю вам новое расширение.

расширение связанные документы

См. также

Табличная часть в доп. реквизитах и формирование таблиц в шаблоне docx для 1С:ДО 3.0

Адаптация типовых решений Платформа 1С v8.3 1С:Документооборот Россия Платные (руб)

Расширение конфигурации для «1С:Документооборот КОРП», редакция 3.0. позволяет: 1.использовать произвольные табличные части в качестве дополнительных реквизитов к документу; 2 использовать произвольные табличные части в шаблонах в формате docx для автоматического заполнения таблиц.

29400 руб.

29.06.2023    4724    10    5    

18

Расширение для 1С:УНФ. Автоматическое снятие резервов в Заказах покупателей

Логистика, склад и ТМЦ Адаптация типовых решений Платформа 1С v8.3 1С:Управление нашей фирмой 1.6 1С:Управление нашей фирмой 3.0 Россия Управленческий учет Платные (руб)

Чтобы не допустить путаницы с обещаниями клиентам и для четкого контроля исполнения заказов мы используем резервирование товаров. Мы доработали УНФ, чтобы она автоматически отменяла старые резервы и не мешала эффективно продавать.

7200 руб.

02.08.2023    3146    4    0    

20

Каждому менеджеру нужен свой Excel

Адаптация типовых решений Платформа 1С v8.3 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Абонемент ($m)

Каждый из нас сталкивается с ситуацией, когда какой-нибудь менеджер показывает свой Excel и рассказывает, как он что-то из 1С копирует в него, снабжает пояснениями, выделяет цветом и т.д. и т.п. Заканчивается все просьбой сделать вот чтобы также было в 1С. И оказывается такой человек (почти с гарантией) либо лучшим продажником, либо каким-то важным, за все отвечающим, - на ком все держится.

2 стартмани

22.04.2024    3683    dimanich70    10    

14

Создать на основании - своя кнопка (БСП). Проблема двух подменю Создать на основании

БСП (Библиотека стандартных подсистем) Адаптация типовых решений Платформа 1С v8.3 1С:ERP Управление предприятием 2 Бесплатно (free)

Понадобилось в подменю "Создать на основании" добавить свою команду, которая открывает обработку. В процессе доработок появилась проблема двух подменю "Создать на основании". В статье о том, как решились проблемы.

01.03.2024    1819    dimanich70    8    

14

Печать непроведенных документов для УТ, КА, ERP. Настройка печати по пользователям, документам и печатным формам

Пакетная печать Печатные формы Адаптация типовых решений Универсальные функции Платформа 1С v8.3 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Россия Абонемент ($m)

Расширение для программ 1С:Управление торговлей, 1С:Комплексная автоматизация, 1С:ERP, которое позволяет распечатывать печатные формы для непроведенных документов. Можно настроить, каким пользователям, какие конкретные формы документов разрешено печатать без проведения документа.

2 стартмани

22.08.2023    2304    28    progmaster    8    

3
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. &rew 49 30.10.23 08:55 Сейчас в теме
Интересная статья. В свое время не пошел таким путем, а написал свою "кнопку" в расширении со своим же отчетом по выводу подчиненных (принцип работы- НайтиПоСсылкам) &ИзменениеИКонтроль меня уже не раз подводило (Работает до очередного внезапного изменения). Да и конфа была в режиме совместимости ниже 8.3.16. чтобы критерии отбора можно было расширить.
7. avmartynov 44 30.10.23 13:53 Сейчас в теме
(1) Было подобное с &ИзменениеИКонтроль, но обычно выявлялось на этапе тестирования. После обновления таких проблем не встречал.
8. &rew 49 30.10.23 19:00 Сейчас в теме
(7)Если процедура или функция которые Вы изменяете и контролите стала называться по другому, то вы этого и не узнаете.
Так же и &вместо. Только &Вместо - это что-то типа НайтиПоНаименованию. Используешь и каждый день себя за это плетьми бьёшь, пока не придумаешь, как по-другому.
9. avmartynov 44 31.10.23 15:27 Сейчас в теме
(8) Доработал реализацию. &Вместо использую только в том случае, если есть возможность изменить результат функции.
2. andrey_sag 48 30.10.23 11:43 Сейчас в теме
Хорошо описано. Даже отчет качать не надо ))
3. tedweb 30.10.23 12:06 Сейчас в теме
а как вывести кнопку "Связанные документы" на форме?
4. tedweb 30.10.23 13:31 Сейчас в теме
(3) В принципе получилось через расширение следующим образом:

&ИзменениеИКонтроль("ИндексТиповСвязанныхОбъектов")
Функция Расш1_ИндексТиповСвязанныхОбъектов()

	Индекс = Новый Соответствие;

	МетаданныеСвязанныхОбъектов = Метаданные.КритерииОтбора.СвязанныеДокументы;
	ТипыСвязанныхОбъектов = МетаданныеСвязанныхОбъектов.Тип.Типы();
	ТипПараметраКоманды = Метаданные.ОбщиеКоманды.СвязанныеДокументы.ТипПараметраКоманды;

	Для Каждого ТипСвязанногоОбъекта Из ТипыСвязанныхОбъектов Цикл 

		Если Не ТипПараметраКоманды.СодержитТип(ТипСвязанногоОбъекта) Тогда 
			Индекс.Вставить(ТипСвязанногоОбъекта, Истина);
		КонецЕсли;

	КонецЦикла;
	
	#Вставка  
	Индекс.Вставить(Тип("ДокументСсылка.Документ1"), Истина);
	Индекс.Вставить(Тип("ДокументСсылка.Документ2"), Истина);
	#КонецВставки

	Возврат Индекс;

КонецФункции
Показать
6. avmartynov 44 30.10.23 13:45 Сейчас в теме
(4) Хорошее решение. Если нужно изменить результат функции, то я использую &Вместо. Получается более обновлениенезависимым решением.
10. avmartynov 44 31.10.23 15:32 Сейчас в теме
(4) Добавил Вашу реализацию, немного изменив.
5. avmartynov 44 30.10.23 13:41 Сейчас в теме
(3) ОбщиеКоманды.СвязанныеДокументы
11. virs 04.04.24 10:02 Сейчас в теме
В мартовских бухгалтериях 2024 года будет работать?
13. avmartynov 44 16.04.24 17:35 Сейчас в теме
(11) Для Бухгалтерии нужно дорабатывать
12. muzikant 05.04.24 17:51 Сейчас в теме
Купил, но не работает. При подключении расширения в бухгалтерии предприятия 3.0 сообщает, что надо выбрать соответствие языка и я выбрал русский (скрин1). Потом при проверке конфигурации расширения на применимость вываливает ошибки скрин2. При попытке штатной кнопкой посмотреть связи документа, или при вводе на основании вываливаются соответственно ошибки и всё.
Прикрепленные файлы:
14. avmartynov 44 16.04.24 17:36 Сейчас в теме
(12) В описании написано, что тестировалось на УТ 11.5.8.410. Для Бухгалтерии нужно дорабатывать
Оставьте свое сообщение