В разработке на платформе 1С:Предприятие (особенно в режиме Обычных форм) часто возникает задача управления интерфейсом «по умолчанию». Например, при открытии документа или справочника определенные колонки должны быть скрыты для удобства пользователя, а кнопка, отвечающая за их отображение, должна выглядеть нажатой. Если пользователю всё же понадобится увидеть скрытые данные, он сможет нажать на кнопку, «отжать» её и отобразить столбцы.
В этой статье мы подробно разберем, как правильно обратиться к кнопкам на панели, как установить их визуальное состояние и как связать это с логикой отображения данных.
Прежде всего, проанализируем, почему возникают трудности при обращении к кнопкам. В обычных формах (1С 8.2 или 8.3 в режиме совместимости) кнопки чаще всего располагаются не в корне самой формы, а внутри специального контейнера — Командной панели. Именно поэтому простое обращение типа ЭлементыФормы.ИмяКнопки часто приводит к ошибке «Объект не найден».
Рассмотрим структуру обращения подробнее:
ЭтаФорма — ссылка на текущий объект формы.ЭлементыФормы — коллекция всех визуальных объектов.ДействияФормы (или другое имя вашей панели) — конкретный элемент управления типа «Командная панель».Кнопки — коллекция кнопок внутри этой панели.Размещение (имя вашей кнопки) — конкретный объект кнопки, у которого мы будем менять свойство Пометка.Для того чтобы кнопка выглядела «нажатой», используется свойство Пометка (в англоязычном варианте — Check). Это булево значение: Истина — кнопка нажата (подсвечена), Ложь — кнопка в обычном состоянии.
Разберем типичную ошибку начинающих разработчиков. Посмотрим на этот пример кода:
// Ошибочный вариант
размещ = ЭтаФорма.ЭлементыФормы.ДействияФормы.Кнопки.Размещение.Пометка = Истина;
В данном случае происходит попытка присвоить переменной размещ результат логического сравнения, что не приводит к изменению состояния кнопки. Правильный синтаксис выглядит так:
// Правильный вариант
ЭлементыФормы.ДействияФормы.Кнопки.Размещение.Пометка = Истина;
Просто «нажать» кнопку визуально недостаточно. Нам необходимо, чтобы сработал тот же программный код, который выполняется при физическом нажатии кнопки пользователем. Для этого в процедуре ПриОткрытии мы должны не только установить Пометка = Истина, но и вызвать соответствующую процедуру скрытия колонок.
Рассмотрим комплексный пример реализации:
Процедура ПриОткрытии()
// 1. Устанавливаем визуальное состояние кнопки на панели
// Предположим, панель называется "ДействияФормы", а кнопка "Размещение"
ЭлементыФормы.ДействияФормы.Кнопки.Размещение.Пометка = Истина;
// 2. Устанавливаем значение связанной переменной (если она используется)
// Часто логика скрытия колонок завязана на реквизит формы или переменную
Размещение = Истина;
// 3. Вызываем процедуру, которая непосредственно управляет видимостью колонок
УстановитьИспользование_РезервированиеРазмещение();
КонецПроцедуры
Чтобы не дублировать код, важно правильно организовать процедуру, которая вызывается при нажатии кнопки. Проанализируем стандартную реализацию обработчика нажатия:
Процедура ДействияФормыРазмещение(Кнопка)
// Инвертируем состояние пометки (нажата/отжата)
Кнопка.Пометка = НЕ Кнопка.Пометка;
// Синхронизируем переменную с состоянием кнопки
Размещение = Кнопка.Пометка;
// Вызываем общую процедуру обновления интерфейса
УстановитьИспользование_РезервированиеРазмещение();
КонецПроцедуры
Обратите внимание, что процедура УстановитьИспользование_РезервированиеРазмещение() должна быть универсальной. Она не должна «знать» о кнопке, она должна ориентироваться на значение переменной Размещение или на текущее состояние Пометки кнопки.
Если код выдает ошибку, что элемент не найден, выполним следующие действия для отладки:
ПанельИнструментов1).ДействиеСкрытьКолонки).ЭлементыФормы.ПанельИнструментов1.Кнопки.ДействиеСкрытьКолонки.Пометка.Выясним, как можно сделать решение еще более надежным. В 1С есть механизм сохранения настроек формы. Если вы хотите, чтобы программа запоминала выбор пользователя (нажал он кнопку или нет) и восстанавливала его при следующем открытии, выполните следующие шаги:
Сохранять значения.Выбираемые значения отметьте переменную или реквизит Размещение.В этом случае вам даже не придется жестко прописывать Истина в коде ПриОткрытии. Достаточно будет просто вызвать процедуру обновления колонок, а 1С сама подставит последнее сохраненное значение переменной и состояние кнопки.
Если вы столкнетесь с аналогичной задачей в Управляемых формах, помните, что там работа с кнопками строится иначе. Вы не управляете «кнопкой» напрямую. Вместо этого вы создаете Реквизит формы (тип Булево), выносите его на форму в виде кнопки с видом Кнопка командной панели и устанавливаете для этого элемента свойство Пометка (или привязываете к свойству Пометка команды). Состояние кнопки в управляемом интерфейсе автоматически синхронизируется с реквизитом, к которому она привязана.
Резюмируем: Для решения задачи в обычных формах всегда проверяйте путь к кнопке через коллекцию Кнопки вашей командной панели и не забывайте вызывать процедуру перерисовки интерфейса сразу после программного изменения свойства Пометка.