В процессе сопровождения или обновления баз данных 1С (особенно при переходе с редакции 2.0 на 3.0) специалисты часто сталкиваются с ситуацией, когда регистр сведений, подчиненный регистратору, содержит некорректные данные. Самая сложная форма этой проблемы — наличие записей, где поле Регистратор не просто указывает на удаленный объект, а является абсолютно пустым или содержит данные неверного типа. В таких случаях стандартные методы очистки через СоздатьНаборЗаписей() перестают работать, так как платформа требует обязательной установки отбора по регистратору, который невозможно определить. Разберем подробно, как выйти из этой ситуации.
Первым делом проанализируем, почему стандартный код не срабатывает. Для подчиненного регистра запись набора без отбора по регистратору запрещена на уровне платформы. Если поле регистратора заполнено значением Неопределено или NULL (что иногда случается при программных ошибках записи), можно попробовать следующий код:
НаборЗаписей = РегистрыСведений.УдалитьЛицевыеСчетаРаботниковОрганизации.СоздатьНаборЗаписей();
// Пробуем установить отбор в NULL, если платформа это позволит
НаборЗаписей.Отбор.Регистратор.Установить(NULL);
НаборЗаписей.Записать(Истина);
Однако, как показывает практика, если ссылка действительно «битая» или тип значения в таблице базы данных нарушен, этот метод выдаст ошибку. Рассмотрим более надежные способы.
Проанализируем встроенные механизмы платформы. Часто «пустой» регистратор — это результат физического удаления документа-владельца из базы без очистки движений. В этом случае поможет штатный механизм Тестирование и исправление информационной базы.
Важно: Перед выполнением ТИИ необходимо создать резервную копию базы данных. Если записей немного, платформа успешно обнаружит «осиротевшие» строки в таблице регистра и удалит их.
Если база данных работает в клиент-серверном варианте, мы можем прибегнуть к самому радикальному и эффективному способу — очистке таблицы на уровне СУБД. Для этого выясним имя таблицы регистра с помощью функции ПолучитьСтруктуруХраненияБазыДанных.
Выполним в консоли SQL-запрос (для MS SQL Server):
-- Очистка всей таблицы регистра
TRUNCATE TABLE _InfoRgXXXXX;
-- Где _InfoRgXXXXX - имя таблицы вашего регистра в БД
Если база файловая, и у нас нет SQL-сервера, воспользуемся специализированными утилитами, такими как Tool1CD. Разберем этот процесс по шагам:
1Cv8.1CD через утилиту.УдалитьЛицевыеСчетаРаботниковОрганизации).Этот метод позволяет обойти любые программные проверки платформы 1С, так как мы работаем непосредственно с данными на диске.
Если база снята с поддержки или вы готовы временно внести изменения в структуру, можно применить «хитрость» с метаданными. Проанализируем этот путь:
Внимание: Этот способ приведет к полной потере всех данных в этом регистре и может изменить Идентификатор объекта метаданных, что критично для некоторых механизмов БСП (библиотеки стандартных подсистем). Используйте этот метод только для регистров с префиксом Удалить....
Если битые записи мешают запуску обработчиков обновления (как в случае автора темы), мы можем принудительно «протолкнуть» обновление. Выясним причину остановки — обычно это запись в регистре сведений ОбработчикиОбновления или СведенияОбОбновленииИБ.
Попробуем запустить базу с параметром командной строки, который инициализирует повторный запуск процедур обновления:
/C ЗапуститьОбновлениеИнформационнойБазы
Или программно изменим статус проблемного обработчика:
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ * ИЗ РегистрСведений.ОбработчикиОбновления ГДЕ Статус = &СтатусОшибка";
// ... находим нужную запись и меняем статус на "Выполнено"
Рассмотрим еще один способ, который помогает очистить «мусор», не прибегая к SQL. Для этого используем типовую обработку Выгрузка и загрузка данных XML (с ИТС).
<record>, в которых значение регистратора выглядит подозрительно (пустое или некорректное).Этот метод хорош тем, что он остается в рамках штатных механизмов платформы, но позволяет «вырезать» только поврежденные участки данных, сохраняя остальные записи.
Выбор метода зависит от типа вашей базы (файловая или серверная) и того, насколько критично сохранение идентификаторов метаданных. В большинстве случаев сочетание Тестирования и исправления с включенными флагами очистки является наиболее безопасным и правильным решением задачи.