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

Программист 1С v8.3 (Обычные формы) Бухгалтерский учет Финансы и профессиональные услуги
← На главную

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

Понимаем архитектуру документа

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

Пошаговое решение задачи

Для корректного удаления данных выполним следующие действия:

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

Пример программного кода

Рассмотрим, как реализовать этот алгоритм на практике. Для начала создадим набор записей и установим отбор по нашему документу-регистратору:


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

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


Для Индекс = 1 - Набор.Количество() По 0 Цикл
    Запись = Набор[- Индекс];
    Если Запись.ОсновноеСредство = НужноеМнеОсновноеСредство Тогда
        Набор.Удалить(- Индекс);
    КонецЕсли;
КонецЦикла;
Набор.Записать();

Почему это работает

Метод Набор.Прочитать() загружает в оперативную память текущие движения документа по выбранному регистру. Работая с коллекцией записей через Набор, мы воздействуем напрямую на таблицу регистра. После выполнения метода Набор.Записать() платформа автоматически обновляет таблицу движений. Этот метод является наиболее безопасным и стандартным способом управления движениями документа.

Рекомендации по отладке

Если вы не видите данных в отладчике, когда просматриваете документ, воспользуйтесь следующими советами:

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

← На главную