[ Вопрос дня ] Зачем нужен метод “ПродолжитьВызов()” в расширениях?

Бывает, что у слушателя, прошедшего обучение, остаются вопросы. В этом случае тренер еще раз разъясняет материал в Мастер-группе, акцентирует внимание на деталях, приводит примеры.

Ниже мы публикуем ответ тренера на вопрос о назначении метода ПродолжитьВызов() и прикладываем слайд из методических материалов курса Разработка расширений и технологии доработки конфигураций 1С без снятия с поддержки.

Вопрос

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

Ответ тренера

Если в расширении используется аннотация &Вместо(), то никаким другим образом, кроме метода ПродолжитьВызов(), нельзя вызвать код заменяемой процедуры.

Допустим, в основной конфигурации есть общий модуль «ОстаткиТоваров», а в нем – экспортная процедура ПолучитьОстаткиТоваров(). В коде конфигурации данная процедура будет вызываться как ОстаткиТоваров.ПолучитьОстаткиТоваров(). При ее вызове будет выполнен код, который указан в соответствующей процедуре.

Если подключить расширение, заимствовать процедуру общего модуля и указать аннотацию &Вместо(“ПолучитьОстаткиТоваров”), то при вызове ОстаткиТоваров.ПолучитьОстаткиТоваров() будет выполнен только код процедуры из расширения.

Выполнить следом код первоначальной заменяемой процедуры возможно лишь с помощью метода ПродолжитьВызов() (Рисунок 1).

Рисунок 1 – Хронология выполнения функций

Комментарии / обсуждение (9):

  1. Сергей

    Здравствуйте. Возник такой вопрос. Обратил внимание, что в расширениях при переопределении процедур и функций не указываются директивы компиляции. Если необходимо переопределить процедуру или функцию таким образом: была &НаСервере, стала &НаСеревереБезКонтекста? Как поступать в таком случае?

  2. Юрий

    Всем доброго дня! 3 разных метода применения. Непонятно использование метода ПродолжитьВызов()

    &Вместо(“СформироватьДвиженияСторноНаСервере”)
    Процедура Расш1_СформироватьДвиженияСторноНаСервере()
    // … наш код… // это типа &Перед?
    ПродолжитьВызов();
    КонецПроцедуры

    &Вместо(“СформироватьДвиженияСторноНаСервере”)
    Процедура Расш1_СформироватьДвиженияСторноНаСервере()
    ПродолжитьВызов();
    // … наш код… // это типа &После?
    КонецПроцедуры

    &Вместо(“СформироватьДвиженияСторноНаСервере”)
    Процедура Расш1_СформироватьДвиженияСторноНаСервере()
    // … наш код… // это типа &Вместо?
    КонецПроцедуры

    так?

    С уважением, Юрий

    • Василий Ханевич

      Добрый день!
      Да, примеры Вы привели верно.
      Смысл получается такой же, как и в случае использования аннотаций Перед и После.
      Причем Ваши доработки могут находиться в одной процедуре расширения, а не разнесены в разных процедурах расширения (отдельно обработчик Перед, отдельно – После):

      &Вместо("СформироватьДвиженияСторноНаСервере")
      Процедура Расш1_СформироватьДвиженияСторноНаСервере()
      // … наш код… // аналог &Перед
      ПродолжитьВызов();
      // … наш код… // аналог &После
      КонецПроцедуры

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

  3. РоМАН

    Конструкция не работает почти нигде где есть СКД. Вина тут наверно не метода а глюкавой 1С – ной СКД. Почему – то при вызове метода ПродолжитьВызов в СКД теряются все наборы данных! Хотя вроде контекст возвращается в типовое русло, непонятно. Кто знает в чем глюк?

    • Василий Ханевич

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

  4. Игорь

    Подскажите, пожалуйста, а не является ли конструкция описанная в этом материале (&Вместо – ПродолжитьВызов()), аналогом аннотации &Перед?

    • Василий Ханевич

      Добрый день!
      Не совсем.
      Дело в том, что для функций нельзя использовать аннотации Перед и После, а для процедур – можно. Поэтому чтобы существовала возможность не просто полностью переопределить функцию, а выполнить еще и исходный код из основной конфигурации, в платформе реализован метод ПродолжитьВызов.
      Метод ПродолжитьВызов содержит те же параметры, что и метод основной конфигурации, т.е. происходит вызов функции из основной конфигурации с фактическими значениями параметров, которые могли быть изменены в расширении.
      При использовании аннотацию Вместо не происходит “потеря контекста” между частями “до” и “после”. То есть все объявленные переменные и их значения сохранятся после исполнения ПродолжитьВызов.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Вход на сайт

Зарегистрироваться

Подтверждение регистрации будет отправлено на указанный e-mail.

Я подтверждаю, что ознакомлен(а) с Пользовательским соглашением, принимаю его условия и даю свое согласие на обработку моих персональных данных.

Восстановить доступ

E-mail или логин

Ссылка на создание нового пароля будет отправлена на указанный e-mail.