Объект удалён, а ссылка осталась: как вычистить неразрешимые ссылки из конфигурации и базы 1С
Содержание
Неразрешимые ссылки на объекты метаданных в 1С появляются, когда один объект конфигурации ссылается на другой, которого больше нет: справочник удалили, а реквизит документа всё ещё имеет тип СправочникСсылка.Удалённый. Исправляют их в Конфигураторе: Конфигурация → Проверка конфигурации с флажком «Поиск некорректных ссылок», затем правка каждого найденного свойства или возврат объекта в объединение.
Чаще всего ошибка всплывает при обновлении нетиповой конфигурации через сравнение и объединение: часть объектов сняли с отметки, а отмеченные на них ссылаются. Платформа не даёт сохранить такую конфигурацию или собирает её с «дырами», которые потом вылезают ошибками в формах и запросах.
Отдельная история — битые ссылки уже в данных: в документе вместо контрагента видно <Объект не найден>. Это другой слой проблемы, и лечится он тестированием и исправлением базы. Ниже оба слоя разобраны по порядку.
Где искать неразрешимые ссылки: проверка конфигурации
Первый шаг — понять, что именно сломано и где. Гадать по тексту ошибки не нужно: Конфигуратор сам составит список.
Проверка через меню Конфигуратора
- Откройте базу в режиме Конфигуратор и откройте конфигурацию:
Конфигурация → Открыть конфигурацию. - Выберите
Конфигурация → Проверка конфигурации.... - Отметьте «Проверка логической целостности конфигурации» и «Поиск некорректных ссылок». Остальные флажки (синтаксис модулей, неиспользуемые процедуры) для этой задачи не нужны и только удлиняют проверку.
- Нажмите «Выполнить» и дождитесь окна служебных сообщений.
Каждая строка результата указывает объект и свойство, где лежит ссылка в пустоту. Двойной щелчок по строке открывает нужный объект в дереве метаданных.
💡 Если строк сотни, скопируйте окно сообщений в текстовый файл и отсортируйте. Обычно сотни строк сводятся к 3-5 удалённым объектам, на которые ссылаются из разных мест.
Проверка из командной строки
Для больших конфигураций и регулярных проверок удобнее запуск без интерфейса:
"C:\Program Files\1cv8\8.3.24.1691\bin\1cv8.exe" DESIGNER /F "D:\Bases\Buh" /N "Администратор" /P "" /CheckConfig -ConfigLogIntegrity -IncorrectReferences /Out "D:\Logs\check.txt"
Путь к платформе и номер версии подставьте свои. Результат окажется в check.txt — его удобно прикладывать к задаче разработчику.
Что обычно оказывается в списке
- 🧩 тип реквизита, табличной части или параметра запроса указывает на удалённый объект;
- 📂 в составе подсистемы, плана обмена или функциональной опции числится объект, которого нет;
- 🔐 роль содержит права на несуществующий объект;
- 🖼️ реквизит формы или элемент командного интерфейса ссылается на удалённую команду;
- 🔗 определяемый тип или подписка на событие перечисляет устаревшие типы.
Откуда берутся битые ссылки после обновления
Неразрешимая ссылка — всегда след несогласованного изменения. Типовая конфигурация сама по себе их не содержит: фирма-разработчик проверяет релиз перед выпуском.
| Ситуация | Что происходит | Как распознать |
|---|---|---|
| Объединение с поставкой, часть объектов не отмечена | Новый объект поставщика не взяли, а изменённый объект, который на него ссылается, взяли | Ошибки сразу после «Сравнение, объединение» |
| Ручное удаление объекта | Объект удалили, не проверив, где он используется | Ссылки на один и тот же объект из многих мест |
| Частичная загрузка из XML-файлов | Загрузили выборочный набор файлов без зависимых объектов | Ошибки после Загрузить конфигурацию из файлов |
| Перенос объектов между конфигурациями | Скопировали документ без справочников из его реквизитов | Ссылки на объекты с префиксом чужой разработки |
| Расширение после обновления основной конфигурации | В расширении заимствован объект, который в новом релизе переименовали или удалили | Расширение не применяется, база пишет о несоответствии |
Самый частый сценарий — первый. При обновлении доработанной конфигурации кто-то снимает галочки с «лишних» новых объектов поставщика, чтобы не тянуть в базу ненужное. Но изменённые типовые объекты уже ссылаются на эти новинки.
Если неразрешимые ссылки появились в типовой конфигурации на поддержке без доработок, скорее всего повреждён сам файл обновления или конфигурация загружена не полностью. Скачайте дистрибутив повторно, а не правьте объекты руками.
Порядок исправления: от конфигурации к данным
Ошибку лучше чинить в строгой последовательности. Если сначала запустить тестирование базы , а конфигурация ещё содержит ссылки на несуществующие типы, исправление данных пройдёт впустую.
Перед любыми правками сделайте выгрузку информационной базы в .dt и сохраните текущую конфигурацию в .cf. Выгрузка .dt требует, чтобы в базе не работали пользователи.
Шаг 1. Исправить объединение
Если ошибка возникла в окне сравнения и объединения, не закрывайте его.
- При нажатии «Выполнить» платформа покажет список неразрешимых ссылок: какие отмеченные объекты ссылаются на неотмеченные.
- Самый безопасный вариант — отметить для объединения все объекты, на которые есть ссылки. В окне со списком есть команда для этого, ей и пользуйтесь.
- Если объект поставщика вам действительно не нужен, оставьте его неотмеченным, но тогда вручную уберите ссылку на него в отмеченных объектах после объединения.
- Повторите «Выполнить» и убедитесь, что предупреждение больше не появляется.
💡 Если сомневаетесь, берите объект поставщика. Лишний справочник в конфигурации ничего не ломает, а выкинутый ломает следующее обновление.
Шаг 2. Убрать ссылки на удалённые объекты вручную
Для каждой строки из проверки конфигурации:
- Откройте объект двойным щелчком по сообщению.
- Найдите свойство из сообщения: тип реквизита, состав подсистемы, права роли.
- Выберите решение: заменить тип на существующий, удалить реквизит или вернуть удалённый объект.
- После всех правок повторите проверку, пока список не станет пустым.
Вернуть удалённый объект проще всего сравнением с сохранённой копией: Конфигурация → Сравнить, объединить с конфигурацией из файла..., отметить только нужный объект и выполнить объединение.
Шаг 3. Обновить конфигурацию базы данных
После исправлений выполните Конфигурация → Обновить конфигурацию базы данных (F7). Если меняли типы реквизитов, платформа покажет список реструктуризации — прочитайте его перед подтверждением. Удаление реквизита удаляет и его данные.
Шаг 4. Тестирование и исправление базы
Когда конфигурация чистая, переходите к данным: Администрирование → Тестирование и исправление... в Конфигураторе. Режим требует монопольного доступа, поэтому пользователей нужно попросить выйти.
Ключевые настройки для битых ссылок:
| Параметр | Значение | Что даёт |
|---|---|---|
| Проверка логической целостности информационной базы | вкл. | Находит повреждённые записи |
| Проверка ссылочной целостности информационной базы | вкл. | Ищет ссылки на несуществующие объекты |
| При наличии ссылок на несуществующие объекты | «Создавать объекты» или «Очищать ссылки» | Определяет, как поступить с битой ссылкой |
| Режим | сначала «Только тестирование» | Показывает масштаб без изменений |
Выбор между двумя режимами важен:
- ✅ Создавать объекты — платформа создаёт элемент-заглушку с тем же идентификатором. Документы сохраняют связь, а заглушку потом можно заполнить или объединить с правильным элементом. Это вариант по умолчанию для учётных данных.
- ⚠️ Очищать ссылки — поле становится пустым. Связь теряется навсегда, проводки документа могут перестать сходиться с регистрами.
Тот же прогон можно запустить из командной строки:
"C:\Program Files\1cv8\8.3.24.1691\bin\1cv8.exe" DESIGNER /F "D:\Bases\Buh" /N "Администратор" /P "" /IBCheckAndRepair -LogIntegrity -TestOnly /Out "D:\Logs\tii.txt"
После анализа отчёта уберите -TestOnly и добавьте -BadRefCreate (создавать объекты) или -BadRefClear (очищать ссылки).
Точечная чистка обработками и скриптами
Тестирование и исправление обрабатывает базу целиком. Иногда нужно другое: найти битые ссылки в одном виде документов и решить судьбу каждой отдельно. Для этого подходит запрос во внешней обработке или консоли запросов.
Как найти битые ссылки запросом
Приём простой: если ссылка не пустая, а обращение к её реквизиту возвращает NULL, объекта в базе нет.
ВЫБРАТЬ
Док.Ссылка КАК Документ,
Док.Контрагент КАК БитаяСсылка
ИЗ
Документ.РеализацияТоваровУслуг КАК Док
ГДЕ
Док.Контрагент <> ЗНАЧЕНИЕ(Справочник.Контрагенты.ПустаяСсылка)
И Док.Контрагент.Наименование ЕСТЬ NULL
Имена документа и реквизита подставьте под свою задачу. Запрос работает и в файловой, и в клиент-серверной базе, ничего не меняет и безопасен для рабочей базы.
Как очистить или заменить ссылки кодом
Если решено заменить битую ссылку правильным элементом, код во внешней обработке может выглядеть так:
&НаСервереБезКонтекста
Процедура ЗаменитьБитыеСсылкиНаСервере(НовыйКонтрагент)
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Док.Ссылка КАК Ссылка
|ИЗ
| Документ.РеализацияТоваровУслуг КАК Док
|ГДЕ
| Док.Контрагент <> ЗНАЧЕНИЕ(Справочник.Контрагенты.ПустаяСсылка)
| И Док.Контрагент.Наименование ЕСТЬ NULL";
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
ДокОбъект = Выборка.Ссылка.ПолучитьОбъект();
ДокОбъект.Контрагент = НовыйКонтрагент;
ДокОбъект.ОбменДанными.Загрузка = Истина;
ДокОбъект.Записать(РежимЗаписиДокумента.Запись);
КонецЦикла;
КонецПроцедуры
ОбменДанными.Загрузка = Истина отключает проверки и обработчики записи, поэтому документ записывается без перепроведения. Движения при этом не меняются: если контрагент участвует в регистрах, их придётся поправить отдельно или перепровести документы штатно.
Запускайте такой код сначала на копии базы. Загрузка в режиме обмена обходит всю бизнес-логику, и ошибку в условии отбора никто не остановит.
Типовые инструменты конфигурации
В конфигурациях на БСП (БП 3.0, ЗУП 3.1, УТ 11) есть «Поиск и удаление дублей» и «Удаление помеченных объектов» в разделе Администрирование → Обслуживание. Первая помогает, когда после исправления с созданием объектов появились заглушки: их можно заменить на правильные элементы во всех документах сразу.
Файловая и клиент-серверная база: в чём разница
Логика исправления одна, но инструменты и риски различаются.
| Что делаем | Файловая база | Клиент-серверная (MS SQL, PostgreSQL) |
|---|---|---|
| Резервная копия | Копия файла 1Cv8.1CD при закрытой базе или .dt | .dt плюс бэкап средствами СУБД |
| Монопольный доступ | Все пользователи выходят из базы | Блокировка начала сеансов в консоли кластера |
| Физические повреждения | Утилита chdbfl.exe из каталога bin платформы | Средства проверки самой СУБД |
| Тестирование и исправление | Может идти долго на больших файлах | Нагрузка на сервер, лучше ночью |
| Правка таблиц напрямую | Невозможна | Технически возможна, но запрещена |
Для файловой базы есть нюанс: если chdbfl.exe находит физические ошибки, сначала исправьте их, а потом запускайте тестирование и исправление. Иначе проверка ссылок будет читать повреждённые страницы.
Для клиент-серверной базы перед тестированием установите блокировку начала сеансов в свойствах информационной базы через консоль администрирования кластера. Принудительное завершение сеансов обрывает работу пользователей без сохранения — предупредите их и выберите нерабочее время.
Не правьте таблицы 1С прямыми SQL-запросами, даже если видите «битые» значения в полях. Платформа хранит данные в своей внутренней структуре, и ручная правка легко ломает связи, которые она потом не сможет восстановить. Все исправления — только через платформу.
Как не допустить повторения
Неразрешимые ссылки почти всегда рождаются при обновлении и доработке. Несколько правил закрывают проблему почти полностью.
- 📦 Дорабатывайте через расширения. Всё, что можно вынести в расширение, не трогает основную конфигурацию, и объединение при обновлении проходит без конфликтов.
- 🔍 Удаляйте объекты через поиск ссылок. Перед удалением объекта выполните для него в дереве метаданных «Поиск ссылок на объект» и уберите все найденные упоминания.
- 🧪 Обновляйте на копии. Обновление доработанной конфигурации сначала прогоните на копии, проверку конфигурации включите в обязательный порядок работ.
- 📝 Не снимайте галочки с новых объектов поставщика без понимания, кто на них ссылается.
- 💾 Храните .cf каждой версии. Сохранённая конфигурация до обновления — самый быстрый способ вернуть удалённый по ошибке объект.
- 👥 Используйте хранилище конфигурации при командной разработке: видно, кто и когда удалил объект.
После обновления расширений проверяйте их отдельно: откройте расширение в Конфигураторе и выполните для него ту же проверку. Заимствованный объект, переименованный в новом релизе, — частая причина того, что расширение перестаёт подключаться.