Операция в 1С висит на блокировке: как найти виновника и освободить данные

· 10 мин

Содержание

Чтобы разблокировать операцию в 1С, нужно найти сеанс, который держит нужные данные, и дождаться его завершения или завершить его принудительно. Отдельной кнопки «снять блокировку» в 1С нет: блокировка живёт ровно столько, сколько транзакция или сеанс, который её поставил.

На практике порядок такой: смотрите Активные пользователи, затем журнал регистрации, а в клиент-серверной базе — список блокировок в консоли кластера. Если операция «висит» постоянно, причина почти всегда в долгой транзакции или в одновременной работе нескольких тяжёлых процессов.

Всё ниже относится к платформе 1С:Предприятие 8.3 и не зависит от конфигурации: одинаково работает в Бухгалтерии 3.0, ЗУП 3.1, УТ 11 и других типовых решениях.

Почему операция в 1С блокируется: виды блокировок

Под словом «блокировка» пользователи называют три разные ситуации. От того, какая у вас, зависит способ разблокировки.

Вид блокировкиКак выглядитКто держитКак снять
Объектная (на редактирование)Не удается записать! Объект уже заблокирован или похожее сообщение при открытии/записи документаСеанс, в котором этот документ открыт и изменёнЗакрыть форму у другого пользователя или завершить его сеанс
Транзакционная (блокировка данных)Проведение долго «думает», затем Конфликт блокировок при выполнении транзакции: Превышено максимальное время ожидания предоставления блокировкиТранзакция другого сеанса: проведение, закрытие месяца, обмен, регламентное заданиеДождаться конца транзакции или завершить сеанс-виновник
Взаимоблокировка (deadlock)Ошибка со словами взаимоблокировка или deadlock от СУБДДве транзакции ждут друг другаПовторить операцию; устранять причину в коде или в расписании

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

Типичные причины транзакционных блокировок

  • 🕐 Долгая операция у коллеги. Закрытие месяца , перепроведение за квартал, расчёт зарплаты по всей организации держат данные регистров минуты и десятки минут.
  • 🔄 Обмен данными или загрузка. Синхронизация с другой базой, загрузка выписки или прайса пишет в те же регистры, что и пользователи.
  • ⏰ Регламентные задания. Задание, запущенное днём, конкурирует с рабочими сеансами.
  • 🧩 Доработки. Код, который открывает транзакцию и внутри неё ждёт ответа пользователя, внешнего сервиса или выполняет тяжёлый запрос.
  • 💾 Файловая база. В файловом варианте блокировки ставятся на целые таблицы, поэтому два пользователя, проводящих разные документы, мешают друг другу заметно чаще, чем на сервере.
  • 🐢 Медленная СУБД или диск. Транзакция выполняется дольше обычного — и дольше держит блокировки.

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

Как разблокировать документ, занятый другим пользователем

Объектная блокировка возникает, когда двое открыли один и тот же документ или элемент справочника, и первый уже начал его менять. Второй не сможет записать изменения, пока первый не закроет форму.

  1. Прочитайте сообщение целиком. Часто в нём указано, каким пользователем и на каком компьютере занят объект.
  2. Попросите коллегу записать или закрыть документ. Блокировка снимается сразу после закрытия формы.
  3. Если человек ушёл, а форма открыта, завершите его сеанс (способы — в следующих разделах).
  4. Откройте документ заново и повторите запись.

Блокировка на редактирование принадлежит сеансу. Поэтому «отобрать» её из своего сеанса нельзя: сработает только закрытие формы у владельца или завершение его сеанса. После завершения сеанса все его блокировки освобождаются автоматически.

Кто держит данные: проверка через «Активные пользователи»

Первый и самый быстрый шаг — посмотреть, кто сейчас работает в базе.

Где найти список:

  • В большинстве типовых конфигураций — в разделе Администрирование → Обслуживание, группа отчётов администратора.
  • Универсальный путь для любой конфигурации: Все функции → Стандартные → Активные пользователи. Если пункта Все функции нет в главном меню, включите его в Сервис и настройки → Параметры → Отображать команду "Все функции".

На что смотреть в списке:

  • 👤 пользователей, которые могут выполнять тяжёлую операцию прямо сейчас (бухгалтер, закрывающий месяц, зарплатник);
  • 🤖 сеансы фоновых заданий и обменов — у них в колонке приложения указано «Фоновое задание» или похожий признак;
  • 🕓 время начала сеанса: сеанс, открытый со вчерашнего вечера, — частый кандидат на «забытую» форму или зависший процесс;
  • 💻 имя компьютера — помогает найти человека, даже если в базе несколько одинаковых пользователей.

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

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

Журнал регистрации: что происходило в момент зависания

Активные пользователи показывают текущую картину. Если блокировка уже прошла, а разобраться нужно, кто мешал, откройте журнал регистрации: Все функции → Стандартные → Журнал регистрации или из того же раздела администрирования.

Как отфильтровать нужные записи

  1. Задайте интервал: 10–15 минут вокруг времени, когда у вас появилась ошибка.
  2. Отберите уровень «Ошибка» — найдёте собственную запись о конфликте блокировок и точное время отказа.
  3. Снимите отбор по уровню и посмотрите, какие пользователи и сеансы в те же минуты писали данные: проведение документов, записи регистров, события фоновых заданий.
  4. Обратите внимание на события отмены транзакций. Их всплеск в одно время у нескольких пользователей указывает на общую причину.
  5. Сравните с расписанием регламентных заданий и обменов. Совпадение по времени — главная улика.

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

Мини-кейс

Бухгалтер жалуется: каждый день около 12:00 проведение реализаций зависает на 20 секунд и падает с ошибкой. В журнале регистрации видно, что в 11:58 стартует обмен с торговой базой, а у всех ошибок — регистр взаиморасчётов. Решение без программиста: перенести обмен на обеденный перерыв или на вечер, а днём запускать его реже.

Таблица блокировок в консоли кластера

В клиент-серверном варианте самый точный инструмент — консоль Администрирование серверов 1С Предприятия. В ней видно, какие блокировки сейчас установлены и каким сеансом.

Как посмотреть блокировки

  1. Запустите консоль администрирования на сервере или на машине администратора.
  2. Раскройте Центральные серверы 1С:Предприятия → <сервер> → Кластеры → <кластер> → Информационные базы → <ваша база>.
  3. Откройте ветку Блокировки. В списке — объект блокировки, сеанс-владелец, пользователь, компьютер и время.
  4. Перейдите в ветку Сеансы той же базы и найдите сеанс по номеру или пользователю.
  5. Если сеанс не отвечает и человек недоступен — выделите его и удалите через контекстное меню. Сеанс будет завершён, его транзакция откатится, блокировки исчезнут.

То же самое можно сделать утилитой rac с командной строки. Надёжно работают команды для просмотра:

rac cluster list
rac infobase summary list --cluster=<id_кластера>
rac session list --cluster=<id_кластера> --infobase=<id_базы>
rac lock list --cluster=<id_кластера> --infobase=<id_базы>

Для завершения сеанса используется режим session с командой terminate; точный набор параметров для вашей версии платформы смотрите в rac help session. Если на кластере задан администратор, к командам добавляются параметры логина и пароля администратора кластера.

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

Технологический журнал — когда блокировки повторяются

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

  • TTIMEOUT — превышение времени ожидания блокировки; в свойстве WaitConnections записаны номера соединений, которые мешали;
  • TDEADLOCK — взаимоблокировка, с описанием, какие ресурсы ждали обе стороны;
  • TLOCK — установка управляемых блокировок (событий много, включайте на короткое время).

Пример минимальной настройки:

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

Технологический журнал быстро растёт. Ограничьте срок хранения (history в часах), следите за местом на диске и отключите сбор после диагностики.

Диагностика: выберите симптом

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

Программно «отпустить» чужую блокировку нельзя — это правило платформы. Код может управлять только своими блокировками и настройкой ожидания.

Объектные блокировки в своём сеансе

Если обработка блокирует объект методом Заблокировать(), после работы блокировку нужно снять. Для блокировки, установленной по ссылке, применяется РазблокироватьДанныеДляРедактирования:

ЗаблокироватьДанныеДляРедактирования(ДокументСсылка, , УникальныйИдентификатор);
// ... изменения ...
РазблокироватьДанныеДляРедактирования(ДокументСсылка, УникальныйИдентификатор);

Работает только для того же сеанса и того же идентификатора формы, которые поставили блокировку.

Управляемая блокировка в транзакции

Правильно написанный код блокирует ровно те данные, которые читает для контроля, и делает это в начале транзакции:

НачатьТранзакцию();
Попытка
    Блокировка = Новый БлокировкаДанных;
    ЭлементБлокировки = Блокировка.Добавить("РегистрНакопления.ТоварыНаСкладах");
    ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный;
    ЭлементБлокировки.УстановитьЗначение("Склад", Склад);
    Блокировка.Заблокировать();

    // чтение остатков, контроль, запись движений

    ЗафиксироватьТранзакцию();
Исключение
    ОтменитьТранзакцию();
    ВызватьИсключение;
КонецПопытки;

Блокировки транзакции снимаются автоматически при ЗафиксироватьТранзакцию() или ОтменитьТранзакцию(). Отдельной команды «разблокировать» здесь нет и не нужно.

Время ожидания блокировки

По умолчанию платформа ждёт освобождения данных 20 секунд. Значение меняется в Конфигураторе: Администрирование → Параметры информационной базы, поле времени ожидания блокировки данных. Из кода его читают и задают функциями ПолучитьВремяОжиданияБлокировкиДанных() и УстановитьВремяОжиданияБлокировкиДанных().

ДействиеКогда помогаетРиск
Увеличить таймаут (например, до 40–60 с)Короткие пики нагрузки, операции укладываются чуть дольше 20 сПользователи дольше смотрят на «песочные часы»; причина не устранена
Уменьшить таймаутНужно быстрее получать отказ, а не ждатьБольше отказов при обычной нагрузке
Оставить 20 с и разнести операции по времениРегулярные конфликты из-за обменов и заданийНужно договориться о расписании

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

Как не допустить блокировок в будущем

Блокировки — нормальная часть многопользовательской работы. Задача не убрать их совсем, а сделать короткими.

Организационные меры

  • 📅 Расписание тяжёлых операций. Закрытие месяца, перепроведение и групповой перерасчёт — вечером или в выходные, с предупреждением коллег.
  • 🔁 Обмены и регламентные задания. Проверьте расписание в Администрирование → Обслуживание → Регламентные операции (или аналогичном разделе вашей конфигурации); убирайте ненужные задания и сдвигайте тяжёлые с рабочего времени.
  • 🚪 Привычка закрывать формы. Открытый на ночь изменённый документ — источник объектных блокировок утром.
  • 📦 Порции вместо «всё сразу». Перепроведение за квартал лучше делать по месяцам.

Технические меры

  • 🖥️ Клиент-серверный вариант. Если в файловой базе работают больше 5–7 человек и конфликты ежедневные, переход на сервер с СУБД снимает большую часть проблем: блокировки ставятся на записи, а не на таблицы.
  • ⚙️ Режим управления блокировками. В свойствах конфигурации задаётся автоматический, управляемый или смешанный режим. Современные типовые конфигурации работают в управляемом. Доработанные старые базы иногда остаются в автоматическом или смешанном — их перевод выполняет программист после проверки кода.
  • 📊 Обслуживание СУБД. Регулярное обновление статистики и перестроение индексов ускоряют запросы, а значит, сокращают время удержания блокировок.
  • 🧑‍💻 Аудит доработок. Ищите транзакции, внутри которых есть диалоги с пользователем, обращения к внешним сервисам, запись в файлы или тяжёлые отчёты.
Проверка базы, где операции регулярно блокируются
Выполнено: 0 / 6

Частые вопросы о блокировках в 1С

Помогает ли перезагрузка сервера снять блокировку?
Да, но это самый грубый способ: обрываются все сеансы всех пользователей. Почти всегда достаточно завершить один сеанс-виновник в консоли кластера.
Пользователь давно вышел из 1С, а его сеанс всё ещё висит. Что делать?
Сеанс мог остаться после аварийного закрытия клиента или обрыва сети. Найдите его в консоли кластера по пользователю и компьютеру и удалите. Блокировки освободятся вместе с ним.
Вход в базу запрещён с сообщением о блокировке. Это то же самое?
Нет. Это блокировка начала сеансов, которую ставит администратор перед обновлением. Её снимают в той же форме администрирования, где установили, или в консоли кластера в свойствах базы. Зайти при действующем запрете можно с параметром запуска /UC<код разрешения>.
Документ не проводится из-за даты запрета изменения — это блокировка?
Нет, это ограничение по закрытому периоду. Ни консоль, ни завершение сеансов не помогут: дату меняет пользователь с правами администратора или главного бухгалтера в настройках дат запрета.
Можно ли узнать, кто заблокировал данные, в файловой базе?
Консоли кластера у файловой базы нет. Остаются список активных пользователей и журнал регистрации: по времени ошибки и действиям других пользователей виновник обычно находится за пару минут.