Имя: Пароль:
1C
1С v8
Найти ошибку в запросе
0 Byasha
 
21.09.11
22:40
УТ 10.3. Платформа 8.2
Задача простая. Нужно определить количество номенклатуры по документам корректировки и суммы корректировки заказов покупателей, и сумму оплаты заказов покупателей с детализацией до документа оплаты. Итоги нужны по основному менеджеру покупателя, контрагенту, договор и заказу покупателя. Ок. Корректировки возьмем из регистра "Заказы покупателей", Сумму оплаты из регистра "Расчеты с контрагентами".

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

Все считает правильно, за исключением суммы оплаты.
Если в отладчике после выполнения запроса данные выгрузить в таблицу, то получается что сумму оплаты считает по всем детальным записям.
На примере. Есть заказ покупателя, по нему было два документа корректировки и один документ оплаты.
Получаем такую таблицу результата запроса
Менеджер | Контрагент | Договор | Заказ | Регистратор | Документ оплаты | Сумма

Менеджер |            |         |       |             |                 | 120 000
Менеджер | Контрагент |         |       |             |                 | 120 000
Менеджер | Контрагент | Договор | Заказ |             |                 | 120 000  
Менеджер | Контрагент | Договор | Заказ |             | ПКО             | 120 000
Менеджер | Контрагент | Договор | Заказ | Корр-ка 1   | ПКО             | 30 000
Менеджер | Контрагент | Договор | Заказ |             | ПКО             | 30 000
Менеджер | Контрагент | Договор | Заказ | Корр-ка 2   | ПКО             | 30 000
Менеджер | Контрагент | Договор | Заказ | Заказ       | ПКО             | 30 000

При этом суммирует только сумму оплаты, сумму корректировок и количество суммирует так как нужно.
Уже всю голову сломал где собака зарыта.
Может кто подскажет куда копать?
1 Byasha
 
21.09.11
22:57
ЗЫ. СГРУППИРОВАТЬ ПО - не предлагать. Не помогает.
2 viktor_vv
 
21.09.11
23:17
Объединить Все
3 viktor_vv
 
21.09.11
23:18
Два запроса. Один по Заказы покупателей другой по РасчетыСКонтрагентами.
4 viktor_vv
 
21.09.11
23:21
Вместо Левого соединения.
5 Byasha
 
21.09.11
23:24
Это вообще-то только часть запроса. Выжимка так сказать. Там еще куча показателей рассчитывается. И объединение не хотелось бы делать, поскольку объединение потребует что бы типы были одинаковые, что не реально. Загвоздка только в показателе суммы оплаты. Все остальные рассчитываются верно. Если других вариантов кроме как объединение запросов не будет - тогда конечно придется объединять. Но пока очень не хочется.
6 GROOVY
 
21.09.11
23:28
"поскольку объединение потребует что бы типы были одинаковые" - это кто такое сказал?
7 GROOVY
 
21.09.11
23:32
Вообще упрощайте запросы. Сначала выбирайте нужные данные, потом уже соединяйте.
В Вашем случае Может не стоит суммировать сумму оплаты, а использовать другие функции, Минимум, Максимум.
8 viktor_vv
 
21.09.11
23:35
(5) Будет оплат больше, чем корректировок, будет проблема в сумме корректировки.
9 Byasha
 
21.09.11
23:38
(6) Сорри, глупость сморозил. Каюсь. на объединение это условие не распространяется. Просто уже затюкался с этим запросом, и в каком то из вариантов 8-ка ругнулась что нужные одинаковые типы.

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

Объединить то попробую - но блин, геморно это потом будет разгребать.

(8) - неа, проверял, с корректировками все ок, в не зависимости от количества и наличия оплат - в запросе "ВЫБОР" для этого есть.
10 viktor_vv
 
21.09.11
23:47
(9) Да там проблема в левом соединении по неоднозначной комбинации полей для выбранной детализации строк.
11 Byasha
 
21.09.11
23:49
Эт понятно. Вопрос в том как этого избежать и желательно без объединения запросов. Если коллективный разум ничего не подскажет - будем объединять, но пока не хоца.
Основная теорема систематики: Новые системы плодят новые проблемы.