Расчёт себестоимости в крупных информационных базах 1С:ERP Управление предприятием — это одна из самых ресурсоёмких операций. Ошибка Недостаточно памяти для получения результата запроса к базе данных на этапе закрытия месяца обычно возникает спустя несколько часов работы алгоритма. Это критическая ситуация, которая останавливает получение финансового результата предприятия. Проанализируем причины этой проблемы и разберем по шагам методы её решения.
Для начала выясним причину, почему программа потребляет так много ресурсов. В основе расчёта себестоимости в 1С:ERP (при использовании метода «Средняя за месяц») лежит решение Системы линейных алгебраических уравнений (СЛАУ). Программа строит гигантскую матрицу, где переменными выступают стоимости товаров, а коэффициентами — их количественные движения.
Рассмотрим подробнее факторы, раздувающие объем используемой памяти:
ТаблицаЗначений или внутреннего представления данных. Если срез данных по СЛАУ превышает этот порог, процесс аварийно завершается.Проанализируем технологическое решение, предложенное в сообщениях форума. В старых версиях ERP (до 2.4.8) и платформы решение уравнений выполнялось скриптами на стороне СУБД (MS SQL или PostgreSQL). Это было медленно и требовало колоссальных ресурсов SQL-сервера.
Начиная с платформы 8.3.14 и конфигурации 2.4.8, появилось Native-решение СЛАУ. Теперь вычисления выполняются не в SQL, а на сервере приложений 1С с использованием оптимизированных математических библиотек на языке C++. Рассмотрим, как это активировать и что это дает:
Если обновление в моменте невозможно, или оно не помогло до конца, разберем по шагам внутренние настройки ERP. Перейдем в раздел НСИ и администрирование — Настройка НСИ и разделов — Финансовый результат и контроллинг — Учет затрат.
Проанализируем параметры в подразделе «Параметры расчета себестоимости»:
0.000001. Если в данных есть «шум» (копеечные остатки), матрица может не сходиться. Попробуем снизить точность до 0.001 или даже 0.01. Это значительно ускорит «схлопывание» итераций и снизит потребление памяти.Выясним причину ошибки на уровне инфраструктуры. Часто фраза «Недостаточно памяти» относится к временным таблицам TempDB в MS SQL или параметру work_mem в PostgreSQL.
Посмотрим, что можно сделать системному администратору:
TempDB располагался на быстром SSD и имел достаточно места для роста. Ограничение роста TempDB — частая причина падения тяжелых запросов 1С.work_mem. Однако будьте осторожны: этот объем памяти выделяется на каждую операцию внутри каждого запроса. Слишком большое значение может привести к тому, что память закончится на уровне операционной системы.Безопасный расход памяти за один вызов и Максимальный объем памяти рабочих процессов. Если лимиты установлены слишком жестко, платформа будет принудительно завершать «прожорливый» сеанс расчёта.Иногда корень проблемы кроется в «зависших» копейках. Рассмотрим ситуацию: на складе числится 0 единиц товара, но висит стоимость 0.01 руб. При расчете СЛАУ эти хвосты создают лишние связи в матрице.
Выполним следующие действия:
СебестоимостьТоваров и ВыручкаИСебестоимостьПродаж на наличие записей с нулевым количеством и ненулевой стоимостью.Инвентаризация или Оприходование излишков.Если ваша база данных продолжает расти, а ресурсы сервера на пределе, единственным стратегическим решением будет переход на ERP версии 2.5. В этой версии архитектура учета затрат была пересмотрена.
Выясним преимущества новой версии:
Резюме: Если вы столкнулись с ошибкой памяти на версии 2.4.7, в первую очередь обновите платформу до 8.3.14+ и конфигурацию до 2.4.8+, чтобы задействовать встроенный в платформу решатель СЛАУ. Если это не помогло, переходите к анализу точности расчёта в настройках и проверке чистоты данных в регистрах накопления.