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

05.09.23

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

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

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

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

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

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

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

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

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

Пример:

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


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

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

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

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

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

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

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

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

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

Вывод

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

См. также

SALE! %

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

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

12000 10000 руб.

02.09.2020    163175    902    401    

880

Запросы Программист Бесплатно (free)

Увидел cheatsheet по SQL и захотелось нарисовать подобное, но про запросы.

18.10.2024    10573    sergey279    18    

65

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

Столкнулся с интересной ситуацией, которую хотел бы разобрать, ввиду её неочевидности. Речь пойдёт про использование функции запроса АВТОНОМЕРЗАПИСИ() и проблемы, которые могут возникнуть.

11.10.2024    5712    XilDen    36    

81

Запросы Программист Запросы Бесплатно (free)

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

16.08.2024    8381    user1840182    5    

28

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

Рассмотрим быстрый алгоритм поиска дублей с использованием hash функции по набору полей шапки и табличных частей.

08.07.2024    2543    ivanov660    9    

22

Запросы СКД Программист Стажер Система компоновки данных Россия Бесплатно (free)

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

15.05.2024    9399    implecs_team    6    

47

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

Часто поступают задачи по произвольному распределению общих сумм. После распределения иногда пропадают копейки. Суть решения добавить АвтоНомерЗаписи() в ВТ распределения, и далее используя функции МАКСИМУМ или МИНИМУМ можем положить разницу копеек в первую или последнюю строку знаменателя распределения.

11.04.2024    3496    andrey_sag    10    

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

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

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

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

(0) странно что получение константы в ПовтИсп модули не обернули. Было бы чуток получше. Хотя вряд ли бы сильно спасло
11. coollerinc 196 06.09.23 11:25 Сейчас в теме
(9) Получение констант 1с не рекомендует добавлять в модули повторного использования, т.к. с их слов разницы в скорости вы не получите. Скорость получения данных из таблицы констант сопоставима с получением данных из памяти. Прочитал это на ИТС и пока ситуации не возникло, что бы это проверить.
triviumfan; +1 Ответить
12. vandalsvq 1592 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. Константин С. 675 08.09.23 11:57 Сейчас в теме
Не используйте слепо "ПРЕДСТАВЛЕНИЕ"


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

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

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


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

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

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