При очистке информационной базы или удалении ненужной организации через стандартную процедуру удаления помеченных объектов пользователи и специалисты нередко сталкиваются с ситуацией, когда все документы организации уже удалены, но сам элемент справочника Организации удалить не удается. Контроль ссылочной целостности выдает блокирующую ссылку вида «ПартионныйУчетБУ (Границы) Регистратор».
Разберем детально, почему возникает эта ошибка и какими способами можно полностью очистить базу от ссылок на удаляемую организацию.
Проанализируем внутреннее устройство механизма последовательностей документов в платформе 1С. Последовательность состоит из двух независимых системных таблиц:
Организация), дата границы (Период) и документ, на котором граница остановилась (Регистратор).Когда мы помечаем на удаление и физически удаляем документы по организации, платформа очищает строки в таблице регистрации документов. Однако запись в таблице границ по соответствующему измерению автоматически не удаляется. В этой таблице сохраняется строка, где в измерении указана удаляемая организация, а в поле Регистратор остается пустая ссылка, ссылка на несуществующий объект («Объект не найден») или последний документ. Стандартный механизм контроля ссылочной целостности видит эту системную связь и справедливо запрещает удаление элемента справочника Организации.
При этом встроенный язык 1С имеет архитектурное ограничение: в объектной модели последовательностей отсутствует прямой метод физического удаления строки границы (вроде Границы.Удалить()), а метод УстановитьГраницу() лишь сдвигает дату границы, сохраняя саму строку с измерением в базе данных.
Рассмотрим проверенные способы обхода и устранения этой проблемы.
Самый безопасный и быстрый способ, не требующий написания программного кода, заключается в переносе ссылки на границу на другую (действующую) организацию.
В результате этой операции строка в таблице границ последовательности ПартионныйУчетБУ переключится на рабочую организацию. С удаляемой организации снимется последняя ссылка, и мы сможем без препятствий удалить ее через стандартную обработку удаления помеченных объектов.
Если в базе не должно оставаться никаких следов организации, а также нет второй организации для переброски ссылки, применим программный механизм управления набором записей последовательности.
Разберем алгоритм по шагам:
ПартионныйУчетБУ (например, документ «Поступление товаров и услуг»).Регистратор.
Набор = Последовательности.ПартионныйУчетБУ.СоздатьНаборЗаписей();
Набор.Отбор.Регистратор.Установить(СсылкаНаСозданныйДокумент);
Набор.Прочитать();
Набор.Очистить();
Набор.Записать();
В ситуациях, когда документы уже удалены напрямую и в поле Регистратор таблицы границ осталась «битая ссылка» (отображаемая как «Объект не найден»), поможет встроенная утилита обслуживания базы.
После завершения процедуры платформа попытается очистить некорректные системные ссылки в служебных таблицах, после чего проверим возможность удаления организации в пользовательском режиме.
Если конфигурация сильно изменена, база данных является архивной или организация гарантированно не нужна, можно обойти платформенный контроль ссылочной целостности и удалить элемент справочника программно.
Посмотрим на пример программного кода:
СсылкаНаОрганизацию = Справочники.Организации.НайтиПоНаименованию("Удаляемая Организация");
Если ЗначениеЗаполнено(СсылкаНаОрганизацию) Тогда
ОбъектОрганизация = СсылкаНаОрганизацию.ПолучитьОбъект();
ОбъектОрганизация.Удалить();
КонецЕсли;
Важно: вызов метода Удалить() физически стирает запись из таблицы справочника без проверки существующих ссылок. В системной таблице границ последовательности останется запись с «битой ссылкой» вместо организации. Этот способ следует использовать с осторожностью, предварительно сделав архивную копию базы данных.
В сложных случаях в клиент-серверных базах (MS SQL, PostgreSQL) возможно прибегнуть к очистке строки границы напрямую в СУБД.
Проанализируем порядок действий:
ИмяТаблицы = ПолучитьСтруктуруХраненияБазыДанных().Найти("Последовательность.ПартионныйУчетБУ.Границы", "Имя").ИмяТаблицыХранения;
Сообщить(ИмяТаблицы);
_SeqBnd....Данный способ является исключительным и рекомендуется только опытным администраторам баз данных при невозможности решить проблему средствами платформы 1С.