Алгоритм расследования мёртвого кэша и утечек памяти в 1С

24.08.26

База данных - Технологический журнал

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

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

1. Архитектура памяти 1С: rphost, rmngr и специфика кэширования

Ошибочно считать процесс rphost единственным виновником нехватки памяти. В высоконагруженных системах критическую роль играет rmngr (менеджер кластера), кэширующий сеансовые данные, управляющий блокировками и полнотекстовым поиском. Утечки в rmngr способны обрушить кластер не реже, чем тяжелый BSL-код в рабочих процессах.

Анализируя метрику Private Bytes, необходимо отличать утечку от прогрева кэша платформы. После рестарта службы 1С агрессивно кэширует скомпилированные модули и метаданные. Линейный рост в первые часы работы — это штатный прогрев. Настоящая утечка диагностируется только тогда, когда потребление не останавливается после пробития лимитов платформы и не снижается при падении пользовательской нагрузки.

Системная метрика Описание Ключевой фактор для аудита
Private Bytes (Commit) Виртуальная память, эксклюзивно запрошенная процессом у ОС. Главный индикатор утечки памяти только на длинной дистанции (после прогрева кэша).
Working Set Объем физической RAM, занятый страницами процесса в данный момент. Метрика может скрывать утечку, если неактивные страницы вытесняются в своп.
Page File Usage (Своп) Память, выгруженная на диск из-за дефицита физической RAM. Критический триггер деградации производительности (появление фризов и таймаутов).

 

2. Истинные источники «мёртвого кэша»

Мёртвый кэш — это структуры, удерживаемые в памяти из-за активных входящих ссылок. Современный сборщик мусора 1С успешно разрешает простые циклические ссылки объектов, однако существуют зоны риска, которые сборщик мусора обойти не в силах.

Объект / Механизм Механика утечки и риски
Пулы сеансов (HTTP-сервисы) Сеанс HTTP-сервиса не уничтожается после ответа, а засыпает. Мутабельные переменные и временное хранилище без явной очистки остаются в rphost навсегда. Особенно это критично при обработке тяжелых JSON-пайплайнов (например, подготовка векторных данных для RAG-ассистентов или поисковых API).
COM-объекты Неконтролируемое создание Excel.Application или внешних коннекторов без явного вызова методов закрытия и обнуления переменных.
Кэш общих модулей Передача мутабельных коллекций (Массив, Структура, ТЗ) в параметры кэшируемой функции. Платформа плодит дублирующие ветки кэша при любом изменении исходной коллекции.
Транзакционный кэш Накопление данных монолитной транзакции при длительной обработке выборок без порционной фиксации (батчинга).

 

3. Ловушки Технологического журнала

Сбор метрик Memory и MemoryPeak — мощный инструмент, но фильтрация событий со скачками свыше 100 МБ помогает отловить только тяжелые, неоптимальные запросы. Настоящая утечка имеет накопительный характер: тысячи вызовов могут забирать по 1 МБ, не освобождая их. Представленный ниже XML ловит именно «слонов», которые могут стать причиной резкого срабатывания лимитов безопасности.

logcfg.xml
<?xml version="1.0" encoding="UTF-8"?>
<config xmlns="http://v8.1c.ru/v8/tech-log">
  <dump create="false"/>
  <log location="C:\LOGS\1C_Memory_Trace" history="48">
    <!-- Фиксация контекстных вызовов с расходом памяти более 100 МБ -->
    <event>
      <eq property="Name" value="CALL"/>
      <gt property="Memory" value="104857600"/>
    </event>
    <event>
      <eq property="Name" value="SCALL"/>
      <gt property="Memory" value="104857600"/>
    </event>
    <!-- Корректная обертка для выгрузки всех свойств -->
    <properties>
      <property name="all"/>
    </properties>
  </log>
</config>

 

4. Иллюзия анализа нативных C++ дампов

Снятие дампов через утилиты вроде procdump -ma генерирует файлы, содержащие нативный код кучи C++. Поскольку фирма «1С» (в отличие от Microsoft) не предоставляет отладочные символы (PDB-файлы) в открытый доступ, самостоятельный анализ дампа в WinDbg бессмысленен. Вы не сможете транслировать шестнадцатеричные адреса обратно в имена объектов метаданных или структуры BSL. Снятие дампа — это процедура исключительно для передачи фактуры в официальную техподдержку 1С.

 

5. Транзакционный паттерн: защита от Deadlock

Обработка тяжелых выборок требует порционной фиксации данных (батчинга) для сброса кэша блокировок. Но код без перехвата исключений оставляет зависшие транзакции при первой же ошибке, вызывая глобальные таймауты (Lock timeout). Единственно верный паттерн — использование конструкции Попытка/Исключение.

1C:Enterprise (BSL) — Продакшен-паттерн
РазмерПачки = 500;
Счетчик = 0;

НачатьТранзакцию();
Попытка
    Пока Выборка.Следующий() Цикл
        Объект = Выборка.ПолучитьОбъект();
        // ... модификация данных объекта
        Объект.Записать();
        Счетчик = Счетчик + 1;

        Если Счетчик % РазмерПачки = 0 Тогда
            ЗафиксироватьТранзакцию(); // Сброс кэша и блокировок
            НачатьТранзакцию();
        КонецЕсли;
    КонецЦикла;

    Если ТранзакцияАктивна() Тогда
        ЗафиксироватьТранзакцию();
    КонецЕсли;

Исключение
    // Гарантированный откат транзакции при сбое на любом этапе
    Если ТранзакцияАктивна() Тогда
        ОтменитьТранзакцию();
    КонецЕсли;
    
    ЗаписьЖурналаРегистрации("МассоваяОбработка", УровеньЖурналаРегистрации.Ошибка,,, ОписаниеОшибки());
    ВызватьИсключение; // Передаем управление выше
КонецПопытки;

 

6. Временное хранилище и пулы HTTP-сервисов

Помещение данных во временное хранилище без UUID формы — классическая утечка. В пулах сеансов веб- и HTTP-сервисов этот антипаттерн приводит к катастрофе. Если интеграционный код поместил бинарный файл в хранилище без привязки к уникальному идентификатору, он останется в памяти rphost даже после отправки HTTP-ответа 200 OK, ожидая переиспользования заснувшего сеанса.

1C:Enterprise (BSL) — Работа с хранилищем
// ПАТТЕРН 1: Привязка к закрытию контекста формы
АдресХранилища = ПоместитьВоВременноеХранилище(ТаблицаБольшихДанных, УникальныйИдентификатор);

// ПАТТЕРН 2: Обязательная явная очистка в фоновых/HTTP-заданиях
УдалитьИзВременногоХранилища(АдресХранилища);

 

7. Архитектурный контроль и инструменты

Статические анализаторы (SonarQube с BSL LS) полезны, но они не способны полностью отследить передачу мутабельных параметров в кэшируемые модули из-за динамической типизации 1С. Полагаться исключительно на статический код-анализ нельзя. Архитектура стабильного кластера строится на следующих правилах:

  1. Жесткие лимиты рабочих процессов: Настройте параметры «Безопасный расход памяти за один вызов» (пресекает тяжелые неоптимальные вызовы) и «Максимальный объем памяти рабочих процессов» (запускает мягкий рестарт rphost без потери сеансов при накоплении утечек).
  2. Строгий Code Review: Ручной контроль отсутствия коллекций в сигнатурах кэшируемых функций и контроль очистки пулируемых HTTP-сеансов.
  3. Осторожность со сбросом кэша: Метод ОбновитьПовторноИспользуемыеЗначения() под высокой нагрузкой может вызвать асинхронный шквал запросов (Cache Stampede), приводящий к просадке CPU и мнимому зависанию баз.

Чеклист аудита потребления памяти в 1С

Область проверки Критерий успеха Статус
Технологический журнал Настроен синтаксически корректный logcfg.xml для перехвата CALL/SCALL > 100 МБ для отсева "тяжелых" запросов. [ ] Выполнено
HTTP/Web-сервисы Код интеграционных шлюзов содержит явные вызовы обнуления коллекций и очистки временного хранилища перед возвратом ответа. [ ] Выполнено
Кэш функций В общие модули "Повторное использование" передаются только скалярные примитивные типы или ссылки. [ ] Выполнено
Батчинг транзакций Циклы обработки обернуты в Попытка/Исключение с обязательным вызовом ОтменитьТранзакцию() при сбоях. [ ] Выполнено
Параметры кластера Установлены лимиты "Безопасного расхода на вызов" и параметры мягкого рестарта рабочих процессов. [ ] Выполнено

Вступайте в нашу телеграмм-группу Инфостарт

Вы можете заказать платную адаптацию этой статьи под ваши задачи на «Бирже заказов».

  • 0% комиссии — оплата напрямую исполнителю;
  • Исполнители любого масштаба — от отдельных специалистов до команд под проект;
  • Прямой обмен контактами между заказчиком и исполнителем;
  • Безопасная сделка — при необходимости;
  • Рейтинги, кейсы и прозрачная система откликов.

См. также

HighLoad оптимизация Инструментарий разработчика Технологический журнал Разработчик 1С 8.3 Россия Абонемент ($m)

Скрипт tj_baseline.py собрал акт замеров из технологического журнала: 7 повторов до и 7 после замены запросов в цикле на «Нано-УТ 2.0». Справка на 150 строк ускорилась с 817,0 до 145,0 мс, проверка доступности с 301,3 до 2,2 мс. При 120 и 300 вызовах в день и ставке 800 руб. выгода 9353 руб. в год по журналу, 4939 руб. по секундомеру без журнала. В архивах скрипт, тесты, журналы опыта, образец приложения к договору и калькулятор.

7 стартмани

27.10.2026    222    Ninel_S    0    

1

HighLoad оптимизация Администрирование СУБД Технологический журнал Системный администратор Разработчик 1С 8.3 Абонемент ($m)

Проверила на стенде совет «сортируйте строки перед записью»: 1С 8.3.27 на PostgreSQL, учебная «Нано-УТ», 20 потоков и по 2000 документов на каждый способ записи движений. Взаимоблокировки дают построчный захват (99 % ошибок) и повышение разделяемой блокировки до исключительной (95 %, сортировка не помогает); одна блокировка на весь набор работает без сортировки. Плюс механика PostgreSQL, дерево ожиданий через pg_blocking_pids, TDEADLOCK в журнале и единицы порога TLOCK в logcfg.xml. В архиве стенд, выгрузка конфигурации и журналы прогона.

5 стартмани

22.10.2026    342    Ninel_S    10    

1

Журнал регистрации Инструменты администратора БД Технологический журнал Мониторинг Системный администратор Разработчик 1С 8.3 1С 8.5 1С:Управление торговлей 11 Абонемент ($m)

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

3 стартмани

19.10.2026    410    6    windsurf    0    

3

HighLoad оптимизация Технологический журнал Сервера Запросы Системный администратор Разработчик 1С 8.3 1С 8.5 1С:Бухгалтерия 3.0 Бесплатно (free)

Составной отчет формировался 15 минут. Вместо перебора разделов одна команда rac показала, что сеанс занят запросом к СУБД, а временный техжурнал с порогом 20 секунд за один прогон назвал виновника: один SQL на 240 секунд и точную строку модуля. В статье четыре разные картины «висит» и как их различить: идет запрос в СУБД, клиент ждет невидимое модальное окно, зомби-вызов после закрытого клиента, зависшее фоновое задание. Пример logcfg.xml, разбор события DBMSSQL с полем Context, замер пакета запросов по временным таблицам, регламентное задание, которое «выполнено», а данные стоят, и шпаргалка по диагностике.

16.10.2026    1024    Konstmax13    6    

2

Технологический журнал Сервера EDT Обновление 1С Системный администратор Разработчик 1С 8.3 1С 8.5 1С:Бухгалтерия 3.0 Бесплатно (free)

Конфигуратор и агент EDT тихо вылетают на 0 % «Обработки структуры базы данных», EDT пишет «Потеряно соединение с агентом конфигуратора», а модель проекта при этом чистая. Разбор двух аварий на большой серверной базе БП КОРП: какие факты снимать (журнал Windows, техжурнал нужной версии, хвост лога процесса), почему инкрементальная выгрузка EDT ломается после сбоев, как довести обновление пакетно через /UpdateDBCfg -Server, как опознать свои rphost среди нескольких кластеров и снять агент EDT, который сам поднимается и держит базу. Протокол одного дня по минутам и порядок диагностики из восьми шагов.

15.10.2026    402    Konstmax13    0    

0

HighLoad оптимизация Инструменты администратора БД Системный администратор Разработчик 1С 8.3 Абонемент ($m)

Найдите сеанс, занявший память rphost, и выведите процесс из работы тремя шагами через rac, не обрывая остальные сеансы. Прогнано на платформе 8.3.27.2130 (Windows) с серверной базой и фоновыми заданиями: в статье реальный вывод rac, замеры памяти и запись технологического журнала. Утилита на Python и скрипты в архиве. Linux не проверялся.

1 стартмани

30.09.2026    1161    Ninel_S    0    

2

HighLoad оптимизация Технологический журнал Разработчик 1С:Предприятие 8 Бесплатно (free)

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

21.09.2026    1331    markbraer    1    

5

Технологический журнал Системный администратор Разработчик 1С 8.3 Бесплатно (free)

База ERP, 400 пользователей, сервер загружен, 1С подвисает, доступа к SQL Server нет. Оптимизировать можно бесконечно, вопрос в том, с чего начать. ЦУП это платная лицензия и отдельная стройка, а технологический журнал встроен в платформу, включается одним файлом и на боевой базе в рабочее время не вызвал ни одной жалобы от пользователей. Разбираю, что он собой представляет, где лежит настройка, как читается строка события и что означает каждое из одиннадцати событий, которые я видел в журналах боевой ERP. Плюс рабочий logcfg.xml, три ловушки, на которых отчёт получается красивым и неверным, и шесть находок за один прогон.

07.09.2026    2402    nedomolkov.ivan    0    

3
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. nedomolkov.ivan 485 24.08.26 09:57 Сейчас в теме
Дельная статья, взял на заметку logcfg с фильтром по Memory > 100 МБ - удобно сразу отсеять неоптимальные запросы, а не тонуть в потоке событий CALL.

Добавлю с практической стороны: пока делал похожую штуку по нагрузке кластера, заметил, что rac process list уже отдаёт memory-size и memory-excess-time по каждому rphost - процесс, который долго сидит за безопасным лимитом, виден прямо из консоли администрирования, без тех-журнала. Экономит шаг: сначала смотришь, кто конкретно кандидат на утечку, и только на него уже включаешь logcfg с фильтром из статьи, а не пишешь лог на весь кластер.
2. Ninel_S 214 24.08.26 11:19 Сейчас в теме
(1)
Дельная статья, взял на заметку logcfg с фильтром по Memory > 100 МБ - удобно сразу отсеять неоптимальные запросы, а не тонуть в потоке событий CALL.

Добавлю с практической стороны: пока делал похожую штуку по нагрузке кластера, заметил, что rac process list уже отдаёт memory-size и memory-excess-time по каждому rphost - процесс, который долго сидит за безопасным лимитом, виден прямо из консоли администрирования, без тех-журнала. Экономит шаг: сначала смотришь, кто конкретно кандидат на утечку, и только на него уже включаешь logcfg с фильтром из статьи, а не пишешь лог на весь кластер.


Однако предложенная схема с динамическим включением ТЖ имеет архитектурное ограничение. Если rac рапортует о раздувании процесса, событие выделения памяти (CALL/SCALL) уже завершилось, и ТЖ не покажет нам виновный BSL-код.
Мы решаем эту задачу параллельным конвейером:
В фоне постоянно держим легковесный logcfg.xml с фильтрацией событий по объёму памяти (диск он не нагружает, так как пишет только аномалии):
<event>
<eq property="name" value="CALL"/>
<gt property="memory" value="104857600"/> <!-- 100 МБ -->
</event>
Через rac настраиваем триггеры в Zabbix/Prometheus. При превышении лимитов мы используем rac для автоматизации реагирования — например, переводим проблемный rphost в режим выключения (активность off), чтобы новые сеансы уходили на другие процессы, и спокойно снимаем дамп через procdump -ma без зависания активных пользователей.
Прикрепленные файлы:
logcfg.xml
3. Ninel_S 214 24.08.26 11:47 Сейчас в теме
Дополню. В предыдущем сообщении выложила файл logcfg.xml, но есть вариант более адекватный требованиям 1С. Во втором варианте добавлено свойство Sql (регистр критичен) - теперь при превышении порога в 50 МБ или длительности в 5 секунд для событий DBMSSQL и DBPOSTGRS вы будете видеть не просто факт медленного запроса, а полный текст SQL-запроса. Это позволит быстро понять, какая именно таблица базы данных перегружена. Добавлены свойства Exception и Descr: Без этих свойств события системных ошибок (EXCP) и принудительного завершения процессов (ATTN) записывались бы пустыми. Теперь ТЖ будет фиксировать полное описание ошибки и её детальный текст.
Исключены избыточные свойства Date и Name: Они всегда пишутся платформой по умолчанию в начале каждой строки лога. Их явное указание в секции свойств привело бы к дублированию или синтаксической избыточности.
Добавлены связующие свойства (SessionID, t:connectID, p:processName): Они необходимы для сквозного расследования. С их помощью вы сможете легко сопоставить конкретную строчку ТЖ с номером сеанса пользователя в консоли кластера 1С и конкретным рабочим процессом rphost на сервере.
Прикрепленные файлы:
logcfg-v2.xml
Для отправки сообщения требуется регистрация/авторизация