Рано или поздно многие системные администраторы и разработчики сталкиваются с ситуацией, когда файловая база данных 1С (особенно на базе конфигураций «Управление производственным предприятием» или «Управление торговым предприятием») начинает критически зависать при проведении документов. Ситуация выглядит парадоксально: в базе работает всего один пользователь, объем базы относительно небольшой (до 3 ГБ), сервер оснащен мощным процессором Intel i7 и достаточным объемом оперативной памяти, а диспетчер задач показывает околонулевую нагрузку на процессор, диск и память. При этом проведение простейшего документа с 5–10 позициями товаров может занимать от 3 до 5 минут.
В этой статье мы подробно разберем, почему возникает эта проблема, проведем глубокую диагностику узких мест и рассмотрим пошаговые методы оптимизации как на уровне СУБД и операционной системы, так и на уровне логики самой конфигурации 1С.
Когда стандартный диспетчер задач Windows показывает низкую нагрузку, это часто вводит в заблуждение. Выясним причину этого феномена. Дело в том, что процесс проведения документа в 1С выполняется строго в один поток. Это значит, что вся вычислительная нагрузка ложится ровно на одно ядро процессора. Если на вашем сервере установлен многоядерный процессор (например, 8 ядер), то 100% загрузка одного ядра в общем графике диспетчера задач отобразится как скромные 12.5% общей нагрузки на CPU. При этом ядро, выполняющее проведение, будет работать на пределе своих возможностей.
Вторая скрытая проблема — дисковые операции. Файловая СУБД 1С при проведении документов совершает огромное количество мелких операций чтения и записи. Стандартные утилиты мониторинга могут показывать низкую скорость передачи данных (в МБ/с), но при этом диск будет перегружен количеством запросов. Нам необходимо запустить «Монитор ресурсов» Windows и обратить внимание на показатель «Длина очереди к диску» (Disk Queue Length). Если это значение в момент проведения документа превышает 1.5–2, дисковая подсистема не справляется с потоком мелких транзакций.
Посмотрим на реальный пример замера производительности в конфигураторе. Если запустить отладку с замером времени, мы увидим, что основная часть времени работы системы тратится на следующий программный модуль:
ОбщийМодуль.УправлениеЗапасамиПартионныйУчет.Модуль
Если этот модуль по замеру съедает более 70–80% времени проведения, проблема носит комплексный характер: программа застревает на обработке огромного количества записей в таблицах партий, совершая миллионы мелких дисковых операций записи во временные таблицы.
Прежде чем менять логику работы конфигурации, необходимо оптимизировать серверную среду. Рассмотрим основные инфраструктурные проблемы.
1Cv8.1CD малыми порциями, программный RAID вынужден непрерывно синхронизировать блоки на двух физических накопителях. Это нивелирует все преимущества даже быстрых SSD-дисков. Рекомендуется отказаться от программного RAID в пользу качественного аппаратного RAID-контроллера с кэшем записи или использовать один быстрый SSD под базу данных, настроив ежечасное резервное копирование на соседний физический диск.*.1CD, *.1CL, *.cdn.C:\Program Files\1cv8 или C:\Program Files (x86)\1cv8).%TEMP% и %TMP%).C:\1C_Bases\UTP\), а не сетевым (например, \\ServerName\1C_Bases\UTP\). Использование UNC-путей внутри терминальной сессии задействует сетевые протоколы SMB, что увеличивает время отклика СУБД в десятки раз.Перейдем к конфигурационным настройкам. Основной «затык» происходит в модуле партионного учета, так как система пытается в режиме реального времени рассчитать себестоимость списываемых товаров, анализируя всю цепочку поставок и партий с начала времен. Разберем два пути решения этой проблемы.
Вариант А. Отключение оперативного проведения партий. Это самый быстрый и безболезненный способ ускорить проведение документов «здесь и сейчас». Выполним следующие действия:
После этого документы (включая возвраты и реализации) начнут проводиться практически мгновенно, так как система перестанет рассчитывать себестоимость «на лету». Все движения по партиям и расчет себестоимости списания переносятся на нерабочее время. Для этого ночью по расписанию (через регламентные задания или вручную) запускается обработка «Проведение по партиям» за прошедший день.
Вариант Б. Переход на РАУЗ (Расширенная аналитика учета затрат). Если специфика вашего бизнеса требует видеть себестоимость сразу, классический партионный учет в крупных файловых базах становится нежизнеспособным. В конфигурациях УПП и УТП реализован альтернативный механизм — РАУЗ.
РАУЗ отказывается от концепции партий и последовательностей документов при оперативном проведении. Документы проводятся мгновенно, делая записи только в количественном выражении. Полный расчет стоимости запасов и затрат производится один раз в конце месяца регламентным документом «Расчет себестоимости», который решает сложную систему линейных уравнений. Переход на РАУЗ кардинально решает проблему производительности файловых баз.
Даже если размер базы составляет менее 3 ГБ, внутренняя структура файла базы данных может быть сильно фрагментирована. Обычное «Тестирование и исправление» (ТиИ) через Конфигуратор или запуск утилиты chdbfl.exe исправляют только логические ошибки и индексы, но они не умеют физически перестраивать структуру хранения таблиц внутри файла. Со временем в файле базы накапливается «мусор» (удаленные объекты, которые физически остаются в файле).
Выполним процедуру полной физической дефрагментации структуры СУБД 1С по шагам:
.dt..dt.Этот процесс полностью пересоздает структуру файла базы данных 1Cv8.1CD с нуля. Все таблицы записываются последовательно, удаляются фантомные записи, перестраиваются индексы, а размер файла на диске часто уменьшается на 20–40%. Это дает существенный прирост к скорости файловых операций чтения/записи.
Если конфигурационные изменения по каким-то причинам невозможны, а дисковая система все еще остается «узким горлышком», мы можем перенаправить временные файлы СУБД 1С в оперативную память. Во время проведения документов 1С активно использует временные таблицы, которые физически создаются в системной папке TEMP пользователя Windows.
Проанализируем этот метод. Мы можем выделить небольшой объем оперативной памяти (например, 1–2 ГБ) под виртуальный диск (RAM-диск) с помощью бесплатного стороннего софта. После этого перенаправим переменные окружения TEMP и TMP для пользователей RDP на этот виртуальный скоростной диск. Запись временных таблиц в оперативную память происходит со скоростью работы ОЗУ, что полностью убирает задержки дисковой очереди.
Применим этот подход программно. Нам нужно убедиться, что временные файлы регулярно очищаются. Рассмотрим пример кода на встроенном языке 1С, который позволяет получить представление о расположении временных файлов текущей сессии:
ПутьКВременнымФайлам = КаталогВременныхФайлов();
Сообщить("Временные файлы сессии 1С записываются в: " + ПутьКВременнымФайлам);
Если этот путь указывает на созданный нами RAM-диск, скорость работы тяжелых запросов в партионном учете возрастет в разы.
Резюмируя все вышесказанное: для решения проблемы зависаний файловой базы 1С:УТП при проведении документов необходимо действовать комплексно. Отключите программное зеркалирование дисков, настройте схему питания сервера на максимальную производительность, выполните выгрузку/загрузку базы через .dt для дефрагментации структуры и рассмотрите возможность отключения оперативного списания партий или перехода на РАУЗ.