В процессе эксплуатации информационных баз 1С, особенно при активном обмене данными, часто возникает необходимость обслуживания вспомогательных таблиц. Одной из таких таблиц является регистр сведений ВерсииОбъектов, который при накоплении огромного количества служебных записей (предупреждений) может приводить к резкому замедлению работы интерфейса. Давайте разберемся, как выполнить очистку этого регистра профессионально, безопасно и эффективно.
Многие специалисты в первую очередь обращаются к прямому редактированию базы данных через SQL Server. Хотя использование команды DELETE или TRUNCATE кажется самым быстрым способом «сбросить» данные, важно понимать риски, связанные с целостностью структуры 1С.
Рассмотрим основные моменты, которые мы должны учитывать:
Самый правильный и безопасный способ очистки данных в 1С — это использование встроенных механизмов платформы. Когда мы работаем через НаборЗаписей, 1С самостоятельно управляет транзакциями, контролирует целостность и корректно обновляет системные индексы.
Разберем, как создать простую внешнюю обработку для полной очистки регистра:
Для реализации задачи нам понадобится процедура, которая создает набор записей для нужного регистра и сразу записывает его в пустом состоянии. Посмотрим на пример кода:
Процедура ОчиститьРегистр()
// Создаем набор записей для регистра сведений
НаборЗаписей = РегистрыСведений.ВерсииОбъектов.СоздатьНаборЗаписей();
// Выполняем запись пустого набора, что приведет к удалению всех данных в регистре
НаборЗаписей.Записать();
Сообщить("Очистка регистра успешно завершена!");
КонецПроцедуры
Этот метод предпочтителен, так как он гарантирует, что система «узнает» об изменениях в данных сразу же. Это исключает возникновение ошибок при последующей работе пользователей в интерфейсе.
Если объем записей исчисляется миллионами и обработка на 1С не справляется из-за нехватки времени (таймаутов), можно использовать SQL. Однако здесь мы должны действовать строго по инструкции:
Шаг 1: Выполнение команды очистки. Команда TRUNCATE работает значительно быстрее, чем DELETE, так как она не протоколирует каждую удаляемую строку, а просто освобождает страницы данных.
USE [Имя_Информационной_Базы]
GO
TRUNCATE TABLE [dbo].[_InfoRg13287]
GO
Шаг 2: Обновление статистики и переиндексация. Чтобы база «поняла», что таблица пуста, обязательно выполните следующие команды после очистки:
UPDATE STATISTICS [dbo].[_InfoRg13287];
// Рекомендуется выполнить полную переиндексацию, если таблица была огромной
DBCC DBREINDEX ([dbo].[_InfoRg13287]);
Часто бывает так, что очистка одного регистра не приносит желаемого результата. Это означает, что проблема «разрослась» за пределы одной таблицы. Проанализируем возможные причины:
ВерсииОбъектов использовался для синхронизации, вполне вероятно, что в планах обмена накопилось огромное количество зарегистрированных изменений. Даже пустой регистр не поможет, если 1С пытается перелопатить таблицу регистрации изменений для формирования пакетов данных.Подведем итог: Всегда начинайте с очистки средствами 1С (через НаборЗаписей). Прибегайте к SQL-методам только в крайних случаях и всегда сопровождайте их обновлением статистики. Если после очистки проблема сохраняется — значит, необходимо проверять планы обмена и системные таблицы регистрации изменений.