Добрый день!
Запросом получаю первых 5 популярных контрагента по закупкам, все остальные объединены как контрагент "Прочее". Запрос выводит все правильно, но в отчет выводятся какие-то левые контрагенты. Конфигурация БП 3.0.73.54
ВЫБРАТЬ ПЕРВЫЕ 5
ВЫРАЗИТЬ(ХозрасчетныйОбороты.Субконто1 КАК Справочник.Контрагенты) КАК Контрагент,
ХозрасчетныйОбороты.Организация КАК Организация,
СУММА(ХозрасчетныйОбороты.СуммаОборотКт) КАК Сумма
ПОМЕСТИТЬ СписокПоставщиков
ИЗ
РегистрБухгалтерии.Хозрасчетный.Обороты(&НачалоПериода, &КонецПериода, Авто, Счет В ИЕРАРХИИ (ЗНАЧЕНИЕ(ПланСчетов.Хозрасчетный.РасчетыСПоставщикамиИПодрядчиками)), , , КорСчет В ИЕРАРХИИ (ЗНАЧЕНИЕ(ПланСчетов.Хозрасчетный.Товары)), ) КАК ХозрасчетныйОбороты
СГРУППИРОВАТЬ ПО
ВЫРАЗИТЬ(ХозрасчетныйОбороты.Субконто1 КАК Справочник.Контрагенты),
ХозрасчетныйОбороты.Организация
УПОРЯДОЧИТЬ ПО
Сумма УБЫВ
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
ВЫБОР
КОГДА СписокПоставщиков.Контрагент ЕСТЬ NULL
ТОГДА "Прочее"
ИНАЧЕ СписокПоставщиков.Контрагент
КОНЕЦ КАК Контрагент,
ХозрасчетныйОбороты.Организация КАК Организация,
СУММА(ХозрасчетныйОбороты.СуммаОборотКт) КАК Сумма,
ХозрасчетныйОбороты.ПериодДень КАК Период
ИЗ
РегистрБухгалтерии.Хозрасчетный.Обороты(&НачалоПериода, &КонецПериода, Авто, Счет В ИЕРАРХИИ (ЗНАЧЕНИЕ(ПланСчетов.Хозрасчетный.РасчетыСПоставщикамиИПодрядчиками)), , , КорСчет В ИЕРАРХИИ (ЗНАЧЕНИЕ(ПланСчетов.Хозрасчетный.Товары)), ) КАК ХозрасчетныйОбороты
ЛЕВОЕ СОЕДИНЕНИЕ СписокПоставщиков КАК СписокПоставщиков
ПО ((ВЫРАЗИТЬ(ХозрасчетныйОбороты.Субконто1 КАК Справочник.Контрагенты)) = СписокПоставщиков.Контрагент)
СГРУППИРОВАТЬ ПО
ХозрасчетныйОбороты.Организация,
ХозрасчетныйОбороты.ПериодДень,
ВЫБОР
КОГДА СписокПоставщиков.Контрагент ЕСТЬ NULL
ТОГДА "Прочее"
ИНАЧЕ СписокПоставщиков.Контрагент
КОНЕЦ
(13) Да, Вы правы, консоль сначала из выборки получает первые 5, а потом уже упорядочивает эти 5 по суммам. Решилось все сменой пакетов запросов на вложенный запрос
ВЫБРАТЬ
ХозрасчетныйОбороты.Организация КАК Организация,
СУММА(ХозрасчетныйОбороты.СуммаОборотКт) КАК Сумма,
ВЫБОР
КОГДА ВложенныйЗапрос.Контрагент ЕСТЬ NULL
ТОГДА "Прочее"
ИНАЧЕ ВложенныйЗапрос.Контрагент
КОНЕЦ КАК Поставщик,
ХозрасчетныйОбороты.ПериодДень КАК ПериодДень
ИЗ
РегистрБухгалтерии.Хозрасчетный.Обороты(&НачалоПериода, &КонецПериода, Авто, Счет В ИЕРАРХИИ (ЗНАЧЕНИЕ(ПланСчетов.Хозрасчетный.РасчетыСПоставщикамиИПодрядчиками)), , , КорСчет В ИЕРАРХИИ (ЗНАЧЕНИЕ(ПланСчетов.Хозрасчетный.Товары)), ) КАК ХозрасчетныйОбороты
ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ ПЕРВЫЕ 5
ВЫРАЗИТЬ(ХозрасчетныйОбороты.Субконто1 КАК Справочник.Контрагенты) КАК Контрагент,
ХозрасчетныйОбороты.Организация КАК Организация,
СУММА(ХозрасчетныйОбороты.СуммаОборотКт) КАК Сумма
ИЗ
РегистрБухгалтерии.Хозрасчетный.Обороты(&НачалоПериода, &КонецПериода, Авто, Счет В ИЕРАРХИИ (ЗНАЧЕНИЕ(ПланСчетов.Хозрасчетный.РасчетыСПоставщикамиИПодрядчиками)), , , КорСчет В ИЕРАРХИИ (ЗНАЧЕНИЕ(ПланСчетов.Хозрасчетный.Товары)), ) КАК ХозрасчетныйОбороты
СГРУППИРОВАТЬ ПО
ВЫРАЗИТЬ(ХозрасчетныйОбороты.Субконто1 КАК Справочник.Контрагенты),
ХозрасчетныйОбороты.Организация
УПОРЯДОЧИТЬ ПО
Сумма УБЫВ) КАК ВложенныйЗапрос
ПО (ВложенныйЗапрос.Контрагент = ХозрасчетныйОбороты.Субконто1)
И (ВложенныйЗапрос.Организация = ХозрасчетныйОбороты.Организация)
СГРУППИРОВАТЬ ПО
ХозрасчетныйОбороты.Организация,
ВЫБОР
КОГДА ВложенныйЗапрос.Контрагент ЕСТЬ NULL
ТОГДА "Прочее"
ИНАЧЕ ВложенныйЗапрос.Контрагент
КОНЕЦ,
ХозрасчетныйОбороты.ПериодДень
ВЫБРАТЬ ПЕРВЫЕ 5
ВЫРАЗИТЬ(ХозрасчетныйОбороты.Субконто1 КАК Справочник.Контрагенты) КАК Контрагент,
ХозрасчетныйОбороты.Организация КАК Организация,
СУММА(ХозрасчетныйОбороты.СуммаОборотКт) КАК Сумма
ПОМЕСТИТЬ СписокПоставщиков
ИЗ
РегистрБухгалтерии.Хозрасчетный.Обороты(&НачалоПериода, &КонецПериода, Авто, Счет В ИЕРАРХИИ (ЗНАЧЕНИЕ(ПланСчетов.Хозрасчетный.РасчетыСПоставщикамиИПодрядчиками)), , , КорСчет В ИЕРАРХИИ (ЗНАЧЕНИЕ(ПланСчетов.Хозрасчетный.Товары)), ) КАК ХозрасчетныйОбороты
СГРУППИРОВАТЬ ПО
ВЫРАЗИТЬ(ХозрасчетныйОбороты.Субконто1 КАК Справочник.Контрагенты),
ХозрасчетныйОбороты.Организация
УПОРЯДОЧИТЬ ПО
Сумма УБЫВ
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
ХозрасчетныйОбороты.Субконто1 КАК Субконто1,
ХозрасчетныйОбороты.Организация КАК Организация,
СУММА(ХозрасчетныйОбороты.СуммаОборотКт) КАК Сумма
ПОМЕСТИТЬ ВТ_Прочее
ИЗ
РегистрБухгалтерии.Хозрасчетный.Обороты(&НачалоПериода, &КонецПериода, Авто, Счет В ИЕРАРХИИ (ЗНАЧЕНИЕ(ПланСчетов.Хозрасчетный.РасчетыСПоставщикамиИПодрядчиками)), , , КорСчет В ИЕРАРХИИ (ЗНАЧЕНИЕ(ПланСчетов.Хозрасчетный.Товары)), ) КАК ХозрасчетныйОбороты
СГРУППИРОВАТЬ ПО
ХозрасчетныйОбороты.Организация,
ХозрасчетныйОбороты.Субконто1
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
ВЫБОР
КОГДА СписокПоставщиков.Контрагент ЕСТЬ NULL
ТОГДА "Прочее"
ИНАЧЕ СписокПоставщиков.Контрагент
КОНЕЦ КАК Контрагент,
ВТ_Прочее.Организация КАК Организация,
СУММА(ВТ_Прочее.Сумма) КАК Сумма
ИЗ
ВТ_Прочее КАК ВТ_Прочее
ЛЕВОЕ СОЕДИНЕНИЕ СписокПоставщиков КАК СписокПоставщиков
ПО (ВТ_Прочее.Субконто1 = СписокПоставщиков.Контрагент)
СГРУППИРОВАТЬ ПО
ВЫБОР
КОГДА СписокПоставщиков.Контрагент ЕСТЬ NULL
ТОГДА "Прочее"
ИНАЧЕ СписокПоставщиков.Контрагент
КОНЕЦ,
ВТ_Прочее.Организация
(2)объясните пожалуйста почему виртуальные таблица нельзя ставить слева.
Можно например поставить какой-то регистр сведений поставить слева , а виртуальную таблицу поставить справа и сделать правое соединение?
(19)То есть вы сейчас предлагаете вместо вывода всех данных из РБ за период, с выделением 5 контрагентов, вывести данные по 5 контагентам, а остальное не выводить.
Вы вот щас серьезно?
(22) Я сербезно считаю, что первой в Левом соединении Виртуальная таблица может стоять только в самых Исключительных случаях.
В рассматриваемом варианте , я не совсем дал рекомендацию поменять левое на правое, но думаю, если перенести виртуальную таблицу во временную , то результат будет другим.
В смысле слева сделать не виртуальную , а временную из виртуальной...
а параметры верные? в запросе конечный период какой указываете? 11.11.2019 23:59:59?
а в скд, просто стандартный период? или как приводите конец периода к концу дня?
исходный отчет сделан с нуля? или взят с какого-то?
Отчет был внесен во внешние отчеты ранее?
я к чему, если отчет сохранен во внешних отчетах, и его сохранить во внешнем отчете и вносить изменения он будет тянуть настройки СКД из ранее сохраненных, решение переименовать Отчет и "Сохранить КАК" другим файлом отчета.
(12)значит проблема в этом. ввидимо СКД и консоль получают разные "Первые 5"
можете в самой настройке СКД ограничить вывод по количеству записей https://yadi.sk/i/dyZGoNgJ5DEetg
(13) Да, Вы правы, консоль сначала из выборки получает первые 5, а потом уже упорядочивает эти 5 по суммам. Решилось все сменой пакетов запросов на вложенный запрос
ВЫБРАТЬ
ХозрасчетныйОбороты.Организация КАК Организация,
СУММА(ХозрасчетныйОбороты.СуммаОборотКт) КАК Сумма,
ВЫБОР
КОГДА ВложенныйЗапрос.Контрагент ЕСТЬ NULL
ТОГДА "Прочее"
ИНАЧЕ ВложенныйЗапрос.Контрагент
КОНЕЦ КАК Поставщик,
ХозрасчетныйОбороты.ПериодДень КАК ПериодДень
ИЗ
РегистрБухгалтерии.Хозрасчетный.Обороты(&НачалоПериода, &КонецПериода, Авто, Счет В ИЕРАРХИИ (ЗНАЧЕНИЕ(ПланСчетов.Хозрасчетный.РасчетыСПоставщикамиИПодрядчиками)), , , КорСчет В ИЕРАРХИИ (ЗНАЧЕНИЕ(ПланСчетов.Хозрасчетный.Товары)), ) КАК ХозрасчетныйОбороты
ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ ПЕРВЫЕ 5
ВЫРАЗИТЬ(ХозрасчетныйОбороты.Субконто1 КАК Справочник.Контрагенты) КАК Контрагент,
ХозрасчетныйОбороты.Организация КАК Организация,
СУММА(ХозрасчетныйОбороты.СуммаОборотКт) КАК Сумма
ИЗ
РегистрБухгалтерии.Хозрасчетный.Обороты(&НачалоПериода, &КонецПериода, Авто, Счет В ИЕРАРХИИ (ЗНАЧЕНИЕ(ПланСчетов.Хозрасчетный.РасчетыСПоставщикамиИПодрядчиками)), , , КорСчет В ИЕРАРХИИ (ЗНАЧЕНИЕ(ПланСчетов.Хозрасчетный.Товары)), ) КАК ХозрасчетныйОбороты
СГРУППИРОВАТЬ ПО
ВЫРАЗИТЬ(ХозрасчетныйОбороты.Субконто1 КАК Справочник.Контрагенты),
ХозрасчетныйОбороты.Организация
УПОРЯДОЧИТЬ ПО
Сумма УБЫВ) КАК ВложенныйЗапрос
ПО (ВложенныйЗапрос.Контрагент = ХозрасчетныйОбороты.Субконто1)
И (ВложенныйЗапрос.Организация = ХозрасчетныйОбороты.Организация)
СГРУППИРОВАТЬ ПО
ХозрасчетныйОбороты.Организация,
ВЫБОР
КОГДА ВложенныйЗапрос.Контрагент ЕСТЬ NULL
ТОГДА "Прочее"
ИНАЧЕ ВложенныйЗапрос.Контрагент
КОНЕЦ,
ХозрасчетныйОбороты.ПериодДень
(18) ну не знаю. пример Получаем цены номенклатуры (Ценыноменклатуры.СрезПоследних) и к нему левым соединяем справочник Валюты чтобы пересчитать цены валютные в рубли. пример из типовых конфигураций.
(20) Я попробую поискать рекомендации гуру про неоптимальность ставить на первое место Виртуальную таблицу....
Пока некогда, но в подсознании отложилось давно...
Виртуальные таблицы , позволяют получить практически готовые данные для большинства прикладных задач.(СрезПервых,СрезПоследних,Остатки,Обороты,ОстаткиИОбороты) Ключевое слово здесь виртуальные. Эти таблицы не являются физическими, а компонуются системой налету, т.е. при получении данных из виртуальных таблиц система собирает данные из итоговых таблиц регистров, компонует, группирует и выдает пользователю.
Т.е. при соединении с виртуальной таблицей происходит соединение с подзапросом. В этом случае оптимизатор СУБД может также выбрать неоптимальный план соединения. Если запрос формируется недостаточно быстро и в запросе испольуются соединения в виртуальными таблицами, то реклмендуется вынести обращение к виртуальным таблицам во временную таблицу, а затем в произвести соедининие между двумя временными таблицами. Перепишем предыдущий запрос.
И это не единственный источник....
Их много, я не на основании единственного сделал себе установку...
(28) Спасибо, ну тут не совсем то. неоптимальность да. Не нельзя, а то что может замедлить получение данных, и потребуется оптимизировать запрос.это скорее рекомендация по проблеме и метод оптимизации
(29) ну я не претендую в данной теме на окончательную истину.
Но когда не знаешь в чем проблема, ну почему они по разному отрабатывают, то можно попробовать и сделать через Временные таблицы...
(40) Просто у меня рабочий день давно закончился) это не значит, что я не перечитаю это все на следующий день) на момент Вашего сообщения у меня уже 9 часов вечера было)