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

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

При динамическом построении интерфейса в управляемых формах 1С:Предприятия 8 часто возникает задача не просто создать кнопку, но и расположить её в строго определенном месте командной панели. По умолчанию новые элементы добавляются в конец коллекции, что не всегда удобно с точки зрения пользовательского интерфейса (UI). В этой статье мы подробно разберем, как программно управлять позиционированием кнопок, используя встроенные методы платформы. Для наглядного изучения механизмов построения интерфейса подойдёт обработка с примером динамического добавления и удаления элементов формы.

Метод 1: Использование метода «Переместить»

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

Элементы.Переместить(Элемент, Родитель, ПередКакимЭлементом)

Разберем параметры подробнее:

  1. Элемент — это сам объект элемента формы, который мы хотим передвинуть.
  2. Родитель — группа или командная панель, в которую мы помещаем кнопку.
  3. ПередКакимЭлементом — самый важный параметр для позиционирования. Кнопка будет вставлена непосредственно перед указанным здесь элементом.

Рассмотрим пример кода, в котором мы перемещаем кнопку в начало командной панели:


// Предположим, кнопка с именем "МояПрограммнаяКнопка" уже создана
Кнопка = Элементы.МояПрограммнаяКнопка;
КоманднаяПанель = Элементы.КоманднаяПанельФормы;

// Чтобы поместить кнопку в начало, нужно найти первый текущий элемент в панели
Если КоманднаяПанель.ПодчиненныеЭлементы.Количество() > 0 Тогда
    ПервыйЭлемент = КоманднаяПанель.ПодчиненныеЭлементы[0];
    Элементы.Переместить(Кнопка, КоманднаяПанель, ПервыйЭлемент);
Иначе
    Элементы.Переместить(Кнопка, КоманднаяПанель);
КонецЕсли;

Метод 2: Оптимальное создание через «Вставить»

Как справедливо замечено в обсуждении, более производительным и изящным способом является использование метода Вставить() вместо связки «создать + переместить». Метод Вставить() позволяет создать элемент и сразу указать его позицию относительно других элементов.

Проанализируем пример, где мы добавляем кнопку сразу в нужное место:


// Определяем, перед каким элементом должна стоять наша кнопка
// Например, мы хотим вставить её перед стандартной кнопкой "Справка"
ЭлементОриентир = Элементы.Найти("ФормаСправка");

// Создаем кнопку сразу в нужной позиции
НоваяКнопка = Элементы.Вставить("МояНоваяКнопка", Тип("КнопкаФормы"), Элементы.КоманднаяПанель, ЭлементОриентир);
НоваяКнопка.ИмяКоманды = "ИмяНужнойКоманды";
НоваяКнопка.Заголовок = "Нажми меня";

Важный нюанс: если в качестве третьего параметра (ориентира) передать Неопределено или не существующий элемент, кнопка просто добавится в конец списка.

Позиционирование относительно стандартных команд

Часто программисты сталкиваются с проблемой: командная панель формы заполнена автоматически (свойство Автозаполнение установлено в значение Истина). В этом случае стандартные кнопки (Записать, Провести, Справка) могут быть недоступны в коллекции Элементы в момент выполнения процедуры ПриСозданииНаСервере в привычном виде.

Чтобы точно управлять положением кнопок среди стандартных команд, проанализируем следующие стратегии:

  1. Отключение автозаполнения: Вы можете снять флаг автозаполнения у командной панели и добавить все необходимые стандартные команды вручную через конфигуратор или программно. Это даст полный контроль над порядком.
  2. Использование групп: Создайте в командной панели свою подгруппу (например, типа «Группа кнопок») и перемещайте элементы внутри неё. Это гарантирует, что ваши кнопки будут сгруппированы вместе и не «разлетятся» при обновлении платформы.
  3. Поиск соседа: Если нужно вставить кнопку в середину, выясним имя элемента, который должен идти СРАЗУ ПОСЛЕ нашей кнопки. Именно его мы передаем как параметр ПередКакимЭлементом.

Работа с вложенными подменю

Командная панель может содержать не только плоский список кнопок, но и иерархию (подменю). Программное перемещение позволяет легко переносить кнопки из корня панели внутрь конкретного меню.

Выясним, как это сделать на практике:


// Находим наше подменю (Группа типа "Подменю")
ГруппаМеню = Элементы.ГруппаВажныеДействия;
КнопкаДляПереноса = Элементы.МояКнопка;

// Переносим кнопку внутрь группы
Элементы.Переместить(КнопкаДляПереноса, ГруппаМеню);

Ограничения и рекомендации по контексту

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

Важные моменты:

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

← На главную