Рано или поздно администраторы и разработчики систем на базе «1С:Предприятие 8.3» сталкиваются с критической ошибкой: «Неспецифичная ошибка работы с ресурсом... Недостаточно свободной памяти для выполнения операции». Особенно остро эта проблема проявляется на 32-битных серверах 1С, однако, как показывает практика, сбой может произойти и на 64-разрядных системах.
В этой статье мы подробно разберем, почему возникает эта ошибка, как провести глубокую диагностику системы без «слепого» приобретения дорогостоящих лицензий и как устранить первопричины сбоя на уровне конфигурации и настроек сервера.
---
Для того чтобы эффективно решить проблему, выясним причину ее возникновения. Основной рабочий процесс сервера 1С — это rphost.exe. Именно он отвечает за выполнение серверного кода, запросов к СУБД и подготовку данных для клиента. Сбои в его работе чаще всего обусловлены следующими факторами:
rphost.exe жесткий лимит виртуальной памяти — до 2 ГБ (в редких случаях до 3 ГБ при использовании ключа /3GB в boot.ini, что крайне не рекомендуется для стабильности самой ОС). Как только процесс приближается к этой границе, любое выделение памяти вызывает ошибку.rphost.exe может занимать, например, 2.5 ГБ. Это не значит, что ему физически не хватает оперативной памяти на сервере (где может быть свободно еще 50 ГБ). Из-за постоянного создания и удаления временных таблиц, выборок и объектов память процесса дробится на мелкие фрагменты. Если платформе требуется выделить один непрерывный блок объемом 200 МБ для построения отчета, а максимальный свободный непрерывный фрагмент в памяти равен лишь 50 МБ, система мгновенно выдаст ошибку нехватки ресурсов.---
Прежде чем вносить изменения в рабочую базу, настроим инструмент точной диагностики. Нам необходимо выяснить, какой именно объект конфигурации, отчет или фоновое задание «пожирает» оперативную память. Для этого создадим файл конфигурации технологического журнала logcfg.xml.
Перейдем в каталог шаблонов настроек ТЖ (обычно это C:\Program Files\1cv8\conf\ или C:\Program Files (x86)\1cv8\conf\ для 32-битной версии) и создадим файл logcfg.xml следующего содержания:
<config xmlns="http://v8.1c.ru/v8/tech-log">
<log location="C:\v8_logs\memory_leaks" history="24">
<event>
<eq property="Name" value="CALL"/>
<gt property="Memory" value="104857600"/>
</event>
<event>
<eq property="Name" value="LEAKS"/>
</event>
<event>
<eq property="Name" value="MEM"/>
</event>
<property name="all"/>
</log>
</config>
Проанализируем параметры, которые мы указали в файле настройки:
CALL с фильтром gt property="Memory" value="104857600" позволяет логировать все серверные вызовы, которые потребляют более 100 МБ памяти за один раз. Это поможет моментально отловить тяжелые запросы и неоптимальные отчеты.LEAKS отслеживает классические утечки памяти в коде (например, незакрытые COM-объекты, циклические ссылки в глобальных переменных).MEM фиксирует общую динамику выделения памяти процессами rphost, rmngr и ragent.Важно: Убедитесь, что у учетной записи, от имени которой запущена служба сервера 1С, есть полные права на запись в каталог C:\v8_logs\memory_leaks.
---
Изучив собранные логи Технологического журнала, обратим внимание на свойство Context в строках лога, предшествующих ошибке нехватки памяти. Там будет четко указана строка кода, имя общего модуля или процедура отчета, вызвавшая перерасход.
Рассмотрим частый пример из практики. В нетиповом отчете или обработке заполнения документов (например, при автозаполнении документа «Отражение зарплаты в регл. учете») программисты могут использовать конструкции, которые приводят к геометрическому росту объема обрабатываемых данных.
Посмотрим на пример неоптимального кода:
// Пример неоптимальной выборки, которая может перегрузить rphost
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ЗарплатаОтражение.Сотрудник,
| ЗарплатаОтражение.Субконто1,
| ЗарплатаОтражение.Сумма
|ИЗ
| РегистрНакопления.ЗарплатаАнналитика КАК ЗарплатаОтражение
|// Отсутствие отбора по периоду или организации приводит к чтению всей таблицы в память!";
РезультатЗапроса = Запрос.Выполнить().Выгрузить(); // Выгрузка гигантского массива в ОЗУ
Решение разработчика: Перепишем запрос с использованием временных таблиц, пакетов запросов и обязательных жестких отборов по индексированным полям (период, организация, подразделение). Никогда не выгружайте избыточные данные в таблицу значений на сервере без крайней необходимости — обрабатывайте информацию порциями или непосредственно внутри СУБД.
---
Если быстро переписать код конфигурации силами программистов невозможно, применим административные методы стабилизации сервера. Настроим автоматический перезапуск (рециклинг) процессов rphost.exe, исчерпавших свой лимит.
Разберем по шагам настройку в консоли администрирования серверов 1С:
2000000 КБ (около 1.9 ГБ).120 секундам. Если процесс удерживает память выше лимита дольше этого времени, сервер мягко выключит его и переведет пользователей на новый запущенный процесс.180–300 секунд. Это время дается старым процессам на завершение длительных отчетов пользователей до принудительного закрытия.Для ПРОФ-лицензий возможности точечной настройки ограничены, однако мы можем использовать параметр «Максимальный объем памяти рабочих процессов» в свойствах кластера. Укажите там значение, адекватное физическим возможностям сервера, чтобы избежать полного зависания операционной системы при пиковых нагрузках.
---
Рассмотрим специфический сценарий: ошибка «Недостаточно свободной памяти» возникает только у одного или нескольких конкретных пользователей, в то время как остальные работают абсолютно нормально в тех же самых формах.
Причиной этого является повреждение сохраненных настроек отчетов, динамических списков или внешнего вида форм в системных базах данных 1С или локальном кэше на компьютере пользователя. Платформа при открытии формы пытается восстановить некорректно записанные данные, уходя в бесконечный цикл выделения памяти.
Выполним очистку кэша по шагам:
%localappdata%\1C\1Cv8%appdata%\1C\1Cv8---
Начиная с современных релизов платформы 1С 8.3, администраторам доступен мощный инструмент — «Ограничение потребления ресурсов». Мы можем защитить сервер от падения из-за одного неоптимального отчета.
В консоли администрирования серверов создадим новое правило в разделе «Профили безопасности» или «Безопасность»:
rphost.exe для всех остальных коллег.---
Мы проанализировали причины сбоев памяти и убедились, что в большинстве случаев проблема кроется не в разрядности сервера, а в качестве кода и настроек окружения. Подведем итог нашим действиям:
rphost, предоставив платформе возможность использовать все доступные ресурсы современного серверного оборудования.