К статье
Практический материал

Разработка и Конфигурация · 9 мин

Как переопределить стандартную команду в 1С

Как переопределить стандартную команду в 1С: подписки на события, обработчики формы, расширения конфигурации. Пошаговые варианты с примерами кода.

Переопределение стандартной команды в 1С — типовая задача при доработке конфигурации: нужно изменить поведение кнопки «Записать», «Провести», «Печать» или команды глобального командного интерфейса, не ломая типовую логику. Способ зависит от того, где находится команда: в форме объекта, в командном интерфейсе или в общем списке команд.

Прямого механизма «переопределить команду» в платформе нет — вместо этого используют несколько приёмов: подмену обработчика команды формы, подписки на события, расширения конфигурации и собственные команды, которые скрывают стандартные. Ниже разобраны рабочие варианты с примерами кода и их ограничения.

Определите, какая команда требует переопределения

Перед доработкой важно понять, что именно вы переопределяете. В 1С различают стандартные команды формы (Записать, Провести, Печать, Перечитать), команды глобального командного интерфейса (создание и открытие списков объектов) и команды, созданные разработчиком в модуле формы или общем модуле.

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

Кнопка в форме объектаСтандартная команда формы

Переопределяется обработчиком команды или событиями формы

Команда в панели навигацииКоманда интерфейса

Меняется через настройку командного интерфейса или расширение

Обработчик в модуле формыПользовательская команда

Достаточно отредактировать процедуру обработчика

Переопределение команды через обработчик в форме

Самый прямой способ — в модуле формы объявить процедуру-обработчик команды с тем же именем, которое назначено кнопке. Если кнопка ссылается на стандартную команду, сначала создайте свою команду формы, назначьте её кнопке и внутри обработчика при необходимости вызовите стандартное действие программно.

Например, чтобы добавить проверку перед записью документа, создают свою команду «ЗаписатьСПроверкой», а стандартную запись выполняют методом Записать() объекта формы:

&НаКлиенте

Процедура ЗаписатьСПроверкой(Команда)

Если Не ПроверкаПройдена() Тогда

ПоказатьПредупреждение(, "Проверка не пройдена");

Возврат;

КонецЕсли;

Записать(); // стандартное действие

КонецПроцедуры

После этого старую кнопку со стандартной командой «Записать» скрывают из командной панели формы (свойство «Видимость» у элемента или настройка командного интерфейса формы), чтобы у пользователя оставалась только новая кнопка.

Порядок действий
  1. 1
    Откройте форму объекта в конфигураторе
  2. 2
    Создайте новую команду формы с нужным именем
  3. 3
    Назначьте команду кнопке через свойство «ИмяКоманды»
  4. 4
    Напишите обработчик: свои проверки + вызов стандартного действия
  5. 5
    Скройте стандартную кнопку из командной панели
  6. 6
    Проверьте запись, проведение и отмену проведения в пользовательском режиме

Перехват через события формы и подписки на события

Если нужно не заменить команду, а дополнить её поведение, часто достаточно событий формы: ПередЗаписью, ПриЗаписи, ПослеЗаписи. Они срабатывают при выполнении стандартных команд «Записать» и «Провести» и позволяют отменить действие через параметр Отказ.

Когда доработка должна касаться всех форм объекта или нескольких видов документов, удобнее подписка на событие. В конфигураторе создаётся подписка на событие, например «ПередЗаписью» или «ОбработкаПроведения», указывается источник (тип объектов) и обработчик в общем модуле. Плюс подхода — формы вообще не трогаются, минус — подписка работает на сервере и не может интерактивно спросить пользователя.

Процедура ПроверкаПередЗаписью(Источник, Отказ, РежимЗаписи, РежимПроведения) Экспорт

Если Источник.СуммаДокумента = 0 Тогда

Отказ = Истина;

Сообщить("Сумма документа не может быть нулевой");

КонецЕсли;

КонецПроцедуры

Переопределение через расширение конфигурации

Если конфигурация на поддержке и менять её напрямую нельзя, используют расширение. В расширении добавляют форму объекта, заимствуют стандартный обработчик команды с аннотацией &ИзменениеИКонтроль (или &После, &Вместо для процедур модулей) и дописывают свою логику.

Аннотация &Вместо полностью заменяет типовой обработчик — это рискованно при обновлениях, потому что изменения вендора в замещённой процедуре перестанут применяться. Безопаснее &Перед и &После: типовая логика сохраняется, а ваша добавляется до или после неё.

&После("Записать")

Процедура Расш1_Записать(Команда)

// свои действия после стандартной записи

Оповестить("ДокументЗаписан", Объект.Ссылка);

КонецПроцедуры

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

Команды глобального командного интерфейса

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

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

Проверка результата и типичные ошибки

После доработки проверьте все сценарии, связанные с командой: запись нового объекта, запись существующего, проведение, отмену проведения, запись через клавиши быстрого доступа и через кнопку в списке. Частая ситуация: переопределена кнопка в форме документа, но стандартная команда остаётся доступной из формы списка или по сочетанию клавиш.

Типичные ошибки
01
Скрыли кнопку в форме, но забыли про команду в форме списка — пользователь обходит проверку
02
Использовали &Вместо — после обновления конфигурации логика вендора потерялась
03
Добавили проверку только в событие формы — при программной записи из обмена или обработки она не срабатывает
04
Подписка пытается показать диалог на сервере — ошибка выполнения
05
Не вызвали стандартное действие в своём обработчике — команда «ничего не делает»
Контрольные точки

Как проверить результат

Запись через новую кнопку
Норма

Выполняется проверка и стандартная запись

Тревожный признак

Записывается без проверки или не записывается вообще

Программная запись из обмена данными
Норма

Срабатывает серверная подписка

Тревожный признак

Объект записывается в обход контроля

Поведение после обновления конфигурации
Норма

Доработка из расширения работает

Тревожный признак

Обработчик «отвалился» или конфликтует с типовым

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

Часто задаваемые вопросы

Можно ли переопределить команду, не снимая конфигурацию с поддержки?

Да. Основной способ — расширение конфигурации: заимствование формы и обработчиков с аннотациями &Перед, &После или &ИзменениеИКонтроль. Подписки на события тоже можно создавать без изменения типовых объектов, если режим совместимости и настройки поддержки это позволяют.

Как полностью заменить действие стандартной кнопки «Провести»?

Создайте свою команду формы, назначьте её кнопке вместо стандартной, в обработчике выполните свои проверки и вызовите Записать() с режимом проведения. Стандартную кнопку скройте. Учтите, что проведение из формы списка и программное проведение придётся контролировать отдельно — через подписку ОбработкаПроведения.

Почему мой обработчик команды не вызывается?

Чаще всего у кнопки в свойстве «ИмяКоманды» осталась стандартная команда, а не ваша. Также проверьте, что процедура расположена в модуле формы с правильной директивой компиляции (&НаКлиенте для команды формы) и что имя процедуры совпадает с именем обработчика, указанного у команды.

Чем подписка на событие отличается от обработчика в форме?

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

Что делать, если после обновления конфигурации переопределённая команда сломалась?

Проверьте расширение: поставщик мог переименовать процедуру, изменить её параметры или переработать форму. Заимствованные методы с &ИзменениеИКонтроль нужно заново сопоставить с типовым кодом и перенести свои изменения. Поэтому доработки в расширении стоит держать минимальными и документировать.

Можно ли переопределить сочетание клавиш стандартной команды?

Да, у команды формы есть свойство «СочетаниеКлавиш». Назначьте нужное сочетание своей команде и уберите его у стандартной, иначе возможны конфликты. Учтите, что некоторые сочетания зарезервированы платформой и веб-клиентом и перехватить их не получится.

Итог

Что важно запомнить

Стандартную команду в 1С переопределяют через свою команду формы с вызовом стандартного действия, события формы, подписки на события или расширение конфигурации. Клиентские проверки дублируйте серверными, избегайте аннотации &Вместо и после доработки тестируйте все пути выполнения команды — из формы, списка и программно.