Алгоритм расследования мёртвого кэша и утечек памяти в 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% комиссии — оплата напрямую исполнителю;
  • Исполнители любого масштаба — от отдельных специалистов до команд под проект;
  • Прямой обмен контактами между заказчиком и исполнителем;
  • Безопасная сделка — при необходимости;
  • Рейтинги, кейсы и прозрачная система откликов.

См. также

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

Устал парсить ТЖ 1С gawk-скриптами каждый раз заново - собрал нормальный инструмент. DuckDB под капотом, разбор ТЖ, планов под MS SQL и PostgreSQL, AI-объяснения опционально.

08.07.2026    4970    nazarovss    33    

27

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

Чтобы перейти от тушения инцидентов в 1С к превентивному подходу, нужно заранее видеть рост данных, блокировок, времени выполнения операций и другие признаки будущих проблем. Разбираем, какие метрики технологического журнала 1С и СУБД стоит мониторить в реальном времени и как использовать простые ML-модели – регрессию и классификацию – для прогноза падения производительности. Объясняем, как автоматически выявлять аномалии в поведении пользователей и фоновых заданий, настраивать proactive-алерты за часы или дни до инцидента и создавать тикеты в ITSM-системах на превентивные действия.

02.07.2026    3947    aidar_safin    17    

32

Технологический журнал Программист Бесплатно (free)

Парсинг техжурнала 1С – это не просто «распарсить JSON» или CSV, а работа с множеством неочевидных особенностей формата. Показываем, какие проблемы могут возникнуть из-за дублей свойств и событий, «полей-призраков», нестандартных имен свойств, разрозненного контекста, кавычек, апострофов и других нюансов, которые легко ломают парсеры и искажают результаты анализа. Объясняем, чем может помочь ИИ при работе с техжурналом и почему даже при использовании современных инструментов важно понимать внутреннюю логику логов. В статье собраны главные правила надежного парсинга и примеры ситуаций, где техжурнал может неожиданно показать свою «темную сторону».

17.06.2026    4499    Andreynikus    9    

26

Технологический журнал Мониторинг Программист 1С 8.3 Абонемент ($m)

Решение-заготовка для автоматического мониторинга и расследования технологических инцидентов в случаях невозможности использования решений КИП.

1 стартмани

29.05.2026    2422    8    tori131313    3    

11

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

Графическая утилита, сделанная по принципу Microsoft SQL Server Profiler, но для СУБД PostgreSQL Позволяет легко настраивать сбор планов запросов как средствами PostgreSQL, так и технологическим журналом 1С Предприятие с их последующей визуализацией. Простая, понятная для пользователей утилита, не требующая прав администратора для визуализации, и требующая их для настройки. Скомпилированная в исполняемый файл.

20.05.2026    4050    capitan    4    

10

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

Пошаговая методика поиска утечек памяти в 1С через технологический журнал: как связать события CALL и LEAKS по clientID, агрегировать тысячи строк стеков вызовов в компактное дерево сценариев, классифицировать проблему без открытия конфигуратора и упаковать результат в готовую задачу разработчику — с bash-скриптами для каждого шага и разбором на реальном примере

17.04.2026    5231    maraty    9    

20

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

Пользователи жалуются на медленную работу 1С, система нестабильна под нагрузкой, а попытки «починить» не дают результата? В статье разбираем, как подойти к оптимизации производительности комплексно: от анализа инфраструктуры и базы данных до уровня кода и пользовательских операций. Показываем пошаговый подход «аудит – оптимизация – контроль» и объясняем, какие инструменты помогают быстро выявить и устранить узкие места. На реальном примере проходим путь от первичного мониторинга до внедрения оптимизаций и стабилизации системы.

06.04.2026    3025    kulmaksim    0    

10

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

tjclick - кроссплатформенная утилита для копирования логов технологического журнала платформы 1С в КликХаус

10 стартмани

02.04.2026    1434    1    SerVer1C    0    

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

Добавлю с практической стороны: пока делал похожую штуку по нагрузке кластера, заметил, что rac process list уже отдаёт memory-size и memory-excess-time по каждому rphost - процесс, который долго сидит за безопасным лимитом, виден прямо из консоли администрирования, без тех-журнала. Экономит шаг: сначала смотришь, кто конкретно кандидат на утечку, и только на него уже включаешь logcfg с фильтром из статьи, а не пишешь лог на весь кластер.
2. Ninel_S 4 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 4 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
Для отправки сообщения требуется регистрация/авторизация