Как в 1С:ERP добавить документ в структуру подчиненности через расширение?

Программист 1С v8.3 (Управляемые формы) 1С:ERP Управление предприятием IT и автоматизация бизнеса
← На главную

При активном развитии и кастомизации систем на базе 1С:ERP Управление предприятием 2 или Комплексной автоматизации 2 часто возникает необходимость создания собственных, нетиповых документов. Чтобы бизнес-процессы оставались прозрачными для пользователей, новые документы должны полноценно участвовать в структуре подчиненности (отчете «Связанные документы»).

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

В этой статье мы подробно разберем, как решить эту задачу изящно и безопасно — с помощью создания собственного критерия отбора в расширении и точечной доработки механизмов БСП. Для этой задачи можно использовать доработку отчета «Связанные документы» для объектов из расширений.

Почему стандартный критерий отбора сложно перенести в расширение?

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

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

Рассмотрим пошагово, как реализовать этот механизм без снятия основной конфигурации с поддержки.

---

Шаг 1. Создание собственного критерия отбора в расширении

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

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

Таким образом, мы получили локальный критерий отбора, который быстро и безболезненно связывает наш документ с остальной системой.

---

Шаг 2. Регистрация нового типа в индексе БСП

Типовой отчет «Связанные документы» использует кэшированный индекс типов для быстрого построения дерева связей. Нам необходимо сообщить системе, что наш новый документ теперь тоже участвует в этих связях. Для этого выполним доработку общего модуля.

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

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

Этот простой шаг гарантирует, что алгоритмы БСП начнут анализировать наш документ при построении дерева связей.

---

Шаг 3. Доработка формы «Связанные документы»

Теперь нам нужно научить саму форму отчета считывать данные не только из типового критерия отбора, но и из нашего собственного. Для этого доработаем общую форму.

  1. Заимствуем в расширение общую форму СвязанныеДокументы.
  2. В модуле формы найдем процедуры, отвечающие за выборку данных. Обычно это процедура ОбъектыПоКритериюОтбора() или аналогичные методы выборки (в зависимости от версии БСП названия могут незначительно отличаться).
  3. Модифицируем запрос формирования связей. Нам нужно объединить результаты запроса к стандартному критерию отбора и к нашему новому. Рассмотрим пример реализации запроса:

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

Благодаря этому решению, при открытии структуры подчиненности для любого документа система соберет связи как по стандартным правилам, так и по правилам нашего нового критерия отбора, объединив их в единое дерево.

---

Шаг 4. Вывод команды «Связанные документы» на форму нового документа

Чтобы пользователи могли открыть отчет непосредственно из формы нашего нового документа, нам нужно связать команду вызова отчета с типом нашего документа. Для этого действия подойдёт расширение для вывода кнопки «Связанные документы» на командную панель.

Разберем, как это сделать:

  1. Заимствуем в расширение общую команду СвязанныеДокументы.
  2. В свойствах команды найдем пункт Тип параметра команды и добавим туда тип нашего нового документа. После этого стандартная кнопка перехода к связанным документам автоматически появится на форме в панели навигации.
  3. Если в вашей версии ERP/КА вывод этой команды управляется программно через БСП, заимствуем общий модуль ВариантыОтчетовПереопределяемый и в процедуре ОпределитьОбъектыСКомандамиОтчетов() зарегистрируем наш документ программно:

&Вместо("ОпределитьОбъектыСКомандамиОтчетов")
Процедура Расш_ОпределитьОбъектыСКомандамиОтчетов(СписокОбъектов)
	ПродолжитьВызов(СписокОбъектов);
	// Добавляем наш документ в список объектов, для которых доступны отчеты БСП
	СписокОбъектов.Добавить(Метаданные.Документы.Расш_НашНовыйДокумент);
КонецПроцедуры

---

Резюме

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

Главные преимущества такого подхода:

← На главную