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