Как полностью удалить помеченные объекты в 1С:Бухгалтерия 3.0 при наличии записей в регистрах версионирования и независимых регистрах

Программист 1С v8.3 (Управляемые формы) 1C:Бухгалтерия IT и автоматизация бизнеса
← На главную

В процессе работы с 1С:Бухгалтерия 3.0 (БП 3.0) многие технические специалисты сталкиваются с ситуацией, когда стандартная обработка «Удаление помеченных объектов» не может окончательно стереть данные. Основная причина — наличие ссылок на объект в различных регистрах, особенно в регистре Версии объектов и в различных независимых регистрах сведений, которые не подчинены документу-регистратору. Разберем по шагам, как решить эту задачу, используя как готовые инструменты, так и программные методы.

Анализ проблемы: почему объект не удаляется

Прежде чем приступать к активным действиям, проанализируем ситуацию. В современных конфигурациях на базе БСП (Библиотеки стандартных подсистем) активно используется механизм версионирования. Все изменения документов записываются в регистр сведений ВерсииОбъектов. Несмотря на то что это типовой механизм, стандартная обработка удаления иногда «спотыкается» об эти записи, если настройки хранения версий установлены как «Бессрочно».

Кроме того, в базе могут существовать независимые регистры сведений (как типовые, так и добавленные в ходе кастомизации), где ссылка на удаляемый объект хранится в качестве измерения или ресурса. Поскольку записи в таких регистрах не связаны с документом жесткой связью «регистратор — набор записей», система контроля ссылочной целостности 1С блокирует удаление основного объекта, чтобы не оставить «битых» ссылок.

Решение 1: Использование «Инструментов разработчика» (IR)

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

  1. Запустим специализированную обработку для поиска и удаления объектов.
  2. В отличие от стандартного механизма, профессиональные инструменты позволяют видеть не только факт наличия ссылки, но и конкретное место (таблицу СУБД), где она находится.
  3. Если регистр сведений является зависимым (подчинен регистратору), обработка удалит его автоматически вместе с объектом.
  4. Для независимых регистров в таких инструментах предусмотрена кнопка «Добавить в кандидаты на удаление». Это позволяет сформировать очередь объектов, которые будут очищены каскадно.

Важно помнить: использование сторонних инструментов требует осторожности и предварительного создания резервной копии информационной базы.

Решение 2: Очистка версий объектов через регламентные задания

Если проблема заключается именно в регистре Версии объектов, мы можем пойти по пути стандартных механизмов БСП. Выясним причину, по которой записи не уходят сами. Часто это связано с тем, что регламентное задание по очистке устаревших версий не запущено или настроено некорректно.

Посмотрим на алгоритм действий:

  1. Перейдем в раздел Администрирование — Обслуживание — Очистка версий.
  2. Настроим расписание для регламентного задания Очистка устаревших версий объектов.
  3. Если нужно удалить записи немедленно, воспользуемся консолью регламентных заданий и запустим очистку принудительно. Система сама проанализирует помеченные на удаление объекты и вычистит их историю из соответствующих таблиц.

Решение 3: Программная очистка ссылок в независимых регистрах

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

Проанализируем ситуацию программно: нам нужно найти все ссылки на объект с помощью метода НайтиСсылки(), а затем перебрать полученную таблицу.


// Пример программной очистки независимого регистра сведений
Процедура ОчиститьСсылкиНаОбъект(УдаляемаяСсылка)
    
    МассивСсылок = Новый Массив;
    МассивСсылок.Добавить(УдаляемаяСсылка);
    
    ТаблицаСсылок = НайтиСсылки(МассивСсылок);
    
    Для Каждого СтрокаСсылки Из ТаблицаСсылок Цикл
        МетаданныеОбъекта = СтрокаСсылки.Данные.Метаданные();
        
        // Проверяем, является ли это независимым регистром сведений
        Если Метаданные.РегистрыСведений.Содержит(МетаданныеОбъекта) 
             И МетаданныеОбъекта.РежимЗаписи = Метаданные.СвойстваОбъектов.РежимЗаписиРегистра.Независимый Тогда
            
            НаборЗаписей = РегистрыСведений[МетаданныеОбъекта.Имя].СоздатьНаборЗаписей();
            
            // Устанавливаем отбор по всем измерениям, где может быть ссылка
            Для Каждого Измерение Из МетаданныеОбъекта.Измерения Цикл
                Если Измерение.Тип.СодержитТип(ТипЗнч(УдаляемаяСсылка)) Тогда
                    НаборЗаписей.Отбор[Измерение.Имя].Установить(УдаляемаяСсылка);
                КонецЕсли;
            КонецЦикла;
            
            НаборЗаписей.Записать(); // Записываем пустой набор, тем самым удаляя записи
            Сообщить("Очищены записи в регистре: " + МетаданныеОбъекта.Имя);
            
        КонецЕсли;
    КонецЦикла;

КонецПроцедуры

Этот подход позволяет «отвязать» документ от всех независимых таблиц, после чего типовая обработка удаления сработает без ошибок.

Решение 4: Монопольный режим и блокировка пользователей

Иногда проблема удаления в БП 3.0 кроется в блокировках таблиц. Выясним, как ускорить процесс штатными средствами. В последних версиях платформы 8.3 при запуске удаления помеченных объектов доступна опция «Заблокировать всю работу в программе и ускорить удаление».

Рассмотрим, что происходит при включении этой настройки:

Дополнительные рекомендации

Если после всех манипуляций объект всё равно не удаляется, рекомендуется проверить механизм Истории данных, который появился в платформе начиная с версии 8.3.11. Даже если версионирование БСП отключено, системная история может хранить ссылки. В таком случае поможет программный вызов команды ИсторияДанных.УдалитьДанные(Ссылка).

Резюме: для успешного удаления «упрямых» объектов в БП 3.0 следует сочетать использование регламентных заданий по очистке версий, блокировку базы для монопольного доступа и, при необходимости, программную очистку независимых регистров через наборы записей.

← На главную