Каталог решений - Допиливаем типовой отчет «Связанные документы» (структура подчиненности) так, чтобы он видел документы из расширения конфигурации

Допиливаем типовой отчет «Связанные документы» (структура подчиненности) так, чтобы он видел документы из расширения конфигурации

Допиливаем типовой отчет «Связанные документы» (структура подчиненности) так, чтобы он видел документы из расширения конфигурации

В наличии

Наконец-то мы перешли на платформу 1С 8.3.20 и смогли отказаться от режима совместимости в 1С ЕРП.
Это позволило нам окончательно закрыть вопрос о перемещении ВСЕХ добавленных объектов из самой конфигурации в её расширение. 
Одним из камней преткновения на пути к переезду, был вопрос работы типового отчета «связанные документы». 
Ну что же, давайте вместе его решим.

Категория:

Описание

Как вы догадались по названию темы, стандартный отчет "Связанные документы" (Структура подчиненности) требует доработки, поскольку он не видит документы из расширения.

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

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

Сразу понятно, такое решение не по фэншую. Будем решать задачу по-другому. 

Задача:

Есть документ в расширении конфигурации "ИТ_ЗаданиеНаТранспортировку" и в нем есть поле "ДокументОснование", ссылающееся на типовой документ "ЗаказПокупателя". Нужно отразить документ из расширения конфигурации в типовом отчете "Связанные документы".

Условие:

И в новом документе "ИТ_ЗаданиеНаТранспортировку", и в типовом документе "ЗаказПокупателя" должен использоваться типовой отчет "Связанные документы", вызываемый через "СтандартныеПодсистемы.ПодключаемыеКоманды".

Решение:

В расширение ранее уже проброшен документ "ЗаказПокупателя", так как нам нужно было указать тип ссылки в поле "ДокументОснование".
Мы не будем добавлять в расширение типовой критерий отбора "СвязанныеДокументы", вместо этого создаём новый критерий отбора в расширении с названием "ИТ_СвязанныеДокументы" (1).

 

Новый критерий отбора

 

В разделе "Данные" заполняем тип данных нового критерия отбора теми объектами, которые должны добавляться к стандартному отчету "Связанные документы"

 

ТипыДаннызКритерийОтбора

 

В разделе "Состав" проставляем флажок у реквизита "ДокументОснование" .

 

СоставКритерияОтбора

 

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

 

ПраваКритерииОтбора

 

С критерием отбора покончено.

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

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

Вносим  исправления в код.

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

&НаСервере
&ИзменениеИКонтроль("ВывестиРодительскиеОбъекты")
Процедура ИТ_ВывестиРодительскиеОбъекты(ТекущийОбъект, ДеревоРодитель, ВыведенныеОбъекты, СлужебныеОбъекты, ИндексСвязейОбъектов)
//...
// в двух местах, где найдете "Метаданные.КритерииОтбора.СвязанныеДокументы.Состав.Содержит(Реквизит)"
// делаете следующие одинаковые изменения:

	#Удаление
		Если Не Метаданные.КритерииОтбора.СвязанныеДокументы.Состав.Содержит(Реквизит) Тогда
			Продолжить;
		КонецЕсли;
        #КонецУдаления
	
	#Вставка 
		Если Не Метаданные.КритерииОтбора.СвязанныеДокументы.Состав.Содержит(Реквизит)
			И Не Метаданные.КритерииОтбора.ИТ_СвязанныеДокументы.Состав.Содержит(Реквизит) Тогда
			Продолжить;
		КонецЕсли;
	#КонецВставки
//...
КонецПроцедуры

 

Функция "ОбъектыПоКритериюОтбора" наоборот — маленькая. Дорабатываем ее, как указано ниже. Код сделан более читаемым в ущерб компактности.

 

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

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

	Запрос = Новый Запрос;
	Запрос.Текст = "ВЫБРАТЬ
	|	СвязанныеДокументы.Ссылка
	|ИЗ
	|	КритерийОтбора.СвязанныеДокументы(&ЗначениеКритерияОтбора) КАК СвязанныеДокументы";
        #КонецУдаления

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

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

	Запрос.УстановитьПараметр("ЗначениеКритерияОтбора", ЗначениеКритерияОтбора);
	Возврат Запрос.Выполнить().Выгрузить();

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

И в принципе, отчет "Связанные документы" уже будет работать с вашими документами из расширения конфигурации.
 

Однако, нужно провести еще одну доработку.
Если вы используете подключаемые команды из стандартных подсистем(2) в формах документов/списков документов из расширения, вы заметите, что вожделенный отчет "Связанные документы" не появляется в ваших интерфейсах. Типовая кнопка "Структура подчиненности", которая формирует отчет "Связанные документы", просто принудительно скрывается от нас, если документ отсутствует в индексах связанных объектов. 

Давайте просто поправим действия с кнопкой "СтруктураПодчиненности".

Находим типовой общий модуль "СтруктураПодчиненностиСлужебный"(3) и пробрасываем из него в расширение конфигурации функцию "ИндексТиповСвязанныхОбъектов".

Вносим в функцию изменения:

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

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

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

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

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

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

 

И все.

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

 

Пример отчета Связанные документы

 

(1) Префикс "ИТ_" в идентификаторах и префикс "(ИТ) " в синонимах является обязательным для новых объектов в соответствии с политикой внедрений 1С, принятой в нашей компании.

(2) Добавление подключаемых команд из стандартных подсистем на ваши формы документов — это отдельная большая тема, и в данной статье умышленно опущена. 

(3) Мне не понятно, почему компания 1С не реализовала функционал добавления новых объектов в специальном модуле "СтруктураПодчиненностиПереопределяемый". Вместо добавления новых, они реализовали функционал по переименованию объектов. 

has been added to your cart:
Оформление заказа