Мусор в ссылках базы 1С: найти, проверить и убрать без потерь

· 9 мин

Содержание

Очистить ссылки в 1С можно тремя путями. Лишние объекты, помеченные на удаление, убирает Администрирование → Обслуживание → Корректировка данных → Удаление помеченных объектов. Битые ссылки вида <Объект не найден> (45:b2f1…) чинит Конфигуратор: Администрирование → Тестирование и исправление, флажок проверки ссылочной целостности и режим «Очищать ссылки». Пустые реквизиты находят запросом или отбором списка и заполняют вручную либо групповой обработкой.

Типичная ситуация: бухгалтер открывает старую реализацию, а в поле «Контрагент» вместо названия стоит <Объект не найден>. Документ не проводится, отчёт по взаиморасчётам показывает строку без имени. Удаление и диагностику таких ссылок важно делать в правильном порядке: сначала найти, где ссылка используется, потом решить, восстанавливать объект или очищать поле.

Пустая, битая, помеченная: три разных проблемы

Под «очисткой ссылок» понимают разное. От типа проблемы зависит инструмент.

Что видитеЧто этоЧем лечат
Поле реквизита пустоеПустая ссылка: значение просто не выбраноЗаполнение вручную, групповое изменение реквизитов
<Объект не найден> (32:8f3a…)Битая ссылка: в поле хранится идентификатор объекта, которого в базе нетТестирование и исправление, восстановление объекта
Объект с красным крестиком в спискеОбъект помечен на удаление, но ещё физически в базеУдаление помеченных объектов
Два элемента «ООО Ромашка»Дубль: обе ссылки живые, но учёт раздваиваетсяПоиск и удаление дублей

Откуда берутся битые ссылки:

  • 🗑️ объект удалили непосредственно, без проверки ссылок (право «Интерактивное удаление» или программный вызов Удалить() у объекта);
  • 🔄 обмен данными загрузил документ, а элемент справочника, на который он ссылается, не пришёл;
  • 💥 файловая база пострадала при сбое питания или копировании «на ходу»;
  • 🛠️ кто-то правил таблицы напрямую в SQL, минуя платформу;
  • 📦 данные перенесли частично: выгрузили документы без справочников.

Цифры в скобках после <Объект не найден> полезны. Первое число — номер таблицы, второе — идентификатор записи. По ним в Конфигураторе можно понять, из какого справочника пропал объект, и восстановить его из резервной копии.

Как найти, где используется ссылка

Перед удалением любого объекта посмотрите, кто на него ссылается. В типовых конфигурациях на БСП (Бухгалтерия 3.0, ЗУП 3.1, УТ 11) это делается из карточки объекта.

Места использования объекта

  1. Откройте элемент справочника или документ.
  2. Нажмите Ещё и выберите Места использования.
  3. Система покажет список документов, регистров и справочников, где объект встречается.

Тот же поиск есть в стандартной обработке: Все функции → Стандартные → Поиск ссылок на объект. Команда «Все функции» появляется в главном меню после флажка Сервис и настройки → Параметры → Отображать команду «Все функции».

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

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

ВЫБРАТЬ
    Реализация.Ссылка КАК Документ,
    Реализация.Контрагент КАК БитаяСсылка
ИЗ
    Документ.РеализацияТоваровУслуг КАК Реализация
        ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Контрагенты КАК Контрагенты
        ПО Реализация.Контрагент = Контрагенты.Ссылка
ГДЕ
    Контрагенты.Ссылка ЕСТЬ NULL
    И Реализация.Контрагент <> ЗНАЧЕНИЕ(Справочник.Контрагенты.ПустаяСсылка)

Логика простая: левое соединение не нашло пару в справочнике, но поле при этом не пустое. Значит, ссылка ведёт в никуда.

Пустые ссылки ищут ещё проще: условие ГДЕ Реализация.Контрагент = ЗНАЧЕНИЕ(Справочник.Контрагенты.ПустаяСсылка). Без запроса тоже можно: в списке документов настройте отбор по полю «Контрагент» с видом сравнения «Не заполнено».

Консоль запросов в Такси открывается как внешняя обработка. Её версия под управляемые формы входит в набор обработок с диска ИТС; откройте её через главное меню Файл → Открыть.

Удаление помеченных и тестирование базы

Удаление помеченных объектов

Это основной штатный способ убрать мусор, не создав битых ссылок. Обработка перед удалением проверяет, не ссылается ли на объект что-то живое.

  1. Сделайте резервную копию базы .
  2. Откройте Администрирование → Обслуживание → Корректировка данных → Удаление помеченных объектов. Если пути нет, используйте Все функции → Стандартные → Удаление помеченных объектов.
  3. Выберите режим: все помеченные или выборочно. Выборочный режим удобен, когда помечены сотни объектов, а удалить нужно только старые номенклатурные позиции.
  4. Запустите удаление.
  5. В конце обработка покажет объекты, которые удалить не удалось, и места, где они используются.

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

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

Тестирование и исправление

Битые ссылки, которые уже есть в базе, штатно лечит Конфигуратор.

  1. Выгрузите базу в .dt (Администрирование → Выгрузить информационную базу) или сделайте копию файла 1Cv8.1CD. Без копии не начинайте: исправление необратимо.
  2. Попросите пользователей выйти. Тестирование требует монопольного доступа.
  3. В Конфигураторе: Администрирование → Тестирование и исправление.
  4. Отметьте «Проверка логической целостности информационной базы» и «Проверка ссылочной целостности информационной базы».
  5. Выберите режим «Тестирование и исправление».
  6. В блоке «При наличии ссылок на несуществующие объекты» выберите действие.
  7. Нажмите Выполнить и дождитесь протокола.

Что выбрать в шаге 6:

ВариантЧто произойдётКогда выбирать
Создавать объектыПлатформа создаст пустые объекты-заглушки с именем вида «Объект не найден (…)»Нужно сохранить связи и потом заполнить заглушку правильными данными
Очищать ссылкиПоле станет пустымЗначение не важно или его проще выбрать заново
Не изменятьТолько отчёт в протоколеПервый прогон: оценить масштаб

Начинайте с «Не изменять» и галки «Только тестирование». Протокол покажет, сколько ссылок битые и в каких таблицах. Если речь о десятке документов, проще восстановить пропавший элемент из копии. Если о тысячах — выбирайте «Создавать объекты» и затем разбирайтесь с заглушками.

Тот же режим запускается из командной строки, удобно для ночного обслуживания:

"C:\Program Files\1cv8\8.3.24.1691\bin\1cv8.exe" DESIGNER /F"D:\Bases\Buh" /N"Администратор" /P"пароль" /IBCheckAndRepair -ReIndex -BadRefCreate /Out"D:\Logs\check.txt"

Ключ -BadRefClear очищает ссылки, -BadRefNone ничего не меняет, -TestOnly включает режим только проверки. Номер версии в пути замените на свой.

Для файловой базы есть отдельная утилита chdbfl.exe в каталоге bin платформы. Она проверяет физическую целостность файла 1Cv8.1CD. Запускайте её первой, если база падала: логическая проверка на повреждённом файле может не дойти до конца.

Диагностика: выберите симптом

Обработки и код для массовой очистки

Штатных средств хватает в большинстве задач. Внешние обработки нужны, когда надо массово заменить одну ссылку на другую или почистить определённый реквизит по условию.

Встроенные обработки БСП

В разделе Администрирование → Обслуживание → Корректировка данных типовых конфигураций есть:

  • 🔁 Поиск и удаление дублей — находит похожие элементы, переносит все ссылки на основной и помечает остальные на удаление;
  • ✏️ Групповое изменение реквизитов — меняет значение поля сразу у выделенных объектов: например, ставит правильного контрагента в 200 документов, где была заглушка.

Связка для заглушек после тестирования: в списке справочника найдите элементы с «Объект не найден» в наименовании. Если это дубль существующего элемента, объедините их через поиск дублей. Ссылки перейдут на правильный элемент, заглушка уйдёт на удаление.

Внешние обработки

Открываются через Файл → Открыть. Нужно право «Интерактивное открытие внешних обработок» и подтверждение запуска в окне безопасности.

Берите обработки только из проверенных источников. Обработка выполняется с вашими правами и может изменить или удалить данные. Чужой .epf сначала прогоните на копии базы.

Если пишете свою

Для поиска мест использования в коде есть метод НайтиПоСсылкам. Он принимает массив ссылок и возвращает таблицу значений с колонками «Ссылка», «Данные», «Метаданные». Проверка, существует ли объект за ссылкой:

Если Ссылка.ПолучитьОбъект() = Неопределено Тогда
    // объекта нет, ссылка битая
КонецЕсли;

Не используйте в своих обработках Объект.Удалить() для очистки. Этот метод удаляет запись без проверки ссылок и как раз плодит битые ссылки. Ставьте пометку УстановитьПометкуУдаления(Истина) и отдавайте удаление штатной обработке.

Большие базы: SQL, индексы и время

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

Что помогает:

  1. Реиндексация. В Конфигураторе в том же окне тестирования отметьте только «Реиндексация таблиц информационной базы», остальные флажки снимите. Для серверной базы то же делает СУБД.
  2. Обслуживание индексов в MS SQL. План обслуживания с перестроением индексов и обновлением статистики. Ручной вариант для одной базы:
USE Buh;
EXEC sp_MSforeachtable 'ALTER INDEX ALL ON ? REBUILD';
EXEC sp_updatestats;

В PostgreSQL ту же роль выполняют REINDEX DATABASE и VACUUM ANALYZE.

  1. Выборочное удаление частями. Удалять по 500-1000 объектов за проход быстрее, чем все 40 тысяч сразу: меньше длинных транзакций и блокировок.
  2. Время. Запускайте вечером, когда пользователей нет. Перестроение индексов на MS SQL Standard блокирует таблицы.

Не удаляйте записи и не очищайте поля SQL-запросами напрямую в таблицах _Reference, _Document и подобных. Платформа не узнает об изменениях, итоги регистров разойдутся, а битых ссылок станет больше. SQL — только для обслуживания индексов и статистики.

Как не допустить новых битых ссылок

  • 🔐 Отберите право «Интерактивное удаление» у всех, кроме администратора. Пользователи помечают, администратор удаляет помеченные.
  • 📅 Чистите помеченные регулярно, раз в месяц или квартал, а не раз в пять лет.
  • 🔄 В обменах проверяйте, что правила выгружают справочники вместе с документами. После обмена загляните в протокол.
  • 💾 Копируйте файловую базу только выгрузкой .dt или после выхода всех пользователей.
  • 🧪 Проверяйте базу тестированием в режиме «Не изменять» раз в квартал: проблемы заметнее, пока их десять, а не десять тысяч.

Если ссылки не очищаются

Бывает, что ничего из штатного не срабатывает.

  • Тестирование пишет ошибку и останавливается. Начните с физической проверки (chdbfl.exe для файловой базы). В серверной базе проверьте СУБД: для MS SQL DBCC CHECKDB.
  • Битые ссылки возвращаются после обмена. Источник — другая база. Почистите её или исправьте правила обмена, иначе каждая синхронизация привезёт мусор заново.
  • Объект не удаляется даже после замены ссылок. На него могут ссылаться регистры сведений или настройки, которые не видны в форме документа. Список «Места использования» показывает и их.
  • Нужно вернуть удалённый элемент с его идентификатором. Разверните копию базы, выгрузите элемент универсальным обменом XML (обработка Выгрузка и загрузка данных XML) и загрузите в рабочую базу. Идентификатор сохранится, и битые ссылки снова станут живыми.

Частые вопросы

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