Как добавить команду «Связанные документы» в форму списка документа через расширение

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

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

Анализ механизма подключаемых команд

В современных версиях 1С (начиная с платформы 8.3.10+ и БСП 3.x) команды не просто «рисуются» на форме в конфигураторе. Они формируются динамически при создании формы на сервере. За этот процесс отвечает подсистема ПодключаемыеКоманды. Подробнее изучить её возможности поможет справочник по методам БСП с примерами использования. Чтобы кнопка появилась, должны совпасть три условия:

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

Шаг 1. Модификация модуля формы списка

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

Добавим в модуль формы следующие процедуры:


&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    // СтандартныеПодсистемы.ПодключаемыеКоманды
    ПодключаемыеКоманды.ПриСозданииНаСервере(ЭтотОбъект);
    // Конец СтандартныеПодсистемы.ПодключаемыеКоманды
КонецПроцедуры

&НаКлиенте
Процедура СписокПриАктивизацииСтроки(Элемент)
    // СтандартныеПодсистемы.ПодключаемыеКоманды
    ПодключаемыеКомандыКлиент.НачатьОбновлениеКоманд(ЭтотОбъект);
    // Конец СтандартныеПодсистемы.ПодключаемыеКоманды
КонецПроцедуры

Проанализируем этот код: метод ПодключаемыеКоманды.ПриСозданииНаСервере сканирует настройки метаданных и «впрыскивает» команды в интерфейс. А НачатьОбновлениеКоманд гарантирует, что если команда зависит от состояния документа (например, проведена или нет), кнопка будет менять свою доступность мгновенно.

Шаг 2. Добавление обработчиков команд

Просто вывести кнопку недостаточно — нужно обработать нажатие на неё. В БСП это делается через стандартные подключаемые процедуры. Разберем пример реализации обработчиков на стороне клиента и сервера:


&НаКлиенте
Процедура Подключаемый_ВыполнитьКоманду(Команда)
    ПодключаемыеКомандыКлиент.НачатьВыполнениеКоманд(ЭтотОбъект, Команда, Элементы.Список);
КонецПроцедуры

&НаКлиенте
Процедура Подключаемый_ПродолжитьВыполнениеКомандыНаСервере(ПараметрыВыполнения, ДополнительныеПараметры) Экспорт
    ВыполнитьКомандуНаСервере(ПараметрыВыполнения);
КонецПроцедуры

&НаСервере
Процедура ВыполнитьКомандуНаСервере(ПараметрыВыполнения)
    ПодключаемыеКоманды.ВыполнитьКоманду(ЭтотОбъект, ПараметрыВыполнения, Элементы.Список);
КонецПроцедуры

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

Шаг 3. Регистрация команды в модуле менеджера

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

Рассмотрим пример кода в модуле менеджера документа (через расширение):


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

Проанализируем ситуацию: если в типовой конфигурации разработчики явно указали, что команда должна выводиться только в форме объекта, нам придется программно изменить это поведение в данной процедуре, добавив ТипФормы = "Список" в настройки команды.

Шаг 4. Подготовка интерфейса формы

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

Если этих групп нет, создайте их (тип — Группа кнопок) и в свойстве Вид укажите «Командная панель». Имена должны строго соответствовать стандартам БСП.

Шаг 5. Проверка критерия отбора и прав доступа

Выясним, включен ли документ в критерий отбора СвязанныеДокументы. Это фундаментальное требование. Выполним следующие действия:

  1. Откроем дерево метаданных (основной конфигурации или через расширение).
  2. Найдем Критерии отбора -> СвязанныеДокументы.
  3. Перейдем на вкладку Состав и убедимся, что там выбраны реквизиты нашего документа (например, ДокументОснование или ссылка на сам документ в табличных частях других объектов).

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

Типичные ошибки и отладка

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

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

/C ЗапуститьОбновлениеИнформационнойБазы

Или через обработку «Обновление вспомогательных данных» (в составе БСП), выбрав обновление идентификаторов объектов метаданных. Это заставит систему пересчитать список доступных команд для всех форм.

← На главную