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