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