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