Разработка и Конфигурация · 9 мин
Как задать ссылку на объект 1С
Как задать ссылку на объект 1С: навигационная ссылка, ПолучитьСсылку, ссылка по GUID, ЗначениеВСтрокуВнутр. Примеры кода, типичные ошибки и проверка результата.
Ссылка на объект — базовый механизм платформы 1С, который связывает элементы базы данных между собой. Под ссылкой понимается уникальное значение типа «СправочникСсылка», «ДокументСсылка» и других ссылочных типов, которое однозначно указывает на конкретный объект. Задать такую ссылку можно несколькими способами: в коде на встроенном языке, через навигационную ссылку в интерфейсе, по уникальному идентификатору (GUID) или через строковое представление.
Выбор способа зависит от задачи. Разработчику при обмене данными нужен GUID, пользователю — кнопка «Получить ссылку» в форме объекта, а при создании предопределённых элементов требуется жёстко заданная ссылка через метод ПолучитьСсылку(). Ниже разобраны все основные варианты с примерами кода и проверкой результата.
Важно понимать разницу между ссылкой и объектом: ссылка — это только «указатель», лёгкое значение, а объект — полная копия данных в памяти, которую можно изменять и записывать. В большинстве случаев для запросов, реквизитов и сравнений достаточно именно ссылки, и работать с ней быстрее.
Что такое ссылка на объект и когда она нужна
Ссылка — это значение, которое хранится в реквизитах документов, справочников, регистров и однозначно идентифицирует запись базы данных. Физически ссылка основана на уникальном идентификаторе GUID, который присваивается объекту при создании и не меняется в течение всей жизни объекта.
Ссылки нужны везде: при заполнении реквизита «Контрагент» в документе, при построении запросов с соединениями таблиц, при обмене данными между конфигурациями, при программном создании объектов. Без корректного задания ссылки невозможно связать, например, строку табличной части с номенклатурой.
Как получить и задать ссылку в коде
Самый частый сценарий — найти существующий объект и получить на него ссылку. Для справочников используются методы НайтиПоКоду(), НайтиПоНаименованию(), НайтиПоРеквизиту(), для документов — НайтиПоНомеру(). Все они возвращают именно ссылку, которую можно присвоить реквизиту.
СсылкаКонтрагент = Справочники.Контрагенты.НайтиПоНаименованию("ООО Ромашка");
Если СсылкаКонтрагент.Пустая() Тогда
Сообщить("Контрагент не найден");
Иначе
ДокументОбъект.Контрагент = СсылкаКонтрагент;
КонецЕсли;
Если объект уже существует как объект (например, вы создали его программно), ссылка доступна через свойство Ссылка: НовыйОбъект.Ссылка. До записи объекта ссылка будет пустой — это частая причина ошибок у начинающих разработчиков.
- 1Определите менеджер объекта: Справочники.Имя или Документы.Имя
- 2Вызовите подходящий метод поиска: НайтиПоКоду, НайтиПоНаименованию, НайтиПоРеквизиту
- 3Проверьте результат через Пустая() или ЗначениеЗаполнено()
- 4Присвойте ссылку нужному реквизиту или используйте в запросе
- 5Запишите объект, если изменяли реквизиты
Задание ссылки по GUID
При обмене между базами или при интеграции с внешними системами объект часто известен только по GUID. В этом случае ссылка задаётся методом ПолучитьСсылку(), которому передаётся объект типа УникальныйИдентификатор.
Ид = Новый УникальныйИдентификатор("8e2f0b54-1234-5678-9abc-def012345678");
СсылкаНаТовар = Справочники.Номенклатура.ПолучитьСсылку(Ид);
Если СсылкаНаТовар.ПолучитьОбъект() = Неопределено Тогда
Сообщить("Объект с таким GUID не существует");
КонецЕсли;
Обратный путь — получить GUID из существующей ссылки — выполняется через свойство УникальныйИдентификатор(): СтрокаGUID = XMLСтрока(Ссылка.УникальныйИдентификатор()). Эта пара методов — стандартный способ синхронизации объектов между разными базами 1С.
Навигационная ссылка в пользовательском интерфейсе
Пользователю, не знакомому с программированием, ссылка на объект доступна прямо из формы. В управляемом интерфейсе нужно открыть объект, нажать кнопку «Ещё» и выбрать пункт «Получить ссылку» — платформа покажет навигационную ссылку вида e1cib/data/Справочник.Номенклатура?ref=....
Такую ссылку можно отправить коллеге, работающему в той же базе: при переходе по ней откроется именно этот объект. Это удобно для указания на конкретный документ в письме или задаче. Программно навигационная ссылка получается функцией ПолучитьНавигационнуюСсылку(Ссылка).
Ограничение: навигационная ссылка работает только в пределах одной информационной базы. Для другой базы она бесполезна — там нужен GUID.
Сравнение способов задать ссылку
Подходит для поиска существующих объектов внутри базы. Ограничение: зависит от заполненности и уникальности данных.
Подходит для обмена между базами и предопределённых элементов. Требует знать GUID и проверять существование объекта.
Подходит пользователям для передачи ссылки внутри одной базы. Не работает между разными базами.
Подходит для сохранения ссылки в файл или строку с последующим восстановлением. Формат внутренний, требователен к совместимости.
Ссылка через строковое представление
Для хранения ссылки в текстовом файле, настройке или передачи через буфер используются функции ЗначениеВСтрокуВнутр() и ЗначениеИзСтрокиВнутр(). Первая превращает ссылку (и любое значение) в строку внутреннего формата, вторая восстанавливает её обратно.
СтрокаСсылки = ЗначениеВСтрокуВнутр(СсылкаНаТовар);
// ...сохранение строки...
ВосстановленнаяСсылка = ЗначениеИзСтрокиВнутр(СтрокаСсылки);
Этот способ требователен к совместимости конфигураций: строка, созданная в одной конфигурации, может не восстановиться в другой, если состав метаданных отличается. Для межбазового обмена надёжнее GUID.
Жёстко заданная ссылка для предопределённых элементов
Иногда требуется, чтобы элемент справочника имел заранее известную ссылку — например, при создании данных обработкой заполнения. Для этого ПолучитьСсылку() вызывается с новым GUID, ссылка присваивается объекту через УстановитьСсылкуНового(), и только после этого объект записывается.
НовыйЭлемент = Справочники.Валюты.СоздатьЭлемент();
НовыйЭлемент.УстановитьСсылкуНового(Справочники.Валюты.ПолучитьСсылку(Новый УникальныйИдентификатор));
НовыйЭлемент.Наименование = "USD";
НовыйЭлемент.Записать();
Такой приём гарантирует, что в нескольких базах элемент будет создан с одинаковым GUID, что критично для синхронизации справочников.
Проверка результата и типичные ошибки
После задания ссылки убедитесь, что она корректна: проверьте Пустая() для результата поиска, а для ссылки по GUID — существование объекта. В запросах битая ссылка отображается как «Объект не найден» с GUID в угловых скобках.
Как проверить результат
Пустая() возвращает Ложь, ссылка открывается в форме
Пустая() возвращает Истина — объект не найден
ПолучитьОбъект() возвращает объект, данные читаются
Ошибка «Объект не найден» — GUID неверен или объект удалён
Реквизит содержит нужную ссылку, объект перезаписывается без ошибок
Реквизит пустой или содержит ссылку другого типа
Что важно запомнить
Ссылку на объект 1С задают через поиск (НайтиПоКоду, НайтиПоНаименованию), через GUID методом ПолучитьСсылку(), через навигационную ссылку в интерфейсе или через ЗначениеВСтрокуВнутр. Всегда проверяйте ссылку на пустоту и существование объекта, а для обмена между базами используйте GUID.
Частые вопросы
Чем ссылка отличается от объекта в 1С?
Ссылка — лёгкое значение-указатель, содержащее только идентификатор. Объект — полная копия данных в памяти, которую можно изменять. Для чтения реквизита через точку платформа неявно обращается к базе, поэтому массовое чтение через ссылки медленнее запросов.
Как узнать GUID существующего объекта?
Используйте Ссылка.УникальныйИдентификатор() — вернётся объект УникальныйИдентификатор. Для получения строки оберните его в XMLСтрока() или Строка().
Почему ПолучитьСсылку() возвращает ссылку, но объект не открывается?
Метод создаёт ссылку формально, не проверяя наличие записи в базе. Если объекта с таким GUID нет, возникает «битая ссылка». Проверяйте существование через ПолучитьОбъект() или запрос.
Можно ли задать ссылку на документ по номеру?
Да, через Документы.ИмяДокумента.НайтиПоНомеру(Номер, Дата). Дата обязательна, так как нумерация документов обычно периодическая, и один номер может встречаться в разных периодах.
Работает ли навигационная ссылка в веб-клиенте?
Да, навигационная ссылка одинаково работает в тонком, толстом и веб-клиенте, но только в пределах той же информационной базы и при наличии у пользователя прав на объект.
Как найти все битые ссылки в базе?
Запросом с левым соединением: выберите реквизиты ссылочного типа и проверьте, что соединённая таблица даёт NULL, при этом сама ссылка не пустая. Также битые ссылки выявляет штатное тестирование и исправление информационной базы.