При работе с большими объемами данных в системе 1С часто возникает необходимость радикальной очистки регистра накопления. Когда речь идет об оборотном регистре, простое удаление строк из основной таблицы приводит к тому, что виртуальные таблицы начинают возвращать некорректные результаты. Давайте разберем, как выполнить эту операцию правильно, чтобы не повредить структуру базы данных.
Прежде чем приступать к манипуляциям с SQL, важно осознать, что 1С хранит данные регистра не в одной таблице. Помимо основной таблицы движений (которая обычно имеет префикс AccumRg), существуют таблицы итогов. Если вы удалите данные только из основной таблицы, механизмы 1С будут по-прежнему считывать старые итоговые значения, что приведет к появлению «несуразицы» в отчетах.
Чтобы точно определить, какие таблицы задействованы в конкретном регистре, используйте встроенный метод ПолучитьСтруктуруХраненияБазыДанных(). Это позволит вам увидеть полный список таблиц, включая таблицы итогов, которые необходимо очистить синхронно с основными данными.
Существует несколько стратегий решения задачи, от безопасных (но медленных) до радикальных (но быстрых). Рассмотрим их подробнее.
Если объем данных не критичен, лучше всего воспользоваться штатными средствами платформы. Вы можете программно создать набор записей регистра с пустым отбором и выполнить запись. В этом случае 1С сама позаботится о корректном обновлении всех таблиц итогов.
Если данных миллионы и стандартные средства работают слишком долго, приходится обращаться напрямую к SQL-серверу. В этом случае мы рекомендуем действовать по следующему алгоритму:
DELETE, будьте готовы к длительному времени выполнения. Команда TRUNCATE работает значительно быстрее, так как не протоколирует каждую строку, но убедитесь, что на таблицы не ссылаются внешние ключи.Важно помнить, что простое выключение флага использования итогов в настройках не удаляет физические данные из таблиц итогов на уровне SQL. Флаг лишь меняет режим работы платформы с этими данными. Поэтому очистку таблиц итогов нужно проводить принудительно.
Многие задаются вопросом: что лучше — пересчет итогов или полное их отключение с последующим включением? С технической точки зрения, полное отключение и включение итогов через конфигуратор принуждает платформу заново перестроить структуры итогов на основе данных, оставшихся в основной таблице (после их очистки — на основе пустой таблицы).
Если вы хотите сохранить историю операций, не удаляя записи физически, рассмотрите вариант сторнирования. Вы можете записать движения с обратным знаком (отрицательные суммы). Это позволит обнулить обороты, сохранив при этом целостность учетных данных и историю операций в базе.
Прямое вмешательство в структуру SQL-базы — это всегда риск. Чтобы процесс прошел максимально гладко, придерживайтесь наших рекомендаций:
ПолучитьСтрукХраБазыДанных(). Имена таблиц могут отличаться в зависимости от версии платформы.Разберем типичную ситуацию: если вы удалили записи, но не пересчитали итоги, виртуальная таблица Обороты будет обращаться к старым данным в таблицах итогов. Чтобы «подружить» физическое состояние БД с логикой 1С, обязательно выполняйте полное перестроение итогов после всех SQL-операций.