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