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

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

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

Как представить ссылку строкой в запросе 1С: функция ПРЕДСТАВЛЕНИЕ, сравнение по строке, получение GUID ссылки. Примеры кода, типичные ошибки и проверка результата.

Задача представить ссылку как строку в запросе 1С возникает при выгрузке данных во внешние системы, формировании текстовых отчётов и поиске объектов по наименованию. У разработчика есть три разных смысла «строки из ссылки»: человекочитаемое представление (например, «Реализация товаров 000001 от 12.01.»), навигационная ссылка и уникальный идентификатор GUID. Каждый вариант получается по-разному, и путаница между ними — частый источник ошибок.

В языке запросов 1С нет прямого аналога функции Строка() из встроенного языка. Для получения текстового представления объекта в запросе используется функция ПРЕДСТАВЛЕНИЕ, а GUID извлекается только средствами встроенного языка после выполнения запроса. Ниже разобраны оба подхода с примерами кода и границами применения.

Что считать «строкой» для ссылки

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

GUID (уникальный идентификатор) — это 36-символьная строка вида «8b3a5c2e-...», которая однозначно идентифицирует объект в пределах всех баз. Именно GUID используют при обмене данными, интеграции с внешними системами и поиске «потерянных» объектов. Навигационная ссылка вида «e1cib/data/...» нужна для гиперссылок внутри клиентского приложения и в запросах не применяется.

Функция ПРЕДСТАВЛЕНИЕ в запросе

Функция ПРЕДСТАВЛЕНИЕ принимает выражение ссылочного типа и возвращает строку. Типичный пример — вывести список документов с их текстовым представлением:

ВЫБРАТЬ

Реализация.Ссылка КАК Ссылка,

ПРЕДСТАВЛЕНИЕ(Реализация.Ссылка) КАК ПредставлениеДокумента

ИЗ

Документ.РеализацияТоваровУслуг КАК Реализация

ГДЕ

Реализация.Дата МЕЖДУ &НачалоПериода И &КонецПериода

В результате запроса колонка «ПредставлениеДокумента» будет иметь тип «Строка» и содержать значения вида «Реализация товаров 000000012 от 15.03. 10:24:00». Точный формат зависит от настроек объекта в конфигураторе: длины номера, отображения времени, синонима вида документа.

Функция работает и с полями ссылочного типа, а не только с самой ссылкой. Например, ПРЕДСТАВЛЕНИЕ(Реализация.Контрагент) вернёт наименование контрагента без обращения к таблице справочника — платформа выполнит неявное соединение сама.

Представление полей и значений перечислений

Отдельный частый случай — получить строковое представление перечисления. Прямого преобразования перечисления в строку в языке запросов нет, но ПРЕДСТАВЛЕНИЕ справляется и с этим:

ВЫБРАТЬ

ПРЕДСТАВЛЕНИЕ(Заказы.Статус) КАК СтатусСтрокой

ИЗ

Документ.ЗаказКлиента КАК Заказы

Для составных типов данных (поле, которое может хранить ссылки разных видов) ПРЕДСТАВЛЕНИЕ возвращает корректную строку для каждого конкретного значения. Это удобно в универсальных отчётах по регистрам, где тип записи заранее неизвестен.

Для примитивных типов — чисел, дат, булево — функция тоже применима и возвращает их текстовое отображение. Однако форматирование (разделители разрядов, формат даты) внутри запроса управляется ограниченно, поэтому для тонкой настройки вывода лучше обрабатывать результат уже в коде или в СКД.

Как получить GUID ссылки

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

Выборка = Запрос.Выполнить().Выбрать();

Пока Выборка.Следующий() Цикл

ГУИДСтрокой = Строка(Выборка.Ссылка.УникальныйИдентификатор());

// дальнейшая обработка, например запись в файл обмена

КонецЦикла;

Обратная задача — найти объект по строке GUID — решается методом менеджера объекта:

Идентификатор = Новый УникальныйИдентификатор(СтрокаГУИД);

Ссылка = Документы.РеализацияТоваровУслуг.ПолучитьСсылку(Идентификатор);

Если НЕ ОбщегоНазначения.СсылкаСуществует(Ссылка) Тогда

// объект отсутствует в базе

КонецЕсли;

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

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

Иногда требуется обратное действие: найти объект, чьё представление совпадает с заданной строкой, например при загрузке из Excel, где ссылки пришли текстом. Для этого применяют ПОДОБНО или сравнение представления с параметром:

ВЫБРАТЬ

Контрагенты.Ссылка КАК Ссылка

ИЗ

Справочник.Контрагенты КАК Контрагенты

ГДЕ

ПРЕДСТАВЛЕНИЕ(Контрагенты.Ссылка) = &СтрокаПоиска

Такой запрос работает, но имеет два существенных ограничения. Во-первых, он не использует индексы: платформа вынуждена вычислить представление для каждой строки таблицы, что на больших справочниках приводит к полному сканированию. Во-вторых, представления не уникальны — два контрагента с одинаковым наименованием вернут обе ссылки.

Если поиск идёт по наименованию справочника, правильнее сравнивать само поле Наименование, а не представление ссылки. Для документов по строке обычно ищут по номеру и дате, разобрав входящую строку на части.

Условия выбора подхода

Выбор способа зависит от назначения строки. Для показа пользователю в отчёте или журнале достаточно ПРЕДСТАВЛЕНИЕ прямо в запросе — это быстро и не требует постобработки. Для выгрузки во внешнюю систему нужен GUID, получаемый в коде после запроса. Для поиска объекта по тексту из файла загрузки предпочтительнее сравнение конкретных полей (наименование, номер), а не представления целиком.

Сравнение вариантов

ПРЕДСТАВЛЕНИЕ в запросе

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

GUID через УникальныйИдентификатор()

Единственный надёжный ключ для обмена и интеграции. Требует постобработки выборки в коде.

Поиск по полям (Наименование, Номер)

Быстрее и точнее, чем сравнение представления, но требует знания структуры исходной строки.

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

Самая распространённая ошибка — попытка написать в запросе конструкцию вида «ВЫРАЗИТЬ(Ссылка КАК Строка)». Оператор ВЫРАЗИТЬ не преобразует ссылку в строку: он служит для уточнения типа и ограничения длины строковых полей, но не выполняет преобразования между несовместимыми типами. Запрос с таким выражением либо не пройдёт проверку, либо вернёт пустые значения.

Вторая ошибка — ожидание, что ПРЕДСТАВЛЕНИЕ вернёт GUID. Функция возвращает именно пользовательское представление, и для интеграционных задач она не подходит. Третья типичная проблема — использование представления в соединениях таблиц: соединять таблицы нужно всегда по ссылкам, а не по строкам.

Типичные ошибки
01
ВЫРАЗИТЬ(Ссылка КАК Строка(100)) — оператор не преобразует ссылку в строку, результат пустой или ошибка запроса
02
Использование ПРЕДСТАВЛЕНИЕ для сопоставления объектов между базами — представления не уникальны и меняются
03
Соединение таблиц по строковым представлениям вместо ссылок — потеря индексов и резкое замедление
04
Поиск документа по полной строке представления вместо разбора на номер и дату — ложные совпадения и промахи

После реализации проверьте результат на контрольных данных. Для ПРЕДСТАВЛЕНИЕ сравните строку в результате запроса с тем, что показывает платформа в форме списка объекта — значения должны совпадать. Для GUID выполните обратное получение ссылки через ПолучитьСсылку и убедитесь, что найден именно исходный объект.

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

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

Строка из ПРЕДСТАВЛЕНИЕ
Норма

Совпадает с отображением объекта в форме списка

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

Пустая строка или текст другого объекта

Обратный поиск по GUID
Норма

ПолучитьСсылку возвращает исходный объект, СсылкаСуществует = Истина

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

Возвращается битая ссылка или другой объект

Производительность запроса
Норма

Запрос с ПРЕДСТАВЛЕНИЕ выполняется сопоставимо с запросом без него

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

Время выполнения выросло кратно из-за массовых неявных соединений

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

Можно ли получить GUID ссылки прямо в тексте запроса?

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

Чем ПРЕДСТАВЛЕНИЕ отличается от функции Строка() в коде?

По результату для ссылок они обычно совпадают — обе возвращают пользовательское представление объекта. Разница в месте выполнения: ПРЕДСТАВЛЕНИЕ вычисляется на стороне СУБД внутри запроса, а Строка() — в коде после получения данных.

Почему запрос с ПРЕДСТАВЛЕНИЕ по нескольким ссылочным полям стал медленным?

Для вычисления представления платформа обращается к связанным таблицам. Каждое ссылочное поле с ПРЕДСТАВЛЕНИЕ добавляет неявное соединение. Сократите число таких полей или вычисляйте представления в коде только для нужных строк.

Как найти документ, если из файла загрузки пришла строка «Реализация 000123 от 01.02»?

Не сравнивайте строку с представлением целиком. Разберите её на номер и дату, затем ищите документ условием по полям Номер и Дата с учётом префиксов нумерации. Это быстрее и исключает ложные совпадения.

Можно ли использовать представление ссылки как ключ в соединении таблиц запроса?

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

Что вернёт ПРЕДСТАВЛЕНИЕ для пустой ссылки?

Для пустой ссылки функция вернёт пустую строку или строку вида «<Объект не найден>» для битых ссылок. Если в результате нужно явное значение, обработайте этот случай через ВЫБОР ... КОГДА Ссылка ЕСТЬ NULL или проверку на пустую ссылку.

Итог

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

В запросе ссылку преобразуют в строку функцией ПРЕДСТАВЛЕНИЕ — она даёт пользовательское представление для отчётов. GUID получают только в коде через УникальныйИдентификатор(). Для поиска и соединений используйте ссылки и конкретные поля, а не строки представлений.