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

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

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

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

Почему БСП не выводит внешнюю обработку сразу в табличную часть?

Проанализируем стандартную экспортную функцию СведенияОВнешнейОбработке(), которая используется для регистрации обработки в справочнике «Дополнительные отчеты и обработки»:


Функция СведенияОВнешнейОбработке() Экспорт
    ПараметрыРегистрации = ДополнительныеОтчетыИОбработки.СведенияОВнешнейОбработке("3.1.10.383");
    ПараметрыРегистрации.Вид = ДополнительныеОтчетыИОбработкиКлиентСервер.ВидОбработкиЗаполнениеОбъекта();
    ПараметрыРегистрации.Версия = "1.0.0.0";  
    
    МСН = Новый Массив();
    МСН.Добавить("Документ.ЗаказПоставщику");
    МСН.Добавить("Документ.КорректировкаЗаказаПоставщику");
    ПараметрыРегистрации.Назначение = МСН;
    
    Команда = ПараметрыРегистрации.Команды.Добавить();
    Команда.Представление = НСтр("ru = 'Заполнение Количество=0'");
    Команда.Идентификатор = "ЗаполнениеКоличество0";
    Команда.Использование = ДополнительныеОтчетыИОбработкиКлиентСервер.ТипКомандыЗаполнениеФормы();
    Команда.ПоказыватьОповещение = Ложь;
    
    Возврат ПараметрыРегистрации;  
КонецФункции

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

Чтобы решить эту задачу централизованно для всех пользователей, существует несколько проверенных способов.

Способ 1. Программное перемещение кнопки через расширение конфигурации

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

Разберем по шагам алгоритм реализации:

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

Посмотрим на пример серверного кода в расширении:


&После("ПриСозданииНаСервере")
Процедура Расш1_ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    
    // Имя кнопки формируется БСП по правилу: "ПодключаемаяКоманда_" + ИдентификаторКоманды
    ИмяКнопки = "ПодключаемаяКоманда_ЗаполнениеКоличество0";
    
    Кнопка = Элементы.Найти(ИмяКнопки);
    ЦелеваяГруппа = Элементы.Найти("ТоварыКоманднаяПанельПодменюЗаполнить");
    
    Если Кнопка <> Неопределено И ЦелеваяГруппа <> Неопределено Тогда
        Элементы.Переместить(Кнопка, ЦелеваяГруппа);
    КонецЕсли;

КонецПроцедуры

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

Способ 2. Перенос команды в расширение с регистрацией в подсистеме БСП

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

Разберем этот вариант подробнее:

  1. В расширении для нужного документа определяется модуль менеджера.
  2. В процедуре ДобавитьКомандыЗаполнения() регистрируется команда.
  3. В свойствах описания подключаемой команды задается имя родительской группы табличной части. По правилам БСП это группа вида ИмяТабличнойЧастиПодменюЗаполнить (например, ТоварыПодменюЗаполнить).

При таком подходе подсистема БСП сама сформирует кнопку в командной панели таблицы без ручных правок формы.

Способ 3. Тиражирование пользовательских настроек формы без доработки конфигурации

Если в базе запрещено использование расширений и изменения конфигурации, можно воспользоваться возможностью тиражирования настроек внешнего вида формы.

Выясним последовательность действий:

  1. Один эталонный пользователь открывает форму документа, нажимает Еще → Изменить форму и перетаскивает мышью кнопку команды заполнения в командную панель таблицы товаров.
  2. Администратор заходит в раздел НСИ и администрирование → Настройки пользователей и прав → Копирование настроек.
  3. В открывшемся окне выбирается исходный эталонный пользователь, отмечается настройка формы требуемого документа и выполняется копирование всем остальным 70 пользователям информационной базы.

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


// Пример программного копирования настройки конкретной формы
КлючОбъекта = "Документ.ЗаказПоставщику.Форма.ФормаДокумента";

ПользовательИсточник = "Администратор";

МассивПриемников = Новый Массив;
МассивПриемников.Добавить("Менеджер1");
МассивПриемников.Добавить("Менеджер2");

ХранилищеСистемныхНастроек.Копировать(ПользовательИсточник, МассивПриемников, КлючОбъекта);

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

← На главную