При разработке в расширениях мы часто сталкиваемся с архитектурными ограничениями платформы 1С. Одно из самых частых — невозможность изменения типа данных в типовых Критериях отбора, таких как СвязанныеДокументы. В результате созданный нами документ, который вводится на основании типового, не появляется в дереве структуры подчиненности автоматически. Давайте разберем, как решить эту задачу, сохраняя конфигурацию на полной поддержке.
Механизм Критериев отбора жестко задан в основной конфигурации. Платформа индексирует данные на уровне метаданных, и расширения не могут расширять список типов, входящих в состав критерия. Это означает, что попытка просто добавить объект в Критерий отбора через расширение не приведет к успеху — платформа его «не увидит». Однако, это не означает, что задача невыполнима. Мы можем изменить не структуру данных, а способ их визуализации.
Самый надежный и профессиональный метод, позволяющий оставить основную конфигурацию на поддержке — это перехват вызова формы СтруктураПодчиненности и ее доработка в расширении. Рассмотрим этот процесс по шагам.
СтруктураПодчиненности, которая обычно принадлежит общей форме или обработке в составе БСП (Библиотеки стандартных подсистем). Добавьте эту форму в расширение.&Вместо или &Перед, перехватите вызов и направьте его на вашу заимствованную форму.Критериям отбора. Нам нужно дополнить этот запрос, добавив в него объединение данных (UNION ALL) из нашего собственного регистра или таблиц документов.Если документов много или связи сложные, рекомендуется создать в расширении РегистрСведений, который будет хранить информацию о том, какой документ на основании какого был создан. Разберем, как это реализовать:
Для начала создадим регистр СвязиДокументовРасширения с измерениями ДокументОснование и ДокументРасширения. При записи или проведении вашего документа в расширении, программно записывайте пару в этот регистр:
// В модуле объекта вашего документа
Процедура ПриЗаписи()
// Записываем связь в регистр
НаборЗаписей = РегистрыСведений.СвязиДокументовРасширения.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.ДокументРасширения.Установить(ЭтотОбъект.Ссылка);
НоваяЗапись = НаборЗаписей.Добавить();
НоваяЗапись.ДокументРасширения = ЭтотОбъект.Ссылка;
НоваяЗапись.ДокументОснование = ЭтотОбъект.ДокументОснование;
НаборЗаписей.Записать();
КонецПроцедуры
После этого, в доработанной форме СтруктураПодчиненности, вы будете использовать данные этого регистра для расширения дерева. В методе, который собирает структуру (обычно это запрос в модуле формы), вы добавляете ваш регистр в ЛЕВОЕ СОЕДИНЕНИЕ или через ОБЪЕДИНИТЬ.
Рассмотрим, почему стоит выбрать именно этот путь, а не пытаться менять основную конфигурацию:
Конечно, этот подход требует дополнительных усилий при обновлении, если разработчики БСП кардинально изменят алгоритм работы формы СтруктураПодчиненности. Однако это стандарт индустрии для сложных корпоративных внедрений. Если вы стремитесь к чистоте архитектуры и стабильности системы, метод с заимствованием и расширением формы является единственно верным.
Помните, что при использовании запросов в расширении, всегда проверяйте актуальность планов обмена или других механизмов, если ваш документ должен участвовать в обмене данными, так как стандартные механизмы обмена также могут требовать доработки через расширение (подписки на события).