Администраторы и разработчики конфигураций 1С:Предприятие часто сталкиваются с необходимостью очистки накопленных данных в регистрах сведений. Эта задача может возникнуть при тестировании новых алгоритмов, исправлении ошибочных загрузок или просто для оптимизации производительности базы данных. Однако удаление информации из регистров — процесс деликатный, требующий понимания структуры хранения и специфики работы СУБД.

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

Особенности хранения данных в регистрах сведений

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

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

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

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

Удаление через обработку «Удаление помеченных объектов»

Самый простой и безопасный способ удаления записей регистра сведений по отбору — использование стандартной обработки Удаление помеченных объектов. Этот метод не требует написания кода и подходит для пользователей с правами администратора, но без навыков программирования.

Процесс начинается с установки пометки на удаление для тех записей, которые соответствуют вашему критерию. Вы можете использовать стандартные отчеты или обработки для массового выделения записей. Например, в обработке «Групповое изменение реквизитов» можно установить отбор по нужному полю и пометить все найденные строки.

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

📊 Какой способ удаления вы используете чаще?
Стандартная обработка
Обработка удаления данных
SQL-запрос
Свой код
  • 🗑️ Позволяет визуально контролировать процесс удаления через интерфейс.
  • 🛡️ Автоматически проверяет наличие ссылок на удаляемые элементы.
  • ⏳ Может работать медленно на больших объемах данных из-за проверок ссылок.
  • 🔒 Требует наличия прав на проведение операций удаления и изменения данных.

Однако у этого метода есть существенный недостаток — скорость. При наличии миллионов записей в регистре сведений процесс проверки ссылок может занять часы. В таких случаях целесообразно переходить к более специализированным инструментам, таким как обработка Удаление данных.

Использование обработки «Удаление данных» (Data Cleansing)

Для профессиональной очистки регистров сведений по сложным отборам разработчики 1С создали специализированную обработку УдалениеДанных (часто называемую Data Cleansing). Она входит в состав типовых конфигураций и позволяет гибко настраивать правила отбора.

В отличие от стандартного удаления помеченных объектов, эта обработка работает напрямую с таблицами базы данных, минуя некоторые уровни проверки объектов метаданных. Это значительно ускоряет процесс, но повышает ответственность пользователя за корректность заданных отборов.

В интерфейсе обработки вы выбираете объект метаданных «Регистр сведений», затем настраиваете отбор по необходимым полям. Можно использовать сложные условия: даты, периоды, ссылки на справочники или конкретные значения реквизитов. Система сформирует запрос и удалит только те записи, которые попадают под фильтр.

☑️ Подготовка к массовой очистке

Выполнено: 0 / 4

⚠️ Внимание: Обработка «Удаление данных» может игнорировать некоторые механизмы контроля целостности, встроенные в обычные формы. Убедитесь, что удаляемые данные действительно не нужны для работы других подсистем.

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

Программное удаление через код 1С

Разработчикам часто требуется реализовать автоматическую очистку регистров сведений в рамках регламентных заданий или обработок обслуживания. Для этого используется встроенный язык 1С и объект метаданных РегистрСведений.МенеджерЗаписи.

Основной метод работы — создание набора записей с установленным отбором и последующее их удаление. Код должен быть оптимизирован, чтобы не блокировать работу пользователей и не вызывать переполнение оперативной памяти сервера.

Процедура ОчиститьРегистрПоОтбору()

// Получаем менеджер регистра

Менеджер = РегистрыСведений.НашиНастройки;

// Создаем набор записей

Набор = Менеджер.СоздатьНаборЗаписей();

// Устанавливаем отбор

Набор.Отбор.Период.Установить(<=, ТекущаяДата());

Набор.Отбор.Организация.Установить(Справочники.Организации.НайтиПоНаименованию("Тест"));

// Читаем данные с сервера

Набор.Прочитать();

// Удаляем записи

Набор.Записать();

КонецПроцедуры

Ключевой момент здесь — метод Записать(). Если набор записей был прочитан, но не содержит новых данных для записи, вызов этого метода с пустым набором (после очистки коллекции) приводит к удалению выбранных записей из базы. В некоторых случаях требуется явно вызвать метод Удалить() для каждой строки перед записью, в зависимости от версии платформы.

Нюансы работы с транзакциями

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

При написании кода следует учитывать ограничение на количество записей в наборе. Если отбор возвращает сотни тысяч строк, чтение их всех в память может привести к ошибке Out of Memory. В таких случаях используют циклическое удаление порциями или переходят к прямым SQL-запросам.

Прямое удаление через SQL-запросы

Для администраторов баз данных на платформах MS SQL Server, PostgreSQL или Oracle самым быстрым способом удаления является выполнение прямого SQL-запроса к физической таблице регистра. Этот метод обходит все механизмы платформы 1С и работает на уровне СУБД.

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

Параметр Описание Пример значения
Имя таблицы Физическое имя в СУБД _InfoRg12345
Поле периода Колонка с датой записи _Period
Ссылка на объект Колонка с UID справочника _OrgRRef
Уникальный ключ Поле первичного ключа _IDRRef

Пример SQL-запроса для удаления записей старше определенной даты:

DELETE FROM _InfoRg12345 WHERE _Period < '20230101'

Использование этого метода дает максимальную производительность, но несет highest риски. Отсутствие контроля ссылочной целостности со стороны 1С может привести к тому, что документы будут ссылаться на несуществующие записи регистра, вызывая ошибки при проведении.

⚠️ Внимание: Прямое изменение таблиц базы данных нарушает поддержку конфигурации. При обновлении типовых решений такие изменения могут быть потеряны или вызвать конфликты. Используйте SQL только в крайних случаях и на свой страх и риск.

💡

Перед выполнением DELETE запроса всегда выполняйте аналогичный SELECT запрос, чтобы убедиться, что вы удаляете именно те строки, которые планировали.

Оптимизация и обслуживание после удаления

После массового удаления записей из регистра сведений, особенно через SQL или обработку «Удаление данных», в файлах базы данных остается свободное пространство. В файловом варианте базы это приводит к разрастанию файла .1CD, в клиент-серверном — к фрагментации страниц данных.

Для файловых баз рекомендуется выполнить сжатие базы данных через режим предприятия или утилиты 1CV8Util. Это физически уменьшит размер файла на диске и ускорит последующий доступ к данным. Для серверных баз (MSSQL) следует выполнить команду DBCC SHRINKDATABASE или настроить автоматическое сжатие.

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

💡

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

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

Часто задаваемые вопросы (FAQ)

Можно ли восстановить удаленные записи регистра сведений?

Стандартными средствами 1С восстановить удаленные записи невозможно, так как операция удаления является необратимой. Единственный способ — восстановление из резервной копии базы данных (бэкапа), сделанной до момента удаления. Если использовалось удаление помеченных объектов, и запись не была удалена физически (только помечена), ее можно снять с пометки.

Почему удаление через код работает медленнее, чем SQL?

При удалении через код 1С платформа выполняет множество дополнительных проверок: контроль прав доступа, проверку ссылочной целостности, запись в журнал регистрации, обновление служебных таблиц. SQL-запрос выполняет только команду удаления на уровне СУБД, игнорируя логику приложения, что делает его в разы быстрее, но опаснее.

Как удалить записи периодического регистра сведений за конкретный период?

Необходимо использовать отбор по полю Период. В обработке «Удаление данных» или в коде 1С установите условие вида Период Между Дата1 И Дата2. Для независимых периодических регистров это удалит срезы за указанные даты. Для подчиненных регистратору удаление обычно привязано к конкретному документу.

Влияет ли удаление записей на проведение документов?

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