Как настроить таймауты сеансов и блокировок в 1С 8.3

· 10 мин

Содержание

Время ожидания блокировки данных в 1С 8.3 меняют в Конфигураторе: Администрирование → Параметры информационной базы, поле «Время ожидания блокировки данных (сек)». По умолчанию там 20 секунд. В том же окне задают таймаут пассивных сеансов: «Время засыпания пассивного сеанса» и «Время завершения спящего сеанса».

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

Какие таймауты есть в 1С и за что они отвечают

Слово «таймаут» в 1С относится к разным механизмам. Если их путать, правка в одном месте не даст эффекта в другом.

ТаймаутГде задаётсяЧто происходит по истечении
Время ожидания блокировки данныхПараметры информационной базыТранзакция падает с ошибкой конфликта блокировок
Время засыпания пассивного сеансаПараметры информационной базыСеанс без связи с клиентом переходит в «спящий»
Время завершения спящего сеансаПараметры информационной базыСпящий сеанс удаляется сервером
Таймаут HTTP-соединенияПараметр конструктора HTTPСоединение в кодеЗапрос к внешнему сервису прерывается
Ожидание фонового заданияПараметр метода ожидания в кодеКод перестаёт ждать, задание продолжает работать
Таймауты СУБДНастройки MS SQL или PostgreSQLЗапрос или транзакция обрывается на уровне базы

Все настройки ниже относятся к платформе 8.3 и не зависят от конфигурации: путь один и тот же для Бухгалтерии, ЗУП и УТ.

Время ожидания блокировки данных: где изменить и когда это оправдано

Этот параметр работает в управляемом режиме блокировок. Сеанс А заблокировал остатки склада и проводит документ. Сеанс Б хочет записать по тому же складу и ждёт. Если за 20 секунд блокировка не освободилась, Б получает ошибку:

Конфликт блокировок при выполнении транзакции: Превышено максимальное время ожидания предоставления блокировки

Как изменить значение в Конфигураторе

  1. Откройте базу в режиме Конфигуратор под пользователем с правом администрирования.
  2. Выберите Администрирование → Параметры информационной базы.
  3. В поле «Время ожидания блокировки данных (сек)» укажите новое значение, например 40.
  4. Нажмите «ОК». Перезапускать сервер не нужно, значение действует для новых транзакций.

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

Когда увеличивать, а когда нет

  • ✅ Ночью идёт закрытие месяца или перепроведение, днём по тем же регистрам работают 2–3 человека. Таймаут 40–60 секунд снимет редкие ошибки.
  • ✅ Обмен с сайтом пишет большие пакеты раз в 15 минут, и конфликты совпадают по времени с обменом.
  • ❌ Ошибка возникает у десятков пользователей каждый день. Причина — длинная транзакция или код, который блокирует больше, чем нужно. Таймаут здесь только растянет очередь.
  • ❌ Значение в несколько минут. Пользователь не дождётся ответа, закроет окно, а в журнале останутся сеансы, которые повисли в ожидании.

Если базу перевели из автоматического режима в управляемый, сначала проверьте свойство конфигурации «Режим управления блокировкой данных». В автоматическом режиме ожидание регулирует СУБД, и параметр из Конфигуратора на него не действует.

Таймаут пассивных и спящих сеансов

Это настройка для обрывов связи: закрыли ноутбук, пропал VPN, упал терминальный сервер . Клиент исчез, а сеанс на сервере остался и занимает лицензию.

Работает это в два этапа:

  1. Сервер не получает сигналов от клиента дольше значения «Время засыпания пассивного сеанса». Сеанс переходит в состояние «спящий».
  2. Если клиент не вернулся за «Время завершения спящего сеанса», сервер удаляет сеанс.

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

Где задать значения

Оба параметра находятся в том же окне Администрирование → Параметры информационной базы Конфигуратора. Значения задают в секундах. Из кода их меняют методами УстановитьВремяЗасыпанияПассивногоСеанса() и УстановитьВремяЗавершенияСпящегоСеанса().

Практичные ориентиры:

СитуацияЗасыпаниеЗавершение
Офис, стабильная сеть3001800–3600
Удалёнка через VPN, частые обрывы300–6003600–7200
Лицензий впритык, сеансы «висят» сутками300600–900

Таймаут спящего сеанса не закрывает программу у пользователя, который сидит за компьютером, но ничего не делает. Окно 1С открыто и связь есть — значит, сеанс активный. Автоматический выход по бездействию платформа такой настройкой не даёт.

Завершение зависших сеансов и снятие блокировок

Когда документ не проводится, потому что кто-то держит блокировку, ждать таймаута бессмысленно. Нужно найти этот сеанс и закрыть его.

Завершение сеанса откатывает его незафиксированную транзакцию. Пользователь потеряет несохранённые данные — предупредите его до удаления сеанса.

Через консоль администрирования серверов 1С

  1. Откройте «Администрирование серверов 1С Предприятия».
  2. Раскройте Центральные серверы 1С:Предприятия → <сервер> → Кластеры → <кластер> → Информационные базы → <база> → Сеансы.
  3. Отсортируйте список по колонке времени вызова СУБД или по колонке захвата СУБД. Сеанс с минутами в этих колонках — главный подозреваемый.
  4. Правой кнопкой по сеансу — «Удалить». Сервер завершит сеанс и откатит транзакцию.

В узле «Блокировки» той же базы видны объектные блокировки сеансов, например кто сейчас редактирует документ. Транзакционные блокировки там не отображаются.

Из пользовательского режима

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

Из командной строки

Утилита rac подключается к агенту сервера через ras. Список кластеров выводит rac cluster list, сеансы — rac session list с идентификатором кластера. Точные параметры удаления сеанса смотрите в справке rac help session на своей версии платформы.

Файловая база

У файловой базы нет консоли кластера. Чаще всего блокировку держит пользователь, у которого 1С зависла или осталась в фоне на терминальном сервере. Найдите процесс 1cv8.exe или 1cv8c.exe этого пользователя в диспетчере задач и завершите его, предупредив владельца.

Таймауты на уровне СУБД: MS SQL и PostgreSQL

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

MS SQL Server

  • 🔹 Ошибка 1222 Lock request time out period exceeded — истекло ожидание блокировки на уровне SQL. Встречается в автоматическом режиме блокировок и при эскалации блокировок на таблицу.
  • 🔹 Ошибка 1205 — сервер выбрал жертву взаимоблокировки. Это не таймаут, увеличение времени ожидания не поможет.
  • 🔹 Для управляемого режима 1С включает в базе READ_COMMITTED_SNAPSHOT. Чтение тогда не ждёт записи, и конфликтов меньше. Не выключайте эту опцию вручную.

Кто кого блокирует сейчас:

SELECT r.session_id,
       r.blocking_session_id,
       r.wait_type,
       r.wait_time / 1000 AS wait_sec,
       DB_NAME(r.database_id) AS db_name,
       t.text AS sql_text
FROM sys.dm_exec_requests AS r
CROSS APPLY sys.dm_exec_sql_text(r.sql_handle) AS t
WHERE r.blocking_session_id <> 0;

PostgreSQL

Параметры, связанные со временем ожидания:

ПараметрЧто делаетРекомендация для 1С
deadlock_timeoutЧерез сколько проверять взаимоблокировку (по умолчанию 1s)Не менять
lock_timeoutПредел ожидания блокировки одним запросомГлобально не включать
statement_timeoutПредел выполнения одного запросаГлобально не включать: оборвёт обновление и регламентные операции
idle_in_transaction_session_timeoutОбрыв соединения, которое открыло транзакцию и простаиваетТолько осознанно и с запасом

Поиск заблокированных процессов (PostgreSQL 9.6 и новее):

SELECT pid,
       pg_blocking_pids(pid) AS blocked_by,
       state,
       wait_event_type,
       now() - xact_start AS xact_age,
       left(query, 200) AS query
FROM pg_stat_activity
WHERE cardinality(pg_blocking_pids(pid)) > 0;

Не завершайте процессы СУБД через pg_terminate_backend или KILL в обход 1С без крайней необходимости. Рабочий процесс 1С потеряет соединение, и сеанс пользователя упадёт. Сначала закройте сеанс через консоль кластера.

Связать процесс СУБД с сеансом 1С помогает колонка соединения с СУБД в списке сеансов консоли: там показан идентификатор процесса на стороне базы данных.

Контроль времени выполнения в коде 1С

Встроенного «таймаута на запрос» в языке 1С нет. Контролировать время приходится архитектурно: короткие транзакции, ожидание фоновых заданий с пределом, таймауты внешних соединений.

Короткая транзакция с явной блокировкой

Блокируйте только нужные данные и как можно позже, прямо перед записью. Все долгие расчёты — до НачатьТранзакцию().

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

НачатьТранзакцию();
Попытка
    Блокировка.Заблокировать();
    // чтение остатков и запись движений
    ЗафиксироватьТранзакцию();
Исключение
    ОтменитьТранзакцию();
    ВызватьИсключение;
КонецПопытки;

Блокировка по конкретному складу, а не по всему регистру, позволяет параллельно работать с другими складами.

Ограничение ожидания фонового задания

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

Параметры = Новый Массив;
Параметры.Добавить(Организация);

Задание = ФоновыеЗадания.Выполнить("ДлительныеОперацииСервер.ПересчитатьДанные", Параметры, , "Пересчёт с ограничением");

Попытка
    Задание.ОжидатьЗавершенияВыполнения(300);
Исключение
    // время ожидания истекло или задание завершилось с ошибкой
КонецПопытки;

Задание = ФоновыеЗадания.НайтиПоУникальномуИдентификатору(Задание.УникальныйИдентификатор);
Если Задание <> Неопределено И Задание.Состояние = СостояниеФоновогоЗадания.Активно Тогда
    Задание.Отменить();
КонецЕсли;

Имя модуля и процедуры в примере условные: подставьте свой общий модуль с экспортной процедурой. Метод ОжидатьЗавершенияВыполнения() есть в платформе 8.3.13 и новее.

Таймаут внешних соединений

Зависший сервис партнёра держит вызов сервера, а если вызов идёт внутри транзакции — и блокировки. Таймаут HTTP задаётся шестым параметром конструктора, в секундах:

Соединение = Новый HTTPСоединение("api.example.ru", 443, , , , 30, Новый ЗащищенноеСоединениеOpenSSL);

Никогда не вызывайте внешние сервисы внутри открытой транзакции. Сначала получите данные, потом записывайте.

Замер длительности

Чтобы понять, где тратится время, засеките его в коде:

Начало = ТекущаяУниверсальнаяДатаВМиллисекундах();
// проверяемый участок
Длительность = ТекущаяУниверсальнаяДатаВМиллисекундах() - Начало;
ЗаписьЖурналаРегистрации("Замер", УровеньЖурналаРегистрации.Информация, , ,
    СтрШаблон("Длительность: %1 мс", Формат(Длительность, "ЧГ=0")));

Как найти причину долгих блокировок

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

Настройка технологического журнала

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

<?xml version="1.0" encoding="UTF-8"?>
<config xmlns="http://v8.1c.ru/v8/tech-log">
  <log location="D:\techlog\locks" 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>
  • 🔒 TLOCK — установка управляемой блокировки. Свойство WaitConnections показывает, кого ждал сеанс.
  • ⏱ TTIMEOUT — ожидание истекло. Здесь указано соединение-виновник.
  • 🔁 TDEADLOCK — взаимоблокировка, когда два сеанса ждут друг друга.

События TLOCK на нагруженной базе пишутся гигабайтами в час. Держите журнал включённым только на время разбора, history не больше суток, а каталог — на диске со свободным местом. После разбора удалите или переименуйте logcfg.xml.

Разбор по шагам

  1. Дождитесь повторения ошибки и найдите в журнале событие TTIMEOUT.
  2. Возьмите из него номер соединения, которое удерживало блокировку.
  3. По этому номеру найдите события TLOCK того же соединения: какое пространство блокировок и какие поля.
  4. По свойству Context определите модуль и строку кода, где открыта транзакция.

Типичные находки:

  • 📌 проведение документа читает остатки без отбора по складу и блокирует весь регистр;
  • 📌 внутри транзакции идёт обмен, вызов веб-сервиса или вывод диалога;
  • 📌 регламентное задание пересчёта запускается в рабочее время;
  • 📌 запрос без индекса выполняется минутами внутри транзакции.
Диагностика: выберите симптом

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

Можно ли задать время ожидания блокировки для одного пользователя?
Нет. Параметр действует на всю информационную базу. Разное поведение для разных операций добиваются кодом: короткими транзакциями и точечными блокировками.
Сбрасывается ли время ожидания блокировки после обновления конфигурации?
Нет. Это параметр информационной базы, а не конфигурации. Обновление релиза его не меняет, при выгрузке и загрузке .dt он переносится вместе с базой.
Действует ли время ожидания блокировки в файловой базе?
Да, управляемые блокировки и этот параметр работают и в файловом варианте. Но в файловой базе запись идёт последовательно, поэтому конфликты там чаще связаны с долгими операциями одного пользователя.
Освобождает ли спящий сеанс лицензию?
Ориентироваться стоит на консоль: пока сеанс виден в списке, считайте, что он занимает место. Поэтому при нехватке лицензий сокращают время завершения спящего сеанса.
Что делать, если консоль показывает сеанс, а пользователь давно ушёл?
Удалите сеанс в консоли кластера. Если сеанс сразу появляется снова, его создаёт регламентное задание или обмен — ищите по имени приложения в колонке сеанса.