Как удалить запись в подчиненном регистре сведений без регистратора в 1С

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

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

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

Особенности поиска записей с битыми ссылками через запрос

Проанализируем частую ошибку: если написать условие ГДЕ Регистратор = NULL или ГДЕ Регистратор ЕСТЬ NULL, платформа не найдет битые ссылки, так как битая ссылка является валидным ссылочным типом, но указывает на несуществующий GUID в таблице документа. Чтобы обнаружить такие строки, необходимо заставить СУБД выполнить соединение с таблицей документа через разыменование ссылочного поля.

Посмотрим на корректный текст запроса для поиска битых ссылок:


Запрос = Новый Запрос;
Запрос.Текст = 
    "ВЫБРАТЬ РАЗЛИЧНЫЕ
    |	Цены.Регистратор КАК Регистратор
    |ИЗ
    |	РегистрСведений.ЦеныНоменклатурыМагазинов КАК Цены
    |ГДЕ
    |	Цены.Регистратор.Ссылка ЕСТЬ NULL
    |	И НЕ Цены.Регистратор ЕСТЬ NULL";

Результат = Запрос.Выполнить();
Выборка = Результат.Выбрать();

В этом примере разыменование Цены.Регистратор.Ссылка (или обращение к реквизитам Цены.Регистратор.Номер, Цены.Регистратор.Дата) заставляет СУБД выполнить левое соединение с таблицей документа. Если строки документа в базе нет, соединение возвращает NULL.

Способ 1. Программная очистка через пустой набор записей

Если в поле Регистратор находится битая ссылка правильного ссылочного типа (например, ДокументСсылка.УстановкаЦенНоменклатуры), мы можем установить отбор по этой битой ссылке и записать пустой набор записей.

Рассмотрим пример кода:


Запрос = Новый Запрос;
Запрос.Текст = 
    "ВЫБРАТЬ РАЗЛИЧНЫЕ
    |	Цены.Регистратор КАК Регистратор
    |ИЗ
    |	РегистрСведений.ЦеныНоменклатурыМагазинов КАК Цены
    |ГДЕ
    |	Цены.Регистратор.Ссылка ЕСТЬ NULL";

Выборка = Запрос.Выполнить().Выбрать();

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

Способ 2. Восстановление фиктивного документа по GUID

Если при попытке установить отбор Набор.Отбор.Регистратор.Установить(...) возникает ошибка «Недопустимое значение типа», это означает, что платформа не может сопоставить битую ссылку с конкретным типом метаданных. В таком случае восстановим документ с нужным GUID.

  1. Получаем строковое представление битой ссылки вида <Объект не найден> (84:a1b2c3d4...).
  2. Извлекаем GUID документа и создаем пустой документ соответствующего типа с этим идентификатором:
    
    УИД = Новый УникальныйИдентификатор("a1b2c3d4-e5f6-7890-abcd-ef1234567890");
    Ссылка = Документы.УстановкаЦенНоменклатуры.ПолучитьСсылку(УИД);
    
    НовыйДок = Документы.УстановкаЦенНоменклатуры.СоздатьДокумент();
    НовыйДок.УстановитьСсылкуНового(Ссылка);
    НовыйДок.Дата = ТекущаяДата();
    НовыйДок.Записать();
    
  3. После создания документа выполняем штатную очистку набора записей регистра с отбором по созданной ссылке.
  4. Помечаем созданный документ на удаление и удаляем его штатной обработкой «Удаление помеченных объектов».

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

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

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

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

В исключительных случаях, когда значение поля Регистратор в СУБД повреждено физически (например, содержит 0x00000000000000000000000000000000 или бинарный мусор) и платформа 1С падает с аварийной ошибкой при обращении к таблице, очистку выполняют прямым SQL-запросом.

  1. Определяем имя физической таблицы регистра в СУБД с помощью функции ПолучитьСтруктуруХраненияБазыДанных().
  2. В среде управления СУБД (например, SQL Server Management Studio) выполняем точечный запрос на удаление строк с пустым или отсутствующим полем _RecorderRRef.
  3. После удаления строк обязательно перезапускаем кластер серверов «1С:Предприятие» и очищаем серверный кэш метаданных.
← На главную