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