К статье
Практический материал

Разработка и Конфигурация · 10 мин

Что такое ссылка в 1С и как с ней работать

Разбираем, что такое ссылка в 1С: объектные ссылки, GUID, навигационные ссылки, методы ПолучитьСсылку и НайтиПоСсылкам, типичные ошибки и проверка результата.

Ссылка в 1С — это один из базовых типов данных платформы, который представляет собой указатель на конкретный объект информационной базы: элемент справочника, документ, план счетов, запись плана видов характеристик и другие ссылочные объекты. Сама по себе ссылка не содержит данных объекта — ни наименования, ни реквизитов, — она лишь однозначно идентифицирует объект в базе и позволяет получить к нему доступ.

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

Материал рассчитан на тех, кто работает с конфигурациями на управляемых и обычных формах: разберём виды ссылок, внутреннее устройство (GUID), основные методы, ограничения и типичные ошибки с безопасными способами их избежать.

Что представляет собой ссылка и чем она отличается от объекта

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

Когда вы пишете Справочники.Номенклатура.НайтиПоКоду("000001"), результат — именно ссылка. Чтобы прочитать наименование или цену, платформа обращается к базе. А чтобы изменить данные, нужно получить объект: ОбъектНоменклатуры = Ссылка.ПолучитьОбъект(), изменить реквизиты и вызвать Записать().

Путаница между ссылкой и объектом — источник большинства ошибок новичков. Например, попытка присвоить значение реквизиту через ссылку (Ссылка.Наименование = "Новое") не изменит данные в базе: ссылка доступна только для чтения, и изменения не сохранятся.

Виды ссылок в платформе 1С

Ссылочные типы существуют для всех объектов, которые хранятся в базе как самостоятельные сущности. Каждому виду соответствует свой тип ссылки: СправочникСсылка, ДокументСсылка, ПланСчетовСсылка, ПланВидовХарактеристикСсылка, ПланВидовРасчетаСсылка, БизнесПроцессСсылка, ЗадачаСсылка, ПланОбменаСсылка.

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

Объектные ссылки и навигационные ссылки

Помимо внутренних ссылок, существуют навигационные — строки вида e1cib/data/Справочник.Номенклатура?ref=.... Они используются для открытия объекта по прямой ссылке в тонком или веб-клиенте и получаются функцией ПолучитьНавигационнуюСсылку(Ссылка). Такие ссылки удобно отправлять коллегам или вставлять в уведомления, но они не заменяют объектную ссылку в коде.

GUID — внутреннее устройство ссылки

Физически ссылка хранится как уникальный идентификатор — GUID (глобально уникальный идентификатор). Именно по GUID платформа находит запись в таблице базы данных. Два объекта разных типов не могут иметь одинаковый GUID, что гарантирует однозначность идентификации во всей базе.

Получить GUID ссылки можно методом Ссылка.УникальныйИдентификатор(). Обратное преобразование выполняется конструктором: Новый УникальныйИдентификатор(СтрокаGUID) с последующим получением ссылки через Справочники.Номенклатура.ПолучитьСсылку(Ид). Эта пара приёмов активно используется в обменах данными, когда объект нужно идентифицировать между разными базами.

bsl
Ид = Ссылка.УникальныйИдентификатор();
СтрокаGUID = Строка(Ид);
НоваяСсылка = Справочники.Номенклатура.ПолучитьСсылку(Новый УникальныйИдентификатор(СтрокаGUID));

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

Основные способы получить ссылку

На практике ссылку получают несколькими стандартными путями: поиском по реквизитам (НайтиПоКоду, НайтиПоНаименованию, НайтиПоРеквизиту, НайтиПоНомеру для документов), запросом к базе или явным созданием через ПолучитьСсылку() с заданным GUID.

Если объект не найден, методы поиска возвращают пустую ссылку. Проверка выполняется функцией ЗначениеЗаполнено(Ссылка) или сравнением с пустой ссылкой: Справочники.Номенклатура.ПустаяСсылка(). Пропуск этой проверки — частая причина ошибок «Объект не найден» дальше по коду.

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

Для поиска всех мест использования объекта применяется функция НайтиПоСсылкам() — она возвращает таблицу объектов, где встречается указанная ссылка. Это стандартный инструмент перед удалением или объединением дублей.

Битые ссылки: причины и диагностика

Битая ссылка — это ссылка на объект, которого уже нет в базе. Она возникает при непосредственном удалении объектов без контроля ссылочной целостности, при ошибках обмена или при восстановлении базы из неполной копии. В интерфейсе такие значения отображаются как «Объект не найден» с идентификатором.

Проверить ссылку на «битость» можно через запрос: если запрос по ссылке не возвращает строк, объект отсутствует. Также используется проверка Ссылка.ПолучитьОбъект() = Неопределено. Массовую диагностику выполняют штатной обработкой поиска и удаления дублей или тестированием и исправлением информационной базы.

Контрольные точки

Как проверить результат

Отображение ссылки в форме
Норма

Показывается наименование или представление объекта

Тревожный признак

Текст «Объект не найден» с идентификатором

Запрос по ссылке
Норма

Запрос возвращает строку с данными объекта

Тревожный признак

Результат запроса пуст

ПолучитьОбъект()
Норма

Возвращает объект с заполненными реквизитами

Тревожный признак

Возвращает Неопределено

Ссылки в запросах и производительность

В языке запросов ссылка используется как параметр отбора: ГДЕ Номенклатура = &Ссылка. Передавать ссылку параметром — правильный и быстрый способ фильтрации, поскольку сравнение идёт по индексированному идентификатору.

Обращение к реквизитам через точку от ссылки в запросе (Товары.Номенклатура.Наименование) платформа преобразует в соединение с таблицей справочника. Одиночное обращение допустимо, но массовое «разыменование» десятков полей через точку замедляет запрос. В таких случаях лучше явно соединять таблицы или получать данные в цикле через объект.

Ссылка как реквизит составного типа

Реквизит может иметь составной тип — например, «ДокументСсылка.РеализацияТоваровУслуг, ДокументСсылка.ВозвратТоваров». Проверку конкретного типа выполняют функцией ТипЗнч(Ссылка) в сочетании с Тип("ДокументСсылка.РеализацияТоваровУслуг"). Это важно при универсальных обработках, где заранее неизвестно, объект какого вида придёт на вход.

Типичные ошибки
01
Изменение реквизитов через ссылку без ПолучитьОбъект() — данные в базе не меняются
02
Отсутствие проверки на пустую ссылку после поиска — ошибка «Объект не найден» ниже по коду
03
Сравнение ссылок по строковому представлению вместо оператора равенства — ложные несовпадения
04
Получение объекта в цикле там, где достаточно запроса — резкое падение производительности
05
Удаление объектов без НайтиПоСсылкам — появление битых ссылок в связанных документах

Где ссылки применяются на практике

Ссылки связывают всю структуру учёта: документ «Реализация» хранит ссылку на контрагента и договор, строки табличной части — ссылки на номенклатуру, движения по регистрам — ссылку на регистратор. Благодаря этому платформа обеспечивает целостность: пока на объект есть ссылки, стандартное удаление помечает его, а не стирает физически.

В обменах данными ссылки — основной механизм сопоставления: объект ищется в базе-приёмнике по GUID, а при несовпадении — по ключевым полям. В отчётах на СКД ссылки автоматически превращаются в представления (наименования), поэтому пользователь видит читаемые данные, а не идентификаторы.

Итог

Что важно запомнить

Ссылка — это идентификатор объекта, а не его данные. Чтение возможно напрямую, изменение — только через ПолучитьОбъект() и Записать(). Всегда проверяйте ссылку на заполненность, а перед удалением объектов — на наличие ссылающихся записей.

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

Чем ссылка отличается от объекта в 1С?

Ссылка — только идентификатор объекта, доступный для чтения и сравнения. Объект — полная копия данных в памяти, которую можно изменять и записывать. Для модификации данных всегда нужно получать объект через Ссылка.ПолучитьОбъект().

Как проверить, пустая ли ссылка?

Используйте функцию ЗначениеЗаполнено(Ссылка) или сравнение с пустой ссылкой конкретного вида, например Справочники.Номенклатура.ПустаяСсылка(). Обе проверки корректны; первая универсальнее для составных типов.

Что означает надпись «Объект не найден» в поле?

Это битая ссылка: в реквизите хранится идентификатор объекта, который уже удалён из базы. Такое значение следует заменить существующим объектом или очистить, предварительно проверив, не повлияет ли это на связанные документы и отчёты.

Можно ли получить ссылку на ещё не записанный объект?

Да. Для нового объекта вызывают УстановитьСсылкуНового(Ссылка) до записи — тогда объект получит заранее известный идентификатор. Это используется, когда нужно одновременно записать связанные объекты, ссылающиеся друг на друга.

Сохраняется ли GUID при переносе данных между базами?

При штатных обменах и выгрузке-загрузке через XML GUID обычно сохраняется, поэтому ссылки в связанных базах совпадают. Если объект создаётся заново в каждой базе независимо, GUID будет разным даже при одинаковых наименованиях.

Почему сравнение ссылок строками даёт неверный результат?

Строковое представление ссылки зависит от контекста и настроек представления, а не от идентификатора. Сравнивать ссылки нужно оператором равенства или по значению УникальныйИдентификатор() — только это гарантирует корректное сопоставление.