Разработка и Конфигурация · 10 мин
Как обратиться к кнопке на форме 1С
Как программно обратиться к кнопке на форме 1С: поиск через Элементы, изменение видимости и доступности, обработчики команд, типичные ошибки и примеры кода.
Обращение к кнопке на форме в 1С — одна из самых частых задач при доработке конфигураций. Разработчику требуется скрыть кнопку, сделать её недоступной, изменить заголовок или программно выполнить связанную с ней команду. В управляемых формах для этого используется коллекция Элементы, а сама кнопка представлена объектом типа КнопкаФормы.
Ключевой момент: к кнопке нельзя обратиться напрямую по имени, как к переменной. Все элементы управляемой формы доступны только через свойство Элементы объекта формы. Попытка написать КнопкаСохранить.Видимость = Ложь приведёт к ошибке «Переменная не определена» — платформа не создаёт переменные для элементов формы автоматически.
Способ обращения зависит от того, где выполняется код: в модуле самой формы, в модуле другой формы или из внешнего контекста. Также важно различать кнопку как элемент интерфейса и команду, которую она вызывает — это разные сущности, и управлять ими нужно по-разному.
Как найти кнопку через коллекцию Элементы
Основной способ обращения к кнопке — указать её имя как свойство коллекции Элементы. Имя кнопки задаётся в конфигураторе в дереве элементов формы либо при программном создании элемента. Типовой код в модуле формы выглядит так:
&НаКлиенте
Процедура ПриОткрытии(Отказ)
Элементы.КнопкаОтправить.Видимость = Ложь;
КонецПроцедуры
Если имя кнопки формируется динамически или содержится в переменной, используйте метод Найти(). Он возвращает элемент формы или Неопределено, если элемент с таким именем не существует. Это безопасный вариант, который защищает от ошибки обращения к несуществующему свойству:
Кнопка = Элементы.Найти("Кнопка" + ИмяВарианта);
Если Кнопка <> Неопределено Тогда
Кнопка.Доступность = Ложь;
КонецЕсли;
Обращение через точку (Элементы.ИмяКнопки) при отсутствии элемента вызывает ошибку выполнения и прерывает код. Поэтому в расширениях конфигураций, где типовая форма может измениться после обновления, предпочтительнее метод Найти() с проверкой результата.
Какие свойства кнопки можно изменить программно
Объект КнопкаФормы предоставляет набор свойств для управления внешним видом и поведением. На практике чаще всего используются четыре из них:
Видимость— показывает или скрывает кнопку целиком. Скрытая кнопка не занимает место в интерфейсе;Доступность— кнопка видна, но неактивна (отображается серым). Пользователь видит, что действие существует, но сейчас недоступно;Заголовок— текст на кнопке, можно менять в зависимости от состояния объекта;Картинка— значок кнопки из библиотеки картинок конфигурации.
Выбор между Видимость и Доступность — не только технический, но и методический вопрос. Если действие в принципе недоступно пользователю (нет прав, не подходит режим работы), кнопку лучше скрыть. Если действие станет доступно после выполнения условий (например, после заполнения обязательных полей), правильнее оставить кнопку видимой, но отключить доступность — так интерфейс остаётся предсказуемым.
&НаКлиенте
Процедура СтатусПриИзменении(Элемент)
Если Объект.Статус = "Согласован" Тогда
Элементы.КнопкаПровести.Доступность = Ложь;
Элементы.КнопкаПровести.Заголовок = "Документ согласован";
Иначе
Элементы.КнопкаПровести.Доступность = Истина;
Элементы.КнопкаПровести.Заголовок = "Провести";
КонецЕсли;
КонецПроцедуры
Как связать кнопку с командой и обработчиком
Кнопка на управляемой форме сама по себе ничего не выполняет — она связана с командой формы. Команда, в свою очередь, указывает на процедуру-обработчик в модуле формы. Цепочка выглядит так: кнопка → команда → обработчик.
- 1В конфигураторе откройте форму и перейдите на закладку «Команды» — добавьте новую команду формы
- 2В свойствах команды задайте «Действие» — имя процедуры-обработчика, платформа создаст заготовку в модуле формы
- 3Перетащите команду из дерева команд в дерево элементов формы — появится кнопка
- 4Задайте кнопке понятное имя вместо автоматического, например КнопкаОтправитьОтчет
- 5Напишите код в обработчике и проверьте работу в режиме предприятия
Обработчик команды обычно размещается в клиентском контексте с директивой &НаКлиенте. Если логика требует обращения к базе данных (запросы, запись объектов), из клиентского обработчика вызывается серверная процедура:
&НаКлиенте
Процедура КнопкаОтправитьОтчет(Команда)
ОтправитьОтчетНаСервере();
ПоказатьПредупреждение(, "Отчет отправлен");
КонецПроцедуры
&НаСервере
Процедура ОтправитьОтчетНаСервере()
// Серверная логика: запросы, запись данных
КонецПроцедуры
Помните об ограничении: в клиентских процедурах недоступны запросы, прямое обращение к объектам базы данных и многие прикладные менеджеры. Если обработчик кнопки должен изменить данные, без серверного вызова не обойтись.
Как обратиться к кнопке из другой формы или извне
Из модуля одной формы нельзя напрямую изменить элементы другой формы — коллекция Элементы доступна только внутри её собственного модуля. Если нужно повлиять на кнопку открытой формы извне, есть несколько рабочих подходов.
Первый вариант — передать параметр при открытии формы. Открываемая форма в обработчике ПриСозданииНаСервере анализирует параметры и сама настраивает свои кнопки:
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
Если Параметры.Свойство("ТолькоПросмотрКнопок") Тогда
Элементы.КнопкаПровести.Видимость = Ложь;
КонецЕсли;
КонецПроцедуры
Второй вариант — оповещения. Форма-источник вызывает Оповестить("ИмяСобытия", ПараметрыСобытия), а целевая форма обрабатывает событие в ОбработкаОповещения и меняет свои элементы. Это стандартный механизм взаимодействия форм без жёсткой связи между ними.
Прямое обращение вида ФормаДокумента.Элементы.Кнопка.Видимость из внешнего кода технически возможно только если у вас есть ссылка на объект формы, но такой подход считается плохой практикой: он создаёт скрытые зависимости и ломается при любом переименовании элемента.
Как обратиться к кнопке в обычных формах
В старых конфигурациях на обычных формах (режим обычного приложения) механизм отличается. Там кнопки чаще всего размещаются на панелях командной панели, и обращение идёт через ЭлементыФормы:
ЭлементыФормы.КоманднаяПанель1.Кнопки.КнопкаПечать.Доступность = Ложь;
Для кнопок, размещённых непосредственно на форме, обращение проще: ЭлементыФормы.ИмяКнопки. Свойства схожи — Доступность, Видимость, Текст (вместо Заголовок).
Обработчик нажатия в обычных формах назначается через свойство «Действие» кнопки — там указывается имя процедуры из модуля формы. При переносе логики с обычных форм на управляемые учитывайте, что прямой перенос кода невозможен: модель работы с элементами полностью другая.
Типичные ошибки при обращении к кнопкам
Большинство проблем при работе с кнопками сводится к нескольким повторяющимся ситуациям. Их знание экономит время отладки.
Отдельно стоит упомянуть работу через расширения. Если кнопка добавлена в заимствованную форму расширением, обращение к ней выполняется так же — через Элементы, но только после того, как расширение применено и форма создана. При обновлении основной конфигурации проверяйте, не изменились ли имена заимствованных элементов.
Как проверить результат
Видимость и доступность меняются сразу после выполнения кода
Свойства в коде меняются, но в интерфейсе ничего не происходит — вероятно, код выполняется не в контексте формы
При нажатии кнопки выполняется нужная процедура, точка останова срабатывает
Кнопка нажимается без реакции — команда не связана с обработчиком или действие не назначено
Код в расширении продолжает находить кнопку через Найти()
После обновления возникают ошибки обращения к элементам — имена изменились в типовой форме
FAQ: частые вопросы о кнопках на форме 1С
Как программно «нажать» кнопку из кода?
Прямого метода «Нажать()» у кнопки формы нет. Правильный подход — вынести логику обработчика в отдельную процедуру и вызывать её напрямую из нужного места кода. Обработчик команды при этом просто вызывает ту же процедуру.
Почему Элементы.ИмяКнопки выдаёт ошибку, хотя кнопка есть на форме?
Чаще всего причина в несовпадении имени (регистр, опечатка) или в том, что код выполняется до создания формы. Также проверьте, не находится ли кнопка внутри динамически создаваемой группы и не удалена ли она условием видимости в расширении. Используйте Элементы.Найти() с проверкой на Неопределено для диагностики.
Можно ли изменить кнопку стандартной команды, например «Провести и закрыть»?
Да, стандартные кнопки командной панели тоже доступны через коллекцию Элементы по их именам (например, ФормаПровестиИЗакрыть). Им видимость и доступность можно изменять программно, но саму команду стандартного действия переопределить таким способом нельзя — для этого используются подписки на события или расширения.
Как скрыть кнопку только для определённых пользователей?
В обработчике ПриСозданииНаСервере проверьте роль текущего пользователя через РольДоступна("ИмяРоли") или ПользователиИнформационнойБазы.ТекущийПользователь(), и установите Видимость = Ложь. Помните, что это лишь интерфейсное ограничение — реальную защиту обеспечивают права доступа к объектам.
Чем отличается кнопка от команды формы?
Команда — это действие с обработчиком, кнопка — визуальное представление команды в интерфейсе. Одну команду могут вызывать несколько кнопок (например, в командной панели и на самой форме), и все они выполнят один обработчик. Управляя кнопкой, вы меняете только отображение; управляя командой — доступность действия целиком.
Что важно запомнить
К кнопке на управляемой форме обращаются через Элементы.ИмяКнопки или Элементы.Найти() с проверкой результата. Кнопка — это представление команды, а действие выполняет обработчик команды. Скрытие кнопки не заменяет настройку прав доступа, а изменение чужой формы извне делается через параметры или оповещения.