[РЕШЕНО] Отчет по остаткам нетиповой. Медленная работа

Тема в разделе "Система компоновки данных (СКД)", создана пользователем Svb, 26 ноя 2015.

  1. TopicStarter Overlay
    Svb
    Offline

    Svb Опытный в 1С Команда форума

    Регистрация:
    12 янв 2011
    Сообщения:
    980
    Симпатии:
    19
    Баллы:
    29
    Добрый день.
    УТ 11.0, Платформа 8.2
    Был типовой отчет "ведомость по товарам на складах".
    В связи с необходимостью учета артикулов товаров не по номенклатуре, а по характеристикам был добавлен регистр сведений "Артикулы номенклатуры".
    Соответственно надо дать пользователю в отчетах отбор по артикулу.
    В запрос СКД было добавлено левое соединение с регистром сведений.
    Снимок.JPG
    Потом накладываю отбор на поле "Артикул". Отчет работает медленно. В разы медленней, чем до соединения с регистром сведений.
    Как правильно доработать отчет, чтобы не сильно терять в производительности?
    --- Объединение сообщений, 26 ноя 2015 ---
    Даже не так. Работает медленнее, когда пользователь задает отбор по артикулу. Если задать отбор по номенклатуре, а по артикулу отключить, тогда все летает.
  2. nomad_irk
    Offline

    nomad_irk Гуру в 1С

    Регистрация:
    20 окт 2008
    Сообщения:
    7.581
    Симпатии:
    717
    Баллы:
    204
    Происходит перебор всех артикулов при формировании результата.
    Ускорение можно получить если:
    сделать артикул числовым значением/строковым фиксированной длины и сделать его измерением РС.
  3. TopicStarter Overlay
    Svb
    Offline

    Svb Опытный в 1С Команда форума

    Регистрация:
    12 янв 2011
    Сообщения:
    980
    Симпатии:
    19
    Баллы:
    29
    Артикул строковое, длинна 5 символов.
    Измерением сделать можно, но это много переделывать в конфе.
    Еще вариантов нет? :)
  4. nomad_irk
    Offline

    nomad_irk Гуру в 1С

    Регистрация:
    20 окт 2008
    Сообщения:
    7.581
    Симпатии:
    717
    Баллы:
    204
    Если не делать измерением, то включи индексацию артикула в РС.
  5. TopicStarter Overlay
    Svb
    Offline

    Svb Опытный в 1С Команда форума

    Регистрация:
    12 янв 2011
    Сообщения:
    980
    Симпатии:
    19
    Баллы:
    29
    Индексация включена.
  6. Draco
    Offline

    Draco Модераторы Команда форума Модератор

    Регистрация:
    28 окт 2009
    Сообщения:
    13.649
    Симпатии:
    948
    Баллы:
    204
    НУ смотри как у тебя работает по номенклатуре и как по артикулу.
    Когда номенклатура. он у тебя делает сразу отбор в Вирт таблице по остаткам и выбирает нужную номенклатуру и все, если поле вртикул не нуказано в выборке или отборе то в запрос даже запрос по артикулам СКД не добавляет
    т.е у тебя запрос получается типа
    ПартииТоваровнаСкладах.Остатки(&Дата,&Номенклатура)
    если есть артикул, но он не измерение регистра тогда СКД добавит его только в ГДЕ

    и у тебя получается что получаешь все остатки - все артикулы, соеденяешь и потом только отбор ГДЕ

    Если артикул будет измерением, то СКД скорее всего у тебя тогда в запросе по Артикулам поместит его как праметр отбора вирт таблицы и в ГДЕ
    и тогда у тебя таблица оп артикулам не вся прийдет для соедениения.

    Так жде для быстроты работы у тебя должны остаки получаться и помешаться в ВТ, артикулы и то же помещаться в ВТ и только тогда идти соединение.
    Ну или хотя бы артикулы выбрать и поместить вВТ апотом уже соеденять с ВТ.
    Т.к при левом соедениении когда вторая таблица она виртуальная или там вложеный запрос то скулю сложно опрелить количество записей справа и он неоптимально строит запросы. Если статистика плохо собиралась
    Svb нравится это.
  7. TopicStarter Overlay
    Svb
    Offline

    Svb Опытный в 1С Команда форума

    Регистрация:
    12 янв 2011
    Сообщения:
    980
    Симпатии:
    19
    Баллы:
    29
    Я не понял.
    В таком случае СКД сама сделает запрос к регистру сведений АртикулыНоменклатуры и поместит результат этого запроса в параметры виртуальной таблицы регистра Накопления?? СКД такая умная?


    Попробую. Спасибо.
  8. Draco
    Offline

    Draco Модераторы Команда форума Модератор

    Регистрация:
    28 окт 2009
    Сообщения:
    13.649
    Симпатии:
    948
    Баллы:
    204
    Нет смотрит ты пишешь запрос для СКД - на самом деле это всего лишь шаблон запроса

    После того как ты наложил отборы, указал какие поля выводить, какие нет то СКД сама запрос перестраивает еще

    Вот пример.

    ВЫБРАТЬ
    ТоварыНаСкладахОстатки.КоличествоОстаток,
    ТоварыНаСкладахОстатки.Номенклатура
    ИЗ
    РегистрНакопления.ТоварыНаСкладах.Остатки(, ) КАК ТоварыНаСкладахОстатки

    Если ты на вкладке Отбор указываешь Отбор по номенклатуре. если номенклатура Измерение то скорее всего СКД на исполнение отдаст запрос типа

    ВЫБРАТЬ
    ТоварыНаСкладахОстатки.КоличествоОстаток,
    ТоварыНаСкладахОстатки.Номенклатура
    ИЗ
    РегистрНакопления.ТоварыНаСкладах.Остатки(, Номенклатура=&Номенклатура) КАК ТоварыНаСкладахОстатки


    Если это не измерение то скорее всего будет

    ВЫБРАТЬ
    ТоварыНаСкладахОстатки.КоличествоОстаток,
    ТоварыНаСкладахОстатки.Номенклатура
    ИЗ
    РегистрНакопления.ТоварыНаСкладах.Остатки(, ) КАК ТоварыНаСкладахОстатки
    Где
    ТоварыНаСкладахОстатки.Номенклатура=&Номенклатура

    Аналогично с полями если у тебя звпрос где есть 2 таблицы соеденены левым соединениме и в выбрке на вывод не будет не одного поля из второй таблице, то итоговый запрос будет без соединения
  9. TopicStarter Overlay
    Svb
    Offline

    Svb Опытный в 1С Команда форума

    Регистрация:
    12 янв 2011
    Сообщения:
    980
    Симпатии:
    19
    Баллы:
    29
    Я понял тебя.
    В отчете поле "артикул" из регистра сведений есть всегда, не зависимо от того накладывает пользователь отбор на Артикул или нет.
    Я не понял, как СКД поместит отбор по Артикулу в параметры виртуальной таблицы ОстаткиТоваров, если этого поля в регистре ОстаткиТоваров нет? Вот тут
    --- Объединение сообщений, 26 ноя 2015 ---
    Я вечером попробую с виртуальной таблицей запрос сделать. Думаю будет лучше.
  10. Draco
    Offline

    Draco Модераторы Команда форума Модератор

    Регистрация:
    28 окт 2009
    Сообщения:
    13.649
    Симпатии:
    948
    Баллы:
    204
    В вирт таблицу не поместит, помести в таблицу где артикулу у тебя там РС, я не знаю просто запроса не видно, может ты там Срез полседних берешь и т.д
  11. TopicStarter Overlay
    Svb
    Offline

    Svb Опытный в 1С Команда форума

    Регистрация:
    12 янв 2011
    Сообщения:
    980
    Симпатии:
    19
    Баллы:
    29
    Сделал как посоветовал с виртуальной таблицей. Скорость выполнения отчета стала неотличима от поиска по номенклатуре.

    Код:
    ВЫБРАТЬ
        АртикулыНоменклатуры.Номенклатура,
        АртикулыНоменклатуры.Характеристика,
        АртикулыНоменклатуры.Артикул77
    ПОМЕСТИТЬ втАртикулы
    ИЗ
        РегистрСведений.АртикулыНоменклатуры КАК АртикулыНоменклатуры
    ;
    
    ////////////////////////////////////////////////////////////////////////////////
    ВЫБРАТЬ
        втАртикулы.Номенклатура КАК Номенклатура,
        втАртикулы.Характеристика КАК Характеристика,
        ТоварыНаСкладахОстаткиИОбороты.Серия КАК Серия,
        ТоварыНаСкладахОстаткиИОбороты.Склад КАК Склад,
        ТоварыНаСкладахОстаткиИОбороты.Помещение КАК Помещение,
        ТоварыНаСкладахОстаткиИОбороты.Качество КАК Качество,
        ТоварыНаСкладахОстаткиИОбороты.Упаковка КАК Упаковка,
        ВЫБОР
            КОГДА ТоварыНаСкладахОстаткиИОбороты.Регистратор = НЕОПРЕДЕЛЕНО
                ТОГДА NULL
            ИНАЧЕ ТоварыНаСкладахОстаткиИОбороты.Регистратор
        КОНЕЦ КАК Регистратор,
        ТоварыНаСкладахОстаткиИОбороты.ПериодСекунда КАК ПериодСекунда,
        ТоварыНаСкладахОстаткиИОбороты.ПериодДень КАК ПериодДень,
        ТоварыНаСкладахОстаткиИОбороты.ПериодНеделя КАК ПериодНеделя,
        ТоварыНаСкладахОстаткиИОбороты.ПериодДекада КАК ПериодДекада,
        ТоварыНаСкладахОстаткиИОбороты.ПериодМесяц КАК ПериодМесяц,
        ТоварыНаСкладахОстаткиИОбороты.ПериодКвартал КАК ПериодКвартал,
        ТоварыНаСкладахОстаткиИОбороты.ПериодГод КАК ПериодГод,
        ТоварыНаСкладахОстаткиИОбороты.ВНаличииКонечныйОстаток КАК КонечныйОстатокВУпаковках,
        ТоварыНаСкладахОстаткиИОбороты.ВНаличииОборот КАК ОборотВУпаковках,
        ТоварыНаСкладахОстаткиИОбороты.ВНаличииПриход КАК ПриходВУпаковках,
        ТоварыНаСкладахОстаткиИОбороты.ВНаличииРасход КАК РасходВУпаковках,
        ТоварыНаСкладахОстаткиИОбороты.ВНаличииНачальныйОстаток КАК НачальныйОстатокВУпаковках,
        втАртикулы.Артикул77 КАК Артикул77,
        ТоварыНаСкладахОстаткиИОбороты.Упаковка.Коэффициент * ТоварыНаСкладахОстаткиИОбороты.ВНаличииНачальныйОстаток КАК НачальныйОстаток,
        ТоварыНаСкладахОстаткиИОбороты.Упаковка.Коэффициент * ТоварыНаСкладахОстаткиИОбороты.ВНаличииОборот КАК Оборот,
        ТоварыНаСкладахОстаткиИОбороты.Упаковка.Коэффициент * ТоварыНаСкладахОстаткиИОбороты.ВНаличииПриход КАК Приход,
        ТоварыНаСкладахОстаткиИОбороты.Упаковка.Коэффициент * ТоварыНаСкладахОстаткиИОбороты.ВНаличииРасход КАК Расход,
        ТоварыНаСкладахОстаткиИОбороты.Упаковка.Коэффициент * ТоварыНаСкладахОстаткиИОбороты.ВНаличииКонечныйОстаток КАК КонечныйОстаток,
        ТоварыНаСкладахОстаткиИОбороты.ВРезервеНачальныйОстаток,
        ТоварыНаСкладахОстаткиИОбороты.ВРезервеКонечныйОстаток,
        ТоварыНаСкладахОстаткиИОбороты.ВРезервеОборот,
        ТоварыНаСкладахОстаткиИОбороты.ВРезервеПриход,
        ТоварыНаСкладахОстаткиИОбороты.ВРезервеРасход
    ИЗ
        РегистрНакопления.ТоварыНаСкладах.ОстаткиИОбороты(
                &НачалоПериода,
                &КонецПериода,
                Авто,
                ,
                (Номенклатура, Характеристика) В
                    (ВЫБРАТЬ
                        втАртикулы.Номенклатура,
                        втАртикулы.Характеристика
                    ИЗ
                        втАртикулы)) КАК ТоварыНаСкладахОстаткиИОбороты
            ПОЛНОЕ СОЕДИНЕНИЕ втАртикулы КАК втАртикулы
            ПО ТоварыНаСкладахОстаткиИОбороты.Номенклатура = втАртикулы.Номенклатура
                И ТоварыНаСкладахОстаткиИОбороты.Характеристика = втАртикулы.Характеристика
    
    ОБЪЕДИНИТЬ ВСЕ
    
    ВЫБРАТЬ
        втАртикулы.Номенклатура,
        втАртикулы.Характеристика,
        ЗНАЧЕНИЕ(Справочник.СерииНоменклатуры.ПустаяСсылка),
        ТоварыКПоступлениюОстаткиИОбороты.Склад,
        "В пути",
        ТоварыКПоступлениюОстаткиИОбороты.Качество,
        ТоварыКПоступлениюОстаткиИОбороты.Упаковка,
        ВЫБОР
            КОГДА ТоварыКПоступлениюОстаткиИОбороты.Регистратор = НЕОПРЕДЕЛЕНО
                ТОГДА NULL
            ИНАЧЕ ТоварыКПоступлениюОстаткиИОбороты.Регистратор
        КОНЕЦ,
        ТоварыКПоступлениюОстаткиИОбороты.ПериодСекунда,
        ТоварыКПоступлениюОстаткиИОбороты.ПериодДень,
        ТоварыКПоступлениюОстаткиИОбороты.ПериодНеделя,
        ТоварыКПоступлениюОстаткиИОбороты.ПериодДекада,
        ТоварыКПоступлениюОстаткиИОбороты.ПериодМесяц,
        ТоварыКПоступлениюОстаткиИОбороты.ПериодКвартал,
        ТоварыКПоступлениюОстаткиИОбороты.ПериодГод,
        ТоварыКПоступлениюОстаткиИОбороты.КПоступлениюКонечныйОстаток,
        ТоварыКПоступлениюОстаткиИОбороты.КПоступлениюОборот,
        ТоварыКПоступлениюОстаткиИОбороты.КПоступлениюПриход,
        ТоварыКПоступлениюОстаткиИОбороты.КПоступлениюРасход,
        ТоварыКПоступлениюОстаткиИОбороты.КПоступлениюНачальныйОстаток,
        втАртикулы.Артикул77,
        ТоварыКПоступлениюОстаткиИОбороты.КПоступлениюНачальныйОстаток * ТоварыКПоступлениюОстаткиИОбороты.Упаковка.Коэффициент,
        ТоварыКПоступлениюОстаткиИОбороты.КПоступлениюОборот * ТоварыКПоступлениюОстаткиИОбороты.Упаковка.Коэффициент,
        ТоварыКПоступлениюОстаткиИОбороты.КПоступлениюПриход * ТоварыКПоступлениюОстаткиИОбороты.Упаковка.Коэффициент,
        ТоварыКПоступлениюОстаткиИОбороты.КПоступлениюРасход * ТоварыКПоступлениюОстаткиИОбороты.Упаковка.Коэффициент,
        ТоварыКПоступлениюОстаткиИОбороты.КПоступлениюКонечныйОстаток * ТоварыКПоступлениюОстаткиИОбороты.Упаковка.Коэффициент,
        0,
        0,
        0,
        0,
        0
    ИЗ
        РегистрНакопления.ТоварыКПоступлению.ОстаткиИОбороты(
                &НачалоПериода,
                &КонецПериода,
                Авто,
                ,
                (Номенклатура, Характеристика) В
                    (ВЫБРАТЬ
                        втАртикулы.Номенклатура,
                        втАртикулы.Характеристика
                    ИЗ
                        втАртикулы)) КАК ТоварыКПоступлениюОстаткиИОбороты
            ПОЛНОЕ СОЕДИНЕНИЕ втАртикулы КАК втАртикулы
            ПО ТоварыКПоступлениюОстаткиИОбороты.Номенклатура = втАртикулы.Номенклатура
                И ТоварыКПоступлениюОстаткиИОбороты.Характеристика = втАртикулы.Характеристика
    ГДЕ
        &ПоказыватьТоварыВПути = ИСТИНА
  12. Draco
    Offline

    Draco Модераторы Команда форума Модератор

    Регистрация:
    28 окт 2009
    Сообщения:
    13.649
    Симпатии:
    948
    Баллы:
    204
    Ну еще бы - я сморю оно у тебя еще и как условие в запросе бло причем 2 раза . Конечно тем более Вирт табл.

    когда вот так
    (Номенклатура, Характеристика) В
    (ВЫБРАТЬ
    втАртикулы.Номенклатура,
    втАртикулы.Характеристика
    ИЗ
    втАртикулы))

    и тут у тебя запрос а не вирт таблица, тогда совсем плохо скуль делает когда план запроса строит.

    Ну и еще я бы тогда посмотрел на скуле как часто утебя сттистика собирается, обновляется
    Svb нравится это.
  13. TopicStarter Overlay
    Svb
    Offline

    Svb Опытный в 1С Команда форума

    Регистрация:
    12 янв 2011
    Сообщения:
    980
    Симпатии:
    19
    Баллы:
    29
    Статистика не собирается пока. Тестовая база.
    В выходные буду настраивать обслуживание базы
  14. Draco
    Offline

    Draco Модераторы Команда форума Модератор

    Регистрация:
    28 окт 2009
    Сообщения:
    13.649
    Симпатии:
    948
    Баллы:
    204
    Ну тогда принципе все ясно.
    Привыкай к 2м вещам
    1. Когда в качестве условия Запрос, то это должен быть запрос из ВТ
    2. Когда думаешь соединять виртуальные таблицы типа (Остатки, Обороты ) и или таблицы с каким то запросом вложеным и т.д то лучше всего эти табл сначало поместить в ВТ, азатем соединять
  15. TopicStarter Overlay
    Svb
    Offline

    Svb Опытный в 1С Команда форума

    Регистрация:
    12 янв 2011
    Сообщения:
    980
    Симпатии:
    19
    Баллы:
    29
    То есть оптимальней остатки из регистров ТоварыНаСкладах и ТоварыКПоступления поместить во временную таблицу, а потом ее соединить с втАртикулы?
  16. Draco
    Offline

    Draco Модераторы Команда форума Модератор

    Регистрация:
    28 окт 2009
    Сообщения:
    13.649
    Симпатии:
    948
    Баллы:
    204
    Да + еще красивее (нагляднее) будет выглядеть запрос.
    Svb нравится это.
  17. TopicStarter Overlay
    Svb
    Offline

    Svb Опытный в 1С Команда форума

    Регистрация:
    12 янв 2011
    Сообщения:
    980
    Симпатии:
    19
    Баллы:
    29

Поделиться этой страницей