Разработка и Конфигурация · 9 мин
1С: как получить ссылку по объекту
Как в 1С получить ссылку по объекту: метод ПолучитьСсылку, свойство Ссылка, поиск по наименованию и коду, работа с уникальным идентификатором и типичные ошибки.
В языке 1С объект и ссылка — два разных представления одних и тех же данных. Ссылка — это лёгкий указатель на запись в базе, с ней можно сравнивать, искать и передавать между процедурами. Объект — это полная копия данных в памяти, которую можно изменять и записывать. Задача «получить ссылку по объекту» возникает постоянно: после записи нового элемента, при обмене данными, при построении запросов и отчётов.
Способ получения ссылки зависит от того, что у вас есть на руках: объект в памяти, уникальный идентификатор, значение кода или наименования, либо строковое представление ссылки. Ниже разобраны все рабочие варианты с примерами кода, ограничениями и проверкой результата.
Чем ссылка отличается от объекта
Ссылка (тип СправочникСсылка, ДокументСсылка и т.п.) содержит только идентификатор записи и её тип. Через ссылку можно обратиться к реквизитам «через точку», и платформа неявно выполнит чтение из базы, но изменить данные через ссылку нельзя — она доступна только для чтения.
Объект (тип СправочникОбъект, ДокументОбъект) получают вызовом метода ПолучитьОбъект() у ссылки или созданием через СоздатьЭлемент(). Объект занимает больше памяти, поддерживает модификацию и запись. Понимание этой разницы важно: многие ошибки новичков связаны с попыткой записать ссылку или сравнить объект со ссылкой напрямую.
Получение ссылки из существующего объекта
Самый частый сценарий: объект уже получен или создан и записан, нужна его ссылка. Для этого у любого объекта данных есть свойство Ссылка:
ОбъектТовара = Справочники.Номенклатура.СоздатьЭлемент();
ОбъектТовара.Наименование = "Тестовый товар";
ОбъектТовара.Записать();
СсылкаНаТовар = ОбъектТовара.Ссылка;
Обратите внимание: до вызова Записать() свойство Ссылка у нового объекта содержит пустую ссылку соответствующего типа. Реальное значение появляется только после записи, если заранее не задать ссылку нового (об этом ниже).
Если объект получен из существующей ссылки, обратное преобразование тривиально и не требует обращения к базе:
ОбъектДокумента = СсылкаНаДокумент.ПолучитьОбъект();
// ... изменения ...
ОбъектДокумента.Записать();
ТаЖеСсылка = ОбъектДокумента.Ссылка; // равна СсылкаНаДокумент
Ссылка для нового объекта до записи
Иногда ссылка нужна до того, как объект записан: например, чтобы заполнить реквизиты связанных объектов или сформировать движения. Для этого служит пара методов ПолучитьСсылкуНового() и УстановитьСсылкуНового().
ОбъектТовара = Справочники.Номенклатура.СоздатьЭлемент();
НоваяСсылка = Справочники.Номенклатура.ПолучитьСсылку(Новый УникальныйИдентификатор);
ОбъектТовара.УстановитьСсылкуНового(НоваяСсылка);
// теперь ОбъектТовара.Ссылка уже возвращает НоваяСсылка
ОбъектТовара.Наименование = "Товар с заранее известной ссылкой";
ОбъектТовара.Записать();
Проверить, назначена ли ссылка новому объекту, можно методом ПолучитьСсылкуНового(): если ссылка не установлена, он вернёт пустую ссылку. Этот приём активно используется в обменах данными, когда ссылка приходит из другой базы и должна быть сохранена без изменений.
Получение ссылки без загрузки объекта
По уникальному идентификатору
Если известен GUID записи (например, из строки, лога обмена или внешней системы), ссылку получают напрямую через менеджер справочника или документа:
Ид = Новый УникальныйИдентификатор("a1b2c3d4-e5f6-7890-abcd-ef1234567890");
СсылкаНаТовар = Справочники.Номенклатура.ПолучитьСсылку(Ид);
Метод ПолучитьСсылку() не проверяет, существует ли запись. Чтобы убедиться, что ссылка указывает на реальный объект, используйте НайтиПоСсылке-подход через запрос или проверку на «битость»:
Если СсылкаНаТовар.ПолучитьОбъект() = Неопределено Тогда
// записи с такой ссылкой нет — ссылка битая
КонецЕсли;
По коду или наименованию
Когда идентификатор неизвестен, но есть код или наименование, применяют методы поиска менеджера — они возвращают именно ссылку, не загружая объект:
СсылкаПоКоду = Справочники.Номенклатура.НайтиПоКоду("000123");
СсылкаПоНаименованию = Справочники.Номенклатура.НайтиПоНаименованию("Тестовый товар", Истина);
Если СсылкаПоКоду.Пустая() Тогда
// элемент не найден
КонецЕсли;
Для документов аналогично работает НайтиПоНомеру(Номер, Дата) — дата обязательна, так как нумерация документов обычно периодическая. Универсальный вариант для любых данных — запрос с выборкой поля Ссылка.
- 1Определите, что у вас есть: объект в памяти, GUID, код, наименование или номер документа
- 2Для объекта в памяти возьмите свойство Объект.Ссылка
- 3Для GUID вызовите Менеджер.ПолучитьСсылку(Идентификатор)
- 4Для кода или наименования используйте НайтиПоКоду / НайтиПоНаименованию
- 5Проверьте результат: метод Пустая() для ненайденных и ПолучитьОбъект() = Неопределено для битых ссылок
Получение ссылки из строки и обратное преобразование
В обменах и интеграциях ссылку часто передают строкой. Преобразовать ссылку в строку GUID можно так:
СтрокаИд = XMLСтрока(СсылкаНаТовар);
// или
СтрокаИд = Строка(СсылкаНаТовар.УникальныйИдентификатор());
Обратно из строки:
Ид = Новый УникальныйИдентификатор(СтрокаИд);
СсылкаНаТовар = Справочники.Номенклатура.ПолучитьСсылку(Ид);
Для универсального кода, где тип объекта заранее неизвестен, используют XMLЗначение и XMLСтрока — они сохраняют и тип, и идентификатор. Это надёжнее, чем хранить только GUID, потому что один и тот же GUID в разных таблицах даст разные ссылки.
В журналах обмена и очередях интеграции храните ссылку вместе с её строковым GUID. Если объект удалят, по GUID вы быстро восстановите, о какой записи шла речь, а по живой ссылке — нет.
Проверка результата и «битые» ссылки
Полученная ссылка не гарантирует, что запись существует. Три типовые ситуации: ссылка пустая (поиск не дал результата), ссылка корректная (запись есть) и ссылка «битая» (запись удалена или никогда не создавалась).
Ссылка.Пустая()— истина, если ссылка не заполнена.Ссылка.ПолучитьОбъект() = Неопределено— записи нет в базе, ссылка битая.- Запрос с условием
ГДЕ Ссылка = &Ссылка— если выборка пустая, записи нет; это быстрее, чем ПолучитьОбъект, для массовых проверок.
В формах и отчётах битая ссылка отображается как «<Объект не найден> (…)». Такие записи стоит вычищать регламентно, иначе они ломают обмены и итоги.
Как проверить результат
Пустая() возвращает Ложь
Возвращает Истина — поиск не сработал
ПолучитьОбъект() возвращает объект
Возвращает Неопределено — ссылка битая
ТипЗнч(Ссылка) совпадает с ожидаемым типом
Тип другой — GUID взят из чужой таблицы
Типичные ошибки
Большинство проблем при работе со ссылками сводится к нескольким повторяющимся промахам.
Отдельно стоит помнить про производительность: конструкция Ссылка.Реквизит внутри цикла вызывает обращение к базе на каждой итерации. Если реквизиты нужны массово, выбирайте их запросом, а ссылку используйте только как ключ.
FAQ
Как получить ссылку на только что созданный элемент справочника?
Создайте объект через СоздатьЭлемент(), заполните реквизиты, вызовите Записать() и возьмите свойство Ссылка: СсылкаЭлемента = Объект.Ссылка. Если ссылка нужна до записи, заранее установите её через УстановитьСсылкуНового.
Чем ПолучитьСсылку() отличается от НайтиПоКоду()?
ПолучитьСсылку работает по уникальному идентификатору и не проверяет существование записи — вернёт ссылку в любом случае. НайтиПоКоду ищет реальную запись в базе и вернёт пустую ссылку, если ничего не нашёл.
Как узнать GUID существующей ссылки?
Вызовите метод Ссылка.УникальныйИдентификатор() — он вернёт значение типа УникальныйИдентификатор. Для передачи в строковом виде примените Строка() или XMLСтрока().
Почему сравнение двух одинаковых записей даёт Ложь?
Скорее всего, вы сравниваете объект со ссылкой или два разных объекта. Сравнивать нужно ссылки: Объект1.Ссылка = Объект2.Ссылка. Ссылки на одну запись всегда равны, объекты — нет.
Что делать, если ссылка отображается как «Объект не найден»?
Это битая ссылка: запись удалена, а указатель остался. Проверьте Ссылка.ПолучитьОбъект() — он вернёт Неопределено. Такие ссылки очищают штатной обработкой поиска и удаления помеченных объектов или вручную заменяют на корректные значения.
Можно ли получить ссылку, не зная типа объекта?
Да, если есть полное строковое представление, сохранённое через XMLСтрока, — обратное преобразование выполняется через XMLЗначение с указанием типа. По одному GUID без типа ссылку восстановить нельзя: нужно знать, к какой таблице (справочнику или документу) он относится.
Что важно запомнить
Ссылку из объекта берут через свойство Ссылка, для новых объектов — через УстановитьСсылкуНового. Без загрузки объекта ссылку дают ПолучитьСсылку по GUID и методы НайтиПоКоду / НайтиПоНаименованию / НайтиПоНомеру. Результат всегда проверяйте: Пустая() — для ненайденного, ПолучитьОбъект() = Неопределено — для битой ссылки.