Как правильно исправить метод в общем модуле через расширение в 1С 8.3

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

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

Определяем стратегию изменения метода

Прежде чем приступать к написанию кода в расширении, нам необходимо проанализировать ситуацию. Выбор метода расширения зависит от нескольких ключевых факторов. Разберем их по порядку:

  1. Режим совместимости конфигурации. Это критически важный параметр. Например, самая современная и рекомендуемая директива &ИзменениеИКонтроле доступна только начиная с версии платформы 8.3.15. Если ваша конфигурация работает в более старом режиме, этот вариант будет недоступен.
  2. Тип метода. Проанализируем, является ли метод процедурой или функцией. Для функции нам обязательно нужно вернуть значение, что накладывает определенные обязательства при использовании директивы &Вместо.
  3. Цель исправления. Если нам нужно просто добавить код в начало или конец метода, лучше использовать &Перед или &После. Если же требуется изменить логику внутри типового алгоритма, придется выбирать между полной заменой или точечным вмешательством.

Использование директивы ИзменениеИКонтроле

Рассмотрим наиболее надежный способ — аннотацию &ИзменениеИКонтроле. Этот метод позволяет нам не переписывать всю процедуру целиком, а работать только с нужным фрагментом кода. Проанализируем механизм работы: платформа хранит контрольную сумму оригинального метода. Если при обновлении типовой конфигурации вендор изменит этот метод, расширение выдаст ошибку при компиляции, что позволит нам вовремя адаптировать свои правки.

Посмотрим на пример использования специальных инструкций внутри такого метода:


&ИзменениеИКонтроле("РассчитатьСуммуДокумента")
Процедура Расш1_РассчитатьСуммуДокумента(Параметры)
    // Оригинальный код метода копируется сюда целиком
    Сумма = Цена * Количество;
    #Удалить
    Сумма = Сумма - СтараяСкидка;
    #КонецУдаления
    #Вставить
    Сумма = Сумма - НоваяСкидкаПоАкции;
    #КонецВставки
КонецПроцедуры

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

Замена метода с помощью директивы Вместо

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

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

Посмотрим на пример для функции:


&Вместо("ПолучитьТекстЗапроса")
Функция Расш1_ПолучитьТекстЗапроса(Параметр1)
    // Мы можем модифицировать входящие параметры перед вызовом
    Параметр1 = Параметр1 + " ДопУсловие";
    
    // Вызываем оригинальный метод из основной конфигурации
    Результат = ПродолжитьВызов(Параметр1);
    
    // Дополняем результат своей логикой
    Результат = Результат + " УПОРЯДОЧИТЬ ПО Ссылка";
    
    Возврат Результат;
КонецФункции

Важные нюансы при работе с общими модулями

Проанализируем технические требования, которые часто упускают из виду, что приводит к ошибкам выполнения:

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

Рекомендации по отладке

Выясним, как эффективно искать ошибки в расширенном коде. Точки останова в основной конфигурации могут не срабатывать для кода расширения. Для корректной отладки необходимо:

1. Открыть конфигурацию расширения.

2. Найти нужный метод именно внутри расширения.

3. Установить точку останова там.

Также рекомендуется использовать безопасный режим для расширений, если вы не уверены в стабильности вносимых изменений, чтобы предотвратить критические сбои всей системы.

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

← На главную