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