Как исправить ошибку «Процедура или функция с указанным именем уже определена» в расширении 1С?

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

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

Причина возникновения ошибки совпадения имен

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

При использовании аннотаций перехвата (например, &Вместо) связывание с исходной процедурой происходит через строковый параметр в самой аннотации. Имя же процедуры в самом модуле расширения должно быть уникальным.

Шаги по исправлению ошибки переопределения метода

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

  1. Выясним точное имя метода в основной конфигурации, который необходимо заместить (например, ЗаполнитьТаблицуОстатковРасчетов).
  2. В модуле расширения укажем аннотацию с исходным именем: &Вместо("ЗаполнитьТаблицуОстатковРасчетов").
  3. Зададим процедуре в расширении уникальное имя. Рекомендуется использовать стандартный префикс расширения (например, Расш1_ЗаполнитьТаблицуОстатковРасчетов).

Посмотрим на пример правильного оформления кода в модуле расширения:


&Вместо("ЗаполнитьТаблицуОстатковРасчетов")
Процедура Расш1_ЗаполнитьТаблицуОстатковРасчетов(ТаблицаОстатков, Параметры)
    // Свой вариант реализации логики
КонецПроцедуры

Использование префикса расширения гарантирует уникальность имен и предотвращает конфликты как с основной конфигурацией, так и с другими подключенными расширениями.

Ограничения при изменении списка параметров метода

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


&Вместо("ПолучитьКоэффициентыПересчетаВалюты")
Процедура Расш1_ПолучитьКоэффициентыПересчетаВалюты(Валюта, Дата, МойПараметр = Неопределено)
    // Код процедуры
КонецПроцедуры

Платформа выдаст ошибку применения модуля: «Список параметров метода не соответствует методу...».

Платформа 1С осуществляет строгий контроль соответствия количества и типов передаваемых параметров. Изменять количество формальных параметров в методах с аннотацией &Вместо напрямую запрещено.

Альтернативные способы решения задачи с передачей новых данных

Выясним, как обойти ограничение платформы, если в переопределяемый метод требуется передать дополнительный контекст:

  1. Использование параметров-структур: Если в исходной процедуре уже присутствует параметр типа Структура или Соответствие (например, ДополнительныеПараметры), новые данные передаются путем добавления новых свойств в эту структуру без изменения списка формальных параметров.
  2. Создание отдельной экспортной процедуры: В расширении создается новая процедура с необходимым составом параметров. Из мест кода, где требуется расширенная логика, вызывается этот новый метод. Замещенный метод &Вместо сохраняет исходную сигнатуру.
  3. Передача через временное хранилище или параметры сеанса: Перед вызовом метода значение сохраняется с помощью функции ПоместитьВоВременноеХранилище, а внутри переопределенного метода в расширении считывается обратно.
  4. Использование аннотации &ИзменениеИКонтроль: Начиная с версии платформы 8.3.15, вместо полного переопределения метода через &Вместо рекомендуется использовать аннотацию &ИзменениеИКонтроль. Она позволяет точечно изменять фрагменты кода внутри метода без изменения его внешней сигнатуры.
← На главную