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