Разработка и Конфигурация · 10 мин
Как в 1С выразить значение как ссылку
Как в 1С выразить значение как ссылку: ПолучитьСсылку, преобразование уникального идентификатора, работа в запросах и типовые ошибки. Практические примеры кода.
Задача «выразить как ссылку» возникает в 1С в двух типовых ситуациях: когда нужно получить ссылку на объект по известному уникальному идентификатору (GUID) и когда в запросе требуется привести значение к ссылочному типу. Обе задачи решаются штатными средствами платформы, но у каждого способа есть ограничения, о которых лучше знать заранее.
Чаще всего ссылку восстанавливают при обмене данными: внешняя система передаёт строку GUID, а в базе 1С нужно получить ссылку на элемент справочника или документ, чтобы продолжить работу — заполнить реквизит, построить отчёт или проверить наличие объекта. Реже требуется обратная операция — получить идентификатор из существующей ссылки.
Ниже разобраны рабочие способы преобразования с примерами кода, проверкой результата и типовыми ошибками, которые приводят к битым ссылкам и дублям в базе.
Что такое ссылка и уникальный идентификатор в 1С
Ссылка — это типизированный указатель на объект базы данных: элемент справочника, документ, план счетов и т.д. Ссылка «знает» тип объекта и содержит внутри себя уникальный идентификатор — 128-битное значение, которое обычно представляют строкой вида «8a3f...-....-....-....-............».
Уникальный идентификатор (GUID) сам по себе не является ссылкой. Это просто значение типа «УникальныйИдентификатор», которое можно создать из строки, но оно не привязано ни к какому типу метаданных. Именно поэтому одной строки GUID недостаточно — нужно знать, к какому справочнику или виду документов относится искомый объект.
Понимание этой связки важно на практике: при обмене между базами GUID сохраняется, а тип объекта внешней системе нужно передавать отдельно или согласовывать заранее. Если тип угадан неверно, ПолучитьСсылку вернёт формально корректную, но «пустую» для данной базы ссылку.
Получение ссылки по уникальному идентификатору
Основной инструмент — метод ПолучитьСсылку() менеджера соответствующего объекта метаданных. Сначала строка преобразуется в значение типа УникальныйИдентификатор, затем менеджер строит из него ссылку нужного типа.
СтрокаGUID = "8a3f2c1e-1234-4abc-9def-001122334455";
Идентификатор = Новый УникальныйИдентификатор(СтрокаGUID);
СсылкаНаТовар = Справочники.Номенклатура.ПолучитьСсылку(Идентификатор);Аналогично работают менеджеры документов, планов видов характеристик, планов счетов и других ссылочных типов: Документы.РеализацияТоваровУслуг.ПолучитьСсылку(Идентификатор), ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.ПолучитьСсылку(Идентификатор).
Важно понимать: ПолучитьСсылку не обращается к базе данных и не проверяет, существует ли объект. Метод просто конструирует ссылку из идентификатора. Если объекта с таким GUID в базе нет, вы получите «битую» ссылку — об этом подробнее в разделе про проверку.
Проверка существования объекта по ссылке
После получения ссылки почти всегда нужно убедиться, что объект реально есть в базе. Самый быстрый способ — запрос, который не выгружает данные объекта целиком, а только проверяет факт наличия записи.
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА ИЗ Справочник.Номенклатура ГДЕ Ссылка = &Ссылка";
Запрос.УстановитьПараметр("Ссылка", СсылкаНаТовар);
ОбъектСуществует = НЕ Запрос.Выполнить().Пустой();Другой вариант — функция ОбщегоНазначения.СсылкаСуществует() в конфигурациях на БСП (Библиотека стандартных подсистем). Она делает то же самое, но оформлена как готовый вызов. Проверяйте наличие этой функции в вашей конфигурации — в самописных решениях её может не быть.
Признак несуществующего объекта виден и без запроса: у «битой» ссылки строковое представление имеет вид «<Объект не найден> (8a3:...)». Но полагаться на строковое представление в коде нельзя — оно зависит от локализации и версии платформы.
Как проверить результат
Запрос вернул одну строку — объект есть
Запрос пустой — ссылка битая, объекта в базе нет
Отображается код и наименование объекта
Текст вида <Объект не найден>
Возвращает объект для чтения и изменения
Возвращает Неопределено — записи нет
Приведение к ссылочному типу в запросах
В языке запросов задача «выразить как ссылку» решается двумя инструментами. Функция ССЫЛКА позволяет построить ссылку из строки GUID прямо в тексте запроса, а оператор ВЫРАЗИТЬ приводит значение составного типа к конкретному ссылочному типу.
ТекстЗапроса =
"ВЫБРАТЬ
| ВЫРАЗИТЬ(Регистр.Товар КАК Справочник.Номенклатура) КАК ТоварСсылка
|ИЗ РегистрСведений.Штрихкоды КАК Регистр
|ГДЕ Регистр.Товар ССЫЛКА Справочник.Номенклатура";Оператор ВЫРАЗИТЬ особенно полезен при работе с реквизитами составного типа: если поле может хранить ссылки на разные справочники, приведение к нужному типу позволяет дотянуться до реквизитов через точку и получать корректные соединения таблиц. Без приведения обращение к реквизиту составного поля даст NULL для всех записей «чужого» типа.
Проверка вида ссылки выполняется оператором ССЫЛКА в условии ГДЕ: «ГДЕ Поле ССЫЛКА Справочник.Контрагенты». Это стандартный способ отфильтровать записи нужного типа в составных полях.
Обратное преобразование и работа с внешними системами
Обратный путь — получить GUID из ссылки — делается методом УникальныйИдентификатор(): Строка(Ссылка.УникальныйИдентификатор()). Именно эту строку передают в веб-сервисы, файлы обмена и внешние базы, чтобы та сторона могла восстановить ссылку у себя.
При двустороннем обмене договоритесь о формате: GUID передаётся как строка в фиксированном регистре, тип объекта — отдельным полем или подразумевается структурой сообщения. Несогласованность типов — самая частая причина, по которой на приёмной стороне создаются дубли или пустые ссылки.
Типичные ошибки и их последствия
Большинство проблем с преобразованием ссылок связано не с самим кодом, а с данными и допущениями о них. Ниже — ошибки, которые встречаются чаще всего.
Отдельная группа проблем — обход битых ссылок в уже существующей базе. Если в реквизитах документов накопились значения «Объект не найден», их нужно искать запросами по соответствующим таблицам и вычищать либо перезаполнением из источника, либо пометкой на удаление зависимых записей. Автоматической «починки» платформа не выполняет.
При массовой загрузке из внешних систем удобно сначала собрать все входящие GUID в таблицу значений, одним запросом найти существующие объекты через временную таблицу, и только потом создавать недостающие. Это на порядок быстрее, чем проверять каждую ссылку отдельным запросом в цикле.
Порядок безопасной реализации
Соберите преобразование в одну функцию, чтобы не размножать по коду хрупкие конструкции. Ниже — рекомендуемая последовательность для обработчика обмена.
- 1Проверьте формат входящей строки GUID и оберните создание УникальногоИдентификатора в Попытка/Исключение
- 2Определите тип объекта по данным сообщения и выберите правильный менеджер (Справочники, Документы и т.д.)
- 3Получите ссылку через ПолучитьСсылку(Идентификатор)
- 4Проверьте существование объекта запросом или СсылкаСуществует()
- 5Если объекта нет — создайте его с заданной ссылкой через УстановитьСсылкуНового либо зафиксируйте ошибку обмена
- 6Запишите результат в журнал обмена для последующей диагностики
Такая функция возвращает структуру «Ссылка + ПризнакСуществования», и вызывающий код явно решает, что делать с отсутствующими объектами. Это убирает неоднозначность и упрощает поиск проблем при рассинхронизации баз.
Что важно запомнить
Ссылку из строки GUID создают через ПолучитьСсылку() менеджера нужного типа; метод не проверяет наличие объекта, поэтому существование проверяйте запросом. В запросах используйте ВЫРАЗИТЬ и ССЫЛКА. Всегда контролируйте тип объекта и формат GUID — это главные источники битых ссылок и дублей.
Частые вопросы
Можно ли получить ссылку, не зная тип объекта?
Напрямую нет: ПолучитьСсылку вызывается у менеджера конкретного вида. Если тип неизвестен, его нужно определить из контекста обмена или перебрать ограниченный список возможных типов, проверяя существование объекта для каждого. Универсального метода «найти объект по GUID в любой таблице» в платформе нет.
Чем ПолучитьСсылку отличается от НайтиПоРеквизиту?
ПолучитьСсылку строит ссылку из GUID без обращения к базе. НайтиПоРеквизиту выполняет запрос и ищет объект по значению любого реквизита (кода, наименования, артикула). Первый метод быстрее, но требует точного GUID; второй медленнее, но работает с «человеческими» ключами.
Почему ПолучитьСсылку вернула ссылку, а объекта в базе нет?
Это нормальное поведение: метод не проверяет базу, а лишь конструирует ссылку из идентификатора. Такой механизм специально используется в обменах, чтобы создавать объекты с заранее известными ссылками. Проверку существования делайте отдельным запросом.
Как создать новый объект с заданным GUID?
Создайте объект обычным способом (СоздатьЭлемент/СоздатьДокумент), затем вызовите УстановитьСсылкуНового(Ссылка), передав ссылку, полученную через ПолучитьСсылку, и запишите объект. Используйте это только в синхронизации по GUID — в ручной работе такой механизм не нужен.
Как в запросе отфильтровать только ссылки нужного типа из составного поля?
Используйте условие «ГДЕ Поле ССЫЛКА Справочник.ИмяСправочника». Для дальнейшей работы с реквизитами дополнительно примените ВЫРАЗИТЬ(Поле КАК Справочник.ИмяСправочника) — тогда обращение к реквизитам через точку будет работать корректно.
Что делать с накопившимися битыми ссылками в базе?
Найдите их запросами по таблицам, где хранятся ссылочные реквизиты (проверка на «Объект не найден» через LEFT JOIN по таблице объекта с условием IS NULL). Затем либо восстановите объекты из источника обмена, либо очистите/перезаполните реквизиты. Перед массовой обработкой сделайте резервную копию базы.