В процессе разработки или администрирования баз данных на платформе 1С:Предприятие 8 часто возникает необходимость полной очистки регистра накопления. Это может потребоваться при исправлении последствий некорректных доработок, очистке тестовых данных или при кардинальном изменении логики ведения учета. В отличие от справочников, регистры накопления имеют свою специфику: записи в них жестко привязаны к документам-регистраторам, и простого метода "удалить все" одной командой в платформе не предусмотрено.
Рассмотрим подробно все доступные способы решения этой задачи, проанализируем их эффективность и разберем конкретные примеры кода.
Этот метод является наиболее безопасным и "правильным" с точки зрения платформы 1С. Основная сложность заключается в том, что для регистра накопления нельзя просто создать пустой РегистрНакопленияНаборЗаписей и записать его без отбора. Платформа требует установки отбора по Регистратор. Поэтому алгоритм действий будет следующим: мы получаем список всех уникальных документов, которые делали движения в регистре, и по каждому из них перезаписываем пустой набор записей.
Проанализируем программный код, который позволяет это сделать максимально эффективно:
Запрос = Новый Запрос;
// Выбираем только уникальные регистраторы, чтобы не делать лишних циклов
Запрос.Текст =
"ВЫБРАТЬ РАЗЛИЧНЫЕ
| ТвояТаблица.Регистратор КАК Регистратор
|ИЗ
| РегистрНакопления.ИмяВашегоРегистра КАК ТвояТаблица";
РезультатЗапроса = Запрос.Выполнить();
Выборка = РезультатЗапроса.Выбрать();
Набор = РегистрыНакопления.ИмяВашегоРегистра.СоздатьНаборЗаписей();
Пока Выборка.Следующий() Цикл
// Устанавливаем отбор по конкретному документу
Набор.Отбор.Регистратор.Установить(Выборка.Регистратор);
// Для ускорения процесса отключаем проверку бизнес-логики
Набор.ОбменДанными.Загрузка = Истина;
// Записываем пустой набор. Это удаляет все движения данного документа по этому регистру.
// Параметр Ложь в методе Записать() означает, что мы не замещаем записи,
// но так как набор и так пустой, это эффективно очищает данные.
Набор.Записать();
КонецЦикла;
Важные нюансы оптимизации:
ОбменДанными.Загрузка = Истина критически важна. Она отключает выполнение процедур ПередЗаписью и ПриЗаписи в модуле набора записей. Это не только ускоряет работу в разы, но и предотвращает возможные ошибки, если в модуле прописаны сложные проверки.Набор.Прочитать() перед очисткой. Это лишняя операция, которая нагружает сервер и базу данных. Если ваша задача — полная очистка, вам не нужно знать, что было в регистре, вам нужно просто записать пустоту.Если записей очень много, использование стандартного набора записей может затянуться на часы. Выясним причину: при каждой записи набора система обновляет таблицы текущих итогов и таблицы итогов по периодам. Чтобы этого избежать, разберем по шагам методику с отключением итогов:
РегистрМенеджер = РегистрыНакопления.ИмяВашегоРегистра;
// 1. Полностью отключаем использование итогов для регистра
РегистрМенеджер.УстановитьИспользованиеИтогов(Ложь);
// 2. Выполняем очистку (код из Метода 1)
// ... здесь цикл очистки через НаборЗаписей ...
// 3. Включаем итоги обратно. Система один раз пересчитает их с нуля.
РегистрМенеджер.УстановитьИспользованиеИтогов(Истина);
Этот подход позволяет избежать лавинообразного роста нагрузки на дисковую подсистему при обновлении итогов после каждого документа.
Если вам нужно очистить регистр полностью и вы имеете возможность выгнать всех пользователей из базы, можно воспользоваться "хитростью" с изменением метаданных. Рассмотрим подробнее этот алгоритм:
РегистрНакопления.Этот метод очищает физические таблицы на уровне СУБД практически мгновенно, однако он требует монопольного доступа и аккуратности, чтобы не забыть вернуть структуру регистра в исходный вид.
Для продвинутых администраторов существует способ удаления через консоль MS SQL Server или PostgreSQL. Проанализируем ситуацию: регистр накопления в базе данных состоит из нескольких таблиц (основная таблица движений и таблицы итогов).
Внимание: Прямое редактирование таблиц SQL нарушает регламент технической поддержки 1С, поэтому обязательно делайте бэкап перед началом работ.
ПолучитьСтруктуруХраненияБазыДанных или сторонние обработки). Обычно это таблицы вида _AccumReg....TRUNCATE TABLE _AccumReg123 (где 123 — номер вашей таблицы). Это мгновенно очистит основную таблицу.Если вы не хотите писать код, можно воспользоваться готовыми инструментами. Посмотрим на наиболее популярные варианты:
Выбор метода зависит от объема данных и наличия доступа к конфигуратору или СУБД. Для небольших регистров (до 100 000 записей) идеально подходит Метод 1 с использованием ОбменДанными.Загрузка. Для массовой очистки миллионов строк лучше использовать Метод 2 с отключением итогов или Метод 3 через изменение метаданных в конфигураторе.
Помните, что удаление движений регистра накопления может привести к нарушению целостности учета, так как документы останутся проведенными, но не будут влиять на остатки. Всегда проверяйте необходимость перепроведения документов после таких операций.