Имя: Пароль:
1C
1С v8
Распределение сумм в запросе пропорционально результатам выборки
,
0 Nikitos
 
22.06.12
14:37
День добрый!
Сдается мне что видел такое, но не нашел.
Собственно говоря, необходимо распределить некую сумму пропорционально некому набору сумм запросом.

Как-то вот такю
1 mikecool
 
22.06.12
14:38
в СКД можно вроде
2 Nikitos
 
22.06.12
14:38
а вот как?
3 andrewks
 
22.06.12
14:40
можно и без СКД. что мешает найти сумму, выбрать и умножить?
4 shuhard
 
22.06.12
14:42
(0)
(1)
неудачники
откройте в типовой Валовую прибыль
5 Nikitos
 
22.06.12
14:42
Относительно многое. Одно из основных - как и куда деть остаток?
6 andrewks
 
22.06.12
14:43
(5) какой остаток?
7 Nikitos
 
22.06.12
14:45
(6) например нужно поровну разделить 10 рублей на 3 части...
8 shuhard
 
22.06.12
14:47
(7) исключи из распределения первую запись и повесь на неё остаток


ладно бы сейчас был 2005 год и нужны бы были подзаппросы,
но не сделать этого через ВТ ?
9 Maxus43
 
22.06.12
14:47
ЦенаОбщая*КоличествоОбщее/КоличествоЧастное

так в запросах постоянно делают в типовых даже
10 Jaap Vduul
 
22.06.12
14:47
(7)А если бы не запросом, то куда девал?
11 Nikitos
 
22.06.12
14:51
(9)  :)
ЦенаОбщая - 10 руб.
КоличествоОбщее - 9
КоличествоЧастное - 3

итого цена конкретной 1 штуки - 30 руб.
12 Nikitos
 
22.06.12
14:51
(10) куда-нибудь кидал
13 Maxus43
 
22.06.12
14:57
(11) ну ты понял смысл) в пятницу мозг плывёт уж
14 Nikitos
 
22.06.12
14:59
(13) все равно надо как-то последнюю копейку пристраивать
15 Nikitos
 
22.06.12
15:00
(8) ну поделись маленько опытом... Дай, так сказать, мастер класс
16 Jaap Vduul
 
22.06.12
15:02
(12)Если в запросе строки можно однозначно идентифицировать, то кидай так же.
17 Nikitos
 
22.06.12
15:04
(16) не всегда возможно. В том и проблема.
18 spu79
 
22.06.12
15:06
а функции Минимум и Максимум в запросах отменили?
19 shuhard
 
22.06.12
15:06
(17)[не всегда возможно. В том и проблема.]
сказки
пример в студию
20 andrewks
 
22.06.12
15:07
(17) почему это не всегда? что мешает добавить нужные поля?
21 Jaap Vduul
 
22.06.12
15:08
22 Nikitos
 
22.06.12
15:12
ВЫБРАТЬ
                     ЗаказПоставщику.НомерВходящегоДокумента КАК НомерМашины,
                     ЗаказПоставщику.р_КомплектацияМашины КАК КомплектацияМашины,
                     ЗаказПоставщику.Ссылка КАК Ссылка,
                     ЗаказПоставщикуТовары.Номенклатура,
                     ЗаказПоставщикуТовары.ХарактеристикаНоменклатуры,
                     ЗаказПоставщикуТовары.Количество,
                     ЗаказПоставщикуТовары.Цена,
                     ЗаказПоставщикуТовары.Количество * ЗаказПоставщикуТовары.Цена КАК Сумма,
                     ЗаказПоставщикуТовары.Заказ.Ссылка,
                     ЗаказПоставщикуТовары.Заказ.Дата КАК ЗаказДата,
                     ЗаказПоставщикуТовары.Заказ.ВалютаДокумента,
                     ЗаказПоставщику.р_КомплектацияМашины.СтоимостьДоставки
                  ИЗ
                     Документ.ЗаказПоставщику.Товары КАК ЗаказПоставщикуТовары
                         ЛЕВОЕ СОЕДИНЕНИЕ Документ.ЗаказПоставщику КАК ЗаказПоставщику
                         ПО ЗаказПоставщикуТовары.Ссылка = ЗаказПоставщику.Ссылка
                  ГДЕ
                     ЗаказПоставщику.Проведен = ИСТИНА
                     И ЗаказПоставщику.НомерВходящегоДокумента В(&НомерВходящегоДокумента)


Стоимость доставки нужно распределить пропорционально сумме
23 andrewks
 
22.06.12
15:13
каков бюджет?
24 Ненавижу 1С
 
гуру
22.06.12
15:13
(20) ну если нет уникальности, то не всегда
25 Jaap Vduul
 
22.06.12
15:14
Наверняка у р_КомплектацияМашины есть НомерСтроки
26 Nikitos
 
22.06.12
15:14
(25) нет. Это всего лишь поле с некой цифрой совершенно в другом документе и не более того
27 andrewks
 
22.06.12
15:15
(24) с тебя пример
28 ssh2006
 
22.06.12
15:16
(26) в ТЧ товары есть НомерСтроки. Корректируй первую или последнюю строку
29 Nikitos
 
22.06.12
15:19
(28) опять же нет. В этой ТЧ присутствует обычно несколько р_КомплектацияМашины
30 shuhard
 
22.06.12
15:20
(29) да пофигу номер строки,
набор полей выборки образует первичный ключ
31 Ненавижу 1С
 
гуру
22.06.12
15:20
(27)
пронумеруй в запросе таблицу:

Поле1
"Вася"
"Вася"
"Вася"
32 Nikitos
 
22.06.12
15:21
(30) и?
33 ssh2006
 
22.06.12
15:21
(29) в ТЧ всегда есть НомерСтроки. р_КомплектацияМашины - это у тебя реквизит документа
34 Ненавижу 1С
 
гуру
22.06.12
15:22
(32) если есть уникальность можно пронумеровать
35 Nikitos
 
22.06.12
15:23
(33) не понимаю я что-то по вашему...
36 m-serg74
 
22.06.12
15:24
что то не пойму чего с распределения съехали на нумерацию?)))
37 ssh2006
 
22.06.12
15:24
(35) в ТЧ всегда есть НомерСтроки.
38 Nikitos
 
22.06.12
15:25
(37) при чем здесь вообще НомерСтроки??
39 Ненавижу 1С
 
гуру
22.06.12
15:26
(36) нумерация позволяет делать красивое распределение
40 ssh2006
 
22.06.12
15:28
ВЫБРАТЬ
   "Вася" КАК Поле1
ПОМЕСТИТЬ Таб

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
   "Вася"

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
   "Вася"
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
   1 КАК Номер
ПОМЕСТИТЬ ТабНомера

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
   2

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
   3
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ РАЗЛИЧНЫЕ
   Таб.Поле1,
   ТабНомера.Номер
ИЗ
   Таб КАК Таб,
   ТабНомера КАК ТабНомера
41 Nikitos
 
22.06.12
15:29
(39) ну не понимаю я как. Ступор какой-то
42 m-serg74
 
22.06.12
15:29
(40) ты Гений)))
43 m-serg74
 
22.06.12
15:29
(39) мне тоже интересно может пригодится...
44 andrewks
 
22.06.12
15:30
(31) если у идентичных строк будет одинаковый номер - это не скажется на распределении
45 andrewks
 
22.06.12
15:32
(40) бугага
46 Ненавижу 1С
 
гуру
22.06.12
15:33
(44) отмазался ))
47 Ненавижу 1С
 
гуру
22.06.12
15:33
(40) бред какой-то
48 ssh2006
 
22.06.12
15:34
(47) Вася пронумерован))
49 andrewks
 
22.06.12
15:34
(46) ага )
(47) почему?  решение частного случая. результат-то налицо :)
50 Nikitos
 
22.06.12
15:46
круче всех выступил (8), но никто так ничего и не смог сказать внятного
51 shuhard
 
22.06.12
15:48
(50) топик закрыт,
накопишь  денег - заходи
55 andrewks
 
22.06.12
16:00
(50) неужели ты так и ничего не понял?
56 Nikitos
 
22.06.12
16:03
(55) да. Это так
57 ptiz
 
22.06.12
16:04
ВЫБРАТЬ
   "А" КАК Поле1,
   1 КАК К
ПОМЕСТИТЬ ТЗКоэффициентов

ОБЪЕДИНИТЬ

ВЫБРАТЬ
   "Б",
   1

ОБЪЕДИНИТЬ

ВЫБРАТЬ
   "В",
   1
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
   СУММА(ТЗКоэффициентов.К) КАК СуммаК
ПОМЕСТИТЬ ТЗПолнаяСуммаК
ИЗ
   ТЗКоэффициентов КАК ТЗКоэффициентов
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
   ТЗКоэффициентов.Поле1,
   ВЫРАЗИТЬ(ТЗКоэффициентов.К / ТЗПолнаяСумма.СуммаК * &РаспределяемаяСумма КАК ЧИСЛО(10, 1)) КАК Распределено
ПОМЕСТИТЬ РаспределеноПредварительно
ИЗ
   ТЗКоэффициентов КАК ТЗКоэффициентов
       ЛЕВОЕ СОЕДИНЕНИЕ ТЗПолнаяСуммаК КАК ТЗПолнаяСумма
       ПО (ИСТИНА)
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
   Подзапрос.Поле1,
   СУММА(Подзапрос.Распределено) КАК Распределено
ИЗ
   (ВЫБРАТЬ
       РаспределеноПредварительно.Поле1 КАК Поле1,
       РаспределеноПредварительно.Распределено КАК Распределено
   ИЗ
       РаспределеноПредварительно КАК РаспределеноПредварительно
   
   ОБЪЕДИНИТЬ ВСЕ
   
   ВЫБРАТЬ
       МАКСИМУМ(РаспределеноПредварительно.Поле1),
       МАКСИМУМ(Остатки.Остаток)
   ИЗ
       РаспределеноПредварительно КАК РаспределеноПредварительно
           ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
               &РаспределяемаяСумма - СУММА(РаспределеноПредварительно.Распределено) КАК Остаток
           ИЗ
               РаспределеноПредварительно КАК РаспределеноПредварительно) КАК Остатки
           ПО (ИСТИНА)) КАК Подзапрос

СГРУППИРОВАТЬ ПО
   Подзапрос.Поле1
58 Ненавижу 1С
 
гуру
22.06.12
16:08
ВЫБРАТЬ
   "А" КАК Объект,
   1 КАК База
ПОМЕСТИТЬ Данные

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
   "Б",
   2

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
   "В",
   3
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
   СУММА(Данные.База) КАК СуммаБазы,
   &Сумма / СУММА(Данные.База) КАК Коэффициент
ПОМЕСТИТЬ Итог
ИЗ
   Данные КАК Данные
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
   Данные1.Объект,
   Данные1.База,
   ЕСТЬNULL(СУММА(Данные2.База), 0) КАК БазаНакопления
ПОМЕСТИТЬ ДанныеСНакоплением
ИЗ
   Данные КАК Данные1
       ЛЕВОЕ СОЕДИНЕНИЕ Данные КАК Данные2
       ПО Данные1.Объект > Данные2.Объект

СГРУППИРОВАТЬ ПО
   Данные1.Объект,
   Данные1.База
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
   ДанныеСНакоплением.Объект,
   ДанныеСНакоплением.База,
   ВЫРАЗИТЬ((&Сумма - (ВЫРАЗИТЬ((ДанныеСНакоплением.БазаНакопления) * Итог.Коэффициент КАК ЧИСЛО(15, 2))))*ДанныеСНакоплением.База/(Итог.СуммаБазы-ДанныеСНакоплением.БазаНакопления) КАК ЧИСЛО(15,2)) КАК Результат
ИЗ
   ДанныеСНакоплением КАК ДанныеСНакоплением,
   Итог КАК Итог
59 andrewks
 
22.06.12
16:26
(58) накопительную ошибку округления не учитываешь
60 andrewks
 
22.06.12
16:30
на скорую руку так получается (типовые не смотрел)


select
Товары.Ссылка as Ссылка
into
ВремТабТовары
from
Справочник.Номенклатура as Товары
where
(НЕ Товары.ЭтоГруппа)  
index by
Ссылка
;

select
 Товары1.Ссылка
,count(Товары2.Ссылка) as НомерСтроки
into
 ВремТабТоварыНумер
from
 ВремТабТовары as Товары1
inner join
 ВремТабТовары as Товары2
on (Товары1.Ссылка>=Товары2.Ссылка)
group by
 Товары1.Ссылка
index by
 НомерСтроки

;

select
 sum(1) as Сумма // пусть база распределения = 1, т.е. равномерно, на алгоритм ниже это не влияет
into
 ВремТабОбщСумма
from
 ВремТабТоварыНумер as Товары
 
;

select top 1
 Товары.Ссылка
,Товары.НомерСтроки
,0 as РаспредСумма
into
ВремТабПервыйТовар
from
 ВремТабТоварыНумер as Товары
;
 
select
Товары.Ссылка
,Товары.НомерСтроки
,cast(&СуммаКРаспред/ОбщСумма.Сумма as number(17,5)) as РаспредСумма
into
ВремТабОстальнойТовар
from
ВремТабТоварыНумер as Товары
,ВремТабОбщСумма as ОбщСумма
where (Товары.Ссылка not in (select ВремТабПервыйТовар.Ссылка from ВремТабПервыйТовар))

;

select
 sum(Товары.РаспредСумма) as Сумма
into
 ВремТабОбщСумма2
from
 ВремТабОстальнойТовар as Товары

;

select
Товары1.Ссылка
,cast(&СуммаКРаспред-ОбщСумма2.Сумма as number(17,5)) as РаспредСумма
from
ВремТабПервыйТовар as Товары1
,ВремТабОбщСумма as ОбщСумма
,ВремТабОбщСумма2 as ОбщСумма2

union all

select
 Товары2.Ссылка
,Товары2.РаспредСумма
from
 ВремТабОстальнойТовар as Товары2
61 Ненавижу 1С
 
гуру
22.06.12
16:32
(59) пример данных, где не верно
62 andrewks
 
22.06.12
16:34
(61) сумма = 150,250
63 shuhard
 
22.06.12
16:47
(60) ВТ убивают искусство подзапросов =)
64 Ненавижу 1С
 
гуру
22.06.12
16:49
(62)    ВЫРАЗИТЬ((&Сумма - (ВЫРАЗИТЬ(ДанныеСНакоплением.БазаНакопления * Итог.Коэффициент КАК ЧИСЛО(15, 3)))) * ДанныеСНакоплением.База / (Итог.СуммаБазы - ДанныеСНакоплением.БазаНакопления) КАК ЧИСЛО(15, 2)) КАК Результат
65 Ненавижу 1С
 
гуру
22.06.12
16:50
(63) да уж искусство ))
66 andrewks
 
22.06.12
16:54
(64) это называется "подгон"
67 Ненавижу 1С
 
гуру
22.06.12
16:54
(66) да, оно тоже не верно
68 Ненавижу 1С
 
гуру
22.06.12
16:55
но, имхо, в (60) тоже наверное нарваться на неприятности можно
если предельно считать что база у первого 0, то толку от его исключения в отдельную таблицу?
хотя хз
69 Ненавижу 1С
 
гуру
22.06.12
16:56
+(68) и что-то мне говорит, что задача запросом 1С 8 не решается в общем случае
70 Coldboy
 
22.06.12
16:58
а нельзя, обработать табличную часть, типа 10 руб, есть процоциональн овсем, 10 \ количество строк, и в каждую строку записать в нужную колонку эту строчку и все?
71 andrewks
 
22.06.12
16:59
(68) select top 1 ... where Base>0
72 Coldboy
 
22.06.12
16:59
а если в запросе, то использовать, вложенные запросы?
73 Coldboy
 
22.06.12
17:00
(0) я эт тебе
74 Ненавижу 1С
 
гуру
22.06.12
17:03
(71) ну может и так, а может и нет
75 shuhard
 
22.06.12
17:03
(68) ни кто же не мешает распределить, найти максимум и выделить его
и на выделенную запись зафигачить расхождение, которое может быть и отрицательным
76 Ненавижу 1С
 
гуру
22.06.12
17:05
(75) фишка в том, чтобы ошибка округления была размазана более менее равномерно по всем, а у тебя на максимальный все вешается
77 andrewks
 
22.06.12
17:06
(76) ошибка округления не может быть размазана более менее равномерно по всем, на то она и ошибка округления
78 Ненавижу 1С
 
гуру
22.06.12
17:08
(77) имел ввиду, чтобы сделать как можно меньше величину

(РасчетныйРезультат[1]-ТочныйРезультат[1])^2+...+(РасчетныйРезультат[N]-ТочныйРезультат[N])^2
79 Coldboy
 
22.06.12
17:09
(78) а вы щас о чем говорите?
80 andrewks
 
22.06.12
17:10
(78) оптимизацией решил заняться? это уже явно не на языке запросов 1с
81 shuhard
 
22.06.12
17:10
(76) в типовых вешается на максимальный
и я не вижу в этом минусов



(78)
ты корень извлечь забыл =)
82 andrewks
 
22.06.12
17:12
(79) о дисперсии
83 anddro
 
22.06.12
17:33
Вот пример функции для распределения без остатка и равномерным распределением погрешности.
И как это сделать запросом в 1С?


Функция РаспределитьЗначениеПоТаблице(Таблица, ИмяКолонкиБазы, ИмяКолонкиРезультат, Знач РаспределяемаяВеличина, Точность)
   БазаРаспределения = Таблица.Итог(ИмяКолонкиБазы);
   Для Каждого СтрокаТаблицы Из Таблица Цикл
       Если РаспределяемаяВеличина = 0 Тогда
           Прервать;
       КонецЕсли;
       Если СтрокаТаблицы[ИмяКолонкиБазы] <> 0 Тогда
           Распределить = Окр(РаспределяемаяВеличина / БазаРаспределения * СтрокаТаблицы[ИмяКолонкиБазы], Точность);
           СтрокаТаблицы[ИмяКолонкиРезультат] = Распределить;
           РаспределяемаяВеличина = РаспределяемаяВеличина - Распределить;
           БазаРаспределения = БазаРаспределения - СтрокаТаблицы[ИмяКолонкиБазы];
       КонецЕсли;
   КонецЦикла;
КонецФункции
84 shuhard
 
22.06.12
17:36
(83) что - то в (57) не понятно ?
85 andrewks
 
22.06.12
17:37
(83) " и равномерным распределением погрешности"  шо це таке?
86 anddro
 
22.06.12
17:39
(84) да, вся погрешность падает на первый по сортировке показатель, даже если в той строке сумма нулевая или минимальная.
(85) ты где-то там видишь вычисление погрешности? нет, но и в итоге ее не будет.
87 shuhard
 
22.06.12
17:40
(86) нам это известно, вопрос о чём ?
88 andrewks
 
22.06.12
17:43
(86) 2. распределение погрешности не равномерное, просто дисперсия будет меньше. чтобы минимизировать, нужно отсортировать по базе в начале. и здесь чисто итеративный алгоритм
89 anddro
 
22.06.12
17:47
(87) о том, что так ли надо извращаться в данном случае с запросами, если у задачи есть простое решение. Или это просто пятница?
(88) да понятно, что не декларативный. Но в языке запросов это сделать гораздо сложнее и те варианты, что приведены - они более ресурсоемкие.
90 shuhard
 
22.06.12
17:50
(89) это типовая задача, решаемая во множестве отчётов
и выносить её в программный цикл бессмысленно
91 Speshuric
 
22.06.12
18:45
(69) Всё можно:

ВЫБРАТЬ
   "А" КАК Объект,
   1 КАК База
ПОМЕСТИТЬ Данные

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
   "Б",
   1

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
   "В",
   1

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
   "Г",
   1

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
   "Д",
   1

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
   "Е",
   1
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
   СУММА(Данные.База) КАК СуммаБазы
ПОМЕСТИТЬ Итог
ИЗ
   Данные КАК Данные
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
   Данные1.Объект КАК Объект,
   ВЫРАЗИТЬ(Данные1.База КАК ЧИСЛО(15, 2)) КАК База,
   ВЫРАЗИТЬ(ЕСТЬNULL(СУММА(Данные2.База), 0) КАК ЧИСЛО(15, 2)) КАК БазаНакопленная
ПОМЕСТИТЬ ДанныеСНакоплением
ИЗ
   Данные КАК Данные1
       ЛЕВОЕ СОЕДИНЕНИЕ Данные КАК Данные2
       ПО Данные1.Объект > Данные2.Объект

СГРУППИРОВАТЬ ПО
   Данные1.Объект,
   Данные1.База
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
   Данные.Объект,
   Данные.База,
   (ВЫРАЗИТЬ(&Сумма * (Данные.БазаНакопленная + Данные.База) / Итог.СуммаБазы КАК ЧИСЛО(15, 2)))
   - (ВЫРАЗИТЬ(&Сумма * Данные.БазаНакопленная / Итог.СуммаБазы КАК ЧИСЛО(15, 2))) КАК РаспределеноПоБазе
ИЗ
   Итог КАК Итог,
   ДанныеСНакоплением КАК Данные
92 anddro
 
22.06.12
18:59
а вот это (91) уже значительно красивее, чем (57)
93 andrewks
 
22.06.12
21:19
(91) браво!
94 Ненавижу 1С
 
гуру
22.06.12
21:55
(91) точно, точно, а я все вспоминал как-же получалось то...
95 artbear
 
23.06.12
14:32
закладка1