При попытке снять пометку на удаление документа пользователи и администраторы 1С могут столкнуться с ошибкой выполнения обработчика событий: Ошибка при вызове метода контекста (Записать) по причине: В данной транзакции уже происходили ошибки!. Ситуация осложняется тем, что типовые механизмы программы не дают сохранить изменения, а стандартное сообщение не указывает на конкретное поле или причину сбоя. Проанализируем природу этой ошибки и подробно разберем практические способы ее локализации и исправления.
Сообщение платформы «В данной транзакции уже происходили ошибки!» не является первопричиной проблемы. В платформе 1С:Предприятие любая запись документа выполняется в единой неделимой транзакции базы данных. Если внутри обработчиков событий (ПередЗаписью, ПриЗаписи, подписках на события или движениях регистров) происходит любое необработанное исключение, транзакция помечается как аварийная (невалидная).
Если после возникновения первоначального сбоя алгоритм конфигурации пытается выполнить дополнительную операцию записи (например, зафиксировать служебные сведения, зарегистрировать изменения для обмена или записать данные в регистр сведений внутри конструкции Попытка ... Исключение), платформа немедленно прерывает выполнение и возвращает указанную ошибку. Выясним причину первичного сбоя и рассмотрим по шагам методы восстановления работоспособности.
Если конфигурация типовая и необходимо оперативно снять пометку на удаление без изменения кода конфигурации, наиболее эффективным методом является программная запись объекта с установленным флагом ОбменДанными.Загрузка = Истина. В этом режиме платформа отключает выполнение большинства прикладных проверок, встроенных обработчиков событий и механизмов контроля ссылочной целостности при записи.
Для выполнения этой операции используем внешнюю обработку или обработку «Групповое изменение реквизитов» с возможностью выполнения произвольного алгоритма. Разберем пример программного кода для снятия пометки на удаление:
ДокументОбъект = СсылкаНаДокумент.ПолучитьОбъект();
ДокументОбъект.ОбменДанными.Загрузка = Истина;
ДокументОбъект.ПометкаУдаления = Ложь;
ДокументОбъект.Записать(РежимЗаписиДокумента.Запись);
Рассмотрим, что происходит при выполнении данного кода: свойство ОбменДанными.Загрузка переводит объект в режим прямой записи в базу данных. В результате обработчики событий модуля документа и общих модулей пропускают сложные проверки, что позволяет успешно убрать пометку на удаление даже у проблемного документа.
Если документ необходимо не просто записать, но и провести, либо требуется устранить корень проблемы в базе, разберем детальные шаги диагностики:
Откроем Журнал регистрации в режиме «1С:Предприятие» и установим отбор по времени возникновения сбоя. В фильтре событий выберем важность «Ошибка» и «Предупреждение». Первичное исключение, сломавшее транзакцию, фиксируется в журнале за несколько миллисекунд до появления сообщения об ошибке метода Записать.
В режиме «Конфигуратор» откроем меню Отладка → Остановка по ошибке. Установим флаг «Останавливаться по ошибке» и включим переключатель для перехвата обрабатываемых исключений. Повторим попытку снятия пометки на удаление. Отладчик остановит исполнение кода на той строке, где произошел самый первый сбой до аварийного завершения транзакции.
Проанализируем распространенные прикладные факторы, которые вызывают скрытый откат транзакции при изменении статуса документа:
Если в документе не заполнена организация, дата, подразделение или договор контрагента, внутренние проверки конфигурации прерывают запись. Проверим значения всех реквизитов документа через стандартную групповую обработку или форму документа.
При снятии пометки на удаление документ проверяет возможность редактирования периода. Если дата документа попадает в закрытый период, транзакция отменяется. Для проверки временно сдвинем общую или персональную дату запрета изменения данных в прошлое.
При изменении признака ПометкаУдаления система пытается зарегистрировать изменения в узлах планов обмена через объект ПланыОбмена. При повреждении таблиц регистрации изменений транзакция аварийно завершается. Проверим и очистим очередь регистрации изменений для данного документа с помощью специализированных обработок.
Если документ входит в границы последовательности (например, партионного учета или взаиморасчетов), при снятии пометки система пытается переместить границы последовательностей. При нарушении целостности таблиц последовательностей необходимо выполнить их пересчет и восстановление.
Если в базе активен механизм ограничения доступа на уровне записей, у текущего пользователя может не хватать прав на чтение или модификацию связанных реквизитов (например, закрытого склада или группы контрагентов). Повторим операцию под учетной записью с полными административными правами.
Нередко сбой вызывается повреждением локального кэша метаданных платформы. Очистим временные папки платформы 1Cv8 в каталогах %AppData% и %LocalAppData% или удалим информационную базу из списка запуска и добавим ее повторно.