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