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

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

Что такое Ref в 1С: ссылка на объект простыми словами

Что такое Ref в 1С: уникальная ссылка на объект, отличие от GUID и кода, где хранится, как получить ссылку в запросе и коде, типичные ошибки разработчиков.

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

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

Материал ниже разбирает, как устроена ссылка, чем Ref отличается от GUID и кода, где встречается поле Ref на уровне СУБД, как получить и проверить ссылку в коде и в запросе, а также какие ошибки чаще всего допускают начинающие разработчики.

Что такое ссылка (Ref) в 1С и зачем она нужна

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

Ссылка — это значение, которое однозначно идентифицирует объект во всей информационной базе. Когда в документе «Реализация товаров» заполнен реквизит «Контрагент», в базе хранится не название контрагента, а ссылка на элемент справочника «Контрагенты». Платформа по этой ссылке получает доступ к наименованию, ИНН, договорам и любым другим реквизитам.

Такой подход даёт три практических следствия. Во-первых, переименование контрагента не ломает документы: ссылка неизменна, меняются только данные. Во-вторых, по ссылке строятся все связи в базе — от табличных частей до движений по регистрам. В-третьих, именно ссылка передаётся при обмене между базами, поэтому согласованность ссылок определяет корректность синхронизации.

Чем Ref отличается от GUID, кода и наименования

Новички часто смешивают несколько понятий: ссылку, GUID, код и наименование. Это разные сущности с разным назначением, и путаница между ними — источник типовых ошибок при обменах и поиске данных.

GUID (глобальный уникальный идентификатор) — это 16-байтовое значение, на основе которого построена ссылка. Ссылка = GUID + тип объекта. Один и тот же GUID теоретически может встретиться у объектов разных типов, поэтому полная идентификация требует и тип, и GUID. Код и наименование — прикладные реквизиты: они видимы пользователю, могут дублироваться (если не настроен контроль уникальности) и могут изменяться.

ПонятиеЧто этоМеняется лиУникальность
Ссылка (Ref)Идентификатор объекта: тип + GUIDНет, в течение жизни объектаУникальна в рамках типа
GUID16-байтовый идентификаторНетУникален практически гарантированно
КодПрикладной реквизит объектаМожет менятьсяЗависит от настроек контроля
НаименованиеПредставление для пользователяМеняется свободноНе гарантируется

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

Где хранится Ref: устройство на уровне СУБД

На уровне SQL Server или PostgreSQL каждая таблица ссылочного объекта содержит служебное поле _IDRRef — двоичное (binary(16)) представление GUID ссылки. Именно по этому полю строятся соединения: реквизит ссылочного типа в другой таблице хранит то же двоичное значение, что и _IDRRef целевого объекта.

Есть нюанс с составными типами. Если реквизит может хранить ссылки разных типов (например, «Документ-основание» составного типа), на уровне СУБД создаются дополнительные поля: признак типа (_TRef) и собственно ссылка (_RRef). Платформа сама разбирает эту структуру, но при прямых SQL-запросах к базе её нужно учитывать.

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

Как получить и проверить ссылку в коде 1С

Во встроенном языке ссылка получается несколькими способами в зависимости от ситуации. Если у вас есть объект (открытый для изменения), его ссылка доступна через свойство Ссылка. Если нужно найти элемент по известному коду или наименованию, используются методы менеджера справочника: НайтиПоКоду(), НайтиПоНаименованию(). Если известен GUID — применяется ПолучитьСсылку() с параметром типа «УникальныйИдентификатор».

Типовой фрагмент кода выглядит так:

Контрагент = Справочники.Контрагенты.НайтиПоКоду("000000123");

Если Контрагент.Пустая() Тогда

// элемент не найден — ссылка пустая

КонецЕсли;

// Получение ссылки по GUID

УИД = Новый УникальныйИдентификатор("a1b2c3d4-...");

СсылкаНаДокумент = Документы.РеализацияТоваровУслуг.ПолучитьСсылку(УИД);

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

Как безопасно найти и проверить ссылку
  1. 1
    Определите тип объекта и известный признак: код, наименование или GUID.
  2. 2
    Получите ссылку через НайтиПоКоду(), НайтиПоНаименованию() или ПолучитьСсылку().
  3. 3
    Проверьте результат методом Пустая() — не пустая ли ссылка.
  4. 4
    Проверьте существование объекта: обратитесь к реквизиту через запрос или ПолучитьОбъект() с обработкой исключения.
  5. 5
    Только после проверок используйте ссылку в документах, движениях или обмене.

Ref в запросах 1С: как работать со ссылочными полями

В языке запросов 1С ссылочные поля доступны напрямую: выбрав поле «Ссылка» или любой реквизит ссылочного типа, вы получаете значение ссылки. Через точку от неё доступны реквизиты объекта — платформа неявно соединяет таблицы. Например, «Реализация.Контрагент.ИНН» вытягивает ИНН из справочника контрагентов по ссылке из документа.

Для проверки типа ссылки в запросе используются операторы ССЫЛКА и функция ТИПЗНАЧЕНИЯ(). Это важно при работе с составными типами: условие «ВЫРАЗИТЬ(Основание КАК Документ.ЗаказКлиента)» отсекает ссылки других типов и позволяет безопасно обращаться к реквизитам конкретного документа.

Битые ссылки в запросе проявляются как NULL при разыменовании: «Контрагент.Наименование» вернёт NULL, если объект удалён. Это удобный способ найти битые ссылки аналитически — отбором по условию «ЕСТЬ NULL» или сравнением представления ссылки.

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

Ссылки при обмене данными и типичные проблемы

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

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

При миграциях и переносах данных правило простое: сначала переносятся справочники (источники ссылок), затем документы и регистры (потребители ссылок). Нарушение порядка гарантированно даёт массу битых ссылок, которые потом приходится искать и сопоставлять вручную.

Типичные ошибки при работе со ссылками
01
Поиск объекта по наименованию без контроля дублей — находится не тот элемент или первый попавшийся.
02
Хранение ссылки как строки в текстовом реквизите — связь не контролируется платформой, появляются битые значения.
03
Использование ПолучитьОбъект() без проверки существования — исключение «Объект не найден» в рабочем коде.
04
Сопоставление при обмене по коду или наименованию без учёта GUID — дубли элементов в базе-приёмнике.
05
Прямая правка _IDRRef в SQL — разрушение целостности базы.

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

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

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

После любых загрузок данных проверяйте результат выборочно: откройте несколько документов, убедитесь, что реквизиты-ссылки заполнены и разыменовываются (открываются по клику), а в отчётах нет строк с пустыми представлениями контрагентов и номенклатуры там, где они обязаны быть.

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

Как проверить состояние ссылок

Открытие объекта по ссылке из документа
Норма

Объект открывается, реквизиты заполнены

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

Ошибка «Объект не найден» или пустая форма

Запрос с разыменованием реквизита
Норма

Реквизиты возвращают значения

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

NULL при непустой ссылке — объект удалён

Тестирование и исправление ИБ
Норма

Проверка ссылочной целостности завершается без ошибок

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

Найдены ссылки на несуществующие объекты

Обмен между базами
Норма

Объекты сопоставлены, дублей нет

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

Дубли элементов, сообщения о незаполненных ссылках

Часто задаваемые вопросы

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

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

Может ли ссылка измениться после создания объекта?

Нет. Ссылка (GUID) присваивается при создании и не меняется в течение всей жизни объекта, включая переименование, изменение кода и перенос между группами. Новая ссылка появляется только при создании нового объекта — именно поэтому «удалить и создать заново» не равно «исправить».

Что такое «битая ссылка» и как её найти?

Битая ссылка — значение, указывающее на удалённый или несуществующий объект. Признак — сообщение «Объект не найден» или NULL при обращении к реквизитам через точку. Находят такие ссылки тестированием и исправлением ИБ или запросом с условием «реквизит ЕСТЬ NULL» при непустой ссылке.

Как получить GUID ссылки и зачем это нужно?

Строковое представление GUID получают через XMLСтрока(Ссылка) или через Ссылка.УникальныйИдентификатор(). GUID нужен при интеграции с внешними системами, сопоставлении объектов между базами и поиске объекта, когда известен только идентификатор из другой системы.

Почему при обмене появляются дубли справочников?

Чаще всего потому, что элементы создавались независимо в обеих базах и имеют разные GUID, а правила обмена сопоставляют их только по коду или наименованию. Лечится настройкой правил поиска (по GUID в первую очередь, затем по ключевым реквизитам) и разовым сопоставлением уже существующих дублей.

Можно ли работать с базой 1С напрямую через SQL-запросы?

Чтение данных прямыми запросами технически возможно и иногда применяется для внешней отчётности, но требует знания структуры хранения (_IDRRef, составные типы). Запись напрямую в СУБД запрещена: она обходит бизнес-логику, нарушает целостность и лишает базу поддержки вендора.

Итог

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

Ref в 1С — это ссылка на объект: неизменный идентификатор (тип + GUID), через который платформа обращается ко всем данным. Ссылка не равна коду и наименованию, хранится на уровне СУБД в поле _IDRRef, а её корректность определяет целостность базы и качество обменов. Проверяйте ссылки перед использованием и никогда не правьте служебные поля напрямую в СУБД.