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

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

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

Что такое ссылка на объект в 1С, чем ссылка отличается от объекта, как получить, проверить и использовать ссылку в коде и интерфейсе. Практические примеры.

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

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

Материал рассчитан на начинающих разработчиков 1С, консультантов и продвинутых пользователей, которые хотят понимать, что происходит «под капотом» при открытии элемента справочника, проведении документа или выполнении запроса.

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

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

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

Когда вы обращаетесь к реквизиту через ссылку — КонтрагентСсылка.ИНН — платформа неявно выполняет запрос к базе данных и считывает нужное поле. Это удобно для чтения одного-двух реквизитов, но при массовом обращении в цикле порождает множество отдельных запросов и резко снижает производительность.

Какие типы данных в 1С являются ссылочными

Не все сущности в 1С имеют ссылки. Ссылочные типы — это те, экземпляры которых хранятся в базе как самостоятельные записи с уникальным идентификатором. К ним относятся: справочники, документы, планы видов характеристик, планы счетов, планы видов расчёта, планы обмена, бизнес-процессы и задачи.

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

ТипЕсть ссылкаКак идентифицируется
СправочникДаGUID (СправочникСсылка)
ДокументДаGUID (ДокументСсылка)
План счетовДаGUID (ПланСчетовСсылка)
ПеречислениеНетЗначение из конфигурации
Регистр сведенийНетКлюч записи (измерения, период)
Регистр накопленияНетРегистратор + номер строки

Как получить ссылку на объект

Существует несколько типовых способов получить ссылку в коде. Самый распространённый — поиск по известным данным: Справочники.Контрагенты.НайтиПоКоду("000000123") или НайтиПоНаименованию("ООО Ромашка"). Для документов используется Документы.РеализацияТоваровУслуг.НайтиПоНомеру(Номер, Дата). Если элемент не найден, метод вернёт пустую ссылку соответствующего типа.

Второй способ — получение ссылки из реквизита другого объекта или результата запроса. В запросах поля ссылочного типа выбираются именно как ссылки: ВЫБРАТЬ Контрагент ИЗ Документ.РеализацияТоваровУслуг вернёт колонку со ссылками на справочник контрагентов.

Третий способ — создание нового объекта и получение ссылки после записи: НовыйОбъект = Справочники.Контрагенты.СоздатьЭлемент(); НовыйОбъект.Наименование = "Тест"; НовыйОбъект.Записать(); Ссылка = НовыйОбъект.Ссылка;. Ссылка присваивается объекту в момент записи в базу.

bsl
// Получение объекта по ссылке для изменения
КонтрагентОбъект = КонтрагентСсылка.ПолучитьОбъект();
КонтрагентОбъект.ИНН = "7707083893";
КонтрагентОбъект.Записать();
// Проверка, что ссылка не пустая
Если НЕ КонтрагентСсылка.Пустая() Тогда
    Сообщить("Ссылка заполнена");
КонецЕсли;

Как проверить ссылку: пустая, битая, правильного типа

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

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

Проверка типа ссылки выполняется через функцию ТипЗнч(Значение) и сравнение с Тип("СправочникСсылка.Контрагенты"). Это особенно важно при работе с реквизитами составного типа, где в одном поле могут храниться ссылки на разные справочники или документы.

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

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

Метод Пустая()
Норма

Возвращает Ложь — ссылка заполнена

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

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

Запрос по ссылке к таблице объекта
Норма

Запрос возвращает строку — запись существует

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

Пустой результат — битая ссылка, объект удалён

Отображение в интерфейсе
Норма

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

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

Текст вида «<Объект не найден> (123:abc...)

ТипЗнч(Значение)
Норма

Совпадает с ожидаемым типом ссылки

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

Другой тип — обращение к реквизитам вызовет ошибку

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

Самая частая ошибка — попытка изменить данные через ссылку: КонтрагентСсылка.ИНН = "123". Ссылка доступна только для чтения, и такая строка вызовет ошибку исполнения. Для изменения нужно получить объект методом ПолучитьОбъект(), изменить реквизиты и вызвать Записать().

Вторая распространённая проблема — обращение к реквизитам через точку в цикле. Код вида Для Каждого Строка Из Таблица Цикл Сумма = Строка.Товар.Цена ... порождает отдельный запрос к базе на каждую итерацию. Правильный подход — получить нужные данные одним запросом с соединением таблиц и затем работать с результатом в памяти.

Третья ошибка — сравнение ссылки со строкой или числом: Если Ссылка = "000000123" Тогда. Ссылка никогда не равна строке кода; для сравнения по коду нужно сначала найти ссылку через НайтиПоКоду() и сравнивать ссылки между собой.

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

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

В языке запросов 1С ссылки — полноценные значения полей. Конструкция Реализация.Контрагент.ИНН называется разыменованием: платформа автоматически соединяет таблицу документа с таблицей справочника. Это удобно, но неявное соединение выполняется для каждого разыменованного поля, и при выборке десятка полей через точку запрос может стать заметно тяжелее, чем явное соединение через ЛЕВОЕ СОЕДИНЕНИЕ.

Для проверки типа ссылки в запросе используются операторы ССЫЛКА и функция ТИПЗНАЧЕНИЯ(): условие ГДЕ Поле ССЫЛКА Справочник.Контрагенты отберёт только записи, где составное поле содержит ссылку на контрагента. Функция ПРЕДСТАВЛЕНИЕ(Ссылка) возвращает строковое представление для вывода пользователю.

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

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

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

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

Ответы на частые вопросы

Итог

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

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

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

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

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

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

Как узнать GUID ссылки в 1С?

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

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

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

Почему сравнение ссылки со строкой не работает?

Ссылка и строка — разные типы данных, и сравнение всегда даёт Ложь. Чтобы найти объект по коду или наименованию, используйте методы НайтиПоКоду(), НайтиПоНаименованию() или запрос, а затем сравнивайте полученную ссылку с другой ссылкой.

Как проверить, что переменная содержит именно ссылку, а не объект?

Функцией ТипЗнч(): для ссылки она вернёт тип вида СправочникСсылка.Имя или ДокументСсылка.Имя, для объекта — СправочникОбъект.Имя или ДокументОбъект.Имя. Это полезно в универсальных процедурах, принимающих параметры разных типов.