ПриНажатии vs Команда: как правильно обрабатывать нажатия в форме 1С

В управляемых формах 1С для действий по нажатию выбирайте так: Команда — для бизнес-действий и переиспользования (кнопка/меню/панель), ПриНажатии — для локальных UI-реакций конкретного элемента. Это упрощает сопровождение и контроль доступности.

Оглавление

ПриНажатии и Команда: в чём разница

ПриНажатии — событие элемента формы. Код привязан к конкретной кнопке/гиперссылке/элементу, и обычно описывает “поведение этого элемента”.

Команда формыдействие, которое можно вывести в разных местах интерфейса и вызывать программно. Обработчик команды — единая точка входа: проще управлять доступностью, видимостью и повторным использованием.

Мини-шаблоны:

// 1) Событие элемента
&НаКлиенте
Процедура КнопкаРассчитатьПриНажатии(Элемент)
    РассчитатьИОбновитьИнтерфейс();
КонецПроцедуры

// 2) Команда формы
&НаКлиенте
Процедура КомандаРассчитать(Команда)
    РассчитатьИОбновитьИнтерфейс();
КонецПроцедуры

Как выбрать подход: практические критерии

Выбирайте ПриНажатии, если действие:

  • строго локальное для элемента (раскрыть/свернуть область, показать подсказку, переключить видимость блока);
  • не должно появляться в меню/панели и не будет вызываться из других мест;
  • не требует общего контроля доступности.

Выбирайте Команду, если действие:

  • бизнесовое: Заполнить, Рассчитать, Провести, Создать на основании, Печать;
  • нужно в нескольких местах формы (кнопка + командная панель + меню);
  • важно централизованно включать/выключать доступность по условиям;
  • есть риск дублирования кода между кнопками.

Простой тест: если вы называете действие глаголом уровня пользователя (“Рассчитать”, “Сформировать”, “Отправить”) — почти всегда делайте Команду. Если это “поведение конкретной кнопки” — ПриНажатии.

Не смешивайте без необходимости: кнопка с заполненным свойством Команда должна жить без логики в ПриНажатии, иначе становится неочевидно, что именно выполняется и в каком порядке.

Клиент/сервер в обработчиках: где выполнять логику

И команда, и событие элемента обычно стартуют на клиенте, но “тяжёлую” работу правильнее выносить на сервер.

Практика:

  • Клиент: проверки заполненности, диалоги, сообщения, работа с элементами формы, подготовка параметров.
  • Сервер: запросы, расчёты по данным ИБ, изменение/запись объектов, проведение.

Пример “команда на клиенте → вычисление на сервере”:

&НаКлиенте
Процедура КомандаРассчитать(Команда)
    Если Не ЗначениеЗаполнено(ПараметрРасчета) Тогда
        Сообщить("Заполните параметр расчета.");
        Возврат;
    КонецЕсли;

    Результат = РассчитатьНаСервере(ПараметрРасчета);
    ПолеРезультата = Результат;
КонецПроцедуры

&НаСервере
Функция РассчитатьНаСервере(Параметр) Экспорт
    // Любая серверная логика: запросы, расчеты, работа с объектами
    Возврат Параметр * 2; // пример
КонецФункции

Частые ошибки

  • Написали обработчик, но не назначили его в свойствах: процедура есть, а кнопка/команда на неё не ссылается.
  • У кнопки указана Команда, но вы ждёте ПриНажатии: кликаете — выполняется команда, событие элемента не используется.
  • Неверный контекст: на клиенте пытаются выполнять серверные операции (или наоборот). Решение — разделить на клиентскую “обвязку” и серверную функцию/процедуру.
  • Дублирование логики в нескольких событиях: вынесите действие в одну общую процедуру или команду, а элементы пусть только вызывают её.

FAQ

Можно ли вызывать команду программно?
Да. Команда — это действие, поэтому её удобно запускать из разных мест (в том числе из другого обработчика), сохраняя одну точку логики.

Команда — только для кнопок?
Нет. Команду можно вывести в командной панели, меню формы, привязать к разным UI-элементам — смысл именно в переиспользовании.

Что выбрать “по умолчанию”, если сомневаюсь?
Для управляемых форм чаще выигрывает Команда: меньше привязки к UI и проще сопровождение. ПриНажатии оставляйте для мелких, строго интерфейсных эффектов.