Как настроить таймауты сеансов и блокировок в 1С 8.3
Содержание
Время ожидания блокировки данных в 1С 8.3 меняют в Конфигураторе: Администрирование → Параметры информационной базы, поле «Время ожидания блокировки данных (сек)». По умолчанию там 20 секунд. В том же окне задают таймаут пассивных сеансов: «Время засыпания пассивного сеанса» и «Время завершения спящего сеанса».
Но увеличенный таймаут почти никогда не лечит блокировки. Он только заставляет пользователей ждать дольше. Ниже разобрано, какие таймауты есть в платформе и СУБД, как завершить зависший сеанс и как найти транзакцию, которая держит данные.
Какие таймауты есть в 1С и за что они отвечают
Слово «таймаут» в 1С относится к разным механизмам. Если их путать, правка в одном месте не даст эффекта в другом.
| Таймаут | Где задаётся | Что происходит по истечении |
|---|---|---|
| Время ожидания блокировки данных | Параметры информационной базы | Транзакция падает с ошибкой конфликта блокировок |
| Время засыпания пассивного сеанса | Параметры информационной базы | Сеанс без связи с клиентом переходит в «спящий» |
| Время завершения спящего сеанса | Параметры информационной базы | Спящий сеанс удаляется сервером |
| Таймаут HTTP-соединения | Параметр конструктора HTTPСоединение в коде | Запрос к внешнему сервису прерывается |
| Ожидание фонового задания | Параметр метода ожидания в коде | Код перестаёт ждать, задание продолжает работать |
| Таймауты СУБД | Настройки MS SQL или PostgreSQL | Запрос или транзакция обрывается на уровне базы |
Все настройки ниже относятся к платформе 8.3 и не зависят от конфигурации: путь один и тот же для Бухгалтерии, ЗУП и УТ.
Время ожидания блокировки данных: где изменить и когда это оправдано
Этот параметр работает в управляемом режиме блокировок. Сеанс А заблокировал остатки склада и проводит документ. Сеанс Б хочет записать по тому же складу и ждёт. Если за 20 секунд блокировка не освободилась, Б получает ошибку:
Конфликт блокировок при выполнении транзакции: Превышено максимальное время ожидания предоставления блокировки
Как изменить значение в Конфигураторе
- Откройте базу в режиме Конфигуратор под пользователем с правом администрирования.
- Выберите
Администрирование → Параметры информационной базы. - В поле «Время ожидания блокировки данных (сек)» укажите новое значение, например 40.
- Нажмите «ОК». Перезапускать сервер не нужно, значение действует для новых транзакций.
Тот же параметр меняют из кода методом УстановитьВремяОжиданияБлокировкиДанных(), а читают — ПолучитьВремяОжиданияБлокировкиДанных(). Нужен административный доступ. Настройка общая для всей информационной базы, а не для одного сеанса.
Когда увеличивать, а когда нет
- ✅ Ночью идёт закрытие месяца или перепроведение, днём по тем же регистрам работают 2–3 человека. Таймаут 40–60 секунд снимет редкие ошибки.
- ✅ Обмен с сайтом пишет большие пакеты раз в 15 минут, и конфликты совпадают по времени с обменом.
- ❌ Ошибка возникает у десятков пользователей каждый день. Причина — длинная транзакция или код, который блокирует больше, чем нужно. Таймаут здесь только растянет очередь.
- ❌ Значение в несколько минут. Пользователь не дождётся ответа, закроет окно, а в журнале останутся сеансы, которые повисли в ожидании.
Если базу перевели из автоматического режима в управляемый, сначала проверьте свойство конфигурации «Режим управления блокировкой данных». В автоматическом режиме ожидание регулирует СУБД, и параметр из Конфигуратора на него не действует.
Таймаут пассивных и спящих сеансов
Это настройка для обрывов связи: закрыли ноутбук, пропал VPN, упал терминальный сервер . Клиент исчез, а сеанс на сервере остался и занимает лицензию.
Работает это в два этапа:
- Сервер не получает сигналов от клиента дольше значения «Время засыпания пассивного сеанса». Сеанс переходит в состояние «спящий».
- Если клиент не вернулся за «Время завершения спящего сеанса», сервер удаляет сеанс.
Если пользователь переподключился раньше, он продолжает работу в том же сеансе с открытыми формами.
Где задать значения
Оба параметра находятся в том же окне Администрирование → Параметры информационной базы Конфигуратора. Значения задают в секундах. Из кода их меняют методами УстановитьВремяЗасыпанияПассивногоСеанса() и УстановитьВремяЗавершенияСпящегоСеанса().
Практичные ориентиры:
| Ситуация | Засыпание | Завершение |
|---|---|---|
| Офис, стабильная сеть | 300 | 1800–3600 |
| Удалёнка через VPN, частые обрывы | 300–600 | 3600–7200 |
| Лицензий впритык, сеансы «висят» сутками | 300 | 600–900 |
Таймаут спящего сеанса не закрывает программу у пользователя, который сидит за компьютером, но ничего не делает. Окно 1С открыто и связь есть — значит, сеанс активный. Автоматический выход по бездействию платформа такой настройкой не даёт.
Завершение зависших сеансов и снятие блокировок
Когда документ не проводится, потому что кто-то держит блокировку, ждать таймаута бессмысленно. Нужно найти этот сеанс и закрыть его.
Завершение сеанса откатывает его незафиксированную транзакцию. Пользователь потеряет несохранённые данные — предупредите его до удаления сеанса.
Через консоль администрирования серверов 1С
- Откройте «Администрирование серверов 1С Предприятия».
- Раскройте
Центральные серверы 1С:Предприятия → <сервер> → Кластеры → <кластер> → Информационные базы → <база> → Сеансы. - Отсортируйте список по колонке времени вызова СУБД или по колонке захвата СУБД. Сеанс с минутами в этих колонках — главный подозреваемый.
- Правой кнопкой по сеансу — «Удалить». Сервер завершит сеанс и откатит транзакцию.
В узле «Блокировки» той же базы видны объектные блокировки сеансов, например кто сейчас редактирует документ. Транзакционные блокировки там не отображаются.
Из пользовательского режима
В типовых конфигурациях на БСП есть список «Активные пользователи». Он находится в разделе Администрирование → Обслуживание (в части релизов раздел называется «Поддержка и обслуживание»). Из списка сеанс можно завершить командой в панели формы. Для клиент-серверной базы потребуется пароль администратора кластера, если он задан.
Из командной строки
Утилита 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.
Разбор по шагам
- Дождитесь повторения ошибки и найдите в журнале событие TTIMEOUT.
- Возьмите из него номер соединения, которое удерживало блокировку.
- По этому номеру найдите события TLOCK того же соединения: какое пространство блокировок и какие поля.
- По свойству
Contextопределите модуль и строку кода, где открыта транзакция.
Типичные находки:
- 📌 проведение документа читает остатки без отбора по складу и блокирует весь регистр;
- 📌 внутри транзакции идёт обмен, вызов веб-сервиса или вывод диалога;
- 📌 регламентное задание пересчёта запускается в рабочее время;
- 📌 запрос без индекса выполняется минутами внутри транзакции.