Как изменить логику типовой процедуры в расширении 1С, не копируя весь код?

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

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

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

Основные принципы работы с расширениями

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

Решение задачи с помощью подмены флага

Представим ситуацию, когда вам нужно заставить систему выполнить определенное действие, проигнорировав стандартную проверку. В данном случае, типовой код проверяет, рассчитаны ли скидки, прежде чем разрешить оплату бонусами. Если мы хотим «обмануть» эту проверку, не переписывая сам алгоритм, мы можем манипулировать состоянием объекта.

Рассмотрим пошагово, как это реализовать:

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

Давайте посмотрим, как это выглядит на примере программного кода:


&Вместо("ВыполнитьЧО08ОплатаБонусами")
Процедура Расширение_ВыполнитьЧО08ОплатаБонусами()
    // Сохраняем исходное состояние свойства, чтобы вернуть его назад
    БылоРассчитано = Объект.СкидкиРассчитаны;
    
    // Принудительно меняем значение на Ложь, чтобы обойти условие в типовом коде
    Объект.СкидкиРассчитаны = Ложь;
    
    // Вызываем оригинальную типовую процедуру
    ПродолжитьВызов();
    
    // Возвращаем исходное состояние, чтобы система работала корректно дальше
    Объект.СкидкиРассчитаны = БылоРассчитано;
КонецПроцедуры

Почему этот способ является профессиональным?

Разберем подробнее, почему именно такой подход считается «золотым стандартом» разработки:

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

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

← На главную