Как исправить ошибку «В данной транзакции уже происходили ошибки» при перепроведении документов в 1С:Бухгалтерии?

Программист 1С v8.3 (Управляемые формы) 1C:Бухгалтерия Бухгалтерский учет IT и автоматизация бизнеса
← На главную

При выполнении процедуры закрытия месяца или группового перепроведения документов в 1С:Предприятии 8.3 пользователи и программисты нередко сталкиваются с системным сбоем следующего вида:

{Обработка.ГрупповоеПерепроведениеДокументов.МодульМенеджера(1958)}: Ошибка при вызове метода контекста (Записать): В данной транзакции уже происходили ошибки!

При этом ручное перепроведение того же самого документа проходит абсолютно без ошибок. Проанализируем физическую природу этого поведения платформы 1С и разберем пошаговые методы локализации и устранения первопричины сбоя.

Почему возникает ошибка «В данной транзакции уже происходили ошибки»

Для понимания сути проблемы рассмотрим механизм работы транзакций в платформе 1С:Предприятие. В СУБД (MS SQL Server, PostgreSQL, Oracle) транзакция всегда монолитна и едина для сеанса. Механизм вложенных транзакций в 1С является логическим: реальная транзакция на стороне сервера базы данных открывается только один раз при самом первом вызове метода НачатьТранзакцию().

Если внутри открытой транзакции происходит любая критическая ошибка СУБД (конфликт блокировок, нарушение уникальности индекса, ошибка контроля остатков или сбой триггера), транзакция СУБД безвозвратно помечается как аварийная (концепция «обреченной транзакции» — Doomed Transaction).

Даже если разработчик перехватил эту первоначальную ошибку программно с помощью конструкции Попытка ... Исключение, дальнейшая работа с базой данных внутри текущей транзакции полностью блокируется платформой. Любое следующее действие — будь то запись документа, изменение регистра или фиксация транзакции вызовом ЗафиксироватьТранзакцию() — немедленно вызовет платформенное исключение «В данной транзакции уже происходили ошибки!».

Таким образом, документ и строка кода, указанные в тексте ошибки, являются лишь местом, где транзакция попыталась продолжить работу после ранее произошедшего сбоя, а не истинной причиной проблемы.

Способ 1. Поиск исходной ошибки через отладчик в Конфигураторе

Поскольку исходное исключение было перехвачено и скрыто внутри блока Попытка ... Исключение, настроим отладчик на остановку до момента перехвата ошибки.

  1. Откроем базу в режиме Конфигуратора.
  2. В главном меню перейдем в раздел Отладка → Остановка по ошибке.
  3. В открывшемся окне установим флаг Останавливаться по ошибке и выберем вариант реакции платформы на ошибки (без фильтрации по тексту).
  4. Запустим сеанс «1С:Предприятие» в режиме отладки и повторим операцию закрытия месяца или группового перепроведения.

Отладчик остановит исполнение кода ровно в том месте, где произошел первоначальный сбой. Это позволит увидеть реальный текст ошибки — например, отсутствие остатка по конкретной номенклатуре, деление на ноль в расчете себестоимости или попытку записи в заблокированный регистр.

Способ 2. Локализация сбоя с помощью Технологического журнала

Если воспроизвести ошибку в режиме отладки невозможно (например, на рабочей многопользовательской базе), настроим сбор Технологического журнала (ТЖ).

Создадим или дополним файл конфигурации logcfg.xml в каталоге настроек платформы (например, C:\Program Files\1cv8\conf\logcfg.xml), настроив перехват событий EXCP и EXCPCNTX:


<config xmlns="http://v8.1c.ru/v8/tech-log">
    <log location="C:\Logs\1C_Exceptions" history="4">
        <event>
            <eq property="name" value="EXCP"/>
        </event>
        <event>
            <eq property="name" value="EXCPCNTX"/>
        </event>
        <property name="all"/>
    </log>
</config>

В полученном журнале событий найдем запись исключения, которая предшествует сообщению о сломанной транзакции. В ней будет содержаться полный контекст сценарного вызова и детализированный текст ошибки СУБД.

Способ 3. Проверка корректности модулей после обновления конфигурации

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

Разберем порядок восстановления типовых модулей:

  1. Откроем информационную базу в режиме Конфигуратора.
  2. Перейдем в меню Конфигурация → Сравнить, объединить с конфигурацией из файла и выберем файл типовой конфигурации .cf того же релиза.
  3. Снимем флаги со всех объектов и выделим только служебные обработки (Обработка.ГрупповоеПерепроведениеДокументов, модули закрытия месяца) и модули перепроводимых документов (например, Документ.РеализацияТоваровУслуг).
  4. Установим режим объединения Взять из файла и выполним обновление конфигурации базы данных.

Способ 4. Уменьшение размера порции транзакции

По умолчанию типовые механизмы группового проведения объединяют обработку документов в пакеты (порции по 10–100 документов в одной транзакции) для ускорения записи. Если один документ в пакете падает, откат затрагивает все остальные документы порции.

Для гарантированного проведения валидных документов используем стандартную обработку «Групповое перепроведение документов» (раздел Администрирование → Обслуживание → Корректировка данных):

  1. Установим флаг Останавливать по ошибке или зададим размер пакета транзакции, равный 1 документу.
  2. Запустим процесс проведения заново.

При таком подходе каждый документ обрабатывается в собственной изолированной транзакции: все корректные документы успешно проведутся, а сбойный документ будет точно определен и выведен в итоговый протокол с реальным описанием проблемы.

Способ 5. Блокировка фоновых заданий и очистка кэша

Параллельная работа регламентных заданий (таких как обмен с банком, фоновое закрытие месяца, синхронизация с внешними базами или сервисами ЭДО) может приводить к неявным взаимоблокировкам таблиц прямо в момент пакетного проведения.

Перед запуском закрытия месяца выполним следующие профилактические действия:

  1. Установим блокировку регламентных заданий в консоли администрирования кластера серверов 1С или через раздел Администрирование → Обслуживание → Блокировка работы пользователей.
  2. Выполним очистку серверного кэша метаданных (остановка службы ragent, удаление содержимого каталога snccntx).
  3. Запустим операцию Тестирование и исправление информационной базы в Конфигураторе с обязательным пересчетом итогов и проверкой логической целостности.
← На главную