Имя: Пароль:
1C
1С v8
Определить факт оплаты по заказу: самый быстрый алгоритм
,
0 Cyberhawk
 
03.04.13
06:01
Друзья!
Имеем УТ 10.3. Появилась интересная (надеюсь, не только мне) задача: зная документ заказа ("Заказ покупателя"), определить, есть ли по нему хоть один проведенный документ оплаты (ПКО или ППВх).
Нужно узнавать только сам факт наличия оплаты (сам документ оплаты, например, выдергивать не нужно).
Мой вариант алгоритма:

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

Ну а далее, собственно,

Ответ = НЕ Результат.Пустой()

Вопросы к сообществу:
1. Влияет ли в теории свойство "Индексировать" у выбираемого измерения на скорость выборки? К примеру, у измерения "ДокументОплаты" индексирование = ложь, а у "ПриходРасход" из текста выше индексирование = истина. Замер производительности разницы мне не показал, но это видимо потому что регистр у меня небольшой.
2. Может, есть более быстрый вариант решения задачи? Если знаете - напишите.
1 echo77
 
03.04.13
06:19
Из регистра взаиморасчетов взять тоже самое
2 Cyberhawk
 
03.04.13
06:25
(1) во взаиморасчеты делают движения не только ПКО и ППВх, но и реализации, и корректировки долга, и возвраты.
Придется делать отбор по виду регистратора, который недоступен в параметрах виртуальных таблиц (остатки, обороты, остатки+обороты), следовательно, не катит такой вариант. Я прав?
3 hhhh
 
03.04.13
07:51
(2) с индексированием раз в 30 будет быстрее.
4 Ursus maritimus
 
03.04.13
07:55
(0) Открой для себя регистр РасчетыСКонтрагентами (НЕ Взаиморасчеты)
5 Cyberhawk
 
03.04.13
08:09
(4) аналогично: смотри (2)
6 Cyberhawk
 
03.04.13
08:10
(3) как это относится к (2)?
7 Ursus maritimus
 
03.04.13
08:12
(5) Задействуй мозг.
8 Cyberhawk
 
03.04.13
08:16
(7) напиши свой вариант решения задачи (код или запрос)
9 Ursus maritimus
 
03.04.13
08:38
(8) 1500 руб.
10 Cyberhawk
 
03.04.13
08:40
(9) прилюдно заключаю пари: если ты покажешь и докажешь, что твой код будет быстрее варианта в (0), то Я переведу тебе запрошенную сумму :)
11 Ursus maritimus
 
03.04.13
08:42
(10) Прилюдно обещаю, что за 1500 ты получишь работоспособную функцию возвращающую булево (была оплата или нет). А доказывать и показывать можешь самостоятельно.
12 Ursus maritimus
 
03.04.13
08:45
(11)+ И да. там не будет запроса оборотов по открытому периоду
13 mikecool
 
03.04.13
08:45
насыпьте кто-нить попкорну ))
(11) такая у автора уже есть
14 mzelensky
 
03.04.13
08:46
(11) работоспособная функция у него и так есть. Он от тебя более "производительную" хочет.
15 mikecool
 
03.04.13
08:48
(12) а вот с закрытым периодом - это уже интереснее...
16 Ksandr
 
03.04.13
08:50
(0) Да поможет тебе денормализация.
17 mzelensky
 
03.04.13
08:53
(0) кстати, советую вот так написать:

"(ВЫРАЗИТЬ(Сделка КАК Документ.ЗаказПокупателя)).ссылка = &ЗаказСсылка"

Лично столкнулся с проблемой. что в некоторых случаях вот так:

"(ВЫРАЗИТЬ(Сделка КАК Документ.ЗаказПокупателя)) = &ЗаказСсылка"

криво отрабатывало
18 Cyberhawk
 
03.04.13
08:56
(17) благодарю
(12), (15) а что там с закрытым периодом? Вы свертку регистра имеете в виду? Т.е. документ будет в базе проведен, а в таблице оборотов его не будет?
19 crazy_killer
 
03.04.13
09:03
На большой базе должно работать быстрее, чем (0)

ВЫБРАТЬ
   РасчетыСКонтрагентамиОбороты.СуммаВзаиморасчетовРасход КАК СуммаОплаты
ИЗ
   РегистрНакопления.РасчетыСКонтрагентами.Обороты(
           ,
           ,
           ,
           ДоговорКонтрагента = &Договор
               И (ВЫРАЗИТЬ(Сделка КАК Документ.ЗаказПокупателя)) = &Сделка) КАК РасчетыСКонтрагентамиОбороты
ГДЕ
   РасчетыСКонтрагентамиОбороты.СуммаВзаиморасчетовРасход > 0
20 Cyberhawk
 
03.04.13
09:05
(19) а за счет чего быстрее? Условие из "Где" наложится уже после выборки строк из таблицы оборотов, следовательно из-за него быстрее не будет. В остальном разницы не вижу: выборка из таблицы оборотов с параметром
21 Cyberhawk
 
03.04.13
09:06
+(20) Я не утверждаю, Я делюсь соображениями. Если не прав, то поправьте - буду благодарен за новые знания :)
22 crazy_killer
 
03.04.13
09:07
(21) за счет попадания в кластерный индекс регистра накопления
23 Cyberhawk
 
03.04.13
09:11
(22) т.е. за счет того что два измерения подряд идут друг за другом, так? :)
Круто, не знал, благодарствую!