Как очистить регистр «Замеры времени» и устранить ошибку «Превышен максимально допустимый размер внутреннего файла» в 1С?

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

При активной работе пользователей в конфигурациях 1С (например, «1С:Комплексная автоматизация» или «1С:ERP») подсистема оценки производительности APDEX регулярно записывает показатели скорости выполнения операций в регистр сведений ЗамерыВремени. Если автоматическая очистка отключена или не успевает отрабатывать, таблица регистра быстро разрастается до критических размеров.

В файловом режиме работы (файл базы данных .1CD) действует строгое ограничение: размер каждого внутреннего файла (таблицы или её индексов) при стандартном размере страницы 4 КБ не может превышать 4 ГБ. При попытке очистить такой регистр «в лоб» через запись пустого набора записей НаборЗаписей.Записать() платформа считывает слишком большой объем данных в оперативную память, что приводит к ошибке с нехваткой памяти (Out Of Memory) или аварийному завершению работы.

Рассмотрим подробнее эффективные варианты решения этой проблемы, разберем по шагам порядок действий и способы предотвращения повторного переполнения.

Выясним причину возникновения проблемы

Проанализируем ситуация с заполнением таблицы. Подсистема оценки производительности фиксирует замеры времени при выполнении любых ключевых операций. Если в настройках системы установлен слишком длительный период хранения или отключено регламентное задание Очистка замеров времени, миллионы записей накапливаются в базе.

Попытка выполнить standard-очистку кодом:


Набор = РегистрыСведений.ЗамерыВремени.СоздатьНаборЗаписей();
Набор.Записать();

приводит к тому, что платформа versucht прочитать все записи регистра в память перед заменой, вызывая падение по лимиту RAM.

Способ 1. Очистка регистра через удаление и повторную загрузку конфигурации

Это наиболее быстрый и радикальный метод очистить служебный регистр сведений в файловой базе без длительного ожидания. Перед выполнением любых операций обязательно создадим резервную копию базы данных.

Разберем процесс по шагам:

  1. Откроем базу в режиме «Конфигуратор» и выполним сохранение текущей конфигурации в файл: Конфигурация -> Сохранить конфигурацию в файл... (получаем файл .cf).
  2. Найдем в дереве метаданных служебный регистр сведений ЗамерыВремени (а также при необходимости смежные регистры ЗамерыВремениТехнологические, ЗамерыСтатистики).
  3. Удалим регистр из дерева конфигурации.
  4. Выполним обновление конфигурации базы данных (клавиша F7). В появившемся окне подтверждаем реструктуризацию таблицы и удаление данных. В этот момент таблица физически удаляется из файла .1CD.
  5. Выполним загрузку ранее сохраненного файла конфигурации обратно: Конфигурация -> Загрузить конфигурацию из файла....
  6. Снова обновим конфигурацию базы данных (F7). Регистр пересоздастся в конфигурации абсолютно пустым.

Способ 2. Увеличение размера страницы файла базы через cnvdbfl.exe

Ограничение в 4 ГБ на внутреннюю таблицу файловой базы связано с базовым размером страницы 4 КБ. Платформа 1С содержит встроенную утилиту cnvdbfl.exe, которая позволяет сконвертировать файл 1CD на использование большего размера страницы (8, 16, 32 или 64 КБ), что поднимает лимит на размер таблицы до 6 ГБ и выше.

Посмотрим, как выполнить конвертацию:

  1. Завершим все сеансы пользователей и остановим службы, работающие с базой.
  2. Найдем утилиту cnvdbfl.exe в каталоге установленной платформы (например, C:\Program Files\1cv8\8.3.XX.XXXX\bin\).
  3. Запустим утилиту, выберем файл базы данных 1cv8.1CD.
  4. Укажем новый размер страницы (например, 16 КБ или 32 КБ) и запустим процесс конвертации.
  5. После завершения конвертации откроем базу в режиме 1С:Предприятие. Ошибка размера файла исчезнет, и очистку регистра можно будет провести штатно или с помощью регламентного задания.

Способ 3. Порционное программное удаление данных по интервалам

Если удалять данные программно, нельзя считывать весь регистр целиком. Разберем подход к удалению порциями с установкой отбора по периоду или измерениям (например, по полю ДатаЗаписиНачалоЧаса).

Проанализируем пример алгоритма удаления частями:


Запрос = Новый Запрос;
Запрос.Текст = 
    "ВЫБРАТЬ РАЗЛИЧНЫЕ
    |	Т.ДатаЗаписиНачалоЧаса КАК ДатаЗаписи
    |ИЗ
    |	РегистрСведений.ЗамерыВремени КАК Т
    |УПОРЯДОЧИТЬ ПО
    |	ДатаЗаписи ВОЗРАСТАЮЩИЕ";

Результат = Запрос.Выполнить();
Выборка = Результат.Выбрать();

Пока Выборка.Следующий() Цикл
    Набор = РегистрыСведений.ЗамерыВремени.СоздатьНаборЗаписей();
    Набор.Отбор.ДатаЗаписиНачалоЧаса.Установить(Выборка.ДатаЗаписи);
    Набор.Записать(); // Записываем пустой набор для конкретного часа
КонецЦикла;

При таком подходе память не переполняется, так как в каждый момент времени обрабатывается и очищается небольшая порция записей.

Обязательные завершающие действия: сжатие таблиц

Важно учитывать, что после любого способа удаления записей физический размер файла 1CD на диске автоматически не уменьшается. Чтобы высвободить дисковое пространство, обязательно нужно сжать файлы базы.

Для этого:

  1. Откроем Конфигуратор.
  2. Перейдем в меню Администрирование -> Тестирование и исправление....
  3. Отметим флажок Сжатие таблиц информационной базы и запустим выполнение.
  4. Альтернативный вариант — выполнить выгрузку информационной базы в файл .dt и загрузить её в новую пустую файловую базу.

Как предотвратить повторное разрастание регистра

Чтобы проблема не повторилась в будущем, выполним настройки подсистемы «Оценка производительности»:

  1. Перейдем в раздел Администрирование -> Оценка производительности.
  2. Если оценка производительности по методике APDEX не требуется на предприятии, снимите флажок Выполнять оценку производительности.
  3. Если замерами необходимо пользоваться, проверьте параметр Период хранения замеров — установите его в значение 3–7 дней.
  4. Убедитесь, что регламентное задание Очистка замеров времени включено и успешно выполняется по расписанию в фоновом режиме.
← На главную