Есть отчет План-факт по брендам. группировка по строка: контрагенты. группировка по колонкам брендам. Ресурсы: план на месяц, план на дату, факт на дату, процент на дату. В виду того что данных слишком много. На некоторых компах отчет доходит до определенного процента вывода и зависает. На мощных выполняется, но тоже долго. Вначале даже у меня писал "Недостаточно памяти на сервере". Но после отключения расшифровки стал формироваться. Сервер очень мощный. Как еще можно оптимизировать этот отчет?
По теме из базы знаний
- Сложные отчеты для управляемых форм с использованием СКД: просто. На примере отчета ABC анализ номенклатуры, клиентов для УТ11
- Подстановка и добавление в отчет на СКД произвольных значений, которые нельзя получить запросом
- Разные хм... неожиданности при работе с УТ 11 и платформой
- Мобильный помощник эксперта 1С (приложение android, позволяющее строить отчеты на СКД по логам технологического журнала и не только)
- Переход на Clickhouse для анализа метрик
Ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
Еще один ньюанс - если это внешний отчет, то наверняка все запросы выполняются на стороне клиента.
на стороне клиента не может ничего выполняться в части запросов в 8.2 априори. Так что хоть внешний хоть внутренний все равно
Конфигурация древняя УТ 10.2. Отчет внешний,но находится на файловом сервере.
[/1C-CODE]
ВЫБРАТЬ
ПланФакт.Клиент,
ПланФакт.Бренд,
СУММА(ЕСТЬNULL(ПланФакт.СуммаПлана, 0)) КАК СуммаПлана,
ПланФакт.ТорговыйПредставитель,
СУММА(ЕСТЬNULL(ПланФакт.СуммаФакта, 0)) КАК СуммаФакта,
Контрагенты.Категория,
Контрагенты.Организация,
Контрагенты.Контрагент
ИЗ
(ВЫБРАТЬ РАЗЛИЧНЫЕ
КатегорииОбъектов.Категория КАК Категория,
ДоговорыКонтрагентов.Организация КАК Организация,
Контрагенты.Ссылка КАК Контрагент
ИЗ
Справочник.Контрагенты КАК Контрагенты
ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.КатегорииОбъектов КАК КатегорииОбъектов
ПО Контрагенты.Ссылка = КатегорииОбъектов.Объект
ЛЕВОЕ СОЕДИНЕНИЕ Справочник.ДоговорыКонтрагентов КАК ДоговорыКонтрагентов
ПО Контрагенты.Ссылка = ДоговорыКонтрагентов.Владелец
СГРУППИРОВАТЬ ПО
КатегорииОбъектов.Категория,
ДоговорыКонтрагентов.Организация,
Контрагенты.Ссылка) КАК Контрагенты
ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
Планы.Клиент КАК Клиент,
Планы.Бренд КАК Бренд,
Планы.суммаПлан КАК СуммаПлана,
Планы.торговыйПредставитель КАК ТорговыйПредставитель,
NULL КАК СуммаФакта,
Планы.Организация КАК Организация
ИЗ
(ВЫБРАТЬ
Планы.Клиент КАК Клиент,
Планы.Бренд КАК Бренд,
Планы.сумма КАК суммаПлан,
Планы.Нужныйуровень КАК Нужныйуровень,
Планы.торговыйПредставитель КАК торговыйПредставитель,
Планы.Организация КАК Организация
ИЗ
(ВЫБРАТЬ
ПланыПродажКлиенты.Клиент КАК Клиент,
ПланыПродажКлиенты.Бренд КАК Бренд,
СУММА(ПланыПродажКлиенты.сумма) КАК сумма,
ВЫБОР
КОГДА ПланыПродажКлиенты.Бренд.Родитель.Родитель <> ЗНАЧЕНИЕ(Справочник.Бренд.ПустаяСсылка)
ТОГДА ИСТИНА
КОНЕЦ КАК Нужныйуровень,
ПланыПродажКлиенты.торговыйПредставитель КАК торговыйПредставитель,
ПланыПродажКлиенты.Организация КАК Организация
ИЗ
РегистрСведений.ПланыПродажКлиенты КАК ПланыПродажКлиенты
ГДЕ
ПланыПродажКлиенты.ПериодПлана.ПериодПлана МЕЖДУ &НачалоПериода И &КонецПериода
СГРУППИРОВАТЬ ПО
ПланыПродажКлиенты.Клиент,
ПланыПродажКлиенты.Бренд,
ПланыПродажКлиенты.торговыйПредставитель,
ВЫБОР
КОГДА ПланыПродажКлиенты.Бренд.Родитель.Родитель <> ЗНАЧЕНИЕ(Справочник.Бренд.ПустаяСсылка)
ТОГДА ИСТИНА
КОНЕЦ,
ПланыПродажКлиенты.Организация) КАК Планы
ГДЕ
Планы.Нужныйуровень = ИСТИНА) КАК Планы
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
Факты.ДоговорКонтрагентаВладелец,
Факты.Бренд,
NULL,
Факты.ДокументПродажиТорговыйПредставитель,
Факты.СтоимостьОборот,
Факты.ДоговорКонтрагентаОрганизация
ИЗ
(ВЫБРАТЬ
Продажи.ДоговорКонтрагентаВладелец КАК ДоговорКонтрагентаВладелец,
СУММА(Продажи.СтоимостьОборот) КАК СтоимостьОборот,
ВЫБОР
КОГДА Продажи.УрБренд = 4
ТОГДА Продажи.НоменклатураБренд.Родитель
КОГДА Продажи.УрБренд = 5
ТОГДА Продажи.НоменклатураБренд.Родитель.Родитель
ИНАЧЕ Продажи.НоменклатураБренд
КОНЕЦ КАК Бренд,
Продажи.ДокументПродажиТорговыйПредставитель КАК ДокументПродажиТорговыйПредставитель,
Продажи.ДоговорКонтрагентаОрганизация КАК ДоговорКонтрагентаОрганизация
ИЗ
(ВЫБРАТЬ
ПродажиОбороты.Номенклатура.Бренд КАК НоменклатураБренд,
ПродажиОбороты.ДоговорКонтрагента.Владелец КАК ДоговорКонтрагентаВладелец,
СУММА(ПродажиОбороты.СтоимостьОборот) КАК СтоимостьОборот,
ВЫБОР
КОГДА ПродажиОбороты.Номенклатура.Бренд.Родитель.Родитель.Родитель.Родитель = ЗНАЧЕНИЕ(Справочник.Бренд.ПустаяСсылка)
ТОГДА 4
КОГДА ПродажиОбороты.Номенклатура.Бренд.Родитель.Родитель.Родитель.Родитель.Родитель = ЗНАЧЕНИЕ(Справочник.Бренд.ПустаяСсылка)
ТОГДА 5
КОНЕЦ КАК УрБренд,
ПродажиОбороты.ДокументПродажи.ТорговыйПредставитель КАК ДокументПродажиТорговыйПредставитель,
ПродажиОбороты.ДоговорКонтрагента.Организация КАК ДоговорКонтрагентаОрганизация
ИЗ
РегистрНакопления.Продажи.Обороты(, , , ) КАК ПродажиОбороты
СГРУППИРОВАТЬ ПО
ПродажиОбороты.Номенклатура.Бренд,
ПродажиОбороты.ДоговорКонтрагента.Владелец,
ВЫБОР
КОГДА ПродажиОбороты.Номенклатура.Бренд.Родитель.Родитель.Родитель.Родитель = ЗНАЧЕНИЕ(Справочник.Бренд.ПустаяСсылка)
ТОГДА 4
КОГДА ПродажиОбороты.Номенклатура.Бренд.Родитель.Родитель.Родитель.Родитель.Родитель = ЗНАЧЕНИЕ(Справочник.Бренд.ПустаяСсылка)
ТОГДА 5
КОНЕЦ,
ПродажиОбороты.ДокументПродажи.ТорговыйПредставитель,
ПродажиОбороты.ДоговорКонтрагента.Организация) КАК Продажи
СГРУППИРОВАТЬ ПО
Продажи.ДоговорКонтрагентаВладелец,
ВЫБОР
КОГДА Продажи.УрБренд = 4
ТОГДА Продажи.НоменклатураБренд.Родитель
КОГДА Продажи.УрБренд = 5
ТОГДА Продажи.НоменклатураБренд.Родитель.Родитель
ИНАЧЕ Продажи.НоменклатураБренд
КОНЕЦ,
Продажи.ДокументПродажиТорговыйПредставитель,
Продажи.ДоговорКонтрагентаОрганизация) КАК Факты) КАК ПланФакт
ПО Контрагенты.Контрагент = ПланФакт.Клиент
И Контрагенты.Организация = ПланФакт.Организация
СГРУППИРОВАТЬ ПО
Контрагенты.Категория,
ПланФакт.Клиент,
ПланФакт.Бренд,
ПланФакт.ТорговыйПредставитель,
Контрагенты.Организация,
Контрагенты.Контрагент[1C-CODE]
Показать
(5) Bajo, о, самый первый шаг для оптимизации - заменить вложенные запросы на временные таблицы с индексированием.
Второй шаг - переписать поиск родителей брендов. Наверняка можно не искать Бренд.Родитель.Родитель.Родитель.Родитель и т.п., а использовать отдельную временную таблицу, в которой можно получить перечень брендов В Иерархии.
Второй шаг - переписать поиск родителей брендов. Наверняка можно не искать Бренд.Родитель.Родитель.Родитель.Родитель и т.п., а использовать отдельную временную таблицу, в которой можно получить перечень брендов В Иерархии.
+ 5 копеек: трансформируй выводимые пользователю ссылки на представление через Представление() или [Ссылка].Наименование. Иначе программа сама будет делать неявный вызов для получения основного представления.
Основное написали:
- вложенные запросы менять на врем таблицы (с индексированием),
- использовать параметры вирт таблиц,
- не использовать в запросе функции от параметров (типа КОНЕЦПЕРИОДА(&Дата2,МЕСЯЦ)
- ограничить получение поля "Ссылка" чреез точку
- использать ВЫРАЗИТЬ при работе с данных составного типа
Основное написали:
- вложенные запросы менять на врем таблицы (с индексированием),
- использовать параметры вирт таблиц,
- не использовать в запросе функции от параметров (типа КОНЕЦПЕРИОДА(&Дата2,МЕСЯЦ)
- ограничить получение поля "Ссылка" чреез точку
- использать ВЫРАЗИТЬ при работе с данных составного типа
(9) Столкнулся с проблемой при оптимизации отчета СКД, помогли данные советы. Но есть еще один самый эффективный способ, это убрать расшифровку и ресурсов, именно это спасло ситуацию у меня. Совет нашел также на сайте [URL=https://infostart.ru/1c/articles/73879/] спасибо vanleo и Danil Potapov
присоединяюсь. Есть еще идеи -
переделать - понятно что считается уровень вложенности, но желательно уйти от этого кода
А что, обороты по факту интересуют за все время? Раз нет -то и указать в параметрах виртуальной таблицы период начала и окончания.
И есть еще технологический журнал - посмотреть план запроса.
ВЫБОР
КОГДА ПродажиОбороты.Номенклатура.Бренд.Родитель.Родитель.Родитель.Родитель = ЗНАЧЕНИЕ(Справочник.Бренд.ПустаяСсылка)
ТОГДА 4
КОГДА ПродажиОбороты.Номенклатура.Бренд.Родитель.Родитель.Родитель.Родитель.Родитель = ЗНАЧЕНИЕ(Справочник.Бренд.ПустаяСсылка)
ТОГДА 5
КОНЕЦ КАК УрБренд,
переделать - понятно что считается уровень вложенности, но желательно уйти от этого кода
А что, обороты по факту интересуют за все время? Раз нет -то и указать в параметрах виртуальной таблицы период начала и окончания.
И есть еще технологический журнал - посмотреть план запроса.
(11)
Вложенные запросы - это тема, которую я ненавижу, ещё/уже со времён 8.0.
Результаты этой вложенности - даже проверить - невозможно в принципе.
А "упрощение" (якобы короче текст!) текста запроса - далеко не всегда Факт!
Временные таблицы - это именно то, что нужно для запроса.
В языке SQL - они во всех (знакомых мне!) СУБД и используются.
Индексирование временных таблиц - да.
Но - там тоже не всё (и всегда!) однозначно.
Кроме одного бесспорного - индексирование (правильное и при больших объёмах данных!) реально ускоряет получение нужных данных.
Вложенные запросы - это тема, которую я ненавижу, ещё/уже со времён 8.0.
Результаты этой вложенности - даже проверить - невозможно в принципе.
А "упрощение" (якобы короче текст!) текста запроса - далеко не всегда Факт!
Временные таблицы - это именно то, что нужно для запроса.
В языке SQL - они во всех (знакомых мне!) СУБД и используются.
Индексирование временных таблиц - да.
Но - там тоже не всё (и всегда!) однозначно.
Кроме одного бесспорного - индексирование (правильное и при больших объёмах данных!) реально ускоряет получение нужных данных.
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот