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

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

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

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

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

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

Ниже разобраны все практические способы получить ссылку справочника в запросе: приведение типов через ВЫРАЗИТЬ, поиск по наименованию и коду, работа с составными типами, а также типичные ошибки и способы проверки результата.

Что на самом деле делает ПРЕДСТАВЛЕНИЕ в запросе

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

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

ВЫБРАТЬ

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

ПРЕДСТАВЛЕНИЕССЫЛКИ(Док.Контрагент) КАК КонтрагентСтрокой

ИЗ

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

Запомните главное: обе функции принимают ссылку и отдают строку. Обратной функции в языке запросов не существует — это осознанное ограничение, потому что строка не несёт информации о типе и уникальном идентификаторе объекта.

Получение ссылки по наименованию или коду

Самый частый практический сценарий: из файла или другой таблицы пришло наименование, нужно найти соответствующий элемент справочника. Решается это соединением с таблицей справочника по строковому полю.

ВЫБРАТЬ

Внешние.Наименование КАК Наименование,

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

ИЗ

ВнешняяТаблица КАК Внешние

ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Контрагенты КАК Контрагенты

ПО Внешние.Наименование = Контрагенты.Наименование

Левое соединение выбрано намеренно: если элемент не найден, поле ссылки будет NULL, и вы сможете отдельно обработать не найденные значения, а не потерять строки молча. Для поиска по коду условие аналогичное — Внешние.Код = Контрагенты.Код, но учтите, что код в справочнике может быть строковым с лидирующими нулями, и сравнение с числом даст пустой результат.

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

Приведение составного поля к типу справочника через ВЫРАЗИТЬ

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

ВЫБРАТЬ

ВЫРАЗИТЬ(Док.Контрагент КАК Справочник.Контрагенты) КАК Контрагент

ИЗ

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

ГДЕ

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

Оператор ВЫРАЗИТЬ не преобразует данные — он «сужает» тип. Если фактическое значение другого типа, результатом будет NULL, а не ошибка. Поэтому хорошая практика — сочетать ВЫРАЗИТЬ с проверкой ССЫЛКА в условии, чтобы явно отсечь неподходящие типы.

После приведения становятся доступны реквизиты справочника через точку: ВЫРАЗИТЬ(Док.Контрагент КАК Справочник.Контрагенты).ИНН. Это избавляет от лишних соединений и ускоряет запрос, хотя соединение с явным условием по типу часто читается легче.

Способы получить ссылку

Соединение по наименованию/коду

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

ВЫРАЗИТЬ(... КАК Справочник.Имя)

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

Поиск в модуле через НайтиПоНаименованию

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

Параметры-ссылки и пустые ссылки

Если ссылка известна заранее, её передают в запрос параметром — это единственный способ «внедрить» конкретную ссылку извне. В тексте запроса ссылку создать нельзя, можно только сравнить поле с параметром: ГДЕ Док.Контрагент = &Контрагент.

Для проверки на незаполненность используют значение ЗНАЧЕНИЕ(Справочник.Контрагенты.ПустаяСсылка). Это литерал пустой ссылки конкретного типа, и сравнение с ним надёжнее, чем проверка на пустую строку представления.

ВЫБРАТЬ

Док.Ссылка КАК Документ

ИЗ

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

ГДЕ

Док.Контрагент = ЗНАЧЕНИЕ(Справочник.Контрагенты.ПустаяСсылка)

Частая ошибка — сравнивать ссылочное поле со строкой: ГДЕ Док.Контрагент = "ООО Ромашка". Такое условие не выдаст ошибку на этапе выполнения во всех случаях, но никогда не найдёт записей, потому что ссылка и строка — разные типы. Правильный вариант — соединение со справочником по наименованию с последующим отбором по ссылке.

Как найти ссылку по строке из внешних данных
  1. 1
    Поместите внешние данные во временную таблицу запроса (ВТ) через параметр-таблицу значений.
  2. 2
    Напишите ЛЕВОЕ СОЕДИНЕНИЕ с таблицей справочника по наименованию или коду.
  3. 3
    Добавьте условие отсечения помеченных на удаление: НЕ Справочник.ПометкаУдаления.
  4. 4
    Проверьте строки, где ссылка равна NULL, — это ненайденные элементы, их нужно создать или обработать отдельно.
  5. 5
    При необходимости сгруппируйте результат, убрав дубли наименований через РАЗЛИЧНЫЕ или группировку.

Представление ссылки в отчётах СКД

В системе компоновки данных вопрос «представление как справочник» встречается в обратной постановке: нужно, чтобы поле выводилось как ссылка с корректным представлением, а не как «обезличенная» строка. Для этого в наборе данных используют ПРЕДСТАВЛЕНИЕССЫЛКИ, а само ссылочное поле оставляют в выборке, чтобы работали расшифровка и отборы.

Если в отчёте вместо наименования выводится что-то вроде «Объект не найден» или GUID, причина обычно в битой ссылке — записи регистра указывают на удалённый физически объект. Проверить это можно условием ГДЕ Поле.Ссылка ЕСТЬ NULL при непустом значении самого поля: разыменование битой ссылки даёт NULL.

Для составных полей в СКД задавайте оформление представления через вычисляемое поле или используйте ВЫРАЗИТЬ к конкретному типу там, где логика отчёта это допускает. Это ускоряет формирование, потому что платформа не строит представления для всех возможных типов поля.

Типичные ошибки и как их избежать

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

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

Третья ошибка — сравнение кода справочника с числом, когда код строковый. Значение «0000000123» не равно числу 123, и условие молча не сработает. Приводите обе стороны сравнения к одному типу или используйте ПОДСТРОКА и дополнение нулями осознанно.

Типичные ошибки
01
Использование ПРЕДСТАВЛЕНИЕ для получения ссылки — функция возвращает строку, соединение по ней со ссылкой не работает.
02
Соединение по наименованию без фильтра пометки удаления — в результат попадают удалённые элементы.
03
Сравнение ссылочного поля со строкой в условии ГДЕ — условие никогда не выполняется.
04
ВЫРАЗИТЬ без проверки ССЫЛКА — неподходящие типы превращаются в NULL и теряются в итогах.
05
Игнорирование дублей наименований — строки результата размножаются и искажают суммы.

Проверка результата и границы самостоятельной работы

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

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

Если запрос используется для загрузки данных и автоматического создания элементов справочника, работайте только на копии базы или в тестовом контуре. Массовое создание элементов по неточному соответствию наименований порождает дубли, которые потом приходится вычищать вручную с риском потери связанных данных.

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

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

Тип поля в результате
Норма

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

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

Поле строковое — значит, использовано ПРЕДСТАВЛЕНИЕ вместо ссылки

Количество строк
Норма

Совпадает с количеством строк исходной таблицы

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

Строк больше — есть дубли наименований в справочнике

Значения NULL в ссылке
Норма

NULL только там, где элемент заведомо отсутствует

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

Массовые NULL — ошибка в условии соединения или типе сравнения

Открытие ссылки
Норма

Элемент открывается и содержит ожидаемые данные

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

Ошибка открытия или чужой элемент — неверное соответствие строк

Часто задаваемые вопросы

Можно ли в запросе 1С создать ссылку из произвольной строки?

Нет. Язык запросов не имеет функции преобразования строки в ссылку, потому что строка не содержит типа и уникального идентификатора объекта. Единственные способы — найти существующий элемент соединением по реквизитам или передать готовую ссылку параметром.

Чем ПРЕДСТАВЛЕНИЕ отличается от ПРЕДСТАВЛЕНИЕССЫЛКИ?

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

Почему ВЫРАЗИТЬ возвращает NULL для части записей?

ВЫРАЗИТЬ не преобразует значения, а только сужает тип. Если фактическое значение поля относится к другому типу, чем указанный в приведении, результатом будет NULL. Добавьте условие ССЫЛКА для явного отбора нужного типа.

Как найти элемент справочника по наименованию, если возможны дубли?

Соединяйте по наименованию, но дополнительно уточняйте выбор: группируйте с агрегатом МАКСИМУМ по ссылке, добавляйте отбор по родителю, владельцу или другому уникальному признаку. Лучший вариант — устранить дубли в самом справочнике до загрузки данных.

Почему сравнение кода справочника с числом не находит записи?

Если код справочника имеет строковый тип, значения хранятся с лидирующими нулями, например «0000000123», и не равны числу 123. Приведите параметр к строке с нужным форматированием или сравнивайте с числовым кодом только при числовом типе кода.

Что делать, если в отчёте вместо наименования выводится «Объект не найден»?

Это признак битой ссылки: запись ссылается на физически удалённый объект. Найдите такие записи условием, где разыменование поля даёт NULL при непустом значении самого поля, и восстановите или очистите данные штатными средствами тестирования и исправления.

Итог

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

Строку в ссылку запрос преобразовать не может: ищите элемент соединением по наименованию или коду, сужайте составные поля через ВЫРАЗИТЬ с проверкой ССЫЛКА, а ПРЕДСТАВЛЕНИЕ и ПРЕДСТАВЛЕНИЕССЫЛКИ используйте только для вывода строк. Контролируйте дубли, пометки удаления и NULL в результате.