При создании дополнительных подключаемых обработок на базе Библиотеки Стандартных Подсистем (БСП) разработчики часто сталкиваются с ситуацией, когда кнопка вызова обработки автоматически размещается в общей командной панели формы (в меню «Еще» или общем подменю «Заполнить»). Однако по логике бизнес-процесса требуется, чтобы кнопка находилась непосредственно над конкретной табличной частью документа (например, «Товары»), где пользователи привыкли выполнять команды заполнения строк.
Разберем, почему возникает такое поведение платформы и БСП, а также рассмотрим практические способы размещения кнопки в нужном месте командной панели таблицы без необходимости вручную настраивать интерфейс у десятков пользователей.
Проанализируем стандартную экспортную функцию СведенияОВнешнейОбработке(), которая используется для регистрации обработки в справочнике «Дополнительные отчеты и обработки»:
Функция СведенияОВнешнейОбработке() Экспорт
ПараметрыРегистрации = ДополнительныеОтчетыИОбработки.СведенияОВнешнейОбработке("3.1.10.383");
ПараметрыРегистрации.Вид = ДополнительныеОтчетыИОбработкиКлиентСервер.ВидОбработкиЗаполнениеОбъекта();
ПараметрыРегистрации.Версия = "1.0.0.0";
МСН = Новый Массив();
МСН.Добавить("Документ.ЗаказПоставщику");
МСН.Добавить("Документ.КорректировкаЗаказаПоставщику");
ПараметрыРегистрации.Назначение = МСН;
Команда = ПараметрыРегистрации.Команды.Добавить();
Команда.Представление = НСтр("ru = 'Заполнение Количество=0'");
Команда.Идентификатор = "ЗаполнениеКоличество0";
Команда.Использование = ДополнительныеОтчетыИОбработкиКлиентСервер.ТипКомандыЗаполнениеФормы();
Команда.ПоказыватьОповещение = Ложь;
Возврат ПараметрыРегистрации;
КонецФункции
В современных редакциях БСП для управляемых форм самостоятельный вид регистрации «Заполнение табличной части» упразднен — оставлен общий вид ВидОбработкиЗаполнениеОбъекта(). В метаданных структуры ПараметрыРегистрации отсутствуют штатные свойства, позволяющие указать конкретный элемент или родительскую группу формы. В результате подсистема подключаемых команд создает кнопки исключительно в предопределенной группе командной панели самой формы — ПодменюЗаполнить или выносит их в выпадающее меню «Еще».
Чтобы решить эту задачу централизованно для всех пользователей, существует несколько проверенных способов.
Наиболее надежный программный вариант, сохраняющий конфигурацию на полной поддержке, — использование расширения. В расширении заимствуется форма требуемого документа, и после инициализации команд подсистемой БСП элемент управления перемещается в нужное подменю.
Разберем по шагам алгоритм реализации:
ЗаказПоставщику).ПриСозданииНаСервере с директивой &После, чтобы наш код сработал уже после того, как БСП выполнит инициализацию подключаемых команд.Элементы.Переместить().Посмотрим на пример серверного кода в расширении:
&После("ПриСозданииНаСервере")
Процедура Расш1_ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
// Имя кнопки формируется БСП по правилу: "ПодключаемаяКоманда_" + ИдентификаторКоманды
ИмяКнопки = "ПодключаемаяКоманда_ЗаполнениеКоличество0";
Кнопка = Элементы.Найти(ИмяКнопки);
ЦелеваяГруппа = Элементы.Найти("ТоварыКоманднаяПанельПодменюЗаполнить");
Если Кнопка <> Неопределено И ЦелеваяГруппа <> Неопределено Тогда
Элементы.Переместить(Кнопка, ЦелеваяГруппа);
КонецЕсли;
КонецПроцедуры
Важный момент: если внешней обработке еще не назначен фиксированный идентификатор команды или команд несколько, можно аналогичным образом переместить целиком группу ПодменюЗаполнить в командную панель табличной части.
Если бизнес-логику заполнения допустимо хранить в расширении конфигурации (а не в отдельном внешнем файле .epf), можно задействовать штатный механизм подсистемы «Подключаемые команды» БСП напрямую. В этом случае БСП позволяет точно адресовать местоположение кнопки.
Разберем этот вариант подробнее:
ДобавитьКомандыЗаполнения() регистрируется команда.ИмяТабличнойЧастиПодменюЗаполнить (например, ТоварыПодменюЗаполнить).При таком подходе подсистема БСП сама сформирует кнопку в командной панели таблицы без ручных правок формы.
Если в базе запрещено использование расширений и изменения конфигурации, можно воспользоваться возможностью тиражирования настроек внешнего вида формы.
Выясним последовательность действий:
Если требуется автоматизировать этот процесс программно через административную внешнюю обработку, используем метод платформы ХранилищеСистемныхНастроек.Копировать():
// Пример программного копирования настройки конкретной формы
КлючОбъекта = "Документ.ЗаказПоставщику.Форма.ФормаДокумента";
ПользовательИсточник = "Администратор";
МассивПриемников = Новый Массив;
МассивПриемников.Добавить("Менеджер1");
МассивПриемников.Добавить("Менеджер2");
ХранилищеСистемныхНастроек.Копировать(ПользовательИсточник, МассивПриемников, КлючОбъекта);
Такой подход решает проблему ручной настройки под каждым пользователем и позволяет быстро распространить удобное расположение кнопки в интерфейсе.