Как полностью удалить все движения регистра накопления в 1С

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

В процессе разработки или администрирования баз данных на платформе 1С:Предприятие 8 часто возникает необходимость полной очистки регистра накопления. Это может потребоваться при исправлении последствий некорректных доработок, очистке тестовых данных или при кардинальном изменении логики ведения учета. В отличие от справочников, регистры накопления имеют свою специфику: записи в них жестко привязаны к документам-регистраторам, и простого метода "удалить все" одной командой в платформе не предусмотрено.

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

Метод 1. Программная очистка через Набор записей (универсальный способ)

Этот метод является наиболее безопасным и "правильным" с точки зрения платформы 1С. Основная сложность заключается в том, что для регистра накопления нельзя просто создать пустой РегистрНакопленияНаборЗаписей и записать его без отбора. Платформа требует установки отбора по Регистратор. Поэтому алгоритм действий будет следующим: мы получаем список всех уникальных документов, которые делали движения в регистре, и по каждому из них перезаписываем пустой набор записей.

Проанализируем программный код, который позволяет это сделать максимально эффективно:


Запрос = Новый Запрос;
// Выбираем только уникальные регистраторы, чтобы не делать лишних циклов
Запрос.Текст = 
    "ВЫБРАТЬ РАЗЛИЧНЫЕ
    |   ТвояТаблица.Регистратор КАК Регистратор
    |ИЗ
    |   РегистрНакопления.ИмяВашегоРегистра КАК ТвояТаблица";

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

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

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

Важные нюансы оптимизации:

  1. Использование ОбменДанными.Загрузка: Установка свойства ОбменДанными.Загрузка = Истина критически важна. Она отключает выполнение процедур ПередЗаписью и ПриЗаписи в модуле набора записей. Это не только ускоряет работу в разы, но и предотвращает возможные ошибки, если в модуле прописаны сложные проверки.
  2. Отказ от метода Прочитать(): В некоторых советах встречается вызов Набор.Прочитать() перед очисткой. Это лишняя операция, которая нагружает сервер и базу данных. Если ваша задача — полная очистка, вам не нужно знать, что было в регистре, вам нужно просто записать пустоту.
  3. Отключение итогов: Если в регистре миллионы записей, система будет пытаться пересчитывать итоги после каждой итерации цикла. Для радикального ускорения можно временно отключить итоги регистра.

Метод 2. Оптимизация для больших объемов данных (отключение итогов)

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


РегистрМенеджер = РегистрыНакопления.ИмяВашегоРегистра;

// 1. Полностью отключаем использование итогов для регистра
РегистрМенеджер.УстановитьИспользованиеИтогов(Ложь);

// 2. Выполняем очистку (код из Метода 1)
// ... здесь цикл очистки через НаборЗаписей ...

// 3. Включаем итоги обратно. Система один раз пересчитает их с нуля.
РегистрМенеджер.УстановитьИспользованиеИтогов(Истина);

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

Метод 3. Использование конфигуратора (быстрый, но требует монопольного доступа)

Если вам нужно очистить регистр полностью и вы имеете возможность выгнать всех пользователей из базы, можно воспользоваться "хитростью" с изменением метаданных. Рассмотрим подробнее этот алгоритм:

  1. Зайдите в Конфигуратор.
  2. Найдите нужный РегистрНакопления.
  3. Временно измените его свойство (например, смените Вид регистра с "Остатки" на "Обороты" или наоборот). Также можно временно удалить одно из измерений или добавить новое обязательное.
  4. Нажмите "Обновить конфигурацию базы данных" (F7).
  5. При принятии изменений система предупредит, что данные будут потеряны. Согласитесь.
  6. После обновления верните настройки регистра в исходное состояние и снова обновите конфигурацию.

Этот метод очищает физические таблицы на уровне СУБД практически мгновенно, однако он требует монопольного доступа и аккуратности, чтобы не забыть вернуть структуру регистра в исходный вид.

Метод 4. Прямое удаление через SQL (только для клиент-серверного варианта)

Для продвинутых администраторов существует способ удаления через консоль MS SQL Server или PostgreSQL. Проанализируем ситуацию: регистр накопления в базе данных состоит из нескольких таблиц (основная таблица движений и таблицы итогов).

Внимание: Прямое редактирование таблиц SQL нарушает регламент технической поддержки 1С, поэтому обязательно делайте бэкап перед началом работ.

  1. Выясните имя таблицы регистра в SQL (через функцию ПолучитьСтруктуруХраненияБазыДанных или сторонние обработки). Обычно это таблицы вида _AccumReg....
  2. Выполните команду TRUNCATE TABLE _AccumReg123 (где 123 — номер вашей таблицы). Это мгновенно очистит основную таблицу.
  3. Обязательно очистите таблицы итогов (текущих и периодических), иначе в отчетах будут "висеть" старые данные.
  4. После SQL-очистки необходимо зайти в 1С и выполнить Тестирование и исправление с установленным флагом Пересчет итогов.

Метод 5. Использование типовых обработок

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

Итоги и рекомендации

Выбор метода зависит от объема данных и наличия доступа к конфигуратору или СУБД. Для небольших регистров (до 100 000 записей) идеально подходит Метод 1 с использованием ОбменДанными.Загрузка. Для массовой очистки миллионов строк лучше использовать Метод 2 с отключением итогов или Метод 3 через изменение метаданных в конфигураторе.

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

← На главную