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

05.09.23

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

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

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

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

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

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

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

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

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

Пример:

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


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

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

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

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

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

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

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

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

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

Вывод

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

См. также

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

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

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

10000 руб.

02.09.2020    127297    688    389    

740

Пропорциональное распределение в запросе с использованием АвтоНомерЗаписи()

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

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

11.04.2024    2424    andrey_sag    10    

29

Для чего используют конструкцию запроса "ГДЕ ЛОЖЬ" в СКД на примере конфигурации 1С:ERP

Запросы СКД Платформа 1С v8.3 Запросы Система компоновки данных 1С:ERP Управление предприятием 2 Бесплатно (free)

В типовых конфигурациях разработчики компании 1С иногда используют в отчетах, построенных на СКД, такую конструкцию, как "ГДЕ ЛОЖЬ". Такая конструкция говорит о том, что данные в запросе не будут получены совсем. Для чего же нужен тогда запрос?

13.02.2024    6110    KawaNoNeko    23    

26

Набор-объект для СКД по тексту или запросу

Запросы СКД Платформа 1С v8.3 Управляемые формы Конфигурации 1cv8 Абонемент ($m)

Есть список полей в виде текста, или запрос - закидываем в набор СКД.

1 стартмани

31.01.2024    2192    2    Yashazz    0    

31

Запрос 1С copilot

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

Пишем на человеческом языке, что нам надо, и получаем текст запроса на языке 1С. Используются большие языковые модели (LLM GPT) от OpenAI или Яндекс на выбор.

5 стартмани

15.01.2024    6793    32    mkalimulin    31    

53

PrintWizard: поддержка представлений ЗУП в конструкторе

Инструментарий разработчика Запросы Платформа 1С v8.3 Бесплатно (free)

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

14.12.2023    1942    vandalsvq    7    

29

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

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

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

06.12.2023    5690    user1923546    26    

46

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

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

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

11.10.2023    16740    skovpin_sa    14    

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

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

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

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

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


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

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

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


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

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

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