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

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

Что такое конфликт блокировок в 1С и как его устранить

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

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

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

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

Как работают блокировки в 1С

1С использует два уровня блокировок. Первый — объектные блокировки платформы: они защищают объекты (справочники, документы) от одновременного редактирования в пользовательском интерфейсе. Если один пользователь открыл элемент для редактирования, второй увидит сообщение о том, что объект заблокирован.

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

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

Типичные причины конфликтов

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

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

Ошибка у многих пользователей в одно времяКонкуренция или регламентное задание

Проверьте расписание обменов и фоновых заданий на момент ошибки

Ошибка только при проведении документовСпорные регистры и итоги

Какие регистры двигает документ, включено ли разделение итогов

Ошибка при обмене даннымиДлинные транзакции обмена

Размер пакетов обмена и длительность транзакции загрузки

Как диагностировать конфликт

Основной инструмент диагностики — технологический журнал (ТЖ) сервера 1С. Он фиксирует события блокировок: TLOCK (установка), TTIMEOUT (таймаут ожидания) и TDEADLOCK (взаимоблокировка). По этим событиям видно, какие сеансы, какие таблицы и какие запросы участвовали в конфликте.

Технологический журнал включается через файл настроек logcfg.xml в каталоге conf сервера 1С. Ниже пример минимальной конфигурации для сбора событий блокировок с контекстом запросов:

xml
<config xmlns="http://v8.1c.ru/v8/tech-log"><log location="C:\1c_logs" history="24"><event><eq property="name" value="TLOCK"/></event><event><eq property="name" value="TTIMEOUT"/></event><event><eq property="name" value="TDEADLOCK"/></event><property name="all"/></log></config>

После сбора логов события TDEADLOCK покажут пару процессов и тексты запросов, а TTIMEOUT — какой сеанс кого ждал. Дополнительно полезна консоль кластера: в списке сеансов видно, какие процессы активны долгое время, а в MS SQL Server — динамические представления sys.dm_tran_locks и sys.dm_os_waiting_tasks для просмотра текущих ожиданий.

Порядок диагностики конфликта блокировок
  1. 1
    Включите технологический журнал с событиями TLOCK, TTIMEOUT, TDEADLOCK на период воспроизведения ошибки
  2. 2
    Дождитесь повторения конфликта и зафиксируйте точное время из сообщения пользователя
  3. 3
    Найдите в ТЖ события за этот момент, определите сеансы-участники и тексты запросов
  4. 4
    Сопоставьте сеансы с пользователями или регламентными заданиями через консоль кластера
  5. 5
    Определите таблицу и индекс, на которых возникла блокировка, и найдите в конфигурации код, формирующий эти запросы

Способы устранения и профилактики

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

Далее — оптимизация конкретных мест, найденных через ТЖ:

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

Как выбрать действие при конфликте

Ошибка возникла один раз у одного пользователяПросто повторите операцию — это штатная ситуация при параллельной работе
Ошибки массовые и привязаны ко времениПроверьте расписание регламентных заданий и обменов, перенесите их на ночь
Конфликт на конкретном документе или регистреАнализируйте ТЖ и оптимизируйте код проведения и запросы к этому регистру
Конфигурация работает в автоматическом режиме блокировокПланируйте перевод на управляемый режим с тестированием на копии базы

Частые ошибки при борьбе с блокировками

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

Вторая ошибка — включение технологического журнала с полным сбором всех событий на постоянной основе. Объём логов растёт стремительно, диск переполняется, и производительность сервера падает — к конфликтам добавляется новая проблема. Настраивайте ТЖ точечно и ограничивайте историю хранения.

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

Как проверить, что проблема решена

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

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

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

События TDEADLOCK и TTIMEOUT в ТЖ
Норма

Единичные события без привязки ко времени и операции

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

Повторяющиеся события в одни часы на одних таблицах

Жалобы пользователей
Норма

Операции проходят с первого или второго раза

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

Пользователи вынуждены повторять проведение по несколько раз

Длительность транзакций регламентных заданий
Норма

Задания завершаются за предсказуемое время в нерабочие часы

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

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

Ограничения самостоятельной работы

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

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

Итог

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

Конфликт блокировок — следствие конкуренции транзакций за одни данные, а не случайный сбой. Диагностируйте через технологический журнал (TLOCK, TTIMEOUT, TDEADLOCK), устраняйте сокращением транзакций, настройкой расписаний, индексами и управляемым режимом блокировок. Разовые ошибки допустимы, регулярные требуют анализа и доработки.

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

Опасен ли конфликт блокировок для данных?

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

Почему конфликты возникают чаще в конце месяца?

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

Поможет ли увеличение таймаута ожидания блокировки?

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

Можно ли вообще отключить блокировки в 1С?

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

Чем взаимоблокировка отличается от превышения времени ожидания?

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

Нужно ли перезапускать сервер 1С при конфликтах блокировок?

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