При активном развитии и кастомизации систем на базе 1С:ERP Управление предприятием 2 или Комплексной автоматизации 2 часто возникает необходимость создания собственных, нетиповых документов. Чтобы бизнес-процессы оставались прозрачными для пользователей, новые документы должны полноценно участвовать в структуре подчиненности (отчете «Связанные документы»).
Стандартный механизм платформы и Библиотеки стандартных подсистем (БСП) опирается на предопределенный критерий отбора СвязанныеДокументы. Попытка изменить этот критерий напрямую в основной конфигурации потребует снятия объекта с поддержки, что усложнит последующие обновления системы. Попытка заимствовать типовой критерий в расширение приведет к тому, что платформа потребует перенести в расширение сотни связанных документов, что превратит поддержку расширения в кошмар.
В этой статье мы подробно разберем, как решить эту задачу изящно и безопасно — с помощью создания собственного критерия отбора в расширении и точечной доработки механизмов БСП. Для этой задачи можно использовать доработку отчета «Связанные документы» для объектов из расширений.
Типовой критерий отбора СвязанныеДокументы является одним из самых «связанных» объектов в системе. В его состав входят практически все документы конфигурации. Если мы попытаемся добавить этот критерий в расширение для добавления всего одного нового документа, платформа 1С обяжет нас добавить в расширение и все остальные типы данных, входящие в этот критерий. Это захламит расширение и сделает его практически неработоспособным при обновлениях.
Начиная с версии платформы 8.3.25, разработчики добавили возможность расширять состав критериев отбора реквизитами из расширений, однако для типового отчета связанных документов БСП этого все еще бывает недостаточно. Поэтому наиболее надежным и универсальным способом остается создание дополнительного критерия отбора и его интеграция программным путем.
Рассмотрим пошагово, как реализовать этот механизм без снятия основной конфигурации с поддержки.
---
Для начала создадим изолированный критерий отбора, который будет отвечать только за связи наших новых документов. Это позволит нам не трогать типовые объекты.
Расш_СвязанныеДокументы.ЗаказПокупателя или наш новый документ из расширения).ДокументОснование нашего нового документа.Таким образом, мы получили локальный критерий отбора, который быстро и безболезненно связывает наш документ с остальной системой.
---
Типовой отчет «Связанные документы» использует кэшированный индекс типов для быстрого построения дерева связей. Нам необходимо сообщить системе, что наш новый документ теперь тоже участвует в этих связях. Для этого выполним доработку общего модуля.
СтруктураПодчиненностиСлужебный и заимствуем его в наше расширение.ИндексТиповСвязанныхОбъектов(). Данная функция возвращает соответствие, содержащее типы документов, которые могут иметь подчиненные связи.&Вместо или &ИзменениеИКонтроль и добавим наш документ в возвращаемый результат. Проанализируем пример кода:
&Вместо("ИндексТиповСвязанныхОбъектов")
Функция Расш_ИндексТиповСвязанныхОбъектов()
// Получаем стандартный индекс типов, сформированный БСП
Результат = ПродолжитьВызов();
// Регистрируем наш новый документ в индексе
Результат.Вставить(Тип("ДокументСсылка.Расш_НашНовыйДокумент"), Истина);
Возврат Результат;
КонецФункции
Этот простой шаг гарантирует, что алгоритмы БСП начнут анализировать наш документ при построении дерева связей.
---
Теперь нам нужно научить саму форму отчета считывать данные не только из типового критерия отбора, но и из нашего собственного. Для этого доработаем общую форму.
СвязанныеДокументы.ОбъектыПоКритериюОтбора() или аналогичные методы выборки (в зависимости от версии БСП названия могут незначительно отличаться).
&ИзменениеИКонтроль("ОбъектыПоКритериюОтбора")
Процедура Расш_ОбъектыПоКритериюОтбора(ЗначениеКритерия, РезультатВыборки)
// Опишем запрос, который соберет данные из двух критериев отбора
Запрос = Новый Запрос;
Запрос.УстановитьПараметр("ЗначениеКритерия", ЗначениеКритерия);
Запрос.Текст =
"ВЫБРАТЬ
| ТиповойКритерий.Ссылка КАК Ссылка
|ИЗ
| КритерийОтбора.СвязанныеДокументы(&ЗначениеКритерия) КАК ТиповойКритерий
|
|ОБЪЕДИНИТЬ ВСЕ
|
|ВЫБРАТЬ
| НашКритерий.Ссылка
|ИЗ
| КритерийОтбора.Расш_СвязанныеДокументы(&ЗначениеКритерия) КАК НашКритерий";
РезультатВыборки = Запрос.Выполнить().Выгрузить();
КонецПроцедуры
Благодаря этому решению, при открытии структуры подчиненности для любого документа система соберет связи как по стандартным правилам, так и по правилам нашего нового критерия отбора, объединив их в единое дерево.
---
Чтобы пользователи могли открыть отчет непосредственно из формы нашего нового документа, нам нужно связать команду вызова отчета с типом нашего документа. Для этого действия подойдёт расширение для вывода кнопки «Связанные документы» на командную панель.
Разберем, как это сделать:
СвязанныеДокументы.ВариантыОтчетовПереопределяемый и в процедуре ОпределитьОбъектыСКомандамиОтчетов() зарегистрируем наш документ программно:
&Вместо("ОпределитьОбъектыСКомандамиОтчетов")
Процедура Расш_ОпределитьОбъектыСКомандамиОтчетов(СписокОбъектов)
ПродолжитьВызов(СписокОбъектов);
// Добавляем наш документ в список объектов, для которых доступны отчеты БСП
СписокОбъектов.Добавить(Метаданные.Документы.Расш_НашНовыйДокумент);
КонецПроцедуры
---
Мы подробно разобрали безопасный и надежный способ интеграции нетиповых документов в структуру подчиненности 1С:ERP. Создание собственного критерия отбора Расш_СвязанныеДокументы в расширении и программное объединение запросов в модуле формы позволяют избежать громоздкого заимствования типовых объектов.
Главные преимущества такого подхода: