Бывает, что у слушателя, прошедшего обучение, остаются вопросы. В этом случае тренер еще раз разъясняет материал в Мастер-группе, акцентирует внимание на деталях, приводит примеры.
Ниже мы публикуем ответ тренера на вопрос о назначении метода ПродолжитьВызов() и прикладываем слайд из методических материалов курса Разработка расширений и технологии доработки конфигураций 1С без снятия с поддержки.
Вопрос
Ответ тренера
Если в расширении используется аннотация &Вместо(), то никаким другим образом, кроме метода ПродолжитьВызов(), нельзя вызвать код заменяемой процедуры.
Допустим, в основной конфигурации есть общий модуль «ОстаткиТоваров», а в нем – экспортная процедура ПолучитьОстаткиТоваров(). В коде конфигурации данная процедура будет вызываться как ОстаткиТоваров.ПолучитьОстаткиТоваров(). При ее вызове будет выполнен код, который указан в соответствующей процедуре.
Если подключить расширение, заимствовать процедуру общего модуля и указать аннотацию &Вместо(“ПолучитьОстаткиТоваров”), то при вызове ОстаткиТоваров.ПолучитьОстаткиТоваров() будет выполнен только код процедуры из расширения.
Выполнить следом код первоначальной заменяемой процедуры возможно лишь с помощью метода ПродолжитьВызов() (Рисунок 1).
Рисунок 1 – Хронология выполнения функций
Разработка расширений и технологии доработки конфигураций 1С без снятия с поддержки.
Здравствуйте. Возник такой вопрос. Обратил внимание, что в расширениях при переопределении процедур и функций не указываются директивы компиляции. Если необходимо переопределить процедуру или функцию таким образом: была &НаСервере, стала &НаСеревереБезКонтекста? Как поступать в таком случае?
Добрый день!
При помощи расширений так сделать не получится.
Всем доброго дня! 3 разных метода применения. Непонятно использование метода ПродолжитьВызов()
&Вместо(“СформироватьДвиженияСторноНаСервере”)
Процедура Расш1_СформироватьДвиженияСторноНаСервере()
// … наш код… // это типа &Перед?
ПродолжитьВызов();
КонецПроцедуры
&Вместо(“СформироватьДвиженияСторноНаСервере”)
Процедура Расш1_СформироватьДвиженияСторноНаСервере()
ПродолжитьВызов();
// … наш код… // это типа &После?
КонецПроцедуры
&Вместо(“СформироватьДвиженияСторноНаСервере”)
Процедура Расш1_СформироватьДвиженияСторноНаСервере()
// … наш код… // это типа &Вместо?
КонецПроцедуры
так?
С уважением, Юрий
Добрый день!
Да, примеры Вы привели верно.
Смысл получается такой же, как и в случае использования аннотаций Перед и После.
Причем Ваши доработки могут находиться в одной процедуре расширения, а не разнесены в разных процедурах расширения (отдельно обработчик Перед, отдельно – После):
Процедура Расш1_СформироватьДвиженияСторноНаСервере()
// … наш код… // аналог &Перед
ПродолжитьВызов();
// … наш код… // аналог &После
КонецПроцедуры
Это может оказаться удобнее с точки зрения анализа доработки, выполненной при помощи расширения.
Конструкция не работает почти нигде где есть СКД. Вина тут наверно не метода а глюкавой 1С – ной СКД. Почему – то при вызове метода ПродолжитьВызов в СКД теряются все наборы данных! Хотя вроде контекст возвращается в типовое русло, непонятно. Кто знает в чем глюк?
Добрый день!
В таком случае лучше написать разработчикам платформы, чтобы они могли диагностировать проблему и при необходимости внести изменения в платформу.
Подскажите, пожалуйста, а не является ли конструкция описанная в этом материале (&Вместо – ПродолжитьВызов()), аналогом аннотации &Перед?
Добрый день!
Не совсем.
Дело в том, что для функций нельзя использовать аннотации Перед и После, а для процедур – можно. Поэтому чтобы существовала возможность не просто полностью переопределить функцию, а выполнить еще и исходный код из основной конфигурации, в платформе реализован метод ПродолжитьВызов.
Метод ПродолжитьВызов содержит те же параметры, что и метод основной конфигурации, т.е. происходит вызов функции из основной конфигурации с фактическими значениями параметров, которые могли быть изменены в расширении.
При использовании аннотацию Вместо не происходит “потеря контекста” между частями “до” и “после”. То есть все объявленные переменные и их значения сохранятся после исполнения ПродолжитьВызов.
Благодарю за разъяснения!