Как решить проблему каскадного зависания транзакций и сеансов пользователей в 1С?

Системный администратор 1С v8.3 (Обычные формы) 1С:Управление торговлей IT и автоматизация бизнеса
← На главную

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

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

Симптомы и проявления проблемы: что происходит «под капотом»

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

  1. Каскадный характер зависания. Всё начинается с одного пользователя, который выполняет стандартную транзакционную операцию (например, проведение документа или запись элемента справочника). В течение 5–15 минут число зависших пользователей лавинообразно увеличивается до десятков человек.
  2. Отсутствие ошибок СУБД. Внешние инструменты мониторинга (PerfExpert, стандартный SQL Profiler или Activity Monitor) показывают, что со стороны MS SQL Server или PostgreSQL блокировок нет, либо они кратковременны. СУБД находится в режиме ожидания команд от сервера приложений 1С.
  3. Проблемы с консолью администрирования 1С. При попытке администратора удалить сеанс виновника зависания консоль «задумывается» на несколько минут, после чего выдает ошибку: Ошибка удаления сеанса: Ошибка операции администрирования. Не найдено ни одного сервера с размещенным сервисом serviceName=SessionDataService.
  4. Циклический перезапуск рабочих процессов rphost. Если открыть диспетчер задач или монитор ресурсов на сервере приложений 1С, можно заметить, что один из рабочих процессов rphost постоянно перезапускается. У него каждую минуту меняется идентификатор процесса (PID). Это говорит о том, что процесс падает в аварийный дамп или принудительно завершается менеджером кластера по таймауту.

Выясняем скрытую причину: конфликт нового формата ЖР (SQLite)

Главным виновником описанного поведения системы является новый формат журнала регистрации (ЖР), который был представлен фирмой «1С» в платформе версии 8.3.5. В этом формате данные ЖР хранятся не в текстовых файлах, а в базе данных SQLite (файл с расширением *.lgd).

Проанализируем, почему это приводит к катастрофическим зависаниям на нагруженных базах с числом активных пользователей более 30–50 человек:

Природа SQLite. СУБД SQLite является встраиваемой (embedded) однопользовательской базой данных. В отличие от полноценных клиент-серверных СУБД, SQLite не имеет собственного запущенного процесса-сервера, который управляет распределением ресурсов. Все операции чтения и записи выполняются непосредственно библиотекой, встроенной в рабочий процесс 1С rphost, напрямую на уровне файловой системы операционной системы.

Файловые блокировки при транзакциях. Когда пользователь в 1С проводит документ, платформа открывает транзакцию СУБД и одновременно пытается записать событие начала транзакции в журнал регистрации. Чтобы гарантировать целостность данных в файле *.lgd, библиотека SQLite накладывает монопольную блокировку на уровне операционной системы на весь файл базы данных ЖР. В этот момент никакой другой процесс rphost или поток не может выполнить запись в этот файл.

Эффект «бутылочного горлышка». Если в системе работает много пользователей, они генерируют сотни событий в секунду. Как только один из потоков захватывает блокировку файла ЖР на медленном диске или при задержках в виртуальной сети, выстраивается огромная очередь из других потоков rphost, ожидающих освобождения файла *.lgd. С точки зрения пользователя это выглядит как «белый экран» ожидания.

Падение rphost и ошибка SessionDataService. Менеджер кластера 1С (процесс rmngr) регулярно опрашивает рабочие процессы rphost (так называемый пинг или heartbeat-запрос). Если рабочий процесс намертво завис в ожидании снятия файловой блокировки с файла SQLite, он перестает отвечать менеджеру кластера. Менеджер кластера считает этот rphost аварийно завершенным и пытается перенаправить сеансы на новый запущенный рабочий процесс. Именно в этот переходный момент администратор получает ошибку о недоступности сервиса данных сеанса SessionDataService.

Шаг 1. Настройка технологического журнала для точной диагностики

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

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

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


<?xml version="1.0" encoding="UTF-8"?>
<config xmlns="http://v8.1c.ru/v8/tech-log">
  <dump create="true" location="C:\1C_LOGS\Dumps" type="0" prntscrn="false" externaldump="1"/>
  <log location="C:\1C_LOGS\AllExceptions" history="168">
    <event>
      <eq property="Name" value="EXCP"/>
    </event>
    <event>
      <eq property="Name" value="CONN"/>
    </event>
    <event>
      <eq property="Name" value="PROC"/>
    </event>
    <event>
      <eq property="Name" value="ADMIN"/>
    </event>
    <event>
      <eq property="Name" value="SESN"/>
    </event>
    <event>
      <eq property="Name" value="CLSTR"/>
    </event>
    <property name="all"/>
    <property name="context">
      <event>
        <ne property="process" value="rmngr"/>
      </event>
    </property>
  </log>
  <log location="C:\1C_LOGS\LockErrors" history="168">
    <event>
      <eq property="name" value="TLOCK"/>
      <gt property="duration" value="100000"/>
    </event>
    <event>
      <eq property="Name" value="TTIMEOUT"/>
    </event>
    <event>
      <eq property="Name" value="TDEADLOCK"/>
    </event>
    <property name="all"/>
    <property name="context">
      <event>
        <eq property="name" value=""/>
      </event>
    </property>
  </log>
</config>

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

После активации ТЖ проанализируем файлы логов в каталоге C:\1C_LOGS\AllExceptions. Если мы увидим регулярные события EXCP, связанные с записью в файлы в каталоге 1Cv8JobReg (где хранятся данные журнала регистрации), и последующие запуски новых процессов с событием PROC, наша гипотеза о блокировках SQLite полностью подтверждается.

Шаг 2. Гарантированное решение — перевод ЖР в старый последовательный формат (*.lgf)

Если диагностика подтвердила проблему, единственным надежным, стабильным и официально рекомендованным архитектурным решением является возврат журнала регистрации к старому, проверенному временем последовательному формату (текстовые файлы с расширением *.lgf).

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

Инструкция по изменению формата журнала регистрации:

  1. Запустите информационную базу 1С:Предприятие в режиме Конфигуратора с правами администратора.
  2. В главном меню выберите раздел Администрирование, далее перейдите в пункт Настройка журнала регистрации.
  3. В открывшемся окне обратите внимание на формат хранения. Если в системе используется новый формат (SQLite), в окне будет доступна кнопка или переключатель для изменения формата. В более ранних версиях платформы 8.3 кнопка может называться "Новый формат" (если она не нажата, значит активен старый текстовый формат) или наоборот. Нам необходимо убедиться, что база переведена на классический последовательный формат.
  4. Альтернативный способ через командную строку (для автоматизации): Вы можете выполнить конвертацию журнала регистрации программно, запустив конфигуратор с параметрами пакетного режима. Выполните в консоли сервера следующую команду:
    
    "C:\Program Files\1cv8\8.3.10.2580\bin\1cv8.exe" DESIGNER /S "ИмяСервера\ИмяБазы" /N "Администратор" /P "Пароль" /ConvertRegLog старый
    
    Данная команда выполнит принудительную конвертацию файла 1Cv8.lgd обратно в текстовый структурированный набор файлов 1Cv8.lgf.
  5. После успешного завершения конвертации зайдите в каталог хранения журнала регистрации вашей информационной базы на сервере (по умолчанию он находится по пути: C:\Program Files\1cv8\srvinfo\reg_1541\UUID_вашей_базы\1Cv8Log) и убедитесь, что в каталоге появились файлы с расширением *.lgf, а размер файла 1Cv8.lgd перестал расти. Старый файл *.lgd после успешной конвертации можно безопасно удалить для освобождения дискового пространства.

Шаг 3. Дополнительные сетевые настройки и оптимизация инфраструктуры

Помимо изменения формата ЖР, на стабильность транзакций существенно влияет сетевая инфраструктура, особенно если пользователи и серверы разнесены по разным виртуальным подсетям (VLAN). Выполним несколько важных настроек для минимизации сетевых задержек:

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


[NH_COMMON]
NH_TCPIP = Enabled

[NH_TCPIP]
NH_SERVER_ADDR = 192.168.1.100 ; Укажите точный IP-адрес вашего сервера лицензирования
NH_PORT_NUMBER = 475
NH_TCPIP_METHOD = TCP
NH_USE_BROADCAST = Disabled

Настройка параметров виртуальных сетевых адаптеров. Если сервер 1С развернут в среде виртуализации (например, VMware vSphere или Hyper-V), убедитесь, что тип виртуального сетевого адаптера установлен как VMXNET3 (для VMware). В настройках сетевой карты на уровне операционной системы Windows Server отключите функции энергосбережения и параметры выгрузки контрольной суммы (IPv4 Checksum Offload, Large Send Offload), так как они могут приводить к непредсказуемым микрозадержкам пакетов при передаче больших объемов данных между сервером 1С и СУБД.

Подведем итоги совместной работы

Мы детально разобрали скрытые механизмы работы платформы 1С при каскадных зависаниях. Как показывает реальная практика эксплуатации высоконагруженных систем, отказ от формата журнала регистрации SQLite (*.lgd) в пользу классического формата текстовых логов (*.lgf) полностью решает проблему каскадного накопления транзакционных ожиданий.

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

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

← На главную