Почему вылетает 1С при удалении плана обмена или регистрации изменений и как правильно очистить базу?

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

При свертке или генеральной чистке информационных баз 1С разработчики часто сталкиваются с ситуацией, когда попытка удалить узел плана обмена или очистить зарегистрированные изменения вызывает длительное зависание, отрисовку черного окна предупреждения без текста и аварийное завершение работы платформы. Разберем причинно-следственные связи этой проблемы и рассмотрим практические алгоритмы её решения.

Выясним причины зависания и аварийного завершения 1С

Главная причина аварийного завершения программы заключается в исчерпании адресного пространства 32-разрядного процесса 1С (Out of Memory). Для 32-битного клиента платформы в операционной системе Windows выделяется не более 2–3 ГБ виртуальной памяти.

Проанализируем механику выполнения штатных вызовов:

  1. Методы ПланОбменаОбъект.Удалить() или ПланыОбмена.УдалитьРегистрациюИзменений(Узел) без явного указания конкретных объектов пытаются очистить сразу весь массив записей по всем таблицам базы данных в рамках единой монолитной транзакции.
  2. Если в базе накоплены сотни тысяч или миллионы зарегистрированных изменений, объем операций переполняет выделенный буфер памяти процесса. Появляется пустая графическая рамка (черное окно предупреждения), после чего платформа экстренно закрывается.
  3. Если до очистки обмена проводилось массовое удаление документов без отключения механизма регистрации, платформа автоматически записывала маркер УдалениеОбъекта в таблицы изменений для каждой удаляемой записи. Это дополнительно раздувает таблицы обмена.

Особенности высвобождения места в файловой базе (.1CD)

Важно помнить специфику работы файловой СУБД 1С. При удалении строк из таблиц физический размер файла информационной базы .1CD на диске не уменьшается. Платформа лишь маркирует удаленные страницы как свободные для будущей записи данных.

Чтобы физически уменьшить размер файла базы после очистки данных, необходимо выполнить одно из следующих действий:

  1. Запустить процедуру «Тестирование и исправление» с установленным флажком «Сжатие таблиц информационной базы».
  2. Выполнить выгрузку информационной базы в файл .dt и последующую загрузку в чистую базу.
  3. Воспользоваться утилитой проверки файловых баз chdbfl.exe.

Способ 1. Пообъектная очистка зарегистрированных изменений порциями

Рассмотрим основной способ решения проблемы. Вместо очистки узла целиком выполним порционное удаление зарегистрированных изменений в цикле по каждому объекту метаданных, входящему в состав плана обмена.

Разберем пример кода для выполнения этой операции:


Для Каждого ЭлементСостава Из Метаданные.ПланыОбмена.ИмяПланаОбмена.Состав Цикл
    ПланыОбмена.УдалитьРегистрациюИзменений(Узел, ЭлементСостава.Метаданные);
КонецЦикла;

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

Обратите внимание: предопределенный узел плана обмена (ЭтотУзел) удалить нельзя — удалению подлежат только подчиненные узлы.

Способ 2. Правильная блокировка регистрации при удалении объектов

Посмотрим на корректный вариант массового удаления документов или справочников. Чтобы процесс удаления не порождал новые записи о зарегистрированных изменениях в таблицах обмена, необходимо задействовать свойство ОбменДанными.Загрузка.

Проанализируем пример кода:


Объект = Ссылка.ПолучитьОбъект();
Объект.ОбменДанными.Загрузка = Истина;
Объект.Удалить();

Флаг Загрузка = Истина отключает подписки на события и механизмы авторегистрации изменений для данного объекта, предотвращая рост таблиц обмена при чистке базы.

Способ 3. Использование 64-битного клиента и стандартных обработок БСП

Если нет возможности переписывать код очистки, воспользуемся альтернативными инструментами:

  1. Запуск 64-разрядного клиента 1С: Выполнение процедур очистки через 64-битный исполняемый файл платформы 1cv8.exe снимает ограничение в 2–3 ГБ оперативной памяти и позволяет обработать монолитную транзакцию без вылета.
  2. Типовая обработка БСП: Для безопасного удаления записей в конфигурациях с Библиотекой Стандартных Подсистем используем внешнюю или встроенную обработку «Регистрация изменений для обмена данными». Она позволяет гибко выбирать отдельные узлы и объекты метаданных для пошаговой очистки.
← На главную