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