Зацикливание подписки на событие при записи объекта в 1С
- Длительное зависание сеанса 1С при попытке проведения или сохранения любого документа.
- Ошибка
Превышен лимит времени ожидания блокировкиили переполнение стека вызовов. - Многократное дублирование записей в зависимых регистрах сведений.
- В технологическом журнале фиксируется каскадный запуск одних и тех же событий
ПодпискаНаСобытие.*.ПриЗаписи.
1. Предотвращение повторной записи через ДополнительныеСвойства
Добавьте проверку флага блокировки выполнения в процедуру обработчика подписки:
Процедура ОбработкаПодпискиПриЗаписи(Источник, Отказ)
// Проверяем, выполняется ли уже процедура для этого объекта
Если Источник.ДополнительныеСвойства.Свойство("СинхронизацияВыполняется") Тогда
Возврат;
КонецЕсли;
// Устанавливаем флаг перед модификацией связанных данных
Источник.ДополнительныеСвойства.Вставить("СинхронизацияВыполняется", Истина);
// Пример модификации связанного объекта
СвязанныйОбъект = Источник.СвязанныйДокумент.ПолучитьОбъект();
Если СвязанныйОбъект <> Неопределено Тогда
СвязанныйОбъект.ДополнительныеСвойства.Вставить("СинхронизацияВыполняется", Истина);
СвязанныйОбъект.Комментарий = "Обновлено автоматически: " + Строка(ТекущаяДатаСеанса());
СвязанныйОбъект.Записать();
КонецЕсли;
КонецПроцедуры2. Разделение бизнес-логики и транзакций записи
Никогда не вызывайте метод Источник.Записать() внутри подписки на событие, объектом источника которой является сам этот экземпляр — он будет автоматически сохранен платформой в текущей транзакции.
Частые вопросы (FAQ)
Почему нельзя вызывать Записать() для объекта Источник в событии ПриЗаписи?
Объект Источник уже находится в процессе фиксации транзакции записи. Повторный вызов Записать() инициирует новую транзакцию и повторный вызов всех зарегистрированных подписок, создавая бесконечный цикл.
Сохраняются ли ДополнительныеСвойства объекта между разными подписками?
Да, ДополнительныеСвойства живут на протяжении всего жизненного цикла экземпляра объекта в памяти сервера до завершения транзакции.
Как определить, какая именно подписка вызвала зацикливание?
Используйте замер производительности в конфигураторе или настройте сбор технологического журнала с фильтром по событию CALL и свойству MethodName.
Влияет ли порядок подписок в дереве метаданных на последовательность их вызова?
Платформа 1С не гарантирует строгий порядок выполнения подписок на одно и то же событие. Логика кода не должна зависеть от их взаимного расположения.