Как перехватить выполнение подключаемых команд БСП в расширении 1С?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

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

В этой статье мы подробно разберем, как правильно перехватить выполнение таких команд с помощью механизма расширений, проанализируем типичные ошибки и рассмотрим наиболее безопасные способы модификации кода.

Понимание механизмов БСП в формах

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


// СтандартныеПодсистемы.ПодключаемыеКоманды
&НаКлиенте 
Процедура Подключаемый_ВыполнитьКоманду(Команда)
    ПодключаемыеКомандыКлиент.ВыполнитьКоманду(ЭтотОбъект, Команда, Объект);
КонецПроцедуры 

&НаСервере
Процедура Подключаемый_ВыполнитьКомандуНаСервере(Контекст, Результат)
    ПодключаемыеКоманды.ВыполнитьКоманду(ЭтотОбъект, Контекст, Объект, Результат);
КонецПроцедуры 

&НаКлиенте
Процедура Подключаемый_ОбновитьКоманды()
    ПодключаемыеКомандыКлиентСервер.ОбновитьКоманды(ЭтотОбъект, Объект);
КонецПроцедуры 
// Конец СтандартныеПодсистемы.ПодключаемыеКоманды

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

Типичные ошибки при расширении команд

Разберем ситуацию, когда разработчик пытается создать метод в расширении, но он не срабатывает. Выясним основные причины неудачи:

  1. Несоответствие директив компиляции: Если оригинальная процедура помечена как &НаКлиенте, то и метод в расширении обязан иметь эту директиву. Если ее пропустить, платформа не сможет сопоставить расширяемый метод.
  2. Безопасный режим: Если у расширения в свойствах включен флаг «Безопасный режим», работа с серверными вызовами и некоторыми контекстными манипуляциями может быть ограничена. Рассмотрим это как одну из первых проверок при отладке.
  3. Режим совместимости: В старых версиях платформы (ниже 8.3.10) возможности расширения форм были существенно ограничены. Для версии 8.3.13 и выше, которую мы рассматриваем, этот вопрос обычно не стоит так остро, но проверку версии совместимости конфигурации провести стоит.

Решение проблемы через аннотацию &Вместо

Если нам необходимо полностью перехватить управление и, возможно, отменить стандартное действие, мы можем использовать аннотацию &Вместо. Посмотрим на корректную реализацию этого метода в расширении:


&НаКлиенте
&Вместо("Подключаемый_ВыполнитьКоманду")
Процедура Расш_Подключаемый_ВыполнитьКоманду(Команда)    
    // Здесь можно выполнить действия до основной логики
    
    // Вызов основной логики БСП (если необходимо)
    ПодключаемыеКомандыКлиент.ВыполнитьКоманду(ЭтотОбъект, Команда, Объект);
    
    // Здесь можно выполнить действия после основной логики
КонецПроцедуры

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

Рекомендуемое решение: Использование аннотации &Перед

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


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

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

Альтернативные пути через переопределяемые модули

Проанализируем ситуацию глубже. Вместо того чтобы расширять модуль каждой формы, БСП предлагает штатные «точки выхода» в общих модулях. Рассмотрим работу с общим модулем ПодключаемыеКомандыПереопределяемый.

В этом модуле существуют процедуры, такие как ПриОпределенииКомандПодключенныхКОбъекту. Программное изменение параметров команд на этом этапе часто бывает более эффективным, чем перехват события нажатия кнопки. Мы можем:

Подведем итоги

Для успешного расширения подключаемых команд БСП в версии 8.3.13 и выше необходимо придерживаться следующих правил:

  1. Всегда проверяйте директивы компиляции (&НаКлиенте) — они должны полностью совпадать с оригиналом.
  2. Используйте &Перед для выполнения дополнительных действий без риска сломать обновление конфигурации.
  3. Если используете &Вместо, старайтесь не копировать код типовой конфигурации, а использовать метод ПродолжитьВызов(), если это позволяет контекст.
  4. Помните о безопасном режиме расширения: если ваш код требует доступа к серверным процедурам или файловой системе, безопасный режим должен быть отключен в свойствах расширения в конфигураторе или в справочнике «Расширения» в режиме «1С:Предприятие».

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

← На главную