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