Как программно добавить кнопку в определенную группу на управляемой форме 1С 8.3?

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

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

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

Анализ механизма программного создания элементов формы

Для программного добавления кнопки на управляемую форму требуется выполнить два взаимосвязанных действия:

  1. Создать команду формы в коллекции Команды и связать ее с клиентской процедурой-обработчиком.
  2. Создать визуальный элемент типа КнопкаФормы в коллекции Элементы, указать в качестве родителя целевую группу и связать элемент с созданной командой.

Посмотрим на базовый пример создания команды и кнопки в обработчике расширения:


&НаСервере
&После("ПриСозданииНаСервере")
Процедура Расш_ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)

    // 1. Создаем команду формы
    Команда = Команды.Добавить("ОтправитьНаСайт");  
    Команда.Заголовок = "Отправить данные на сайт";
    Команда.Действие  = "ОтправитьНаСайт"; // Имя связанной клиентской процедуры

    // 2. Создаем кнопку формы в конкретной группе
    КнопкаФормы = Элементы.Добавить("ОтправитьНаСайт", Тип("КнопкаФормы"), Элементы.ГруппаИНН);   
    КнопкаФормы.ИмяКоманды = "ОтправитьНаСайт";
    КнопкаФормы.Вид = ВидКнопкиФормы.ОбычнаяКнопка; 

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

Разберем подробнее ключевые параметры и нюансы, из-за которых кнопка может не отображаться или вызывать ошибки платформы.

Указание родительской группы и позиционирование

Метод Элементы.Добавить() принимает три параметра: имя нового элемента, его тип и родительский контейнер (группу). Если третий параметр не указан или в него передана сама форма (ЭтаФорма), элемент будет помещен в самый низ формы.

Чтобы кнопка оказалась внутри требуемой группы, третьим параметром необходимо передать ссылку на эту группу из коллекции элементов: Элементы.ГруппаИНН.

Важно помнить: метод Элементы.Добавить всегда добавляет элемент в конец указанной группы. Если внутри группы уже есть реквизиты и кнопку необходимо расположить строго перед определенным полем, используем метод Элементы.Переместить():


// Перемещаем созданную кнопку в группе ГруппаИНН перед полем ИНН
Элементы.Переместить(КнопкаФормы, Элементы.ГруппаИНН, Элементы.ИНН);

Соответствие свойства Вид типу родительского элемента

Одной из частых причин ошибок является некорректная установка свойства Вид элемента КнопкаФормы. Платформа 1С предъявляет строгие требования к видам кнопок в зависимости от контейнера:

  1. Обычная группа формы или группа полей: для кнопок, расположенных в обычных панелях и группах, устанавливается значение ВидКнопкиФормы.ОбычнаяКнопка или ВидКнопкиФормы.Гиперссылка.
  2. Командная панель или подменю: если родительским контейнером выступает командная панель формы (КоманднаяПанель) или группа подменю, значение ВидКнопкиФормы.ОбычнаяКнопка недопустимо и приведет к ошибке платформы. В таком случае необходимо использовать ВидКнопкиФормы.КнопкаКоманднойПанели.

Требования к обработчику команды

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

  1. Обязательно объявляется с директивой &НаКлиенте в том же модуле формы расширения.
  2. Должна принимать ровно один параметр — саму команду: Процедура ОтправитьНаСайт(Команда).

Посмотрим на пример клиентского обработчика:


&НаКлиенте
Процедура ОтправитьНаСайт(Команда)
    
    // Алгоритм отправки данных
    ПоказатьОповещениеПользователя("Успешно", , "Данные отправлены на сайт");

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

Альтернативные способы реализации

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

  1. Визуальное добавление через расширение: если форма типовая, наиболее надежным способом часто является заимствование формы и нужной группы в расширение конфигурации. Это позволяет добавить команду и перетащить кнопку в группу визуально в конфигураторе без использования программного кода.
  2. Использование встроенных кнопок поля ввода: если действие логически относится непосредственно к полю ИНН, вместо отдельной кнопки можно включить дополнительную кнопку выбора у самого поля ввода (свойство КнопкаВыбора = Истина) и назначить обработчик события НачалоВыбора через метод УстановитьДействие(). Это сохранит компактность интерфейса без создания лишних контейнеров.
← На главную