Ошибка при выполнении обработчика ПриЗаписи в 1С:Предприятие
- Ошибка
Ошибка при выполнении обработчика ПриЗаписипри сохранении документов или справочников. - Всплывающее системное сообщение:
Действие не может быть выполнено из-за несоответствия версии данных. - Сбои при регистрации изменений для планов обмена (РИБ) внутри обработчика.
- Ошибки дедлока СУБД на шаге фиксации данных объекта.
1. Особенности выполнения события ПриЗаписи
Обработчик ПриЗаписи в модуле объекта выполняется внутри транзакции записи сразу после того, как данные самого объекта уже записаны в таблицы СУБД, но транзакция еще не зафиксирована (не сделан COMMIT).
2. Безопасная работа с подчиненными регистрами и объектами
Не выполняйте внутри ПриЗаписи запись других независимых объектов без крайней необходимости, чтобы не провоцировать взаимоблокировки (Deadlocks):
Процедура ПриЗаписи(Отказ)
Если ЭтотОбъект.ОбменДанными.Загрузка Тогда
Возврат;
КонецЕсли;
Попытка
// Безопасная запись вспомогательного регистра сведений
МенеджерЗаписи = РегистрыСведений.ВерсииОбъектов.СоздатьМенеджерЗаписи();
МенеджерЗаписи.Объект = ЭтотОбъект.Ссылка;
МенеджерЗаписи.НомерВерсии = ЭтотОбъект.ВерсияДанных;
МенеджерЗаписи.Записать(Истина);
Исключение
Отказ = Истина;
ЗаписьЖурналаРегистрации("ОшибкаПриЗаписи", УровеньЖурналаРегистрации.Ошибка,,, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
КонецПопытки;
КонецПроцедуры3. Проверка регистрации изменений на планах обмена
Если в ПриЗаписи выполняется ручная регистрация изменений (ПланыОбмена.ЗарегистрироватьИзменения), убедитесь, что переданный узел обмена существует и не заблокирован.
Частые вопросы (FAQ)
В чем главное отличие обработчика ПередЗаписью от ПриЗаписи?
В ПередЗаписью данные еще не помещены в базу данных (у нового объекта еще нет реальной ссылки в таблицах СУБД). В ПриЗаписи объект уже имеет валидную ссылку и записан в СУБД, но транзакция еще открыта.
Что произойдет, если в процедуре ПриЗаписи установить Отказ = Истина?
Платформа инициирует полный откат транзакции (ROLLBACK): запись самого объекта и все изменения, сделанные в обработчике, будут удалены из базы данных.
Можно ли вызывать серверные HTTP-сервисы внутри события ПриЗаписи?
Крайне не рекомендуется. Внешний сетевой вызов задерживает фиксацию транзакции СУБД, удерживая эксклюзивные блокировки строк и вызывая тайм-ауты у других пользователей.
Почему в ПриЗаписи возникает ошибка 'Версия данных была изменена'?
Если внутри обработчика выполняется неявная повторная модификация и запись того же самого объекта, его версионный счетчик меняется, вызывая конфликт оптимистической блокировки.