Как разом удалить все записи регистра накопления в 1С:Управление торговлей 10.3?

Программист 1С v8.3 (Обычные формы) 1С:Управление торговлей Управленческий учет Торговля и дистрибуция
← На главную

При работе с конфигурацией 1С:Управление торговлей 10.3 разработчики часто сталкиваются с задачей массовой очистки данных. Одной из наиболее частых проблем является попытка удаления записей из РегистрыНакопления. Давайте разберем, почему простой подход здесь не работает и как решить эту задачу профессионально, не нарушив целостность базы данных.

Почему не работает метод простого удаления?

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

Попытка вызвать НаборЗаписей = РегистрыНакопления.ИмяРегистра.СоздатьНаборЗаписей(); НаборЗаписей.Записать(); без установленного отбора приведет к системной ошибке. Это происходит потому, что в 1С все регистры накопления жестко подчинены регистратору. Платформа требует, чтобы любая операция записи (или удаления) была привязана к конкретному документу-источнику.

Решение задачи: алгоритм удаления по регистраторам

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

  1. Получение списка регистраторов: Сначала необходимо сформировать выборку всех записей регистра, чтобы определить, какие именно документы являются регистраторами.
  2. Циклический обход: Для каждого уникального регистратора мы создаем отдельный набор записей.
  3. Установка отбора: В наборе записей мы обязательно устанавливаем отбор по конкретному регистратору с помощью метода НаборЗаписей.Отбор.Регистратор.Установить(РегистраторСсылка).
  4. Запись набора: Вызываем метод НаборЗаписей.Записать(). При пустом наборе записей этот метод физически удаляет данные из таблицы регистра для выбранного документа.

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


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

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

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

Важные замечания по производительности и безопасности

При выполнении массовых операций удаления важно учитывать несколько критических аспектов:

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

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

← На главную