При активной работе пользователей в конфигурациях 1С (например, «1С:Комплексная автоматизация» или «1С:ERP») подсистема оценки производительности APDEX регулярно записывает показатели скорости выполнения операций в регистр сведений ЗамерыВремени. Если автоматическая очистка отключена или не успевает отрабатывать, таблица регистра быстро разрастается до критических размеров.
В файловом режиме работы (файл базы данных .1CD) действует строгое ограничение: размер каждого внутреннего файла (таблицы или её индексов) при стандартном размере страницы 4 КБ не может превышать 4 ГБ. При попытке очистить такой регистр «в лоб» через запись пустого набора записей НаборЗаписей.Записать() платформа считывает слишком большой объем данных в оперативную память, что приводит к ошибке с нехваткой памяти (Out Of Memory) или аварийному завершению работы.
Рассмотрим подробнее эффективные варианты решения этой проблемы, разберем по шагам порядок действий и способы предотвращения повторного переполнения.
Проанализируем ситуация с заполнением таблицы. Подсистема оценки производительности фиксирует замеры времени при выполнении любых ключевых операций. Если в настройках системы установлен слишком длительный период хранения или отключено регламентное задание Очистка замеров времени, миллионы записей накапливаются в базе.
Попытка выполнить standard-очистку кодом:
Набор = РегистрыСведений.ЗамерыВремени.СоздатьНаборЗаписей();
Набор.Записать();
приводит к тому, что платформа versucht прочитать все записи регистра в память перед заменой, вызывая падение по лимиту RAM.
Это наиболее быстрый и радикальный метод очистить служебный регистр сведений в файловой базе без длительного ожидания. Перед выполнением любых операций обязательно создадим резервную копию базы данных.
Разберем процесс по шагам:
.cf).ЗамерыВремени (а также при необходимости смежные регистры ЗамерыВремениТехнологические, ЗамерыСтатистики)..1CD.Ограничение в 4 ГБ на внутреннюю таблицу файловой базы связано с базовым размером страницы 4 КБ. Платформа 1С содержит встроенную утилиту cnvdbfl.exe, которая позволяет сконвертировать файл 1CD на использование большего размера страницы (8, 16, 32 или 64 КБ), что поднимает лимит на размер таблицы до 6 ГБ и выше.
Посмотрим, как выполнить конвертацию:
cnvdbfl.exe в каталоге установленной платформы (например, C:\Program Files\1cv8\8.3.XX.XXXX\bin\).1cv8.1CD.Если удалять данные программно, нельзя считывать весь регистр целиком. Разберем подход к удалению порциями с установкой отбора по периоду или измерениям (например, по полю ДатаЗаписиНачалоЧаса).
Проанализируем пример алгоритма удаления частями:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ РАЗЛИЧНЫЕ
| Т.ДатаЗаписиНачалоЧаса КАК ДатаЗаписи
|ИЗ
| РегистрСведений.ЗамерыВремени КАК Т
|УПОРЯДОЧИТЬ ПО
| ДатаЗаписи ВОЗРАСТАЮЩИЕ";
Результат = Запрос.Выполнить();
Выборка = Результат.Выбрать();
Пока Выборка.Следующий() Цикл
Набор = РегистрыСведений.ЗамерыВремени.СоздатьНаборЗаписей();
Набор.Отбор.ДатаЗаписиНачалоЧаса.Установить(Выборка.ДатаЗаписи);
Набор.Записать(); // Записываем пустой набор для конкретного часа
КонецЦикла;
При таком подходе память не переполняется, так как в каждый момент времени обрабатывается и очищается небольшая порция записей.
Важно учитывать, что после любого способа удаления записей физический размер файла 1CD на диске автоматически не уменьшается. Чтобы высвободить дисковое пространство, обязательно нужно сжать файлы базы.
Для этого:
.dt и загрузить её в новую пустую файловую базу.Чтобы проблема не повторилась в будущем, выполним настройки подсистемы «Оценка производительности»:
Выполнять оценку производительности.Период хранения замеров — установите его в значение 3–7 дней.Очистка замеров времени включено и успешно выполняется по расписанию в фоновом режиме.