Справочник системных ошибок и решений

Windows Server, Active Directory, 1С:Предприятие, СУБД, Linux, Cisco, MikroTik, Asterisk.

⚠️ Важная информация Все материалы, инструкции, команды и скрипты на сайте предоставлены исключительно в ознакомительных целях. Их применение может повлиять на работу операционной системы, программного обеспечения, баз данных, сетевого оборудования и других компонентов инфраструктуры. Перед выполнением действий создайте резервную копию и по возможности протестируйте изменения в безопасной среде. Пользователь самостоятельно оценивает риски и несет ответственность за результат. При отсутствии необходимых знаний обратитесь к квалифицированному ИТ-специалисту.

1C_EVENT_SUBSCRIPTION_LOOP 1С:Предприятие и СУБД

Зацикливание подписки на событие при записи объекта в 1С

Обновлено: 25.08.2026 · Официальная документация ↗
  • Длительное зависание сеанса 1С при попытке проведения или сохранения любого документа.
  • Ошибка Превышен лимит времени ожидания блокировки или переполнение стека вызовов.
  • Многократное дублирование записей в зависимых регистрах сведений.
  • В технологическом журнале фиксируется каскадный запуск одних и тех же событий ПодпискаНаСобытие.*.ПриЗаписи.

1. Предотвращение повторной записи через ДополнительныеСвойства

Добавьте проверку флага блокировки выполнения в процедуру обработчика подписки:

Процедура ОбработкаПодпискиПриЗаписи(Источник, Отказ)
    
    // Проверяем, выполняется ли уже процедура для этого объекта
    Если Источник.ДополнительныеСвойства.Свойство("СинхронизацияВыполняется") Тогда
        Возврат;
    КонецЕсли;
    
    // Устанавливаем флаг перед модификацией связанных данных
    Источник.ДополнительныеСвойства.Вставить("СинхронизацияВыполняется", Истина);
    
    // Пример модификации связанного объекта
    СвязанныйОбъект = Источник.СвязанныйДокумент.ПолучитьОбъект();
    Если СвязанныйОбъект <> Неопределено Тогда
        СвязанныйОбъект.ДополнительныеСвойства.Вставить("СинхронизацияВыполняется", Истина);
        СвязанныйОбъект.Комментарий = "Обновлено автоматически: " + Строка(ТекущаяДатаСеанса());
        СвязанныйОбъект.Записать();
    КонецЕсли;
    
КонецПроцедуры

2. Разделение бизнес-логики и транзакций записи

Никогда не вызывайте метод Источник.Записать() внутри подписки на событие, объектом источника которой является сам этот экземпляр — он будет автоматически сохранен платформой в текущей транзакции.

💡 Практика специалистов: Если требуется обновить реквизит самого записываемого объекта, делайте это в событии ПередЗаписью прямым присвоением полей без вызова метода Записать().

Частые вопросы (FAQ)

Почему нельзя вызывать Записать() для объекта Источник в событии ПриЗаписи?

Объект Источник уже находится в процессе фиксации транзакции записи. Повторный вызов Записать() инициирует новую транзакцию и повторный вызов всех зарегистрированных подписок, создавая бесконечный цикл.

Сохраняются ли ДополнительныеСвойства объекта между разными подписками?

Да, ДополнительныеСвойства живут на протяжении всего жизненного цикла экземпляра объекта в памяти сервера до завершения транзакции.

Как определить, какая именно подписка вызвала зацикливание?

Используйте замер производительности в конфигураторе или настройте сбор технологического журнала с фильтром по событию CALL и свойству MethodName.

Влияет ли порядок подписок в дереве метаданных на последовательность их вызова?

Платформа 1С не гарантирует строгий порядок выполнения подписок на одно и то же событие. Логика кода не должна зависеть от их взаимного расположения.

Полезные материалы
Рекомендуем