База знаний Одина – Одинэсника Форумы ODIN – Форум по 1С Предприятию Почему вызывается расширение после возврата в основной процедуре?

Просмотр 1 ветки ответов
  • Автор
    Сообщения
    • #31002
      Телеграм группа https://t.me/odineskiOdineski
      Участник

      столкнулся со следующей проблемой: в типовой конфигурации УТ есть типовой справочник проекты, в модуле объекта этого справочника есть процедура перед записью
      Процедура ПередЗаписью(Отказ)

      Если ОбменДанными.Загрузка Тогда
      Возврат;
      КонецЕсли;

      ОбновлениеИнформационнойБазы.ПроверитьОбъектОбработан(ЭтотОбъект);

      КонецПроцедуры
      также у меня в расширении конфигурации есть справочник Проекты, в модуле объекта которого есть расширение процедуры ПередЗаписью:
      &После(“ПередЗаписью”)
      Процедура Расш_ПередЗаписью(Отказ)

      Если ОбменДанными.Загрузка Тогда
      Возврат;
      КонецЕсли;

      // тут какая то логика

      КонецПроцедуры
      почему я все равно попадаю в процедуру расширения если сделаю возврат в процедуре основной конфигурации?
      как оптимальнее поступить в данном случае?

    • #31003

      Ваша проблема связана с тем, как работает механизм расширений в 1С:Предприятие. Когда вы используете аннотацию &После, это означает, что ваша процедура Расш_ПередЗаписью будет вызываться после выполнения основной процедуры ПередЗаписью. Таким образом, даже если в основной процедуре вы делаете возврат, это не предотвращает выполнение кода в расширении.

      ### Почему это происходит:
      1. **Контекст выполнения**: При вызове процедуры с аннотацией &После, код в расширении выполняется в том же контексте, что и основной код. Это значит, что возврат из основной процедуры не останавливает выполнение кода в расширении.
      2. **Структура вызовов**: Вызов &После добавляет вашу процедуру в очередь на выполнение после основной, и она будет выполнена независимо от того, был ли выполнен возврат в основной процедуре.

      ### Оптимальные решения:
      1. **Проверка условия в расширении**: В вашей процедуре расширения вы можете добавить проверку, чтобы убедиться, что выполнение не продолжается, если основной код завершился возвратом. Например, вы можете использовать глобальную переменную или свойство объекта, чтобы отслеживать, был ли выполнен возврат:

      2. **Использование аннотации &Вместо**: Если ваша логика в расширении должна полностью заменить логику основной процедуры, вы можете использовать аннотацию &Вместо. Это позволит вам полностью контролировать выполнение и избежать вызова основной процедуры:

      3. **Изменение логики основной процедуры**: Если возможно, вы можете изменить логику основной процедуры, чтобы она учитывала необходимость возврата в зависимости от условий, которые вы хотите реализовать в расширении.

      Выбор подхода зависит от ваших требований и того, насколько вы хотите контролировать выполнение логики в расширении.

Просмотр 1 ветки ответов
  • Для ответа в этой теме необходимо авторизоваться.