Утечки памяти в 1С: как локализовать через технологический журнал и починить в коде | infolimp.ru

Утечки памяти в 1С: как локализовать через технологический журнал и починить в коде

15 мая 2026 · infolimp.ru

Автор: 1С Инсайдер · роль: практик 1С · проверка: типовые конфигурации и рабочие сценарии · 0 комментариев

Сервер 1С с утра отдаёт документы за секунду, к обеду — за пять, к вечеру кладовщики проводят по 30 секунд и звонят в техподдержку. На следующее утро сервис рабочих процессов перезапускали — и снова всё летает. История повторяется неделя за неделей: классическая утечка ресурсов в долгоживущих сеансах. Платформа сама не показывает, кто именно «течёт», а перезапускать сервер каждую ночь — это не решение, это привычка к боли. Разбираем, как заметить утечку до того, как пользователи позвонили, как локализовать причину через технологический журнал и какие приёмы в коде её обычно вызывают.

Как выглядит утечка глазами админа и глазами пользователя

Утечка ресурсов на сервере 1С — это ситуация, когда рабочий процесс с течением времени забирает у системы всё больше памяти и не возвращает её обратно. Симптомы накапливаются медленно и редко привязаны к одному действию. Типичный набор жалоб:

Если хотя бы два из четырёх симптомов совпали с вашей картиной — почти гарантированно утечка ресурсов где-то в коде доработки или внешнего соединения. Просто «нагрузки много» столько памяти не съедают.

Что может «течь» в 1С

Источник утечкиПризнак в логахКак чинится в коде
Незакрытые COM-объекты Накапливаются ссылки на одни и те же имена внешних объектов Явное освобождение ссылки после использования, обработка ошибок через попытку
Долгоживущие массивы и соответствия в общих модулях Память процесса растёт линейно от числа сеансов Локальные переменные внутри процедур, очистка кэша по таймауту
Открытые соединения с внешними системами Растёт количество открытых сокетов на ОС Закрывать соединения сразу после ответа, не держать «на потом»
Файловые потоки без закрытия В логе ОС — обращения к одним и тем же файлам тысячами Закрывать поток в финале даже при исключении

Технологический журнал как инструмент поиска

Что такое технологический журнал

Это серверный лог платформы 1С, который пишет события рабочих процессов: входы и выходы из методов, исключения, обращения к СУБД, операции с памятью. Настраивается через файл `logcfg.xml` в каталоге конфигурации сервера 1С (обычно `conf/`). Без настройки журнал не пишется — платформа экономит ресурсы.

Что включить для поиска утечки

На время диагностики имеет смысл писать события вызовов методов, исключений и специальное событие трекинга утечек. На платформе это категории `CALL`, `EXCP` и `LEAKS` — последняя специально сделана для отслеживания не-освобождённых ссылок в долгих вызовах. Журнал получается объёмный (десятки гигабайт в сутки на нагруженном сервере), поэтому пишут на отдельный диск, фильтруют по проблемному пользователю или сеансу, и не оставляют включённым «на всякий случай».

Самая частая ошибка диагностики — включить технологический журнал на всём сервере «пока не найдём». Через два дня место на диске кончается, журнал перезаписывается, реальной точки прерывания нет. Включайте на одного-двух подозрительных пользователей, на полчаса, с фильтром по сеансу. Этого почти всегда хватает.

Анализ

Главное, что ищем в логе — повторяющиеся пары «вход в метод — выход с исключением» без последующего освобождения ресурса. Если COM-объект открылся, метод упал по исключению и закрытия объекта в логе не видно — это явный кандидат. Или: процедура запускается тысячи раз, каждый раз создаёт массив на 10 тысяч элементов, но ни разу его не очищает — память процесса растёт линейно.

Безопасные приёмы в коде

Большинство утечек в 1С возникают не от изощрённой работы с памятью, а от типовых ошибок: «открыл и забыл закрыть». Базовый защитный приём — обёртка работы с ресурсом в конструкцию обработки исключения, где закрытие ресурса гарантированно выполняется и при ошибке:

// Шаблон: открыли ресурс, поработали, гарантированно закрыли
ВнешнийРесурс = Неопределено;
Попытка
    ВнешнийРесурс = ОткрытьВнешнийРесурс(Путь);
    ОбработатьДанные(ВнешнийРесурс);
Исключение
    ЗаписьЖурналаРегистрации("Утечка-диагностика",
        УровеньЖурналаРегистрации.Ошибка, , ,
        ОписаниеОшибки());
КонецПопытки;

// Освобождение — отдельно, чтобы выполнилось и при ошибке
Если ВнешнийРесурс <> Неопределено Тогда
    ВнешнийРесурс = Неопределено;
КонецЕсли;

Присваивание `Неопределено` отрывает ссылку — платформа освобождает память за следующий проход сборщика. Если ресурс — COM-объект, это критично: без явного отказа от ссылки COM-объект может висеть в памяти до завершения сеанса. На долгоживущем сервере таких висящих объектов набирается за день несколько тысяч.

Чек-лист диагностики

  1. Снять график потребления памяти rphost-процессов за неделю. Подтвердить, что рост есть, и привязать его к рабочим часам.
  2. Идентифицировать одного-двух пользователей, чья активность совпадает с пиками. Опросить: какие операции делают в эти моменты.
  3. На полчаса включить технологический журнал на этих сеансах с категориями `CALL`, `EXCP`, `LEAKS`.
  4. Найти в логе циклически повторяющиеся пары «вход в процедуру — необработанное исключение» или «открытие COM-объекта без последующего закрытия».
  5. Подтвердить гипотезу: воспроизвести сценарий на тестовой базе, замерить рост памяти процесса.
  6. Внести правку в код: обёртка в попытку, явное освобождение ссылки, очистка кэша после использования.
  7. Откатить настройки технологического журнала на минимум. Не оставлять журнал включённым в продакшене после диагностики.

Типичные ошибки

Профессиональные решения для 1С и marketplace-интеграций — каталог отчётов и инструментов на витрине НОПи.

Перейти в каталог решений →