К статье
Практический материал

Администрирование · 11 мин

Ошибка транзакции в 1С: причины и способы устранения

Разбираем, что означает ошибка транзакции в 1С, почему возникает конфликт блокировок и взаимоблокировка, как найти причину и устранить проблему без потери данных.

Ошибка транзакции в 1С — это сообщение о том, что платформа не смогла завершить набор операций с базой данных как единое целое. Транзакция в 1С объединяет несколько изменений (запись документа, движения по регистрам, пересчёт итогов) в неделимый блок: либо выполняется всё, либо откатывается всё. Когда что-то мешает завершению — блокировка другого пользователя, разрыв соединения, нарушение целостности данных — платформа отменяет операцию и выводит ошибку.

Типичные формулировки, с которыми сталкиваются пользователи: «Конфликт блокировок при выполнении транзакции», «Ошибка при выполнении обработчика», «В данной транзакции уже происходили ошибки», «Превышено время ожидания блокировки». Все они указывают на разные сценарии одной проблемы: система защищает данные от противоречивого состояния и откатывает операцию.

Важно понимать: сама по себе ошибка транзакции — это не сбой, а защитная реакция. Данные при этом не портятся: база возвращается в состояние до начала операции. Однако если ошибки повторяются регулярно, это сигнал о проблемах в настройках, коде или инфраструктуре, которые нужно найти и устранить.

Что такое транзакция и почему она прерывается

Транзакция — это механизм гарантии целостности. Когда пользователь проводит документ, 1С последовательно записывает сам документ, движения по регистрам накопления и бухгалтерии, пересчитывает итоги. Если любой из шагов завершится неудачно, все предыдущие изменения отменяются — иначе в базе появились бы «висящие» движения без документа или расхождения между регистрами.

Прерывание происходит в нескольких ситуациях. Первая — невозможность установить блокировку: другой сеанс уже удерживает нужные данные и не отпускает их в отведённое время. Вторая — ошибка внутри кода: исключение в обработчике, нарушение уникальности индекса, деление на ноль. Третья — внешние факторы: обрыв сети, перезапуск сервера СУБД, нехватка места на диске или в tempdb.

Основные виды ошибок транзакций и их причины

Разные формулировки ошибок указывают на разные источники проблемы. Умение «прочитать» сообщение — половина диагностики.

Конфликт блокировок и превышение времени ожидания

Самый частый сценарий. Один пользователь проводит крупный документ или запускается массовая обработка, а второй в это время пытается изменить те же данные. Если ожидание превышает установленный таймаут, платформа выдаёт «Конфликт блокировок при выполнении транзакции» или «Превышено время ожидания предоставления блокировки».

Взаимоблокировка (deadlock)

Возникает, когда сеанс А удерживает ресурс 1 и ждёт ресурс 2, а сеанс Б удерживает ресурс 2 и ждёт ресурс 1. СУБД сама выбирает «жертву» и откатывает одну из транзакций. В сообщении обычно фигурирует слово deadlock или «взаимоблокировка». Это признак проблем в логике кода или в порядке обращения к объектам.

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

Это вторичная ошибка: сначала внутри транзакции случилось исключение (например, в обработчике проведения), а при попытке продолжить работу платформа сообщает, что транзакция уже «испорчена». Диагностировать нужно первичное исключение — оно видно в журнале регистрации или в полном тексте ошибки.

Конфликт блокировокДанные заняты другим сеансом

Кто работает с теми же документами; активные фоновые задания

ВзаимоблокировкаДва сеанса ждут друг друга

Технологический журнал, события TDEADLOCK

Ошибки в транзакцииИсключение в коде обработчика

Журнал регистрации, полный стек ошибки

Разрыв соединенияПотеря связи с сервером

Стабильность сети, логи сервера СУБД

Как найти источник проблемы

Диагностику начинайте с воспроизводимости: ошибка возникает у всех пользователей или у одного, постоянно или периодически, при конкретном действии или в случайные моменты. Массовая ошибка у всех пользователей чаще указывает на серверную проблему, единичная — на конфликт с конкретным сеансом или данные конкретного документа.

Основные инструменты диагностики:

  • Журнал регистрации (в режиме 1С:Предприятие или через конфигуратор) — показывает, какое действие выполнял пользователь и какое исключение произошло.
  • Технологический журнал — настраивается на сервере 1С и фиксирует события блокировок (TLOCK, TTIMEOUT, TDEADLOCK) с указанием сеансов и объектов.
  • Консоль кластера серверов 1С — список активных сеансов и соединений; помогает найти «зависший» сеанс, который удерживает блокировку.
  • Средства СУБД — для MS SQL Server это Activity Monitor и отчёты по блокировкам, для PostgreSQL — представление pg_locks и pg_stat_activity.
Порядок диагностики
  1. 1
    Зафиксируйте точный текст ошибки, время и действие пользователя
  2. 2
    Откройте журнал регистрации и найдите событие с ошибкой за это время
  3. 3
    Проверьте список активных сеансов и фоновых заданий в консоли кластера
  4. 4
    При повторяющихся блокировках включите технологический журнал с событиями TLOCK и TDEADLOCK
  5. 5
    Определите объекты данных, участвующие в конфликте, и сеансы-участники
  6. 6
    Устраните источник: завершите зависший сеанс, скорректируйте расписание заданий или код

Как устранить конфликты блокировок

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

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

Технические меры: перевести регистры нагруженных документов в режим разделения итогов, включить управляемые блокировки там, где это оправдано, сократить время транзакций в коде (не выполнять внутри транзакции обращения к пользователю, длительные расчёты и внешние вызовы). В типовых конфигурациях часть этих настроек уже применена — стоит проверить, не отключены ли они при доработках.

Маршрут решения

Как выбрать действие

Ошибка возникла один раз у одного пользователяПовторите операцию через несколько минут; специальных действий не требуется
Ошибки массовые и одновременныеПроверяйте сервер: состояние СУБД, место на диске, зависшие сеансы
Конфликты повторяются в одно и то же времяПроверьте расписание регламентных заданий и обменов — разведите нагрузку по времени
В журнале видны взаимоблокировкиПривлекайте разработчика: нужен анализ порядка обращения к данным в коде

Ошибки из-за кода и доработок

Если ошибка транзакции появилась после обновления конфигурации или установки расширения, вероятна проблема в коде. Типичные причины: исключение в обработчике проведения, попытка записи объекта, который уже изменён другим сеансом («Объект не может быть записан» из-за конфликта версий), обращение к данным, заблокированным в той же транзакции в другом порядке.

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

Типичные ошибки
01
Игнорировать повторяющиеся конфликты блокировок как «норму» — со временем они приводят к срыву регламентных операций и потере рабочего времени пользователей
02
Принудительно завершать сеансы и перезапускать сервер без анализа — симптом исчезает, причина остаётся
03
Выполнять тестирование и исправление базы при каждой ошибке транзакции — это длительная операция, которая оправдана только при реальном повреждении данных
04
Размещать внутри транзакции запросы к пользователю или внешние вызовы — время блокировки растёт, конфликты множатся

Когда проблема на стороне сервера и СУБД

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

Признаки серверной природы: ошибки возникают у разных пользователей одновременно, не связаны с конкретными документами, сопровождаются разрывами соединения. В этом случае проверяйте журналы операционной системы и СУБД, свободное место на всех томах (включая диск с tempdb и журналами), состояние сетевого оборудования. Исключите каталоги баз и журналов из сканирования антивируса — это стандартная рекомендация для серверов СУБД.

Профилактика: как снизить число ошибок транзакций

Полностью исключить конфликты блокировок в многопользовательской системе невозможно — это плата за целостность данных. Но их частоту можно существенно снизить. Регулярно обновляйте платформу и конфигурацию: в новых версиях оптимизируются механизмы блокировок. Следите за расписанием регламентных заданий и не допускайте их наложения на пиковую нагрузку.

Поддерживайте инфраструктуру: мониторинг свободного места, плановое обслуживание СУБД (обновление статистики, перестроение индексов — средствами СУБД по регламенту), резервное копирование перед любыми массовыми обработками. Для файловых баз с несколькими пользователями при росте нагрузки рассмотрите переход на клиент-серверный вариант — он устойчивее к конфликтам и сбоям.

Контрольные точки

Как проверить результат

Повторение операции после устранения причины
Норма

Документ проводится без ошибок, движения корректны

Тревожный признак

Ошибка воспроизводится — причина не устранена

Журнал регистрации за рабочий день
Норма

Единичные конфликты блокировок или их отсутствие

Тревожный признак

Регулярные ошибки транзакций у разных пользователей

Регламентные задания
Норма

Выполняются по расписанию без ошибок

Тревожный признак

Задания падают с конфликтами блокировок

Сохраняйте полный текст ошибки и время её возникновения до того, как закроете сообщение. По одной фразе «ошибка транзакции» диагностика занимает часы, а по точному тексту и времени причина часто находится в журнале регистрации за минуты.
ПЗ
Практическое замечание

Частые вопросы

Ошибка транзакции — это потеря данных?

Нет. Смысл транзакции именно в защите данных: при ошибке все изменения откатываются, и база остаётся в согласованном состоянии. Теряются только несохранённые действия текущей операции — их нужно выполнить заново.

Что делать пользователю прямо сейчас при конфликте блокировок?

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

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

Потому что это следствие, а не причина. Первичное исключение произошло раньше внутри той же транзакции. Его текст ищите в журнале регистрации по времени события или в полном описании ошибки (кнопка «Подробно» в окне сообщения).

Поможет ли тестирование и исправление базы?

Только если ошибка вызвана физическим повреждением данных, что бывает редко и обычно сопровождается другими симптомами (сбои при чтении таблиц, ошибки СУБД). При конфликтах блокировок и ошибках кода тестирование и исправление бесполезно.

Можно ли отключить блокировки, чтобы ошибок не было?

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

Ошибки начались после обновления конфигурации. Что проверить?

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

Итог

Что важно запомнить

Ошибка транзакции — это защитный откат незавершённых операций, а не порча данных. Чаще всего виноваты конфликты блокировок, реже — код доработок или проблемы сервера. Диагностика строится на точном тексте ошибки, журнале регистрации и анализе активных сеансов; профилактика — на грамотном расписании тяжёлых операций и здоровой инфраструктуре.