Разработка и Конфигурация · 10 мин
1С Ref (ссылка): что это такое и как с ней работать
Разбираем, что такое Ref (ссылка) в 1С: назначение типа Ссылка, отличие от объекта, работа в запросах и коде, типичные ошибки и способы проверки.
Термин «1С ref» чаще всего встречается в двух контекстах: в запросах на встроенном языке 1С, где оператор REFS (ССЫЛКА) проверяет тип ссылки, и в обсуждении типа данных «Ссылка» — например, СправочникСсылка или ДокументСсылка. В обоих случаях речь идёт об одном фундаментальном понятии платформы 1С:Предприятие — ссылке на объект базы данных.
Ссылка — это не сам объект со всеми его реквизитами, а уникальный идентификатор, который «указывает» на запись в базе. Когда вы видите в отчёте контрагента или документ, платформа хранит и передаёт именно ссылку, а полные данные подгружаются только при необходимости. Понимание этого различия — ключ к эффективной работе с 1С: от скорости запросов до корректности обмена данными.
Ниже разберём, что такое ссылка технически, чем она отличается от объекта, как оператор REFS используется в запросах, какие ошибки встречаются чаще всего и как проверить, что ссылка корректна.
Что такое ссылка (Ref) в платформе 1С
Каждый объект ссылочного типа в 1С — элемент справочника, документ, план счетов, задача — имеет уникальный внутренний идентификатор (GUID). Ссылка и есть «упакованная» форма этого идентификатора вместе с указанием типа объекта. Именно ссылка хранится в реквизитах других объектов, в регистрах, в табличных частях.
Важное следствие: ссылка существует, даже если объект физически удалён из базы. Тогда возникает «битая ссылка» — значение вида «Объект не найден (123:abc…)». Платформа не очищает такие ссылки автоматически, потому что удаление объекта не подразумевает обход всех мест, где на него сослались.
Ссылочные типы противопоставляются примитивным (число, строка, дата, булево) и нессылочным объектам — например, записям регистра сведений, у которых нет собственной ссылки: они идентифицируются ключом записи (измерениями и периодом).
Чем ссылка отличается от объекта
Это главный источник путаницы у начинающих разработчиков. Ссылка — лёгкое значение: сравнение, передача в функцию, хранение обходятся дёшево. Объект (например, СправочникОбъект) — это полная копия данных в памяти с возможностью изменения и записи.
Получить объект из ссылки можно методом ПолучитьОбъект(). Но делать это нужно только когда вы собираетесь менять данные. Для чтения реквизитов достаточно обращения через точку к ссылке (Контрагент.Наименование) или запроса — платформа сама подтянет нужные поля.
Ссылка против объекта
Подходит для чтения, сравнения, хранения в реквизитах и параметрах запросов. Нельзя изменять и записывать.
Нужен для изменения и записи данных, вызова обработчиков. Дороже по памяти и скорости, чтение через объект — антипаттерн.
Типичная ошибка производительности — вызывать ПолучитьОбъект() в цикле только ради чтения пары реквизитов. На больших объёмах это многократно замедляет обработку: каждый вызов загружает весь объект, включая табличные части.
Оператор REFS (ССЫЛКА) в языке запросов
В языке запросов 1С ключевое слово ССЫЛКА (английский синтаксис — REFS) используется для проверки типа ссылочного поля. Это особенно актуально для составных типов: реквизит может хранить ссылку и на справочник «Контрагенты», и на «ФизическиеЛица».
ВЫБРАТЬ
Реализация.Контрагент КАК Контрагент
ИЗ
Документ.РеализацияТоваровУслуг КАК Реализация
ГДЕ
Реализация.Контрагент ССЫЛКА Справочник.КонтрагентыОператор возвращает Истина, если значение является ссылкой указанного типа. Типичные сценарии применения:
- фильтрация документов по типу сделки или партнёра в составном поле;
- отбор «непустых» ссылок нужного вида в регистрах с составными измерениями;
- проверка корректности данных при миграции, когда в одном поле оказались ссылки разных типов.
Альтернатива — функция ТИПЗНАЧЕНИЯ() в сочетании с ТИП(). Она гибче (позволяет сравнивать с типом другого поля), но ССЫЛКА обычно читается проще и оптимизируется платформой не хуже.
Как получить и проверить ссылку в коде
Новую ссылку, ещё не записанную в базу, можно создать через Справочники.Номенклатура.ПолучитьСсылку() — с новым GUID, либо ПолучитьСсылку(Новый УникальныйИдентификатор("...")) — с заданным. Это используется в обменах, чтобы записывать объект с заранее известным идентификатором.
- 1Проверьте заполненность: ЗначениеЗаполнено(Ссылка) — отсекает пустые ссылки.
- 2Проверьте тип: ТипЗнч(Ссылка) = Тип("СправочникСсылка.Контрагенты").
- 3Проверьте существование: запросом по полю Ссылка или через Ссылка.ПолучитьОбъект() — если вернул Неопределено, объект удалён.
- 4Если нужны данные — читайте реквизиты через запрос, а не через ПолучитьОбъект().
- 5Если нужно изменить — получите объект, измените, вызовите Записать() и проверьте отсутствие исключений.
Проверка «битости» ссылки через ПолучитьОбъект() рабочая, но медленная при массовых проверках. Для пакетной диагностики лучше использовать запрос с левым соединением: если присоединённая таблица дала NULL, объекта нет.
Как проверить результат
Ссылки на один и тот же объект равны, даже если получены разными способами
Равенство не выполняется при совпадающем GUID — вероятно, различаются типы
Возвращается значение реквизита
Ошибка «Поле не обнаружено» — тип ссылки другой, либо это битая ссылка
Возвращает объект, доступный для изменения
Возвращает Неопределено — объект удалён из базы
GUID, битые ссылки и обмен данными
Уникальный идентификатор ссылки можно получить методом УникальныйИдентификатор(). В строковом виде GUID используется в обменах, веб-сервисах и интеграциях: именно по нему внешняя система однозначно находит объект 1С. Обратное преобразование — через ПолучитьСсылку(Новый УникальныйИдентификатор(СтрокаGUID)).
При обмене между базами совпадение GUID критично: если один и тот же контрагент создан независимо в двух базах, у него будут разные идентификаторы, и типовая синхронизация сопоставит их только по правилам поиска (код, ИНН, наименование). Пренебрежение этим приводит к дублям.
Признак массовой проблемы — значения «Объект не найден» в отчётах и проведённых документах. Причины обычно такие: физическое удаление объектов без контроля ссылочной целостности, нештатная загрузка данных, сбой обмена. Лечится восстановлением объекта по GUID (если есть копия в другой базе) или заменой ссылки на корректное значение.
Типичные ошибки при работе со ссылками
Отдельно стоит сказать о сравнении типов в запросе и в коде. Условие ГДЕ Поле ССЫЛКА Справочник.Контрагенты и проверка ТипЗнч(Поле) = Тип("СправочникСсылка.Контрагенты") решают одну задачу, но в запросе первый вариант предпочтительнее: он работает на стороне СУБД и не требует выгрузки данных.
Когда знание о Ref нужно обычному пользователю
Даже если вы не разработчик, с понятием ссылки вы сталкиваетесь регулярно: «Объект не найден» в отчёте, дубли контрагентов после синхронизации, невозможность удалить элемент, потому что «на него есть ссылки». Во всех этих случаях механика одна — где-то в базе хранится ссылка на этот объект.
Практический вывод для пользователя: перед удалением элемента помечайте его на удаление и запускайте штатное «Удаление помеченных объектов» — платформа покажет все места использования. Так вы избежите битых ссылок и «подвисших» документов.
Как выбрать действие
Частые вопросы
Что означает «Объект не найден» вместо названия элемента?
Это битая ссылка: в базе хранится идентификатор объекта, который был физически удалён. Само значение-ссылка осталось, а данных за ним нет. Нужно либо восстановить объект по GUID из резервной копии или базы-источника, либо заменить ссылку корректным значением.
Чем оператор ССЫЛКА отличается от ТИПЗНАЧЕНИЯ в запросе?
ССЫЛКА проверяет, является ли значение ссылкой заданного типа, и записывается короче. ТИПЗНАЧЕНИЯ возвращает тип значения и позволяет сравнивать его с типом другого поля через ТИП() — это гибче, но многословнее. Для простой фильтрации по типу достаточно ССЫЛКА.
Можно ли изменить данные, имея только ссылку?
Нет, ссылка доступна только для чтения. Для изменения нужно получить объект методом ПолучитьОбъект(), внести правки и вызвать Записать(). Пытаться присвоить значение реквизиту ссылки напрямую бесполезно — изменение не сохранится.
Как узнать GUID ссылки и зачем он нужен?
Метод УникальныйИдентификатор() возвращает GUID ссылки. Он нужен в интеграциях: внешние системы и веб-сервисы идентифицируют объекты 1С именно по GUID, а по строковому представлению можно обратно получить ссылку через ПолучитьСсылку().
Почему запрос с условием ССЫЛКА возвращает пустой результат?
Чаще всего поле имеет другой тип, чем указано в условии, либо все значения поля пустые или относятся к другому виду справочника. Проверьте фактические типы значений в поле — например, выведя ТИПЗНАЧЕНИЯ(Поле) в том же запросе.
Что важно запомнить
Ref в 1С — это ссылка: тип плюс GUID объекта, а не сам объект. Читайте данные через ссылку и запросы, объект получайте только для изменения. Оператор ССЫЛКА (REFS) фильтрует значения по типу в запросах. Битые ссылки и дубли GUID — главные источники проблем, лечатся штатными средствами контроля целостности.