В процессе разработки отчетов на системе 1С:Предприятие часто возникают задачи, связанные с объединением данных различных типов в одном поле запроса. Рассмотрим ситуацию, когда в табличной части документа реквизит Номенклатура может содержать как ссылку на элемент справочника, так и пустую ссылку, при этом в другом реквизите Содержание может быть вписан текстовый комментарий. Попробуем разобраться, почему попытки простого объединения этих данных через ВЫБОР приводят к ошибкам и как сделать это правильно.
При написании запросов в 1С важно помнить строгое правило: конструкция ВЫБОР ... КОГДА ... ТОГДА ... ИНАЧЕ ... КОНЕЦ обязана возвращать результат одного и того же типа во всех ветках выполнения. Если одна ветка возвращает тип СправочникСсылка.Номенклатура, а другая — Строка, платформа выдаст ошибку несовместимости типов. Попытка использовать функцию ВЫРАЗИТЬ для приведения ссылки к строке напрямую также является некорректной, так как ВЫРАЗИТЬ работает только с полями, которые уже являются строками (например, для ограничения длины), но не выполняет конвертацию типов «на лету» для объектов базы данных.
Самым элегантным и правильным способом получения текстового отображения данных любого типа является обращение к виртуальному полю Представление. Система 1С автоматически преобразует ссылку в её строковое отображение (обычно это Наименование или Код), а строковые поля оставит без изменений.
Давайте посмотрим, как это реализовать на практике. Вместо того чтобы пытаться сравнивать типы ссылок, мы сразу получаем строковые представления для всех необходимых полей:
ВЫБОР
КОГДА CRM_ИнтересТовары.Номенклатура = ЗНАЧЕНИЕ(Справочник.Номенклатура.ПустаяСсылка)
ТОГДА CRM_ИнтересТовары.Содержание
ИНАЧЕ CRM_ИнтересТовары.Номенклатура.Представление
КОНЕЦ КАК НоменклатураСтрокой
Этот метод позволяет гарантированно получить на выходе строковый тип, так как Представление всегда возвращает строку.
Если вам требуется не системное представление, а именно конкретный реквизит, например, наименование элемента справочника, мы можем обратиться к нему напрямую через точку. Если номенклатура заполнена, запрос получит значение поля Наименование, которое является строкой. Если же нам нужно, чтобы в случае пустой ссылки выводилось содержимое другого реквизита, мы можем использовать следующую логику:
ВЫБОР
КОГДА CRM_ИнтересТовары.Номенклатура = ЗНАЧЕНИЕ(Справочник.Номенклатура.ПустаяСсылка)
ТОГДА CRM_ИнтересТовары.Содержание
ИНАЧЕ CRM_ИнтересТовары.Номенклатура.Наименование
КОНЕЦ КАК НоменклатураИлиСодержание
Обратите внимание, что оба результата (Содержание и Наименование) имеют строковый тип, поэтому запрос отработает без ошибок.
Частой ошибкой новичков является использование конструкции ВЫРАЗИТЬ(Поле КАК Строка(150)) для ссылочного типа. Важно понимать, что ВЫРАЗИТЬ выполняет приведение типов только внутри уже существующих составных типов данных. Если поле в базе данных имеет строго определенный тип (например, СправочникСсылка), вы не сможете «превратить» его в строку силами этого оператора. Всегда используйте функцию ПРЕДСТАВЛЕНИЕ() или виртуальное поле .Представление, если ваша задача — получить текст для отображения в отчете.
.Представление.ЗНАЧЕНИЕ(Справочник.ИмяСправочника.ПустаяСсылка).ВЫБОР, убедитесь, что все возможные ветки возвращают результат одного и того же типа.Применение этих методов позволит вам создавать гибкие и надежные отчеты, которые корректно обрабатывают данные даже в сложных табличных частях документов, где заполнение может быть вариативным.