Разработка и Конфигурация · 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 — решается методом менеджера объекта:
Идентификатор = Новый УникальныйИдентификатор(СтрокаГУИД);
Ссылка = Документы.РеализацияТоваровУслуг.ПолучитьСсылку(Идентификатор);
Если НЕ ОбщегоНазначения.СсылкаСуществует(Ссылка) Тогда
// объект отсутствует в базе
КонецЕсли;
- 1Сформируйте запрос, выбирающий поле Ссылка нужных объектов
- 2Выполните запрос и откройте обход выборки
- 3Для каждой строки вызовите Ссылка.УникальныйИдентификатор() и преобразуйте результат функцией Строка()
- 4Запишите полученные строки в файл, таблицу значений или передайте во внешнюю систему
- 5Проверьте на контрольном объекте, что по GUID обратно находится та же ссылка
Сравнение и поиск ссылки по строке
Иногда требуется обратное действие: найти объект, чьё представление совпадает с заданной строкой, например при загрузке из Excel, где ссылки пришли текстом. Для этого применяют ПОДОБНО или сравнение представления с параметром:
ВЫБРАТЬ
Контрагенты.Ссылка КАК Ссылка
ИЗ
Справочник.Контрагенты КАК Контрагенты
ГДЕ
ПРЕДСТАВЛЕНИЕ(Контрагенты.Ссылка) = &СтрокаПоиска
Такой запрос работает, но имеет два существенных ограничения. Во-первых, он не использует индексы: платформа вынуждена вычислить представление для каждой строки таблицы, что на больших справочниках приводит к полному сканированию. Во-вторых, представления не уникальны — два контрагента с одинаковым наименованием вернут обе ссылки.
Если поиск идёт по наименованию справочника, правильнее сравнивать само поле Наименование, а не представление ссылки. Для документов по строке обычно ищут по номеру и дате, разобрав входящую строку на части.
Условия выбора подхода
Выбор способа зависит от назначения строки. Для показа пользователю в отчёте или журнале достаточно ПРЕДСТАВЛЕНИЕ прямо в запросе — это быстро и не требует постобработки. Для выгрузки во внешнюю систему нужен GUID, получаемый в коде после запроса. Для поиска объекта по тексту из файла загрузки предпочтительнее сравнение конкретных полей (наименование, номер), а не представления целиком.
Сравнение вариантов
Подходит для отчётов и печати. Не уникально, не подходит для сопоставления данных между базами.
Единственный надёжный ключ для обмена и интеграции. Требует постобработки выборки в коде.
Быстрее и точнее, чем сравнение представления, но требует знания структуры исходной строки.
Типичные ошибки и проверка результата
Самая распространённая ошибка — попытка написать в запросе конструкцию вида «ВЫРАЗИТЬ(Ссылка КАК Строка)». Оператор ВЫРАЗИТЬ не преобразует ссылку в строку: он служит для уточнения типа и ограничения длины строковых полей, но не выполняет преобразования между несовместимыми типами. Запрос с таким выражением либо не пройдёт проверку, либо вернёт пустые значения.
Вторая ошибка — ожидание, что ПРЕДСТАВЛЕНИЕ вернёт GUID. Функция возвращает именно пользовательское представление, и для интеграционных задач она не подходит. Третья типичная проблема — использование представления в соединениях таблиц: соединять таблицы нужно всегда по ссылкам, а не по строкам.
После реализации проверьте результат на контрольных данных. Для ПРЕДСТАВЛЕНИЕ сравните строку в результате запроса с тем, что показывает платформа в форме списка объекта — значения должны совпадать. Для GUID выполните обратное получение ссылки через ПолучитьСсылку и убедитесь, что найден именно исходный объект.
Как проверить результат
Совпадает с отображением объекта в форме списка
Пустая строка или текст другого объекта
ПолучитьСсылку возвращает исходный объект, СсылкаСуществует = Истина
Возвращается битая ссылка или другой объект
Запрос с ПРЕДСТАВЛЕНИЕ выполняется сопоставимо с запросом без него
Время выполнения выросло кратно из-за массовых неявных соединений
Частые вопросы
Можно ли получить GUID ссылки прямо в тексте запроса?
Нет, язык запросов 1С не содержит функции извлечения уникального идентификатора. GUID получают после выполнения запроса в обходе выборки через Ссылка.УникальныйИдентификатор() с последующим преобразованием функцией Строка().
Чем ПРЕДСТАВЛЕНИЕ отличается от функции Строка() в коде?
По результату для ссылок они обычно совпадают — обе возвращают пользовательское представление объекта. Разница в месте выполнения: ПРЕДСТАВЛЕНИЕ вычисляется на стороне СУБД внутри запроса, а Строка() — в коде после получения данных.
Почему запрос с ПРЕДСТАВЛЕНИЕ по нескольким ссылочным полям стал медленным?
Для вычисления представления платформа обращается к связанным таблицам. Каждое ссылочное поле с ПРЕДСТАВЛЕНИЕ добавляет неявное соединение. Сократите число таких полей или вычисляйте представления в коде только для нужных строк.
Как найти документ, если из файла загрузки пришла строка «Реализация 000123 от 01.02»?
Не сравнивайте строку с представлением целиком. Разберите её на номер и дату, затем ищите документ условием по полям Номер и Дата с учётом префиксов нумерации. Это быстрее и исключает ложные совпадения.
Можно ли использовать представление ссылки как ключ в соединении таблиц запроса?
Технически запрос выполнится, но это ошибка проектирования: соединение по строкам не использует индексы и даёт дубли при совпадающих представлениях. Соединять таблицы следует по полям ссылочного типа.
Что вернёт ПРЕДСТАВЛЕНИЕ для пустой ссылки?
Для пустой ссылки функция вернёт пустую строку или строку вида «<Объект не найден>» для битых ссылок. Если в результате нужно явное значение, обработайте этот случай через ВЫБОР ... КОГДА Ссылка ЕСТЬ NULL или проверку на пустую ссылку.
Что важно запомнить
В запросе ссылку преобразуют в строку функцией ПРЕДСТАВЛЕНИЕ — она даёт пользовательское представление для отчётов. GUID получают только в коде через УникальныйИдентификатор(). Для поиска и соединений используйте ссылки и конкретные поля, а не строки представлений.