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

05.09.23

Разработка - Запросы

Часто в запросе получают представления ссылочных данных через функцию языка запроса "ПРЕДСТАВЛЕНИЕ()". Но во многих случаях использование "представления" существенно замедляет формирование отчетов и вывод печатных форм.

1С в своей заметке Вывод ссылочных полей пишет:

При выводе ссылочных полей в отчет (а также в тех местах, где необходимо отображать представление, например, при выводе значения при помощи функции "Сообщить") следует учитывать тот факт, что при выводе значения-ссылки программа будет выполнять дополнительный запрос для получения представления поля, вследствие чего процесс вывода будет выполняться медленнее. Для того чтобы избежать подобного эффекта, следует в запросе сразу получать поле - представление для ссылочного поля и уже его и выводить в отчет

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

Причина в процедуре ОбработкаПолученияПредставления модуля менеджера объекта. Данная процедура вызывается всегда когда мы приводим ссылку к строке, при каждом выводе в табличный документ, при выводе динамических списков (только для отображаемых строк).

"Представление" в запросе не возвращает сразу строку как результат и про это указано в заметке Особенности работы с полем Представление и функцией Представление() языка запросов:

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

Т.е. преобразование в строку идет при получении результата. А когда идет преобразование в строку - идет вызов процедуры ОбработкаПолученияПредставления.

Пример:

Запрос = Новый Запрос;
Запрос.Текст = "
|ВЫБРАТЬ
|	Номенклатура.Ссылка КАК Номенклатура,
|	ПРЕДСТАВЛЕНИЕ(Номенклатура.Ссылка) КАК НоменклатураПредставление
|	
|ИЗ
|	Справочник.Номенклатура КАК Номенклатура";


РезультатЗапроса = Запрос.Выполнить();
Выборка = РезультатЗапроса.Выбрать();
Пока Выборка.Следующий() Цикл
	Сообщить(Выборка.НоменклатураПредставление); <-- Здесь вызовется процедура ОбработкаПолученияПредставления !!!
КонецЦикла;

В последних типовых конфигурациях процедура ОбработкаПолученияПредставления прописана для многих объектов и бывает, что в ней вызываются какие то длительные операции. Например для документа ПриобретениеТоваровУслуг в ERP/УТ11/КА2 идет получение константы. 

Попался мне отчет, в котором был запрос такого вида:

ВЫБРАТЬ
	Таб.Склад КАК Склад,
	ПРЕДСТАВЛЕНИЕ(Таб.Склад) КАК СкладПредставление,
	Таб.Номенклатура КАК Номенклатура,
	ПРЕДСТАВЛЕНИЕ(Таб.Номенклатура) КАК НоменклатураПредставление,
	Таб.Документ КАК Документ,
	ПРЕДСТАВЛЕНИЕ(Таб.Документ) КАК ДокументПредставление,
	Таб.Количество КАК Количество
ИЗ
	Таб КАК Таб

Все как рекомендует 1с. Отчет выполняется 24 секунды.

Профайлер показывает большие затраты времени на ОбластьСтрока.Параметры.Заполнить(ВыборкаЗапроса), т.е. на получение из результата запроса "представлений".

Переписав запрос так:

ВЫБРАТЬ
	Таб.Склад КАК Склад,
	Таб.Склад.Наименование КАК СкладПредставление,
	Таб.Номенклатура КАК Номенклатура,
	Таб.Номенклатура.Наименование КАК НоменклатураПредставление,
	Таб.Документ КАК Документ,
	ТИПЗНАЧЕНИЯ(Таб.Документ) КАК ДокументПредставление,
        РеестрДокументов.НомерДокументаИБ КАК НомерДокумента,
	РеестрДокументов.ДатаДокументаИБ КАК ДатаДокумента,
	Таб.Количество КАК Количество
ИЗ
	Таб КАК Таб
        ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.РеестрДокументов КАК РеестрДокументов
		ПО (Таб.Документ = РеестрДокументов.Ссылка)

Удалось уменьшить время вывода отчета в 2 раза, с 24  до 12 секунд !

Вывод

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

См. также

Infostart Toolkit: Инструменты разработчика 1С 8.3 на управляемых формах

Инструментарий разработчика Роли и права Запросы СКД Платформа 1С v8.3 Управляемые формы Запросы Система компоновки данных Конфигурации 1cv8 Платные (руб)

Набор инструментов программиста и специалиста 1С для всех конфигураций на управляемых формах. В состав входят инструменты: Консоль запросов, Консоль СКД, Консоль кода, Редактор объекта, Анализ прав доступа, Метаданные, Поиск ссылок, Сравнение объектов, Все функции, Подписки на события и др. Редактор запросов и кода с раскраской и контекстной подсказкой. Доработанный конструктор запросов тонкого клиента. Продукт хорошо оптимизирован и обладает самым широким функционалом среди всех инструментов, представленных на рынке.

12000 руб.

02.09.2020    102309    568    385    

615

Объектная модель запроса "Схема запроса" 2

Запросы Платформа 1С v8.3 Запросы Конфигурации 1cv8 Бесплатно (free)

Далеко уже не новый тип данных "Схема запроса". Статья о том, как использовать его "попроще". Примеры создания текста запроса с нуля и изменение имеющегося запроса.

06.12.2023    2617    user1923546    21    

24

Начните уже использовать хранилище запросов

HighLoad оптимизация Запросы

Очень немногие из тех, кто занимается поддержкой MS SQL, работают с хранилищем запросов. А ведь хранилище запросов – это очень удобный, мощный и, главное, бесплатный инструмент, позволяющий быстро найти и локализовать проблему производительности и потребления ресурсов запросами. В статье расскажем о том, как использовать хранилище запросов в MS SQL и какие плюсы и минусы у него есть.

11.10.2023    13730    skovpin_sa    14    

83

Нахождение уникальных наборов строк таблицы запросом

Запросы Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Решение задачи нахождения уникальных наборов строк таблицы запросом

23.07.2023    5127    tormozit    79    

39

Структура запроса

Инструментарий разработчика Запросы Платформа 1С v8.3 Запросы Конфигурации 1cv8 Абонемент ($m)

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

1 стартмани

21.06.2023    4744    53    obmailok    35    

53

MS SQL Server: изучаем планы запросов

Запросы HighLoad оптимизация Запросы Бесплатно (free)

Многие знают, что для ускорения работы запроса нужно «изучить план». При этом сам план обычно обескураживает: куча разноцветных иконок и стрелочек; ничего не понятно, но очень интересно! Аналитик производительности Александр Денисов на конференции Infostart Event 2021 Moscow Premiere рассказал, как выполняется план запроса и что нужно сделать, чтобы с его помощью находить проблемы производительности.

20.06.2023    11079    Филин    37    

101

Как собрать отладчиком отдельные части запроса в один

Запросы Платформа 1С v8.3 Запросы Россия Бесплатно (free)

Подробное описание функционала загрузки данных запроса из отладчика в консоли "Анализатор сложных запросов".

21.03.2023    3916    manuel    2    

20
Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. RustIG 1762 05.09.23 10:52 Сейчас в теме
1) перед каждым повторном замере производительности нужно чистить кэш пользователя 1С
2) очень сомнительно, что движок запросов для получения Представления использует процедуру конфигурации. А если в нетиповой конфе использовать представление, то как это будет работать? Или теперь получение представлений это предопределенная процедура всех объектов ? и можно ее переопределять?
2. coollerinc 178 05.09.23 11:06 Сейчас в теме
(1) В модуле менеджера объектов есть две предопределенные процедуры ОбработкаПолучениеПолейПредставления и ОбработкаПолученияПредставления, с помощью них и можете менять стандартное представление объектов. По умолчанию если она не описана, то для справочников берется поле Основное представление(Наименование или код). Для документов выбирается Тип, дата, номер.
3. RustIG 1762 05.09.23 11:45 Сейчас в теме
(2) 1) начиная с какой платформы такое нововведение применяется?
2) точно ли, что эта процедура используется при исполнении запросов?
4. ixijixi 1696 05.09.23 12:00 Сейчас в теме
(3) Доступен, начиная с версии 8.3.1
© СП
6. itmind 307 06.09.23 03:26 Сейчас в теме
(3)

2) При исполнении запроса не используется. Используется при получении из результата запроса поля представления. Об этом написано в статье (и ссылка на ИТС)
16. svezr 5 09.09.23 17:34 Сейчас в теме
(1) При выполнении запроса обращение к процедуре "ОбработкаПолученияПредставления" не происходит. При получении результатов - срабатывает точка останова в ней. По этой же причине срабатывает и точка останова при выполнении запроса в консоли запросов. Когда-то натыкался на подобное поведение и проверял. Сейчас специально проверил на 8.3.22.2143
5. Spurk 37 06.09.23 02:38 Сейчас в теме
А какой результат будет по времени будет, если сначала выполнить оптимизированный запрос, а после него с представлением?
7. itmind 307 06.09.23 03:31 Сейчас в теме
(5)

Оптимизированный будет быстрее.
Допустим у нас вывод 1000 документов "Приобретение товаров и услуг" (в ЕРП).
Если мы используем в запросе ПРЕДСТАВЛЕНИЕ, то при получении поля представления из результата запроса будет 1000 раз выполнена процедура "ОбработкаПолученияПредставления", в которой 1000 раз будет считана константа ("внутреннее представление входящих документов"). Это долго.

Убедится, что всегда вызывается ОбработкаПолученияПредставления при получении представления из запроса вы можете установив точку останова в менеджере Номенклатуры (в типовых новых конфигурациях) и выполнив первый пример из статьи.
8. Spurk 37 06.09.23 04:30 Сейчас в теме
(7) Исходя из ваших слов, получается что не сам запрос дольше выполняется, а тормозит считывание константы, когда вы результат обходите
(Сообщить(Выборка.НоменклатураПредставление); <-- Здесь вызовется процедура ОбработкаПолученияПредставления !!!)
Типа неявный запрос в цикле. Так получается?
9. vandalsvq 1463 06.09.23 05:39 Сейчас в теме
(8) вряд ли существенно тормозит константа. Сам вызов модуля менеджера для формирования представления наверняка влияет куда сильнее. И хоть эти методы крайне удобны, их цена была понятна с момента появления.

(0) странно что получение константы в ПовтИсп модули не обернули. Было бы чуток получше. Хотя вряд ли бы сильно спасло
11. coollerinc 178 06.09.23 11:25 Сейчас в теме
(9) Получение констант 1с не рекомендует добавлять в модули повторного использования, т.к. с их слов разницы в скорости вы не получите. Скорость получения данных из таблицы констант сопоставима с получением данных из памяти. Прочитал это на ИТС и пока ситуации не возникло, что бы это проверить.
triviumfan; +1 Ответить
12. vandalsvq 1463 06.09.23 12:17 Сейчас в теме
(11) ну в общем то я и написал, что вряд ли проблема в константе. Скорее просто в том, что из выполняемого "быстрого кода" движка, вызывается "медленный код" 1С. Я данными методами пользуюсь только в документах, поскольку другого выхода там нет. А в справочниках просто изменяю наименование и стараюсь туда добавить необходимую инфу из реквизитов. А "ванильное" наименование храню в отдельном поле. На документах конечно мне тоже не нравится, но для них надо чуть больше делать. Например добавить отдельный реквизит, в отчетах реализовать представление через него. Методы в модуле менеджера не делать, и просить пользователей говорить где еще им надо вывести "альтернативное" наименование

Собственно проблема с "Представление" еще и в том, что пользователь не знает где программист вмешался, а где нет. И может ожидать что Ссылка.Наименование = Представление. Но по факту окажется не так. И где-нибудь в отчетах в итоге программист сам вынуждает пользователя использовать ссылочное поле.

То есть, хотелось как лучше, получилось так себе ))))))
it_depDi; coollerinc; +2 Ответить
17. svezr 5 09.09.23 17:36 Сейчас в теме
(12) помню, как-то приходилось исправлять тормозящий код при выводе в списки (если не попутал). От того, что кто-то сильно вмешался в процедуру аж волосы зашевелились :)
10. user1146461 06.09.23 07:21 Сейчас в теме
А как замечательно себя ведут динамические списки при выводе ссылок в модуле менеджера которых используется ОбработкаПолученияПредставления
coollerinc; RustIG; +2 Ответить
13. Константин С. 751 08.09.23 11:57 Сейчас в теме
Не используйте слепо "ПРЕДСТАВЛЕНИЕ"


не влияет ли № платформы на такую ситуацию?
14. NicholasUzunov 08.09.23 16:47 Сейчас в теме
Почему не ПРЕДСТАВЛЕНИЕССЫЛКИ? Проблему с переопределением представления не решит, но глаз цепляется.
triviumfan; +1 Ответить
15. NicholasUzunov 08.09.23 16:50 Сейчас в теме
А когда платформа сама для отображения представления вызывает метод из модуля менеджера это не так замедляет так как получение вызывается только для отображаемых данных?
18. triviumfan 87 11.09.23 16:18 Сейчас в теме
Неожиданное поведение. Спасибо за заметку.
Есть замечание:

Переписав запрос так:

ВЫБРАТЬ
	Таб.Склад КАК Склад,
	Таб.Склад.Наименование КАК СкладПредставление,
	Таб.Номенклатура КАК Номенклатура,
	Таб.Номенклатура.Наименование КАК НоменклатураПредставление,
	Таб.Документ КАК Документ,
	ТИПЗНАЧЕНИЯ(Таб.Документ) КАК ДокументПредставление,
        РеестрДокументов.НомерДокументаИБ КАК НомерДокумента,
	РеестрДокументов.ДатаДокументаИБ КАК ДатаДокумента,
	Таб.Количество КАК Количество
ИЗ
	Таб КАК Таб
        ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.РеестрДокументов КАК РеестрДокументов
		ПО (Таб.Документ = РеестрДокументов.Ссылка)
Показать


Удалось уменьшить время вывода отчета в 2 раза, с 24 до 12 секунд !

Тут неточность, ведь поле "Ссылка" в реестре документов не уникальна, т.к. имеются дополнительные записи.
Нужно добавлять "И Не ДополнительнаяЗапись", иначе будут дубли строк :)

PS: Проверил - у меня такое же поведение на 8.3.23.1672.
Оставьте свое сообщение