При работе с конструктором запросов в системе 1С:Предприятие начинающие разработчики часто сталкиваются с полем Представление, которое отображается в списке доступных полей практически для любого ссылочного типа данных (справочники, документы, планы видов характеристик). При этом в списке реквизитов объекта в конфигураторе такого поля нет, а попытка записать в него данные программно при создании нового элемента заканчивается неудачей. Разберем подробно природу этого поля, механизмы его формирования и способы управления им.
Прежде всего, проанализируем, почему поле Представление называют виртуальным. В физических таблицах базы данных (SQL) колонки с названием "Представление" не существует. Платформа 1С генерирует это поле "на лету" в момент выполнения запроса. Это сервисный механизм, созданный для того, чтобы разработчику не приходилось каждый раз вручную соединять таблицы или писать сложные условия ВЫБОР, чтобы получить понятное человеку текстовое описание объекта.
Рассмотрим стандартную ситуацию: нам нужно вывести список контрагентов в отчет. Если мы выберем только поле Ссылка, в результате запроса мы получим уникальный идентификатор (GUID). Чтобы пользователь увидел название компании, нам нужно поле Наименование. Поле Представление в данном случае автоматически подставит значение наименования, избавляя нас от привязки к конкретному имени реквизита.
Разберем по шагам, каким именно образом 1С решает, что именно написать в поле Представление. Алгоритм работы платформы следующий:
Бывают задачи, когда в качестве представления нужно выводить не просто наименование, а, например, комбинацию из артикула и названия товара, или добавлять статус контрагента ("Заблокирован"). Для этого проанализируем возможности модуля менеджера объекта.
В модуле менеджера существует событие ОбработкаПолученияПредставления. Рассмотрим пример кода, который меняет представление справочника Контрагенты, добавляя к нему ИНН:
Процедура ОбработкаПолученияПредставления(Данные, Представление, СтандартнаяОбработка)
// Отключаем стандартное формирование (по наименованию или коду)
СтандартнаяОбработка = Ложь;
// Формируем свое представление на основе данных объекта
Если ЗначениеЗаполнено(Данные.ИНН) Тогда
Представление = Данные.Наименование + " (ИНН: " + Данные.ИНН + ")";
Иначе
Представление = Данные.Наименование;
КонецЕсли;
КонецПроцедуры
Важный нюанс: чтобы этот код работал эффективно в запросах, платформа должна иметь доступ к полям, используемым в формировании. В параметре Данные будут доступны те поля, которые платформа успела прочитать. Если вы используете сложные вычисления, это может сказаться на производительности.
В языке запросов часто возникает путаница между обращением к полю через точку (Субконто.Представление) и использованием встроенной функции (ПРЕДСТАВЛЕНИЕ(Субконто)). Рассмотрим основные отличия:
Объект.Представление всегда имеет тип Строка. Функция ПРЕДСТАВЛЕНИЕ() также возвращает строку, но она применима не только к ссылкам, но и к примитивным типам (числам, датам, булево).ПРЕДСТАВЛЕНИЕ() может вернуть пустую строку, в то время как обращение к полю через точку в некоторых условиях может вызвать получение NULL при левых соединениях.Представление. Если в метаданных указано "В виде наименования", то запрос ВЫБРАТЬ Представление фактически превратится в ВЫБРАТЬ Наименование.Несмотря на удобство, поле Представление имеет ряд серьезных ограничений, которые необходимо учитывать при проектировании запросов. Проанализируем ситуации, в которых использовать это поле нельзя:
СГРУППИРОВАТЬ ПО Субконто.Представление. Платформа выдаст ошибку. Группировка возможна только по реальным полям или по самой ссылке.ГДЕ. Например, условие ГДЕ Контрагент.Представление ПОДОБНО "%Сервис%" будет нелегитимным. Для фильтрации нужно обращаться напрямую к Наименованию.ПО при соединении таблиц.Важный совет: Если вы разрабатываете отчет на СКД (Система компоновки данных), старайтесь не выбирать поле Представление в самом тексте запроса. СКД гораздо эффективнее обрабатывает получение представлений самостоятельно, основываясь на выбранных ссылочных полях. Это позволяет системе кэшировать данные и избегать лишних соединений в SQL-запросе.
Выясним, что происходит "под капотом" системы, когда мы запрашиваем Представление. Если для объекта не определена ОбработкаПолученияПредставления, то 1С просто подставляет в SQL-запрос выборку колонки наименования (_Description) или кода (_Code). Это происходит быстро.
Однако, если используется программное формирование представления в модуле менеджера, механизм усложняется. Платформе приходится анализировать, какие реквизиты участвуют в формировании строки, и добавлять их в выборку. В динамических списках с большим количеством данных это может привести к заметным задержкам при прокрутке, так как для каждой строки выполняется дополнительная логика вычисления текстового значения.
В случае с документами, где представление состоит из трех полей (заголовок, номер, дата), SQL-запрос дополняется операциями конкатенации строк. Поэтому, если вам нужно отсортировать тысячи документов только по дате, лучше использовать поле Дата, а не Представление, чтобы не заставлять сервер выполнять лишнюю работу по сборке строк.
Мы выяснили, что поле Представление — это мощный и удобный инструмент платформы 1С для отображения данных в понятном пользователю виде. Его нельзя заполнить вручную, так как оно вычисляется динамически. Основные способы управления им лежат в плоскости настроек метаданных и использования обработчика ОбработкаПолученияПредставления в модуле менеджера. Помните об ограничениях при группировке и фильтрации, и используйте это поле преимущественно для окончательного вывода информации в списки или отчеты.