1С в своей заметке Вывод ссылочных полей пишет:
При выводе ссылочных полей в отчет (а также в тех местах, где необходимо отображать представление, например, при выводе значения при помощи функции "Сообщить") следует учитывать тот факт, что при выводе значения-ссылки программа будет выполнять дополнительный запрос для получения представления поля, вследствие чего процесс вывода будет выполняться медленнее. Для того чтобы избежать подобного эффекта, следует в запросе сразу получать поле - представление для ссылочного поля и уже его и выводить в отчет
И многие получают представления через функцию языка запроса "ПРЕДСТАВЛЕНИЕ()". Но часто использование "представления" наоборот существенно замедляет формирование отчетов и вывод печатных форм.
Причина в процедуре ОбработкаПолученияПредставления модуля менеджера объекта. Данная процедура вызывается всегда когда мы приводим ссылку к строке, при каждом выводе в табличный документ, при выводе динамических списков (только для отображаемых строк).
"Представление" в запросе не возвращает сразу строку как результат и про это указано в заметке Особенности работы с полем Представление и функцией Представление() языка запросов:
В запросе возможно получать данное поле точно также как и другие поля таблиц, однако никакие операции с данным полем выполнять нельзя. Данная особенность связана с тем, что это поле является виртуальным, и, на самом деле, при получении данного поля из базы данных, запрос получает несколько полей, а при получении значения поля из результата запроса преобразовывает полученные значения в строку
Т.е. преобразование в строку идет при получении результата. А когда идет преобразование в строку - идет вызов процедуры ОбработкаПолученияПредставления.
Пример:
Запрос = Новый Запрос;
Запрос.Текст = "
|ВЫБРАТЬ
| Номенклатура.Ссылка КАК Номенклатура,
| ПРЕДСТАВЛЕНИЕ(Номенклатура.Ссылка) КАК НоменклатураПредставление
|
|ИЗ
| Справочник.Номенклатура КАК Номенклатура";
РезультатЗапроса = Запрос.Выполнить();
Выборка = РезультатЗапроса.Выбрать();
Пока Выборка.Следующий() Цикл
Сообщить(Выборка.НоменклатураПредставление); <-- Здесь вызовется процедура ОбработкаПолученияПредставления !!!
КонецЦикла;
В последних типовых конфигурациях процедура ОбработкаПолученияПредставления прописана для многих объектов и бывает, что в ней вызываются какие то длительные операции. Например для документа ПриобретениеТоваровУслуг в ERP/УТ11/КА2 идет получение константы.
Попался мне отчет, в котором был запрос такого вида:
ВЫБРАТЬ
Таб.Склад КАК Склад,
ПРЕДСТАВЛЕНИЕ(Таб.Склад) КАК СкладПредставление,
Таб.Номенклатура КАК Номенклатура,
ПРЕДСТАВЛЕНИЕ(Таб.Номенклатура) КАК НоменклатураПредставление,
Таб.Документ КАК Документ,
ПРЕДСТАВЛЕНИЕ(Таб.Документ) КАК ДокументПредставление,
Таб.Количество КАК Количество
ИЗ
Таб КАК Таб
Все как рекомендует 1с. Отчет выполняется 24 секунды.
Профайлер показывает большие затраты времени на ОбластьСтрока.Параметры.Заполнить(ВыборкаЗапроса), т.е. на получение из результата запроса "представлений".
Переписав запрос так:
ВЫБРАТЬ
Таб.Склад КАК Склад,
Таб.Склад.Наименование КАК СкладПредставление,
Таб.Номенклатура КАК Номенклатура,
Таб.Номенклатура.Наименование КАК НоменклатураПредставление,
Таб.Документ КАК Документ,
ТИПЗНАЧЕНИЯ(Таб.Документ) КАК ДокументПредставление,
РеестрДокументов.НомерДокументаИБ КАК НомерДокумента,
РеестрДокументов.ДатаДокументаИБ КАК ДатаДокумента,
Таб.Количество КАК Количество
ИЗ
Таб КАК Таб
ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.РеестрДокументов КАК РеестрДокументов
ПО (Таб.Документ = РеестрДокументов.Ссылка)
Удалось уменьшить время вывода отчета в 2 раза, с 24 до 12 секунд !
Вывод.
Не используйте слепо "ПРЕДСТАВЛЕНИЕ", возможно это существенно замедлит вывод вашего отчета (печатной формы). Вместо этого получайте наименования элементов справочника и собирайте представление документа из типа+номер+дата.