Каждый администратор и программист 1С рано или поздно сталкивается с ситуацией, когда один из важнейших управленческих отчетов — «Себестоимость товаров» в конфигурации «Управление торговлей» (УТ 11) — внезапно начинает зависать. Еще вчера отчет за два месяца формировался за считанные минуты, а сегодня расчет за один день длится часами или вовсе аварийно завершается с ошибкой «Недостаточно памяти». При этом сервер может обладать внушительными характеристиками, например, 32 Гб оперативной памяти и быстрыми SSD-накопителями, а сама база данных быть относительно небольшой (около 7.5 Гб) и работать в файловом режиме.
В этой статье мы подробно разберем, почему возникает эта проблема, проанализируем внутренние механизмы работы платформы 1С:Предприятие 8.3 и предложим пошаговое руководство по оптимизации и устранению подобных сбоев.
Рассмотрим аппаратную и системную сторону вопроса. Ошибка «Недостаточно памяти» на сервере с 32 Гб ОЗУ в случае файловой базы чаще всего возникает из-за ограничений разрядности клиентского приложения. Файловая база данных обрабатывается непосредственно в рамках адресного пространства процесса 1С на локальном компьютере пользователя или на сервере терминалов (файлы 1cv8.exe или 1cv8c.exe).
Если для запуска системы используется 32-разрядная версия платформы 1С (которая часто устанавливается по умолчанию), операционная система Windows выделяет под один такой процесс максимум 2 Гб виртуальной памяти (в редких случаях до 3–4 Гб при включении специальных системных ключей). При формировании сложного отчета, требующего сборки тяжелых временных таблиц по себестоимости, этот лимит исчерпывается мгновенно. Программа зависает и аварийно завершается, полностью игнорируя свободные гигабайты оперативной памяти на сервере.
Решение проблемы:
Проанализируем внутреннее устройство регистров накопления 1С. Очень часто разработчики и администраторы уповают на процедуру «Тестирование и исправление» (ТИИ). Однако стандартный пересчет итогов в рамках ТИИ не всегда сдвигает саму границу расчета итогов в операционной системе 1С.
Если в системе граница расчета итогов установлена на прошлые периоды (например, на начало года), а отчет формируется за более поздний период, платформе приходится динамически («на лету») рассчитывать остатки. Для этого она перебирает миллионы записей движений из физической таблицы регистра вместо того, чтобы быстро прочитать уже готовые итоговые значения из таблицы остатков. Это лавинообразно увеличивает нагрузку на процессор и диск.
Решение проблемы:
РегистрНакопления.СебестоимостьТоваров и РегистрНакопления.ВыручкаИСебестоимостьПродаж.Перейдем к логическим ошибкам в данных, которые часто возникают из-за человеческого фактора. Если еще два дня назад отчет работал быстро, а сегодня завис, значит, в базу были внесены некорректные документы «задним числом».
Расчет себестоимости в УТ 11 строится на решении сложных систем линейных алгебраических уравнений (СЛАУ). Если в информационной базе возникают так называемые «петли» (встречный выпуск, циклическое распределение расходов, когда товар списывается на расходы, которые затем распределяются на себестоимость этого же товара) или образуются отрицательные остатки по аналитике учета, математический алгоритм расчета уходит в бесконечный цикл. Система бесконечно генерирует новые волны распределения затрат, забивая оперативную память временными таблицами до тех пор, пока процесс не завершится аварийно.
Решение проблемы:
УниверсальныйОтчет по регистру накопления СебестоимостьТоваров или ТоварыОрганизаций на конец проблемного периода. Выявим и устраним все минусовые позиции.Обработка.ЗакрытиеМесяца. Если на этапе «Распределение затрат и расчет себестоимости» система выдает ошибки или зависает — проблема гарантированно кроется в некорректно введенных хозяйственных операциях или кольцевых связях затрат.Выясним, как именно отчет «Себестоимость» получает данные в УТ 11. Данный отчет крайне чувствителен к наличию предварительно рассчитанных данных регламентным документом Документ.РасчетСебестоимостиТоваров.
Если за выбранный период регламентная операция расчета себестоимости в режиме «Фактический» не была выполнена или была отменена, отчет при формировании попытается рассчитать плановую или предварительную себестоимость в оперативной памяти «на лету» в момент формирования отчета. Для базы размером 7.5 Гб выполнение столь ресурсоемкой математической задачи в памяти пользовательского сеанса неизбежно приведет к зависанию или вылету программы.
Решение проблемы:
РасчетСебестоимостиТоваров с видом операции «Фактический расчет».Поскольку объем рассматриваемой базы составляет 7.5 Гб, мы находимся в зоне риска технологических ограничений формата файловой СУБД 1С (.1CD). Внутренняя архитектура файловой базы накладывает жесткое ограничение: размер любой отдельной таблицы (индексов или данных) не может превышать 4 Гб.
При активной работе торгового предприятия таблицы движений регистра себестоимости (например, таблица движений _AccumReg8888 или таблица итогов _AccumRegTotals8888) могут вплотную приблизиться к критической отметке в 4 Гб. Когда этот лимит превышается, файловый движок платформы начинает вести себя непредсказуемо: запросы к таблице выполняются некорректно, возникают ложные ошибки нехватки памяти, данные могут искажаться.
Решение проблемы:
.1CD.Резюмируя вышесказанное, выполним следующие последовательные шаги для восстановления быстродействия отчета:
Систематическое выполнение этих правил позволит избежать подобных проблем в будущем и обеспечит стабильную и быструю работу аналитических отчетов в «1С:Управление торговлей 11».