Почему 1С зависает при записи дополнительной обработки и как это исправить?

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

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

Анализируем ситуацию и показания технологического журнала

Рассмотрим типичный сценарий: при записи обработки весом в несколько мегабайт программа подвисает на 2–5 минут. Посмотрим на строки технологического журнала (ТЖ), которые фиксируют разрыв во времени. В логах мы видим вызовы интерфейсов IClusterLocks и IDebugConnection.

Проанализируем фрагмент лога, предоставленный в проблеме:


05:45.807004-1,SCALL,2,process=rphost,p:processName=ERP_2017, ... IName=IClusterLocks,Method=3,MName=getDynDataList
...
07:42.245015-116438010,SCALL,2, ... IName=IClusterOperativeTimestamp,Method=3,MName=clearObjectsByKeys

Обратим внимание на разницу во времени между этими событиями. Метод getDynDataList и последующий clearObjectsByKeys указывают на то, что система в данный момент занимается инвалидацией (очисткой) кэша метаданных. Когда мы записываем дополнительную обработку, сервер 1С должен оповестить все рабочие процессы (rphost) в кластере о том, что объект изменился. Если в кластере настроено много рабочих процессов или сеансов, время на синхронизацию кэша метаданных между ними резко возрастает.

Влияние включенной отладки на производительность

Одной из скрытых причин «тормозов» является активный режим отладки на сервере приложений. В логах мы видим вызов IDebugConnection::transmitDebugCommand. Разберем подробнее, почему это критично:

  1. Передача больших данных: Дополнительная обработка — это бинарный файл (.epf). При включенной отладке (параметр -debug в строке запуска службы сервера) сервер тратит значительное время на передачу состояния объектов и самого тела обработки отладчику.
  2. HTTP-протокол отладки: В современных версиях платформы используется HTTP-отладка. Если сетевое соединение между сервером 1С и менеджером отладки нестабильно или нагружено, каждый шаг записи будет сопровождаться ожиданием подтверждения доставки пакетов.
  3. Задержки интерфейса: Даже если конкретный пользователь не нажал кнопку «F5», сам факт того, что сервер работает в режиме IDebugConnection, заставляет систему выполнять дополнительные проверки прав и состояний объектов при их модификации.

Рекомендация: Для проверки гипотезы попробуйте временно перезапустить службу сервера 1С без флага -debug и повторить запись обработки. Если скорость записи нормализуется, необходимо использовать отладку только на тестовых контурах.

Разбор работы механизмов БСП и фоновых заданий

Часто зависание происходит не в момент записи данных в таблицу SQL, а сразу после. Рассмотрим ситуацию, когда отладчик успешно проходит строку Записать(), но управление не возвращается в форму еще долгое время. Выясним причину, изучив код типовых конфигураций. В ERP при записи объекта справочника срабатывают подписки на события.

Посмотрим на пример кода, где может происходить задержка:


// Процедура в модуле формы или в подписке
Процедура ПриЗаписиНаСервере(Отказ, ТекущийОбъект, ПараметрыЗаписи)
    // Вызов служебных механизмов БСП
    ЗаметкиПользователяСлужебный.УстановитьСнятьПометкуУдаленияЗаметок(ТекущийОбъект);
КонецПроцедуры

В современных версиях БСП при записи объекта может инициироваться целый каскад действий:

Если сервер нагружен (высокий процент использования CPU), фоновые задания, отвечающие за эти операции, выстраиваются в очередь. Основной сеанс пользователя переходит в состояние Wait, ожидая завершения критических участков кода в фоновом режиме. Снижение общей нагрузки на процессор (как в решении автора темы) часто «лечит» проблему, так как освобождаются кванты времени для быстрых фоновых потоков.

Проблемы с полнотекстовым поиском и дисковой подсистемой

Если запись длится несколько минут, а SQL-трафик отсутствует (как заметил автор в сообщении 10), проанализируем состояние файлов сервера приложений. При сохранении бинарных данных (обработок) сервер 1С создает временные файлы в каталоге AppData профиля пользователя, под которым запущена служба ragent.

Разберем по шагам, что может мешать процессу:

  1. Антивирусное сканирование: Антивирус может блокировать временный файл .tmp, в который разворачивается обработка перед записью в базу.
  2. Полнотекстовый поиск (ПП): Если индекс ПП поврежден, попытка обновить его при записи нового элемента справочника может привести к таймауту. Попробуйте отключить полнотекстовый поиск через Управление полнотекстовым поиском и проверить скорость записи.
  3. IPv6 и DNS: Метод IClusterLocks может медленно отрабатывать, если сервер пытается обратиться к менеджеру кластера (rmngr) по протоколу IPv6, не получая быстрого ответа. Выясним, настроен ли приоритет IPv4 в операционной системе.

Итоговый алгоритм действий для решения проблемы

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

  1. Очистка серверного кэша: Остановите службу сервера, удалите содержимое папок snacc и временные файлы в каталоге srvinfo. Это исключит влияние старого «мусора» от динамических обновлений.
  2. Проверка режима отладки: Убедитесь, что на промышленном сервере выключен параметр -debug.
  3. Замер производительности: Используйте встроенный замер производительности, но не ограничивайтесь процедурой ПередЗаписью. Важно смотреть время выполнения до самого конца серверного вызова, включая обработчики ПриЗаписи и ПослеЗаписи.
  4. Анализ нагрузки CPU: Если процессор загружен более чем на 80%, сервер приложений 1С начинает испытывать трудности с синхронизацией объектов между рабочими процессами. Оптимизируйте количество рабочих процессов (рекомендуется не менее 1 на каждые 32-64 сеанса в зависимости от объема памяти).
  5. Настройка ТЖ: Если проблема сохраняется, настройте logcfg.xml на сбор событий EXCP (исключения) и ATTN (предупреждения), чтобы увидеть возможные неявные ошибки сетевых интерфейсов кластера.

Соблюдение этих рекомендаций позволит сократить время записи объектов с нескольких минут до нескольких секунд, обеспечив стабильную работу пользователей в системе.

← На главную