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

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

Как задать ссылку на объект 1С

Как задать ссылку на объект 1С: навигационная ссылка, ПолучитьСсылку, ссылка по GUID, ЗначениеВСтрокуВнутр. Примеры кода, типичные ошибки и проверка результата.

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

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

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

Что такое ссылка на объект и когда она нужна

Ссылка — это значение, которое хранится в реквизитах документов, справочников, регистров и однозначно идентифицирует запись базы данных. Физически ссылка основана на уникальном идентификаторе GUID, который присваивается объекту при создании и не меняется в течение всей жизни объекта.

Ссылки нужны везде: при заполнении реквизита «Контрагент» в документе, при построении запросов с соединениями таблиц, при обмене данными между конфигурациями, при программном создании объектов. Без корректного задания ссылки невозможно связать, например, строку табличной части с номенклатурой.

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

Самый частый сценарий — найти существующий объект и получить на него ссылку. Для справочников используются методы НайтиПоКоду(), НайтиПоНаименованию(), НайтиПоРеквизиту(), для документов — НайтиПоНомеру(). Все они возвращают именно ссылку, которую можно присвоить реквизиту.

СсылкаКонтрагент = Справочники.Контрагенты.НайтиПоНаименованию("ООО Ромашка");

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

Сообщить("Контрагент не найден");

Иначе

ДокументОбъект.Контрагент = СсылкаКонтрагент;

КонецЕсли;

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

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

Задание ссылки по GUID

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

Ид = Новый УникальныйИдентификатор("8e2f0b54-1234-5678-9abc-def012345678");

СсылкаНаТовар = Справочники.Номенклатура.ПолучитьСсылку(Ид);

Если СсылкаНаТовар.ПолучитьОбъект() = Неопределено Тогда

Сообщить("Объект с таким GUID не существует");

КонецЕсли;

Обратный путь — получить GUID из существующей ссылки — выполняется через свойство УникальныйИдентификатор(): СтрокаGUID = XMLСтрока(Ссылка.УникальныйИдентификатор()). Эта пара методов — стандартный способ синхронизации объектов между разными базами 1С.

Навигационная ссылка в пользовательском интерфейсе

Пользователю, не знакомому с программированием, ссылка на объект доступна прямо из формы. В управляемом интерфейсе нужно открыть объект, нажать кнопку «Ещё» и выбрать пункт «Получить ссылку» — платформа покажет навигационную ссылку вида e1cib/data/Справочник.Номенклатура?ref=....

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

Ограничение: навигационная ссылка работает только в пределах одной информационной базы. Для другой базы она бесполезна — там нужен GUID.

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

НайтиПоКоду / НайтиПоНаименованию

Подходит для поиска существующих объектов внутри базы. Ограничение: зависит от заполненности и уникальности данных.

ПолучитьСсылку(GUID)

Подходит для обмена между базами и предопределённых элементов. Требует знать GUID и проверять существование объекта.

Навигационная ссылка

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

ЗначениеВСтрокуВнутр

Подходит для сохранения ссылки в файл или строку с последующим восстановлением. Формат внутренний, требователен к совместимости.

Ссылка через строковое представление

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

СтрокаСсылки = ЗначениеВСтрокуВнутр(СсылкаНаТовар);

// ...сохранение строки...

ВосстановленнаяСсылка = ЗначениеИзСтрокиВнутр(СтрокаСсылки);

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

Жёстко заданная ссылка для предопределённых элементов

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

НовыйЭлемент = Справочники.Валюты.СоздатьЭлемент();

НовыйЭлемент.УстановитьСсылкуНового(Справочники.Валюты.ПолучитьСсылку(Новый УникальныйИдентификатор));

НовыйЭлемент.Наименование = "USD";

НовыйЭлемент.Записать();

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

Проверка результата и типичные ошибки

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

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

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

Результат поиска
Норма

Пустая() возвращает Ложь, ссылка открывается в форме

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

Пустая() возвращает Истина — объект не найден

Ссылка по GUID
Норма

ПолучитьОбъект() возвращает объект, данные читаются

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

Ошибка «Объект не найден» — GUID неверен или объект удалён

Реквизит после записи
Норма

Реквизит содержит нужную ссылку, объект перезаписывается без ошибок

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

Реквизит пустой или содержит ссылку другого типа

Итог

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

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

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

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

Ссылка — лёгкое значение-указатель, содержащее только идентификатор. Объект — полная копия данных в памяти, которую можно изменять. Для чтения реквизита через точку платформа неявно обращается к базе, поэтому массовое чтение через ссылки медленнее запросов.

Как узнать GUID существующего объекта?

Используйте Ссылка.УникальныйИдентификатор() — вернётся объект УникальныйИдентификатор. Для получения строки оберните его в XMLСтрока() или Строка().

Почему ПолучитьСсылку() возвращает ссылку, но объект не открывается?

Метод создаёт ссылку формально, не проверяя наличие записи в базе. Если объекта с таким GUID нет, возникает «битая ссылка». Проверяйте существование через ПолучитьОбъект() или запрос.

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

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

Работает ли навигационная ссылка в веб-клиенте?

Да, навигационная ссылка одинаково работает в тонком, толстом и веб-клиенте, но только в пределах той же информационной базы и при наличии у пользователя прав на объект.

Как найти все битые ссылки в базе?

Запросом с левым соединением: выберите реквизиты ссылочного типа и проверьте, что соединённая таблица даёт NULL, при этом сама ссылка не пустая. Также битые ссылки выявляет штатное тестирование и исправление информационной базы.