← Назад к вопросам

Какие способы переопределения процедур и функций существуют в расширениях?

2.4 Senior🔥 81 комментариев
#Расширения#Стандарты разработки

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI26 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Способы переопределения процедур и функций в расширениях

В 1С:Предприятие существует несколько подходов для переопределения процедур и функций при работе с расширениями. Это критически важная тема, так как позволяет изменять поведение базовой конфигурации без её модификации.

Основные способы переопределения

1. Переопределение через подмену в обработчиках событий (Event Hijacking)

Это самый распространённый метод. Расширение подписывается на события базовой конфигурации и может заменять результаты вызовов:

// В модуле расширения
Процедура ПередСохранением(Параметры) Экспорт
    // Если нужно переопределить сохранение
    Параметры.Отказать = Истина;
    // Вызываем нашу логику
    МояПроцедураСохранения(ЭтотОбъект);
КонецПроцедуры

В этом методе расширение перехватывает события до или после выполнения базовой логики и может:

  • Отменить выполнение базовой процедуры (Отказать = Истина)
  • Добавить дополнительную логику
  • Изменить параметры передаваемые в процедуру

2. Использование обработчиков подписок (Handlers)

Расширение может регистрировать свои обработчики событий модулей базовой конфигурации:

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

Этот подход позволяет регистрировать несколько обработчиков для одного события, что обеспечивает большую гибкость.

3. Переопределение глобальных процедур и функций

Глобальные функции базовой конфигурации могут быть переопределены в расширении. При этом в расширении определяется процедура/функция с тем же именем:

// Базовая конфигурация имеет
Процедура ОбщаяПроцедура() Экспорт
    Возврат "Базовое значение";
КонецПроцедуры

// Расширение переопределяет
Процедура ОбщаяПроцедура() Экспорт
    Возврат "Переопределённое значение";
КонецПроцедуры

Однако этот способ имеет ограничения: он работает только если базовый код вызывает функцию по полному пути (через имя модуля).

4. Переопределение методов объектов через встроенные интерфейсы

Для объектов метаданных (документы, справочники) расширение может переопределять методы модулей через специальные интерфейсы:

// В модуле объекта расширения
Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения) Экспорт
    // Переопределяемая логика
    Если Не ПроверитьКорректность() Тогда
        Отказ = Истина;
        Сообщить("Данные некорректны");
    КонецЕсли;
КонецПроцедуры

Ограничения и особенности

Важные моменты при переопределении:

  • Порядок вызова: базовый код выполняется в первую очередь, затем код расширения (для большинства событий)
  • Параметр Отказ: если установить Отказ = Истина, можно отменить выполнение базовой логики
  • Контекст: в расширении доступен полный контекст объекта, с которым работает базовая конфигурация
  • Производительность: необходимо тщательно следить за производительностью, так как переопределение добавляет накладные расходы

Лучшие практики

  1. Минимизируйте логику в переопределяемых процедурах
  2. Используйте проверки перед изменением параметров
  3. Документируйте какие процедуры переопределяются и почему
  4. Избегайте циклических зависимостей между базовой конфигурацией и расширением
  5. Тестируйте переопределения с разными версиями базовой конфигурации

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