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

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

1С Ref (ссылка): что это такое и как с ней работать

Разбираем, что такое Ref (ссылка) в 1С: назначение типа Ссылка, отличие от объекта, работа в запросах и коде, типичные ошибки и способы проверки.

Термин «1С ref» чаще всего встречается в двух контекстах: в запросах на встроенном языке 1С, где оператор REFS (ССЫЛКА) проверяет тип ссылки, и в обсуждении типа данных «Ссылка» — например, СправочникСсылка или ДокументСсылка. В обоих случаях речь идёт об одном фундаментальном понятии платформы 1С:Предприятие — ссылке на объект базы данных.

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

Ниже разберём, что такое ссылка технически, чем она отличается от объекта, как оператор REFS используется в запросах, какие ошибки встречаются чаще всего и как проверить, что ссылка корректна.

Что такое ссылка (Ref) в платформе 1С

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

Важное следствие: ссылка существует, даже если объект физически удалён из базы. Тогда возникает «битая ссылка» — значение вида «Объект не найден (123:abc…)». Платформа не очищает такие ссылки автоматически, потому что удаление объекта не подразумевает обход всех мест, где на него сослались.

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

Чем ссылка отличается от объекта

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

Получить объект из ссылки можно методом ПолучитьОбъект(). Но делать это нужно только когда вы собираетесь менять данные. Для чтения реквизитов достаточно обращения через точку к ссылке (Контрагент.Наименование) или запроса — платформа сама подтянет нужные поля.

Ссылка против объекта

Ссылка (СправочникСсылка, ДокументСсылка)

Подходит для чтения, сравнения, хранения в реквизитах и параметрах запросов. Нельзя изменять и записывать.

Объект (СправочникОбъект, ДокументОбъект)

Нужен для изменения и записи данных, вызова обработчиков. Дороже по памяти и скорости, чтение через объект — антипаттерн.

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

Оператор REFS (ССЫЛКА) в языке запросов

В языке запросов 1С ключевое слово ССЫЛКА (английский синтаксис — REFS) используется для проверки типа ссылочного поля. Это особенно актуально для составных типов: реквизит может хранить ссылку и на справочник «Контрагенты», и на «ФизическиеЛица».

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

Оператор возвращает Истина, если значение является ссылкой указанного типа. Типичные сценарии применения:

  • фильтрация документов по типу сделки или партнёра в составном поле;
  • отбор «непустых» ссылок нужного вида в регистрах с составными измерениями;
  • проверка корректности данных при миграции, когда в одном поле оказались ссылки разных типов.

Альтернатива — функция ТИПЗНАЧЕНИЯ() в сочетании с ТИП(). Она гибче (позволяет сравнивать с типом другого поля), но ССЫЛКА обычно читается проще и оптимизируется платформой не хуже.

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

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

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

Проверка «битости» ссылки через ПолучитьОбъект() рабочая, но медленная при массовых проверках. Для пакетной диагностики лучше использовать запрос с левым соединением: если присоединённая таблица дала NULL, объекта нет.

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

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

Сравнение двух ссылок оператором =
Норма

Ссылки на один и тот же объект равны, даже если получены разными способами

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

Равенство не выполняется при совпадающем GUID — вероятно, различаются типы

Обращение к реквизиту ссылки
Норма

Возвращается значение реквизита

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

Ошибка «Поле не обнаружено» — тип ссылки другой, либо это битая ссылка

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

Возвращает объект, доступный для изменения

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

Возвращает Неопределено — объект удалён из базы

GUID, битые ссылки и обмен данными

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

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

Признак массовой проблемы — значения «Объект не найден» в отчётах и проведённых документах. Причины обычно такие: физическое удаление объектов без контроля ссылочной целостности, нештатная загрузка данных, сбой обмена. Лечится восстановлением объекта по GUID (если есть копия в другой базе) или заменой ссылки на корректное значение.

Типичные ошибки при работе со ссылками

Типичные ошибки
01
Вызов ПолучитьОбъект() в цикле ради чтения реквизитов — резкое падение производительности обработки.
02
Сравнение ссылки со строкой или GUID через = без преобразования типов — условие никогда не сработает.
03
Игнорирование проверки на битую ссылку — ошибка «Поле не обнаружено» в момент обращения к реквизиту.
04
Создание новой ссылки ПолучитьСсылку() и потеря её без записи объекта — в базе остаются висячие идентификаторы.
05
Использование ССЫЛКА в запросе к полю, которое не является ссылочным, — запрос вернёт пустой результат или ошибку.

Отдельно стоит сказать о сравнении типов в запросе и в коде. Условие ГДЕ Поле ССЫЛКА Справочник.Контрагенты и проверка ТипЗнч(Поле) = Тип("СправочникСсылка.Контрагенты") решают одну задачу, но в запросе первый вариант предпочтительнее: он работает на стороне СУБД и не требует выгрузки данных.

Когда знание о Ref нужно обычному пользователю

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

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

Маршрут решения

Как выбрать действие

Нужно только прочитать реквизиты объектаИспользуйте запрос или обращение через точку к ссылке, без ПолучитьОбъект()
Нужно изменить и записать объектВызовите ПолучитьОбъект(), измените данные, выполните Записать() в попытке-исключении
В отчёте виден «Объект не найден»Проверьте ссылку на существование и восстановите объект по GUID или замените ссылку
Настраиваете обмен между базамиКонтролируйте совпадение GUID и правила поиска, чтобы избежать дублей

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

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

Это битая ссылка: в базе хранится идентификатор объекта, который был физически удалён. Само значение-ссылка осталось, а данных за ним нет. Нужно либо восстановить объект по GUID из резервной копии или базы-источника, либо заменить ссылку корректным значением.

Чем оператор ССЫЛКА отличается от ТИПЗНАЧЕНИЯ в запросе?

ССЫЛКА проверяет, является ли значение ссылкой заданного типа, и записывается короче. ТИПЗНАЧЕНИЯ возвращает тип значения и позволяет сравнивать его с типом другого поля через ТИП() — это гибче, но многословнее. Для простой фильтрации по типу достаточно ССЫЛКА.

Можно ли изменить данные, имея только ссылку?

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

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

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

Почему запрос с условием ССЫЛКА возвращает пустой результат?

Чаще всего поле имеет другой тип, чем указано в условии, либо все значения поля пустые или относятся к другому виду справочника. Проверьте фактические типы значений в поле — например, выведя ТИПЗНАЧЕНИЯ(Поле) в том же запросе.

Итог

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

Ref в 1С — это ссылка: тип плюс GUID объекта, а не сам объект. Читайте данные через ссылку и запросы, объект получайте только для изменения. Оператор ССЫЛКА (REFS) фильтрует значения по типу в запросах. Битые ссылки и дубли GUID — главные источники проблем, лечатся штатными средствами контроля целостности.