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

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

При разработке расширений для современных конфигураций 1С, таких как УНФ 3.0, ERP 2.5 или Комплексная автоматизация, одной из частых задач является включение новых документов в общую цепочку связанных документов. Пользователи привыкли видеть дерево подчиненности, чтобы быстро переходить от заказа к накладной или счету, даже если часть этих документов создана в рамках кастомизации. Рассмотрим подробно, как реализовать этот механизм, учитывая особенности платформы и Библиотеки стандартных подсистем (БСП).

Анализ проблемы и современные возможности платформы

Долгое время разработчики сталкивались с ограничением: расширения не позволяли полноценно изменять состав критериев отбора, на которых строится стандартный механизм СвязанныеДокументы. Однако с выходом платформы 8.3.25 ситуация кардинально изменилась. Теперь платформа позволяет добавлять объекты, созданные в расширении, в состав заимствованных критериев отбора. Если вы используете актуальную версию платформы (например, 8.3.25.1286 и выше), многие задачи решаются без написания программного кода, ведь добавление реквизитов на формы возможно простым конфигурированием метаданных в расширении.

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

Способ 1. Использование возможностей платформы 8.3.25 (без кода)

Если ваша информационная база запущена на платформе 8.3.25, выполним следующие шаги:

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

Важный нюанс: после внесения изменений в структуру метаданных расширения, системе БСП может потребоваться обновление внутренних справочников. Рассмотрим запуск системы с параметром /ЗапуститьОбновлениеИнформационнойБазы. Это принудительно инициализирует заполнение регистров БСП, которые хранят информацию о доступных типах документов для структуры подчиненности.

Способ 2. Программное переопределение через форму (универсальный метод)

Если стандартный механизм не срабатывает или вы ограничены старой версией платформы, разберем программный путь. Основная логика вывода дерева подчиненности сосредоточена в общей форме СвязанныеДокументы. Нам потребуется изменить запросы, которые собирают данные. Рассмотрим пример использования аннотации &ИзменениеИКонтроль для функции ОбъектыПоКритериюОтбора.

Проанализируем код, который позволяет принудительно добавить выборку по новому документу, если критерий отбора его игнорирует:


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

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

Вывод кнопки "Связанные документы" на форму документа

Чтобы пользователь мог открыть структуру подчиненности, необходимо вывести соответствующую кнопку. В БСП это реализовано через общую команду. Разберем по шагам, как это сделать в расширении:

  1. Откроем форму вашего нового документа в расширении.
  2. Перейдем на закладку "Командный интерфейс".
  3. Найдем в разделе "Глобальные команды" команду ОбщаяКоманда.СвязанныеДокументы.
  4. Установим флаг видимости для этой команды. Обычно она размещается в группе "Командная панель формы.Важное" или "Перейти".

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

Дополнительные настройки для красоты интерфейса

Для того чтобы дерево подчиненности выглядело профессионально, нам может потребоваться переопределить еще несколько процедур в форме СвязанныеДокументы. Рассмотрим основные из них:

Использование &ИзменениеИКонтроль позволяет точечно внедряться в эти процедуры, не заменяя весь код модуля, что существенно облегчает дальнейшие обновления конфигурации. Проанализируем пример расширения вывода родительских объектов:


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

Резюме

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

← На главную