Как очистить регистр сведений с «битыми» записями и пустым регистратором

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

В процессе сопровождения или обновления баз данных 1С (особенно при переходе с редакции 2.0 на 3.0) специалисты часто сталкиваются с ситуацией, когда регистр сведений, подчиненный регистратору, содержит некорректные данные. Самая сложная форма этой проблемы — наличие записей, где поле Регистратор не просто указывает на удаленный объект, а является абсолютно пустым или содержит данные неверного типа. В таких случаях стандартные методы очистки через СоздатьНаборЗаписей() перестают работать, так как платформа требует обязательной установки отбора по регистратору, который невозможно определить. Разберем подробно, как выйти из этой ситуации.

Метод 1. Использование стандартного объекта НаборЗаписей

Первым делом проанализируем, почему стандартный код не срабатывает. Для подчиненного регистра запись набора без отбора по регистратору запрещена на уровне платформы. Если поле регистратора заполнено значением Неопределено или NULL (что иногда случается при программных ошибках записи), можно попробовать следующий код:


НаборЗаписей = РегистрыСведений.УдалитьЛицевыеСчетаРаботниковОрганизации.СоздатьНаборЗаписей();
// Пробуем установить отбор в NULL, если платформа это позволит
НаборЗаписей.Отбор.Регистратор.Установить(NULL);
НаборЗаписей.Записать(Истина);

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

Метод 2. Тестирование и исправление (ТИИ)

Проанализируем встроенные механизмы платформы. Часто «пустой» регистратор — это результат физического удаления документа-владельца из базы без очистки движений. В этом случае поможет штатный механизм Тестирование и исправление информационной базы.

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

Важно: Перед выполнением ТИИ необходимо создать резервную копию базы данных. Если записей немного, платформа успешно обнаружит «осиротевшие» строки в таблице регистра и удалит их.

Метод 3. Прямое удаление через SQL или утилиты для файловой базы

Если база данных работает в клиент-серверном варианте, мы можем прибегнуть к самому радикальному и эффективному способу — очистке таблицы на уровне СУБД. Для этого выясним имя таблицы регистра с помощью функции ПолучитьСтруктуруХраненияБазыДанных.

Выполним в консоли SQL-запрос (для MS SQL Server):


-- Очистка всей таблицы регистра
TRUNCATE TABLE _InfoRgXXXXX; 
-- Где _InfoRgXXXXX - имя таблицы вашего регистра в БД

Если база файловая, и у нас нет SQL-сервера, воспользуемся специализированными утилитами, такими как Tool1CD. Разберем этот процесс по шагам:

  1. Закроем все сеансы работы с базой.
  2. Откроем файл 1Cv8.1CD через утилиту.
  3. Найдем таблицу, соответствующую нашему регистру (например, УдалитьЛицевыеСчетаРаботниковОрганизации).
  4. В режиме редактирования данных удалим проблемные строки вручную.

Этот метод позволяет обойти любые программные проверки платформы 1С, так как мы работаем непосредственно с данными на диске.

Метод 4. Манипуляция с метаданными (для нетиповых конфигураций)

Если база снята с поддержки или вы готовы временно внести изменения в структуру, можно применить «хитрость» с метаданными. Проанализируем этот путь:

  1. В конфигураторе создадим копию проблемного регистра (просто копированием).
  2. Удалим исходный регистр из метаданных.
  3. Сохраним конфигурацию (база данных удалит физическую таблицу со всеми битыми записями).
  4. Вернем исходное имя скопированному регистру и снова сохранимся.

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

Метод 5. Обход блокировки обновления

Если битые записи мешают запуску обработчиков обновления (как в случае автора темы), мы можем принудительно «протолкнуть» обновление. Выясним причину остановки — обычно это запись в регистре сведений ОбработчикиОбновления или СведенияОбОбновленииИБ.

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

/C ЗапуститьОбновлениеИнформационнойБазы

Или программно изменим статус проблемного обработчика:


Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ * ИЗ РегистрСведений.ОбработчикиОбновления ГДЕ Статус = &СтатусОшибка";
// ... находим нужную запись и меняем статус на "Выполнено"

Метод 6. Выгрузка и загрузка данных XML

Рассмотрим еще один способ, который помогает очистить «мусор», не прибегая к SQL. Для этого используем типовую обработку Выгрузка и загрузка данных XML (с ИТС).

  1. Выгрузим данные регистра в XML-файл.
  2. Откроем полученный файл в текстовом редакторе (например, Notepad++).
  3. Проанализируем структуру и удалим блоки <record>, в которых значение регистратора выглядит подозрительно (пустое или некорректное).
  4. В обработке загрузки выберем режим Очищать данные перед загрузкой и загрузим исправленный файл обратно.

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

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

← На главную