При формировании тяжелых отчетов в системе «1С:Предприятие» пользователи часто сталкиваются со следующей ошибкой: «Нехватка памяти на сервере». Попытки системных администраторов решить эту проблему самостоятельно, изменяя параметры кластера в консоли администрирования (например, уменьшая количество баз на один рабочий процесс или меняя количество соединений), нередко приводят к полной остановке работы сервера и невозможности запустить новые сеансы.
В этой статье мы подробно разберем, почему возникают подобные ситуации, как правильно настроить кластер серверов 1С, в чем разница между лицензиями ПРОФ и КОРП при тюнинге рабочих процессов, а также как раз и навсегда решить проблему избыточной утилизации оперативной памяти (ОЗУ).
Проанализируем техническую архитектуру процессов платформы. В 32-битных операционных системах и при использовании 32-битной версии сервера «1С:Предприятие 8» любой рабочий процесс rphost имеет жесткое ограничение на объем адресуемой оперативной памяти. Этот лимит заложен на уровне архитектуры операционной системы и составляет ровно 2 ГБ (в очень редких случаях при тонкой настройке ОС предел можно сдвинуть до 3 ГБ, но это нестабильное решение, работающее как временный костыль).
Современные прикладные конфигурации, такие как 1С:Управление торговлей (особенно редакции 11), 1С:ERP Управление предприятием или 1С:Комплексная автоматизация, работают с огромными массивами метаданных. При формировании отчета за большой период без жестких отборов рабочий процесс моментально упирается в этот 2-гигабайтный барьер. Происходит аварийное завершение процесса rphost, все пользователи текущего процесса выбрасываются из системы, а на экранах появляется сообщение об ошибке нехватки памяти.
Решение: Переход на 64-разрядный сервер «1С:Предприятие». В 64-битной архитектуре один процесс rphost может адресовать колоссальный объем памяти, ограниченный лишь физическими возможностями вашего оборудования.
Рассмотрим ситуацию, когда администратор пытается оптимизировать потребление памяти, изменив в консоли администрирования параметр Количество ИБ на процесс (например, установив значение 1 вместо дефолтных 8). После этого сервер вообще перестает впускать пользователей, и новые сеансы не запускаются.
Дело в том, что начиная с версии платформы 8.3.15, компания «1С» внедрила строгий автоматический контроль использования функций КОРП. К возможностям, требующим исключительно лицензии КОРП, относятся практически все тонкие настройки кластера серверов:
Количество ИБ на процесс;Количество соединений на процесс;Безопасный расход памяти за один вызов;Если на вашем сервере установлены лицензии уровня ПРОФ, изменение любого из этих параметров в консоли администрирования кластера приводит к блокировке запуска рабочих процессов rphost. Платформа распознает несанкционированное использование КОРП-функционала и запрещает инициацию новых сессий, выдавая ошибку или просто не создавая новые процессы.
Единственное исключение — если в кластере работает суммарно не более 10 пользователей одновременно. В этом случае технические ограничения КОРП не активируются. Но как только пользователей становится больше 10, сервер на лицензиях ПРОФ с измененными настройками кластера просто перестает работать.
Решение: Если у вас используются лицензии ПРОФ, верните все настройки кластера по умолчанию. Параметр Количество ИБ на процесс должен быть равен 8 (или 0 в зависимости от версии платформы), а остальные параметры — сброшены до стандартных системных значений.
Если вы являетесь обладателем лицензий КОРП, мы можем гибко управлять памятью рабочих процессов, чтобы избежать падения всего сервера из-за одного неоптимального отчета. Посмотрим на ключевые параметры в свойствах кластера, которые нужно настроить:
rphost не падает, и другие пользователи продолжают комфортно работать в этой же базе.rphost превысил лимит памяти, платформа помечает его как «неактивный» и запускает новый «чистый» процесс. Однако старый процесс с накопленной памятью может продолжать висеть в диспетчере задач операционной системы очень долго, пока все сеансы из него не перейдут на новый. Чтобы оперативно высвобождать память, обязательно включите опцию принудительного завершения и укажите таймаут ожидания (например, от 60 до 120 секунд).Даже если мы установим 64-битный сервер и добавим терабайты оперативной памяти, плохой код или неоптимальный запрос все равно способны утилизировать все ресурсы. Разберем основные архитектурные ошибки при разработке и использовании отчетов.
1. Обращение через точку к реквизитам составного типа. Посмотрим на классический пример неоптимального запроса:
ВЫБРАТЬ
Продажи.Регистратор.Организация КАК Организация,
Продажи.СуммаОборот КАК Сумма
ИЗ
РегистрНакопления.Продажи.Обороты КАК Продажи
Если поле Регистратор имеет составной тип (например, может ссылаться на десятки различных видов документов), СУБД будет вынуждена выполнить левое соединение со всеми таблицами этих документов. На уровне SQL-сервера сгенерируется гигантский план запроса, выполнение которого потребует колоссального объема ОЗУ как на стороне СУБД, так и при передаче временных таблиц в 1С. Для оптимизации всегда используйте явное приведение типов с помощью конструкции ВЫРАЗИТЬ.
2. Выгрузка больших массивов данных в память (Таблицы значений). Разработчики часто отказываются от механизмов СКД (системы компоновки данных) и пишут код, который выгружает результат тяжелого запроса в таблицу значений на сервере, а затем перебирает её в цикле. СКД умеет работать с данными порционно, оптимизируя потребление памяти. Ручная обработка таблиц значений объемом в сотни тысяч строк гарантированно приведет к исчерпанию оперативной памяти процесса.
3. Отсутствие обязательных отборов. Обязательно настраивайте в отчетах ограничения по периоду, организации или складу. Если пользователь пытается сформировать отчёт по продажам за 5 лет без отборов по номенклатуре или контрагентам, сервер 1С попытается поднять в память миллионы записей, что приведет к аварийному завершению работы процесса.
Проанализируем ситуацию и составим пошаговый алгоритм действий для устранения проблемы нехватки памяти: