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

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

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

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

Метод 1. Использование критерия отбора «СвязанныеДокументы»

Самый правильный и архитектурно верный способ — это использование типового критерия отбора. В большинстве конфигураций (УТ 11, ERP, КА, БП 3.0) за построение дерева связей отвечает объект метаданных Критерии отбора — СвязанныеДокументы.

Проанализируем шаги, которые необходимо выполнить в конфигураторе:

  1. Добавим в расширение критерий отбора СвязанныеДокументы из основной конфигурации.
  2. Добавим в расширение наш новый документ (например, Расш1_Заявка) и его реквизит, в котором хранится ссылка на родительский документ (например, ДокументОснование).
  3. Перейдем на закладку «Состав» критерия отбора СвязанныеДокументы.
  4. Установим флаг напротив реквизита нашего документа из расширения.

Важное ограничение: этот метод сработает только в том случае, если версия платформы 8.3.16 и выше, а режим совместимости конфигурации установлен не ниже 8.3.15. Если ваша конфигурация работает в режиме совместимости 8.3.14 или ниже, платформа не позволит изменять состав критериев отбора в расширении. В этом случае переходим ко второму методу.

Метод 2. Программное изменение логики формирования дерева (БСП)

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

Рассмотрим, как найти нужную точку входа. Обычно основной сбор данных происходит в общем модуле СвязанныеДокументы. Нам необходимо найти функцию, которая формирует текст запроса для построения дерева. Часто она называется ТекстЗапросаДляДерева или находится внутри процедуры ВывестиСвязанныеОбъектыВДерево.

Разберем пример расширения логики через аннотацию &После или &Вместо:


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

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

Метод 3. Создание «фиктивного» критерия отбора в расширении

Существует более «чистый» программный метод, который позволяет избежать написания сырых SQL-запросов. Мы можем создать в расширении свой собственный критерий отбора, например, Расш1_СвязанныеДокументы, и включить в него все наши новые документы.

После этого нам нужно найти в общем модуле СвязанныеДокументы место, где происходит обращение к метаданным критерия отбора. Проанализируем типичный код БСП:


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

Мы можем расширить этот метод, добавив объединение с нашим критерием отбора:


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

Этот способ хорош тем, что при добавлении новых документов в будущем вам не придется снова править код — достаточно будет просто добавить их в состав вашего критерия Расш1_СвязанныеДокументы в расширении.

Технические нюансы и производительность

При реализации иерархических связей важно учитывать несколько критически важных моментов, чтобы система работала стабильно и быстро:

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

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

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

Используя предложенные методы, вы сможете бесшовно интегрировать ваши разработки в типовой интерфейс «1С:Предприятие», обеспечивая пользователям привычный и удобный функционал работы со связанными документами.

← На главную