Часто при попытке удаления помеченных на удаление объектов в 1С:УНФ мы сталкиваемся с тем, что система не дает этого сделать. В окне контроля ссылочной целостности мы видим ссылку на документ Корректировка регистров. На первый взгляд кажется, что в этом документе нет никакой информации, так как его табличные части пусты или вовсе отсутствуют на форме. Давайте разберемся, как устроена эта система и как корректно очистить записи, которые мешают удалению.
Первое, что важно уяснить: документ Корректировка регистров является лишь регистратором. Он не хранит данные внутри себя. Когда вы создаете в нем движения, записи фактически записываются в таблицы соответствующих Регистров накопления, Регистров сведений или Регистров бухгалтерии. Ссылка, которую вы видите при попытке удаления, указывает не на сам «пустой» документ, а на факт того, что в регистрах существуют записи, где в поле Регистратор указан этот документ.
На форме документа вы видите лишь динамическое представление этих записей. Поэтому искать «колонки» в самом документе бессмысленно — нужно работать с данными напрямую через регистры.
Чтобы понять, в каком именно регистре записана ссылка на ваш удаляемый объект, выполним следующие действия:
Поиск ссылок на объекты.Корректировка регистров. Однако нам нужно глубже изучить структуру регистров, которые корректируются этим документом.Измерение и Реквизит на предмет соответствия типу удаляемого объекта (например, ДокументСсылка.РасходнаяНакладная).Когда регистр, содержащий ссылку, найден, самым надежным способом удаления «лишних» записей будет использование объекта НаборЗаписей. Это позволит нам точечно удалить только те строки, которые ссылаются на удаляемый объект, не затрагивая остальные движения документа.
Рассмотрим пример кода, который можно выполнить в консоли запросов или внешней обработке:
// Предположим, что регистр, в котором находится ссылка — УчетНоменклатуры
// Получаем набор записей по нашему регистратору
НаборЗаписей = РегистрыНакопления.УчетНоменклатуры.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.Регистратор.Значение = СсылкаНаВашДокументКорректировка;
НаборЗаписей.Прочитать();
// Создаем массив для удаления нужных строк
МассивДляУдаления = Новый Массив;
Для каждого Запись Из НаборЗаписей Цикл
// Проверяем, ссылается ли запись на удаляемый объект
Если Запись.ДокументДвижения = УдаляемыйОбъект Тогда
МассивДляУдаления.Добавить(Запись);
КонецЕсли;
КонецЦикла;
// Удаляем найденные записи из набора
Для каждого Запись Из МассивДляУдаления Цикл
НаборЗаписей.Удалить(Запись);
КонецЦикла;
// Записываем изменения обратно в базу данных
НаборЗаписей.Записать();
Многие пытаются пометить на удаление сам документ Корректировка регистров, но это не всегда дает результат. Если в движениях есть критически важные данные для учета, простое удаление документа приведет к нарушению остатков по регистрам. Поэтому правильный подход — это именно анализ и корректировка движений (наборов записей), а не удаление документа-регистратора как объекта.
Если вы видите, что Корректировка регистров имеет тысячи записей, не пытайтесь разбирать их вручную. Используйте описанный выше метод программной фильтрации НаборЗаписей. Это безопасно, так как вы работаете с конкретным регистратором и конкретным регистром, сохраняя целостность всех остальных данных, которые эта корректировка могла затрагивать.
Измерений на наличие ссылок нужного типа.Удаление помеченных объектов — теперь она должна пройти успешно, так как «жесткая» ссылка на документ-регистратор будет разорвана.Помните, что аккуратность в работе с регистрами — залог корректного управленческого учета в 1С:УНФ!