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

Как работают переопределяемые модули в типовых конфигурациях?

1.0 Junior🔥 131 комментариев
#Конфигурации и типовые#Опыт и софт-скиллы

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

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

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

Переопределяемые модули в типовых конфигурациях

Переопределяемые модули — это архитектурный паттерн в типовых конфигурациях (УТ, КА, БП, ЗУП). Понимание их критично для правильного расширения типовых систем.

Суть идеи

Типовая конфигурация (например, УТ 11) содержит базовую логику. Нужно дать возможность компаниям эту логику расширять без правок основного кода.

Решение: переопределяемые модули — точки расширения.

Типовая конфигурация
    ↓
Основной модуль (ОсновнойМодульОперация)
    ↓
Проверка: существует ли переопределяемый модуль?
    ├→ ДА → вызвать его логику
    └→ НЕТ → использовать дефолтную

Как это устроено в коде

Пример из УТ 11: заполнение табличной части документа

// В модуле документа (основной типовой код)
Процедура ПриПолученииДанных() Экспорт
    
    // Дефолтная логика
    ЗаполнитьСтандартныеДанные();
    
    // Проверка: есть ли переопределение?
    Если Метаданные.Модули.Найти("ПереопределяемыеМодули.ЗаполнениеДанных") <> Неопределено Тогда
        
        // Вызываем переопределяемый модуль (расширение компании)
        ПереопределяемыеМодули.ЗаполнениеДанных.ЗаполнитьТабличнуюЧасть(ЭтотОбъект);
        
    КонецЕсли;
    
КонецПроцедуры;

Процедура ЗаполнитьСтандартныеДанные()
    // Базовая логика конфигурации
    // ...
КонецПроцедуры;

В расширении компании:

// Модуль: ПереопределяемыеМодули.ЗаполнениеДанных
// (создаётся в расширении, а не в основной конфе)

Процедура ЗаполнитьТабличнуюЧасть(Документ) Экспорт
    
    // Пользовательская логика
    // Может добавлять строки, менять данные и т.п.
    НоваяСтрока = Документ.Товары.Добавить();
    НоваяСтрока.Товар = Справочники.Товары.НайтиПоКоду("СПЕ001");
    НоваяСтрока.Количество = 100;
    
КонецПроцедуры;

Типичные переопределяемые модули в УТ 11

1. РасчётОсобенностейДокументов — изменение поведения конкретного документа

// Переопределяем логику заполнения счёта
Процедура ЗаполнитьДанныеСчёта(Счёт) Экспорт
    // Пользовательские правила автозаполнения
КонецПроцедуры;

2. ОсновнаяФункциональность.ОперацииДокументов — логика при проведении

Процедура ПриПроведенииДокумента(Документ) Экспорт
    // Доп. проверки перед проведением
    // Дополнительные движения по регистрам
КонецПроцедуры;

3. ОсновнаяФункциональность.РасчётыСКлиентами — логика взаиморасчётов

Процедура ПересчитатьРасчётныеДокументы() Экспорт
    // Пересчёт долгов, авансов
КонецПроцедуры;

Механизм обнаружения

Способ 1: Через Метаданные

Процедура ПроверитьНаличиеПереопределения() Экспорт
    
    // Получаем список всех модулей расширения
    СписокМодулей = Метаданные.Модули;
    
    Для Каждого МодульМета Из СписокМодулей Цикл
        Если Лев(МодульМета.Имя, 27) = "ПереопределяемыеМодули." Тогда
            // Найден переопределяемый модуль
            ИмяМодуля = МодульМета.Имя;
            
            // Проверяем есть ли нужная процедура
            Если МодульМета.МодульОбъект.Найти("НужнаяПроцедура") <> Неопределено Тогда
                // Процедура существует, можем вызвать
            КонецЕсли;
        КонецЕсли;
    КонецЦикла;
    
КонецПроцедуры;

Способ 2: Через условный вызов

Процедура ВызватьПереопределениеЕслиЕсть(ИмяМодуля, ИмяПроцедуры, Параметры) Экспорт
    
    Попытка
        ПолучитьМодульПереопределяемыхМодулей(ИмяМодуля).Выполнить(ИмяПроцедуры, Параметры);
    Исключение
        // Модуля нет или процедуры нет — продолжаем с дефолтом
    КонецПопытки;
    
КонецПроцедуры;

Практический пример: расширение логики счёта

В типовой конфигурации УТ 11:

// Документ.Счёт, модуль документа
Процедура Записать(Параметры = Неопределено) Экспорт
    
    // Дефолтная валидация
    ПроверитьДанные();
    
    // Дефолтное заполнение реквизитов
    ЗаполнитьСтандартныеДанные();
    
    // Точка расширения — пользовательская логика
    ПереопределяемыеМодули.ЛогикаДокументов.ПридЗаписиДокумента(ЭтотОбъект);
    
    // Дефолтная запись
    СтандартнаяЗапись();
    
КонецПроцедуры;

В расширении компании (например, УТ11_ИМЯКОМПАНИИ):

// Модуль ПереопределяемыеМодули.ЛогикаДокументов
Процедура ПридЗаписиДокумента(Документ) Экспорт
    
    // Если это счёт от конкретного клиента
    Если Документ.Метаданные().Имя = "Счёт" И Документ.Контрагент = СтруктурыДанных.ОсновнойПоставщик() Тогда
        
        // Добавляем в реестр счётов
        НаборЗаписей = РегистрыСведений.РеестрСчётов.СоздатьНаборЗаписей();
        НаборЗаписей.Фильтр.Счёт.Значение = Документ.Ссылка;
        НаборЗаписей.Фильтр.Счёт.Использование = Истина;
        
        НоваяЗапись = НаборЗаписей.Добавить();
        НоваяЗапись.Счёт = Документ.Ссылка;
        НоваяЗапись.ДатаРегистрации = ТекущаяДата();
        НоваяЗапись.ПользовательРегистрации = Пользователи.ТекущийПользователь();
        
        НаборЗаписей.Записать();
    КонецЕсли;
    
КонецПроцедуры;

Правила создания переопределяемых модулей

  1. Вложенность: ПереопределяемыеМодули.ИмяМодуля
  2. Процедуры экспортные: обязательно Экспорт
  3. Сигнатура совпадает: такие же параметры, как в типовом коде
  4. Нет глобальных эффектов: работаешь с переданными объектами
  5. Обработка исключений: должны быть проверки на пустоту и корректность

Недостатки и проблемы

❌ Сложность отладки

  • Разработчик первого уровня не видит где живёт логика
  • Нужно искать в переопределяемых модулях

❌ Версионирование

  • При обновлении типовой конфи могут добавиться новые параметры
  • Сигнатура процедуры изменится
  • Старые переопределения могут сломаться

❌ Производительность

  • Каждый вызов — проверка на наличие модуля
  • Условные операторы замедляют выполнение

Вывод

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

  • Компаниям добавлять свою логику
  • Типовой конфе оставаться чистой
  • Упростить обновления

Используй их осторожно:

  • Не усложняй логику переопределяемых модулей
  • Документируй что ты переопределяешь
  • Помни о сигнатурах при обновлении типовой конфи

Это элегантный паттерн архитектуры, но требует дисциплины в использовании.

Как работают переопределяемые модули в типовых конфигурациях? | PrepBro