Форум 1С
Программистам, бухгалтерам, администраторам, пользователям
Задай вопрос - получи решение проблемы
21 ноя 2024, 22:54

Временная таблица во вложенном запросе+Группировка VS Таблица значений + Свернуть

Автор Tsaiger, 14 июл 2017, 15:51

0 Пользователей и 1 гость просматривают эту тему.

Tsaiger

Добрый день коллеги! В общем такой вопрос назрел. Есть внешняя ТЗ передаваемая в запрос. Вопрос вот в чем: что будет более оптимальным при большем объеме передаваемой ТЗ:
1. Во вложенный запрос передаем ТЗ выбираем данные, потом выбираем данные из вложенного запроса+группируем(тем кто не в танке выборка из внешнего источника возможно только в Врем.таблицу, и группировка не доступна при выборке из внешнего источника данных)+закидываем результат во временную таблицу и там уже работаем с ней.
          ИЛИ
2. Передаем в запрос ТЗ уже предварительно свернутую таблицу.
АХ да что бы было понятней: дело вот в чем: Подпиской на событие я "допровожу" документ, т.е та самая ТЗ это выгрузка движений Источника!!!!! И даэто движения по регистру "партии товаров", мне нужен итог по номенклатуре без партий т.е свернутый. Именно в двух этих вариантах что будет более производительней
сворачивание объектной моделью или же табличной(в запросе).
Приложу код именно моего решения:

Процедура ДопроведениеОбработкаПроведения(Источник, Отказ, РежимПроведения) Экспорт

Если Отказ Тогда
Возврат;
КонецЕсли;


Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
               | Движения.Номенклатура КАК Номенклатура,
               | Движения.Себестоимость КАК Себестоимость,
               | Движения.Количество КАК Количество
               |ПОМЕСТИТЬ ВТ_Движения
               |ИЗ
               | &Движения КАК Движения
               |;
               |
               |////////////////////////////////////////////////////////////////////////////////
               |ВЫБРАТЬ
               | &Контрагент КАК Контрагент,
               | &Период КАК Период,
               | ВТ_Движения.Номенклатура КАК Номенклатура,
               | ВТ_Движения.Себестоимость КАК Себестоимость,
               | ВТ_Движения.Количество КАК Количество,
               | ЕСТЬNULL(РасходнаяТовары.Сумма, 0) - ЕСТЬNULL(ВТ_Движения.Себестоимость, 0) КАК Выручка
               |ИЗ
               | ВТ_Движения КАК ВТ_Движения
               | ЛЕВОЕ СОЕДИНЕНИЕ Документ.Расходная.Товары КАК РасходнаяТовары
               | ПО ВТ_Движения.Номенклатура = РасходнаяТовары.Номенклатура
               |ГДЕ
               | РасходнаяТовары.Ссылка = &Ссылка";
   
ДвиженияСтоимостьТоваров = Источник.Движения.СтоимостьТоваров.Выгрузить();
ДвиженияСтоимостьТоваров.Свернуть("Номенклатура","Себестоимость,Количество");

Запрос.УстановитьПараметр("Движения",ДвиженияСтоимостьТоваров);
Запрос.УстановитьПараметр("Контрагент",Источник.Контрагент);    
Запрос.УстановитьПараметр("Период",Источник.Дата);
Запрос.УстановитьПараметр("Ссылка",Источник.Ссылка);
РезультатЗапроса = Запрос.Выполнить().Выгрузить();

ДвиженияПродажи = Источник.Движения.Продажи;

ДвиженияПродажи.Записывать = Истина;
ДвиженияПродажи.Загрузить(РезультатЗапроса);


// Вставить содержимое обработчика.
КонецПроцедуры


lansy

Чот както не так.
нужно не ВТ вставлять, а соединять регистр с движениями, глядишь там и найдется контрагент, а именно из соединения регистратора
это будет правильнее

Добавлено: 14 июл 2017, 18:08


А по вашему запросу проще на ТЗ все сделать. зачем еще запросы нагружать...

Добавлено: 14 июл 2017, 18:11


Весь запрос, идеологически - кошмар

LexaK

да в общем без разницы, все равно это все выполняется на сервере, и какая-то разность в милисекунды не будет заметна.
смотрите по коду что быстрее и понятнее/читабельнее написать.

в самом алгоритме есть небольшая ошибка,

в вашем запросе(как он есть) лучше использовать Правое соединение (или поменять таблицы местами), иначе продажа товара по которому почему-то нет себестоимости не попадет в выручку.
если помогло нажмите: Спасибо!

Tsaiger

Цитата: lansy от 14 июл 2017, 18:07
Чот както не так.
нужно не ВТ вставлять, а соединять регистр с движениями, глядишь там и найдется контрагент, а именно из соединения регистратора
это будет правильнее

Добавлено: 14 июл 2017, 18:08


А по вашему запросу проще на ТЗ все сделать. зачем еще запросы нагружать...

Добавлено: 14 июл 2017, 18:11


Весь запрос, идеологически - кошмар

Зачем нагружать запросы, что бы получить сумму продажи. Как сделать на 1 ТЗ проще, я не ищу проще я ищу оптимальней. Я не все указал, движения по регистру "СтоимостьТоваров" не записаны принудительно в базу, ждет заверешения транзакции СтоимостьТоваров.Записывать = Истина, сейчас я не могу получить движения. Так же запрос пишется для того, что бы загрузить движения в регистр. Но спасибо за ответ. 
Добавлено: 14 июл 2017, 21:18


Цитата: LexaK от 14 июл 2017, 18:12
да в общем без разницы, все равно это все выполняется на сервере, и какая-то разность в милисекунды не будет заметна.
смотрите по коду что быстрее и понятнее/читабельнее написать.

в самом алгоритме есть небольшая ошибка,

в вашем запросе(как он есть) лучше использовать Правое соединение (или поменять таблицы местами), иначе продажа товара по которому почему-то нет себестоимости не попадет в выручку.
На счет правого соединения я немного не понял, движения в любом разе записываются в регистр "СтоимостьТоваров", в не зависимости. Т.е движения копируют полностью ТЧ документа. Это не реальная задача, а так пример просто, интересно знать что методически правильней, конечно движения в документе можно сформировать и в самом модуле объекта, интересен именно этот пример.
Добавлено: 14 июл 2017, 21:22


Цитата: lansy от 14 июл 2017, 18:07
Чот както не так.
нужно не ВТ вставлять, а соединять регистр с движениями, глядишь там и найдется контрагент, а именно из соединения регистратора
это будет правильнее

Добавлено: 14 июл 2017, 18:08


А по вашему запросу проще на ТЗ все сделать. зачем еще запросы нагружать...

Добавлено: 14 июл 2017, 18:11


Весь запрос, идеологически - кошмар
И да, зачем получать запросом те поля которые нам и так известны через Источник, такие как "Контрагент".
    Это к слову об оптимальности, поправьте если я не прав.

LexaK



    |ВЫБРАТЬ
    |    РасходнаяТовары.Ссылка.Контрагент КАК Контрагент,
    |    РасходнаяТовары.Ссылка.Дата КАК Период,
    |    ВТ_Движения.Номенклатура КАК Номенклатура,
    |    ...

    //это не надо
    //Запрос.УстановитьПараметр("Контрагент",Источник.Контрагент);               
    //Запрос.УстановитьПараметр("Период",Источник.Дата);

    Запрос.УстановитьПараметр("Ссылка",Источник.Ссылка);



наверно это имелось ввиду, два лишних параметра передавать не надо.

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

если помогло нажмите: Спасибо!

AIFrame

Цитироватьконечно ситуация придуманная, но на практике сплошь и рядом случается.
Очень легко моделируется. Делаем возврат товара от покупателя, а потом пытаемся его продать.

Tsaiger

Цитата: LexaK от 14 июл 2017, 21:55


    |ВЫБРАТЬ
    |    РасходнаяТовары.Ссылка.Контрагент КАК Контрагент,
    |    РасходнаяТовары.Ссылка.Дата КАК Период,
    |    ВТ_Движения.Номенклатура КАК Номенклатура,
    |    ...

    //это не надо
    //Запрос.УстановитьПараметр("Контрагент",Источник.Контрагент);               
    //Запрос.УстановитьПараметр("Период",Источник.Дата);

    Запрос.УстановитьПараметр("Ссылка",Источник.Ссылка);



наверно это имелось ввиду, два лишних параметра передавать не надо.

по поводу правого соединения, попробуйте продать товар, по которому нет себестоимости.
конечно ситуация придуманная, но на практике сплошь и рядом случается.
Делал замер с почти 2000 записями в документе, разница почти в два раза. Но все равно время на выполнение даже не секунда и к тому же делать замеры на файловой базе)))) Думаю тут кому как удобно. В типовых сплошь и рядом через точку ходят. Я готовлюсь к сдаче спеца, по этому занимаюсь вот таким бредом, вдруг снизят оценку за не оптимальное использование функционала запросов:befhbt:.

Теги:

Похожие темы (5)

Рейтинг@Mail.ru

Поиск