При работе с типовыми или самописными конфигурациями на базе Библиотеки стандартных подсистем (БСП) разработчики часто сталкиваются с ситуацией, когда стандартная команда (например, «Связанные документы» или «Структура подчиненности») отлично отображается в форме самого документа, но отсутствует в форме списка. Существуют различные методы доработки динамических списков, но мы рассмотрим подробно, как решить эту задачу с помощью расширения конфигурации, соблюдая архитектурные стандарты БСП.
В современных версиях 1С (начиная с платформы 8.3.10+ и БСП 3.x) команды не просто «рисуются» на форме в конфигураторе. Они формируются динамически при создании формы на сервере. За этот процесс отвечает подсистема ПодключаемыеКоманды. Подробнее изучить её возможности поможет справочник по методам БСП с примерами использования. Чтобы кнопка появилась, должны совпасть три условия:
Первым делом нам необходимо подготовить модуль формы списка в расширении. Для этого заимствуем форму списка нужного документа в расширение и переходим в её модуль. Разберем программный код, который должен там присутствовать. Нам потребуется обработать события создания формы и активации строки, чтобы команды обновляли свою доступность при перемещении по списку.
Добавим в модуль формы следующие процедуры:
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
// СтандартныеПодсистемы.ПодключаемыеКоманды
ПодключаемыеКоманды.ПриСозданииНаСервере(ЭтотОбъект);
// Конец СтандартныеПодсистемы.ПодключаемыеКоманды
КонецПроцедуры
&НаКлиенте
Процедура СписокПриАктивизацииСтроки(Элемент)
// СтандартныеПодсистемы.ПодключаемыеКоманды
ПодключаемыеКомандыКлиент.НачатьОбновлениеКоманд(ЭтотОбъект);
// Конец СтандартныеПодсистемы.ПодключаемыеКоманды
КонецПроцедуры
Проанализируем этот код: метод ПодключаемыеКоманды.ПриСозданииНаСервере сканирует настройки метаданных и «впрыскивает» команды в интерфейс. А НачатьОбновлениеКоманд гарантирует, что если команда зависит от состояния документа (например, проведена или нет), кнопка будет менять свою доступность мгновенно.
Просто вывести кнопку недостаточно — нужно обработать нажатие на неё. В БСП это делается через стандартные подключаемые процедуры. Разберем пример реализации обработчиков на стороне клиента и сервера:
&НаКлиенте
Процедура Подключаемый_ВыполнитьКоманду(Команда)
ПодключаемыеКомандыКлиент.НачатьВыполнениеКоманд(ЭтотОбъект, Команда, Элементы.Список);
КонецПроцедуры
&НаКлиенте
Процедура Подключаемый_ПродолжитьВыполнениеКомандыНаСервере(ПараметрыВыполнения, ДополнительныеПараметры) Экспорт
ВыполнитьКомандуНаСервере(ПараметрыВыполнения);
КонецПроцедуры
&НаСервере
Процедура ВыполнитьКомандуНаСервере(ПараметрыВыполнения)
ПодключаемыеКоманды.ВыполнитьКоманду(ЭтотОбъект, ПараметрыВыполнения, Элементы.Список);
КонецПроцедуры
Важно убедиться, что в свойствах элемента формы Список (ваша динамическая таблица) в событии ПриАктивизацииСтроки действительно выбрана процедура СписокПриАктивизацииСтроки. Без этой привязки механизм не заработает.
Если после добавления кода кнопка не появилась, выясним причину в модуле менеджера. БСП обращается к процедуре ПриОпределенииКомандПодключенныхКОбъекту. В расширении нам нужно переопределить её, чтобы убедиться, что команда «Связанные документы» не имеет фильтра по типу формы.
Рассмотрим пример кода в модуле менеджера документа (через расширение):
&После("ПриОпределенииКомандПодключенныхКОбъекту")
Процедура Расш1_ПриОпределенииКомандПодключенныхКОбъекту(Настройки, Параметры)
// Здесь можно проверить, не исключена ли форма списка из параметров вывода.
// Обычно команда "СвязанныеДокументы" добавляется автоматически,
// если документ включен в соответствующий критерий отбора.
КонецПроцедуры
Проанализируем ситуацию: если в типовой конфигурации разработчики явно указали, что команда должна выводиться только в форме объекта, нам придется программно изменить это поведение в данной процедуре, добавив ТипФормы = "Список" в настройки команды.
Механизм ПодключаемыеКоманды ищет на форме конкретные места для размещения кнопок. Если их нет, кнопки будут созданы в командной панели формы, но это может выглядеть неэстетично или вовсе привести к скрытию кнопок. Проверим наличие следующих групп в дереве элементов формы:
ГруппаКомандКоманднаяПанельВажное — здесь обычно размещаются кнопки печати и основные действия.ГруппаКомандПерейти — именно сюда БСП помещает команду «Связанные документы».Если этих групп нет, создайте их (тип — Группа кнопок) и в свойстве Вид укажите «Командная панель». Имена должны строго соответствовать стандартам БСП.
Выясним, включен ли документ в критерий отбора СвязанныеДокументы. Это фундаментальное требование. Выполним следующие действия:
СвязанныеДокументы.ДокументОснование или ссылка на сам документ в табличных частях других объектов).Важный момент: если у пользователя нет прав на просмотр критерия отбора СвязанныеДокументы, кнопка будет скрыта системой безопасности платформы автоматически, даже если весь код написан верно.
Если заветная команда так и не появилась, воспользуемся отладчиком. Поставим точку останова в общем модуле ПодключаемыеКоманды, в функции ВывестиКоманды. Рассмотрим массив КомандыКВыводу. Если в этом массиве есть наша команда, но на форме её нет — проблема в группах команд на форме. Если команды нет в массиве — проблема в модуле менеджера или в правах доступа.
Также не забывайте про кэширование метаданных БСП. После внесения изменений в расширение рекомендуется обновить вспомогательные данные. Это можно сделать, запустив программу с параметром:
/C ЗапуститьОбновлениеИнформационнойБазы
Или через обработку «Обновление вспомогательных данных» (в составе БСП), выбрав обновление идентификаторов объектов метаданных. Это заставит систему пересчитать список доступных команд для всех форм.