Как устранить ошибку «Недостаточно памяти для выполнения результата запроса» при закрытии месяца в 1С:УНФ на MS SQL Server

Системный администратор 1С v8.3 (Управляемые формы) 1С:Управление нашей фирмой Управленческий учет IT и автоматизация бизнеса
← На главную

Процедура закрытия месяца в программе 1С:Управление нашей фирмой является одной из самых ресурсоемких операций. Во время ее выполнения платформа рассчитывает себестоимость, выполняет прямые и косвенные распределения затрат, а также строит сложные графы движений по регистрам. Нередко в клиент-серверном режиме работы на базе MS SQL Server администраторы и пользователи сталкиваются с аварийным завершением процесса и ошибкой о нехватке памяти. При этом в файловом режиме база может закрываться без ошибок. Разберем детально, почему возникает данная проблема и как ее устранить на уровне инфраструктуры, СУБД и самой базы 1С.

Причины возникновения ошибки

Проанализируем основные факторы, которые приводят к переполнению памяти и сбою выполнения регламентной операции:

  1. Конкуренция за оперативную память между MS SQL Server и сервером 1С. Если СУБД и служба сервера 1С (процессы rphost, rmngr) установлены на одном сервере, SQL Server по умолчанию захватывает всю доступную RAM под свой буферный пул (Buffer Pool). Когда серверу 1С требуется выделить непрерывный блок памяти для получения и обработки результата тяжелого запроса от СУБД, свободной физической памяти в операционной системе не остается.
  2. Нехватка дискового пространства под лог транзакций и базу tempdb. При массовом пересчете документов и движений файл журнала транзакций (LDF) базы данных и системная база tempdb лавинообразно увеличиваются в размерах. Если на диске заканчивается место для автоматического расширения файлов (Autogrowth), СУБД аварийно прерывает выполнение запроса.
  3. Отрицательные остатки и циклические ссылки в учете. Наличие отрицательных остатков на складах, встречный выпуск полуфабрикатов или некорректная аналитика в регистрах учета запасов заставляют алгоритм расчета партий перебирать колоссальное количество комбинаций, порождая декартово произведение строк и переполняя память.
  4. Устаревшая статистика и неоптимальные планы запросов. Отсутствие актуальной статистики в MS SQL приводит к тому, что оптимизатор выбирает неэффективные планы соединений таблиц (например, Hash Match с запросом избыточного объема Memory Grant).
  5. Неактуальные итоги регистров накопления. Если граница рассчитанных итогов сдвинута в прошлое, платформе приходится сканировать первичные таблицы движений за все периоды, вместо использования готовых таблиц остатков.

Шаг 1. Настройка оперативной памяти и дискового пространства

Разберем инфраструктурные параметры, которые в первую очередь влияют на стабильность выполнения тяжелых запросов:

  1. Увеличение объема RAM. Для совмещенной работы сервера 1С (х64) и MS SQL Server 16 ГБ оперативной памяти часто оказывается критически мало при больших объемах данных. Увеличение RAM до 32 ГБ и выше позволяет выделить достаточный объем памяти как для процессов rphost, так и для буфера СУБД.
  2. Ограничение памяти в MS SQL Server (Max Server Memory). Откроем свойства сервера в SQL Server Management Studio (SSMS), перейдем на вкладку Память (Memory) и зафиксируем параметр Максимальный размер памяти сервера. Необходимо оставить под нужды операционной системы и рабочих процессов 1С не менее 25–35% физической памяти сервера.
  3. Контроль свободного места на дисках. Убедимся, что на дисках, где расположены файлы базы данных (MDF), журнала транзакций (LDF) и системной базы tempdb, имеется достаточный запас свободного пространства (не менее 30–50 ГБ). В момент закрытия месяца лог транзакций может вырастать на десятки гигабайт.
  4. Оптимизация базы tempdb. Разместим файлы tempdb на быстром SSD/NVMe-накопителе и создадим несколько файлов данных одинакового размера (по числу физических ядер процессора, но не более 8).

Шаг 2. Настройка параметров кластера серверов 1С:Предприятия

Рассмотрим настройки кластера 1С, которые помогают избежать зависания и падения рабочих процессов:

  1. Откроем консоль Администрирование серверов 1С:Предприятия.
  2. В свойствах кластера найдем параметр Режим распределения нагрузки и установим значение Приоритет по памяти.
  3. Зададим Допустимый объем памяти и Интервал превышения допустимого объема памяти, чтобы служба корректно перезапускала исчерпавшие лимиты процессы без падения всего сеанса.
  4. Настроим Периодичность перезапуска рабочих процессов, чтобы освобождать накапливающуюся фрагментированную память после тяжелых регламентных заданий.

Шаг 3. Локализация ошибок в данных и поэтапное закрытие месяца

Если серверные ресурсы настроены, но ошибка сохраняется, выясним причину внутри учетных данных:

  1. Поэтапное выполнение операций. Откроем обработку Закрытие месяца и выполним расчет не целиком, а по отдельным регламентным операциям (отключая и включая соответствующие флаги). Это позволит точно выявить операцию, на которой происходит сбой (например, расчет прямых затрат или распределение косвенных расходов).
  2. Проверка отрицательных остатков. Сформируем отчеты по запасам и убедимся, что на дату закрываемого периода отсутствуют отрицательные остатки по количеству и суммам. Не должно быть ситуаций с нулевым количеством и зависшей стоимостью.
  3. Проверка аналитики. Проверим корректность заполнения подразделений, номенклатурных групп и спецификаций, исключая встречный выпуск продукции по замкнутому кругу без явного указания порядка переделов.

Шаг 4. Регламентное обслуживание базы данных

Выполним обязательные регламентные процедуры для поддержания корректной работы СУБД и платформы:

  1. Обновление статистик в MS SQL. Запустим регламентное задание обслуживания или выполним SQL-скрипт с параметром FULLSCAN для всех таблиц базы данных: EXEC sp_updatestats;
  2. Реиндексация и дефрагментация. Выполним перестроение индексов таблиц для ускорения выполнения выборок.
  3. Пересчет итогов в 1С. В режиме Конфигуратора перейдем в меню Администрирование -> Тестирование и исправление..., выберем пункт Пересчет итогов и запустим обработку. Также можно воспользоваться стандартной обработкой управления итогами, чтобы перенести границу рассчитанных итогов на конец текущего учетного периода.
← На главную