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