Администрирование · 8 мин
Как создать битую ссылку в 1С и зачем это нужно
Что такое битая ссылка в 1С, как создать её вручную и программно, зачем это нужно при тестировании и как найти и удалить битые ссылки в базе.
Битая ссылка в 1С — это ссылка на объект, который физически отсутствует в информационной базе. В интерфейсе она выглядит как запись вида «Объект не найден (123:abcd1234...)», а в коде возвращает значение с признаком удалённой ссылки. Чаще всего такие ссылки появляются сами — после прямого удаления объектов без контроля ссылочной целостности, при обменах между базами или при неудачном восстановлении из копии.
Однако бывают ситуации, когда битую ссылку нужно создать намеренно: для тестирования обработок поиска и очистки, проверки устойчивости собственных доработок, отладки обменов данными или воспроизведения ошибки, с которой столкнулся пользователь. Ниже разобраны практические способы создать битую ссылку, проверить результат и безопасно вернуть базу в рабочее состояние.
Что такое битая ссылка и как она выглядит
В 1С каждый объект (элемент справочника, документ, план счетов и т.д.) имеет уникальный идентификатор — GUID. Когда один объект ссылается на другой, в поле реквизита фактически хранится этот идентификатор. Если объект удалить без проверки, все ссылающиеся на него записи продолжают хранить идентификатор, которому уже ничего не соответствует. Это и есть битая ссылка.
В формах и отчётах битая ссылка отображается как «Объект не найден» с указанием идентификатора. В языке запросов такая ссылка возвращает представление «<Объект не найден>», а при обращении к её реквизитам через точку в запросе поля дают NULL. В коде на встроенном языке проверка выполняется через выражение Ссылка.ПолучитьОбъект() — для битой ссылки оно вернёт Неопределено.
Способ 1: удалить объект напрямую, минуя контроль ссылок
Штатное удаление в 1С происходит через пометку на удаление, после чего обработка «Удаление помеченных объектов» проверяет, есть ли ссылки на объект, и блокирует удаление, если ссылки найдены. Чтобы получить битую ссылку, этот контроль нужно обойти. Самый простой вариант — программное удаление через метод Удалить() объекта или установку пометки с последующим прямым удалением через консоль кода.
Порядок действий: создайте тестовый элемент справочника, например контрагента «Тестовый», и документ, где он указан. Затем в консоли кода (обработка «Консоль кода» или аналогичная) выполните прямое удаление элемента. После этого откройте документ — в поле контрагента появится «Объект не найден».
Ссылка = Справочники.Контрагенты.НайтиПоНаименованию("Тестовый");
Объект = Ссылка.ПолучитьОбъект();
Объект.Удалить(); // прямое удаление без контроля ссылокСпособ 2: сформировать ссылку с несуществующим GUID программно
Это самый чистый способ: вы ничего не удаляете, а просто создаёте ссылку на идентификатор, которого заведомо нет в базе. Для этого используется метод ПолучитьСсылку() менеджера объекта с параметром — новым уникальным идентификатором.
Полученную ссылку можно записать в реквизит тестового документа или регистра — и вы получите полноценную битую ссылку без удаления реальных данных. Позже достаточно очистить реквизит, чтобы вернуть всё в исходное состояние.
НовыйУИД = Новый УникальныйИдентификатор;
БитаяСсылка = Справочники.Контрагенты.ПолучитьСсылку(НовыйУИД);
// БитаяСсылка.ПолучитьОбъект() вернёт Неопределено- 1Откройте копию базы и создайте тестовый документ
- 2В консоли кода сформируйте ссылку через ПолучитьСсылку(Новый УникальныйИдентификатор)
- 3Запишите эту ссылку в реквизит документа и проведите его
- 4Откройте документ в интерфейсе и убедитесь, что реквизит показывает «Объект не найден»
- 5Проверьте через ПолучитьОбъект(), что возвращается Неопределено
Способ 3: имитация через обмен и удаление в одной из баз
Битые ссылки часто возникают в распределённых системах: объект выгрузился в другую базу, а затем был удалён в исходной. Чтобы воспроизвести такой сценарий, настройте тестовый обмен (например, через универсальный формат или план обмена), перенесите элемент справочника во вторую базу, создайте там документ с этим элементом, а затем удалите сам элемент в первой базе и выполните синхронизацию.
Этот способ сложнее, но он максимально близок к реальным условиям эксплуатации. Он полезен, если вы тестируете обработку устранения битых ссылок после обменов или отлаживаете правила конвертации данных, где ссылка может не найти соответствие.
Как проверить, что ссылка действительно битая
Признак битой ссылки нужно подтвердить, а не предполагать. В интерфейсе это надпись «Объект не найден» вместо представления объекта. Программно надёжнее всего проверка через ПолучитьОбъект(): если результат равен Неопределено, объекта в базе нет.
В запросах битые ссылки удобно искать соединением с таблицей объекта: если левое соединение по ссылке даёт NULL в полях объекта — ссылка битая. Именно так работают типовые обработки поиска и удаления битых ссылок.
Как проверить результат
Показывается наименование или номер объекта
Надпись «Объект не найден» с идентификатором
Возвращает объект
Возвращает Неопределено
Поля объекта заполнены
Поля объекта равны NULL
Типичные ошибки и ограничения
Главная ошибка — эксперименты в рабочей базе. Даже одна намеренно созданная битая ссылка в учётных данных может попасть в отчёты, обмены и резервные копии, и позже её сложно отличить от случайно возникших. Всегда работайте на копии.
Вторая ошибка — путать битую ссылку с пустой. Пустая ссылка (Справочники.Контрагенты.ПустаяСсылка()) — легальное значение, объект для неё не предполагается вовсе, и обработки очистки её не тронут. Битая ссылка — это несуществующий идентификатор, и это принципиально разные состояния.
Как убрать созданную битую ссылку
После завершения тестов битую ссылку нужно удалить. Если вы создавали её программно в конкретном реквизите — просто очистите этот реквизит или запишите туда корректное значение. Если создавали удалением объекта — восстановите объект из копии или очистите все ссылающиеся записи.
Для комплексной проверки используйте типовые средства: в конфигурациях на БСП есть обработка «Поиск и удаление дублей» и инструменты группового изменения, а также сторонние обработки поиска битых ссылок, которые сканируют все реквизиты метаданных и показывают, где хранятся несуществующие идентификаторы.
Что важно запомнить
Битую ссылку безопаснее всего создавать программно через ПолучитьСсылку с новым уникальным идентификатором — это не требует удаления данных. Все эксперименты проводите на копии базы, а результат подтверждайте проверкой ПолучитьОбъект() на Неопределено.
Частые вопросы
Можно ли создать битую ссылку без программирования?
Да, но с ограничениями: нужно удалить объект в обход контроля ссылок, например через режим прямого удаления в некоторых конфигурациях или через SQL. Оба пути рискованны, поэтому для разовой задачи проще попросить разработчика выполнить две строки кода в консоли.
Чем битая ссылка отличается от пустой?
Пустая ссылка — штатное «незаполненное» значение реквизита, объект для неё не нужен. Битая ссылка содержит идентификатор объекта, который должен существовать, но отсутствует в базе. Обработки очистки находят именно битые ссылки.
Опасны ли битые ссылки для базы?
Они не разрушают базу физически, но искажают отчёты, ломают обмены и вызывают ошибки в коде при обращении к реквизитам несуществующего объекта. В рабочей базе их нужно регулярно искать и устранять.
Как найти все битые ссылки в базе?
Используйте специализированные обработки поиска битых ссылок: они перебирают реквизиты всех объектов метаданных и проверяют ссылки через запросы с левым соединением. В типовых конфигурациях часть таких проверок встроена в инструменты администрирования.
Восстановится ли объект, если создать его с тем же GUID?
Да. Если создать объект через ПолучитьСсылку с тем же уникальным идентификатором и записать его, битая ссылка «оживёт» — все записи, ссылающиеся на этот идентификатор, снова станут валидными. Этим приёмом иногда пользуются при восстановлении данных.