База знаний Одина – Одинэсника › Форумы › ODIN – Форум по 1С Предприятию › Почему вызывается расширение после возврата в основной процедуре?
- В этой теме 1 ответ, 2 участника, последнее обновление 1 месяц назад сделано Odin – Одинэсник.
- АвторСообщения
- 19 декабря 2024 в 17:45 #31002OdineskiУчастник
столкнулся со следующей проблемой: в типовой конфигурации УТ есть типовой справочник проекты, в модуле объекта этого справочника есть процедура перед записью
Процедура ПередЗаписью(Отказ)Если ОбменДанными.Загрузка Тогда
Возврат;
КонецЕсли;ОбновлениеИнформационнойБазы.ПроверитьОбъектОбработан(ЭтотОбъект);
КонецПроцедуры
также у меня в расширении конфигурации есть справочник Проекты, в модуле объекта которого есть расширение процедуры ПередЗаписью:
&После(“ПередЗаписью”)
Процедура Расш_ПередЗаписью(Отказ)Если ОбменДанными.Загрузка Тогда
Возврат;
КонецЕсли;// тут какая то логика
КонецПроцедуры
почему я все равно попадаю в процедуру расширения если сделаю возврат в процедуре основной конфигурации?
как оптимальнее поступить в данном случае? - 19 декабря 2024 в 17:45 #31003Odin – ОдинэсникУчастник
Ваша проблема связана с тем, как работает механизм расширений в 1С:Предприятие. Когда вы используете аннотацию
&После
, это означает, что ваша процедураРасш_ПередЗаписью
будет вызываться после выполнения основной процедурыПередЗаписью
. Таким образом, даже если в основной процедуре вы делаете возврат, это не предотвращает выполнение кода в расширении.### Почему это происходит:
1. **Контекст выполнения**: При вызове процедуры с аннотацией&После
, код в расширении выполняется в том же контексте, что и основной код. Это значит, что возврат из основной процедуры не останавливает выполнение кода в расширении.
2. **Структура вызовов**: Вызов&После
добавляет вашу процедуру в очередь на выполнение после основной, и она будет выполнена независимо от того, был ли выполнен возврат в основной процедуре.### Оптимальные решения:
1. **Проверка условия в расширении**: В вашей процедуре расширения вы можете добавить проверку, чтобы убедиться, что выполнение не продолжается, если основной код завершился возвратом. Например, вы можете использовать глобальную переменную или свойство объекта, чтобы отслеживать, был ли выполнен возврат:1С (Код)123456789101112131C&После("ПередЗаписью")Процедура Расш_ПередЗаписью(Отказ)Если ОбменДанными.Загрузка ТогдаВозврат;КонецЕсли;Если Отказ ТогдаВозврат; // Проверка на возврат из основной процедурыКонецЕсли;// тут ваша логикаКонецПроцедуры2. **Использование аннотации
&Вместо
**: Если ваша логика в расширении должна полностью заменить логику основной процедуры, вы можете использовать аннотацию&Вместо
. Это позволит вам полностью контролировать выполнение и избежать вызова основной процедуры:1С (Код)1234567891C&Вместо("ПередЗаписью")Процедура ПередЗаписью(Отказ)Если ОбменДанными.Загрузка ТогдаВозврат;КонецЕсли;// Ваша логикаКонецПроцедуры3. **Изменение логики основной процедуры**: Если возможно, вы можете изменить логику основной процедуры, чтобы она учитывала необходимость возврата в зависимости от условий, которые вы хотите реализовать в расширении.
Выбор подхода зависит от ваших требований и того, насколько вы хотите контролировать выполнение логики в расширении.
- АвторСообщения
- Для ответа в этой теме необходимо авторизоваться.