Как удалить организацию в 1С, если удаление блокируется ссылкой «ПартионныйУчетБУ (Границы) Регистратор»?

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

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

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

Почему возникает ссылка на границы последовательности

Проанализируем внутреннее устройство механизма последовательностей документов в платформе 1С. Последовательность состоит из двух независимых системных таблиц:

  1. Таблица регистрации документов: содержит перечень документов, включенных в последовательность, с их моментами времени.
  2. Таблица границ (Границы): хранит текущую точку актуальности последовательности. В этой таблице содержатся измерения последовательности (например, Организация), дата границы (Период) и документ, на котором граница остановилась (Регистратор).

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

При этом встроенный язык 1С имеет архитектурное ограничение: в объектной модели последовательностей отсутствует прямой метод физического удаления строки границы (вроде Границы.Удалить()), а метод УстановитьГраницу() лишь сдвигает дату границы, сохраняя саму строку с измерением в базе данных.

Рассмотрим проверенные способы обхода и устранения этой проблемы.

Способ 1. Замена ссылок типовыми инструментами (рекомендуемый)

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

  1. Откроем типовую обработку «Поиск и замена значений» (или встроенный инструмент «Поиск и удаление дублей» / «Объединение дублей»).
  2. Укажем удаляемую организацию в качестве заменяемого значения.
  3. В качестве правильного значения выберем любую существующую рабочую организацию в базе данных.
  4. Выполним замену ссылок во всех найденных местах.

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

Способ 2. Очистка последовательности через временный документ

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

Разберем алгоритм по шагам:

  1. Создадим в базе временный фиктивный документ по удаляемой организации, входящий в последовательность ПартионныйУчетБУ (например, документ «Поступление товаров и услуг»).
  2. Проведем этот документ. При проведении платформа принудительно переставит границу последовательности и запишет ссылку на этот конкретный документ в поле Регистратор.
  3. Используем программную очистку набора записей последовательности по данному документу через внешнюю обработку:

Набор = Последовательности.ПартионныйУчетБУ.СоздатьНаборЗаписей();
Набор.Отбор.Регистратор.Установить(СсылкаНаСозданныйДокумент);
Набор.Прочитать();
Набор.Очистить();
Набор.Записать();
  1. Снимем фиктивный документ с проведения и пометим его на удаление.
  2. Запустим штатное удаление помеченных объектов.

Способ 3. Тестирование и исправление информационной базы

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

  1. Создадим резервную копию базы данных.
  2. Откроем информационную базу в режиме «Конфигуратор».
  3. Перейдем в меню Администрирование -> Тестирование и исправление.
  4. Установим флажок напротив пункта Проверка ссылочной целостности.
  5. В переключателе «При наличии неразрешимых ссылок» выберем вариант Очищать ссылки.
  6. Запустим выполнение тестирования.

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

Способ 4. Непосредственное программное удаление объекта

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

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


СсылкаНаОрганизацию = Справочники.Организации.НайтиПоНаименованию("Удаляемая Организация");
Если ЗначениеЗаполнено(СсылкаНаОрганизацию) Тогда
    ОбъектОрганизация = СсылкаНаОрганизацию.ПолучитьОбъект();
    ОбъектОрганизация.Удалить();
КонецЕсли;

Важно: вызов метода Удалить() физически стирает запись из таблицы справочника без проверки существующих ссылок. В системной таблице границ последовательности останется запись с «битой ссылкой» вместо организации. Этот способ следует использовать с осторожностью, предварительно сделав архивную копию базы данных.

Способ 5. Прямая очистка на уровне СУБД (для клиент-серверного режима)

В сложных случаях в клиент-серверных базах (MS SQL, PostgreSQL) возможно прибегнуть к очистке строки границы напрямую в СУБД.

Проанализируем порядок действий:

  1. Выясним имя таблицы границ с помощью функции встроенного языка:
    
    ИмяТаблицы = ПолучитьСтруктуруХраненияБазыДанных().Найти("Последовательность.ПартионныйУчетБУ.Границы", "Имя").ИмяТаблицыХранения;
    Сообщить(ИмяТаблицы);
    
    Обычно это таблица вида _SeqBnd....
  2. Остановим кластер серверов 1С и создадим резервную копию базы в СУБД.
  3. Выполним SQL-запрос на удаление записи из этой таблицы по внутреннему идентификатору удаляемой организации.

Данный способ является исключительным и рекомендуется только опытным администраторам баз данных при невозможности решить проблему средствами платформы 1С.

← На главную