Как добавить нетиповой документ из расширения в типовую структуру подчиненности?

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

При разработке в расширениях мы часто сталкиваемся с архитектурными ограничениями платформы 1С. Одно из самых частых — невозможность изменения типа данных в типовых Критериях отбора, таких как СвязанныеДокументы. В результате созданный нами документ, который вводится на основании типового, не появляется в дереве структуры подчиненности автоматически. Давайте разберем, как решить эту задачу, сохраняя конфигурацию на полной поддержке.

Почему не удается использовать стандартные средства?

Механизм Критериев отбора жестко задан в основной конфигурации. Платформа индексирует данные на уровне метаданных, и расширения не могут расширять список типов, входящих в состав критерия. Это означает, что попытка просто добавить объект в Критерий отбора через расширение не приведет к успеху — платформа его «не увидит». Однако, это не означает, что задача невыполнима. Мы можем изменить не структуру данных, а способ их визуализации.

Решение: Заимствование и доработка формы структуры подчиненности

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

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

Использование собственного регистра сведений для связей

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

Для начала создадим регистр СвязиДокументовРасширения с измерениями ДокументОснование и ДокументРасширения. При записи или проведении вашего документа в расширении, программно записывайте пару в этот регистр:


// В модуле объекта вашего документа
Процедура ПриЗаписи()
    // Записываем связь в регистр
    НаборЗаписей = РегистрыСведений.СвязиДокументовРасширения.СоздатьНаборЗаписей();
    НаборЗаписей.Отбор.ДокументРасширения.Установить(ЭтотОбъект.Ссылка);
    НоваяЗапись = НаборЗаписей.Добавить();
    НоваяЗапись.ДокументРасширения = ЭтотОбъект.Ссылка;
    НоваяЗапись.ДокументОснование = ЭтотОбъект.ДокументОснование;
    НаборЗаписей.Записать();
КонецПроцедуры

После этого, в доработанной форме СтруктураПодчиненности, вы будете использовать данные этого регистра для расширения дерева. В методе, который собирает структуру (обычно это запрос в модуле формы), вы добавляете ваш регистр в ЛЕВОЕ СОЕДИНЕНИЕ или через ОБЪЕДИНИТЬ.

Почему этот путь — лучший?

Рассмотрим, почему стоит выбрать именно этот путь, а не пытаться менять основную конфигурацию:

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

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

← На главную