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

Программист 1С v8.3 (Обычные формы)
← На главную

В разработке на платформе 1С:Предприятие (особенно в режиме Обычных форм) часто возникает задача управления интерфейсом «по умолчанию». Например, при открытии документа или справочника определенные колонки должны быть скрыты для удобства пользователя, а кнопка, отвечающая за их отображение, должна выглядеть нажатой. Если пользователю всё же понадобится увидеть скрытые данные, он сможет нажать на кнопку, «отжать» её и отобразить столбцы.

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

Разбор архитектуры элементов формы

Прежде всего, проанализируем, почему возникают трудности при обращении к кнопкам. В обычных формах (1С 8.2 или 8.3 в режиме совместимости) кнопки чаще всего располагаются не в корне самой формы, а внутри специального контейнера — Командной панели. Именно поэтому простое обращение типа ЭлементыФормы.ИмяКнопки часто приводит к ошибке «Объект не найден».

Рассмотрим структуру обращения подробнее:

  1. ЭтаФорма — ссылка на текущий объект формы.
  2. ЭлементыФормы — коллекция всех визуальных объектов.
  3. ДействияФормы (или другое имя вашей панели) — конкретный элемент управления типа «Командная панель».
  4. Кнопки — коллекция кнопок внутри этой панели.
  5. Размещение (имя вашей кнопки) — конкретный объект кнопки, у которого мы будем менять свойство Пометка.

Шаг 1: Установка визуального состояния кнопки

Для того чтобы кнопка выглядела «нажатой», используется свойство Пометка (в англоязычном варианте — Check). Это булево значение: Истина — кнопка нажата (подсвечена), Ложь — кнопка в обычном состоянии.

Разберем типичную ошибку начинающих разработчиков. Посмотрим на этот пример кода:


// Ошибочный вариант
размещ = ЭтаФорма.ЭлементыФормы.ДействияФормы.Кнопки.Размещение.Пометка = Истина;

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


// Правильный вариант
ЭлементыФормы.ДействияФормы.Кнопки.Размещение.Пометка = Истина;

Шаг 2: Реализация логики в обработчике ПриОткрытии

Просто «нажать» кнопку визуально недостаточно. Нам необходимо, чтобы сработал тот же программный код, который выполняется при физическом нажатии кнопки пользователем. Для этого в процедуре ПриОткрытии мы должны не только установить Пометка = Истина, но и вызвать соответствующую процедуру скрытия колонок.

Рассмотрим комплексный пример реализации:


Процедура ПриОткрытии()
    
    // 1. Устанавливаем визуальное состояние кнопки на панели
    // Предположим, панель называется "ДействияФормы", а кнопка "Размещение"
    ЭлементыФормы.ДействияФормы.Кнопки.Размещение.Пометка = Истина;
    
    // 2. Устанавливаем значение связанной переменной (если она используется)
    // Часто логика скрытия колонок завязана на реквизит формы или переменную
    Размещение = Истина;
    
    // 3. Вызываем процедуру, которая непосредственно управляет видимостью колонок
    УстановитьИспользование_РезервированиеРазмещение();
    
КонецПроцедуры

Шаг 3: Синхронизация кнопки и действия

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


Процедура ДействияФормыРазмещение(Кнопка)
    
    // Инвертируем состояние пометки (нажата/отжата)
    Кнопка.Пометка = НЕ Кнопка.Пометка;
    
    // Синхронизируем переменную с состоянием кнопки
    Размещение = Кнопка.Пометка;
    
    // Вызываем общую процедуру обновления интерфейса
    УстановитьИспользование_РезервированиеРазмещение();
    
КонецПроцедуры

Обратите внимание, что процедура УстановитьИспользование_РезервированиеРазмещение() должна быть универсальной. Она не должна «знать» о кнопке, она должна ориентироваться на значение переменной Размещение или на текущее состояние Пометки кнопки.

Как найти имя панели и кнопки?

Если код выдает ошибку, что элемент не найден, выполним следующие действия для отладки:

  1. Откроем форму в конфигураторе.
  2. Нажмем правой кнопкой мыши на командную панель и выберем «Свойства». Посмотрим значение в поле Имя (например, ПанельИнструментов1).
  3. Зайдем в свойство «Кнопки» этой панели. Найдем там нужную кнопку и посмотрим её Имя (например, ДействиеСкрытьКолонки).
  4. В коде будем использовать путь: ЭлементыФормы.ПанельИнструментов1.Кнопки.ДействиеСкрытьКолонки.Пометка.

Дополнительные рекомендации и автоматизация

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

В этом случае вам даже не придется жестко прописывать Истина в коде ПриОткрытии. Достаточно будет просто вызвать процедуру обновления колонок, а 1С сама подставит последнее сохраненное значение переменной и состояние кнопки.

Особенности для Управляемых форм (8.3)

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

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

← На главную