Имя: Пароль:
1C
1С v8
v8: Написал функцию по расчету среднего по ТЗ, делюсь.
,
0 Гений 1С
 
гуру
04.12.12
14:07
В общем, усредняет. Юзайте.

Функция УсреднитьПоТаблицеЗначений(ТЗ, ТЗПоиска, СтруктураПоиска, КолонкаСуммы, КолонкаОбщейСуммы = Неопределено, КолонкаКоличестваПоказателей = Неопределено, КолонкаСреднего = Неопределено) Экспорт
   Для Каждого Строка Из ТЗ Цикл
       ЗаполнитьЗначенияСвойств(СтруктураПоиска, Строка);
       Строки = ТЗПоиска.НайтиСтроки(СтруктураПоиска);
       
       ОбщаяСумма = САП.ИтогПоМассивуСтрок(Строки, КолонкаСуммы);
       КоличествоПоказателей = Строки.Количество();
       
       СреднееЗначение = ?(КоличествоПоказателей = 0, 0, ОбщаяСумма / КоличествоПоказателей);
       
       Если ЗначениеЗаполнено(КолонкаОбщейСуммы) Тогда Строка[КолонкаОбщейСуммы] = ОбщаяСумма КонецЕсли;
       Если ЗначениеЗаполнено(КолонкаКоличестваПоказателей) Тогда Строка[КолонкаКоличестваПоказателей] = КоличествоПоказателей КонецЕсли;
       Если ЗначениеЗаполнено(КолонкаСреднего) Тогда Строка[КолонкаСреднего] = СреднееЗначение КонецЕсли;
       
   КонецЦикла;
КонецФункции

Пример юзания:


   //Усредняем по дням
   СтруктураПоиска = Новый Структура("Магазин, КатегорияПлана, Дата");
   УсреднитьПоТаблицеЗначений(ТЗДляРейтингаДень, ТЗДляРейтингаДень, СтруктураПоиска, "Выполнено", "ОбщееВыполнение",  , "СреднееВыполнение");
   ВычислитьПроцентСотрудникаДляРейтингаПоДням(ТЗДляРейтингаДень);
   
   //Усредняем по месяцу
   СтруктураПоиска = Новый Структура("Магазин, КатегорияПлана, Сотрудник");
   УсреднитьПоТаблицеЗначений(ТЗДляРейтингаМесяц, ТЗДляРейтингаДень, СтруктураПоиска, "СреднееВыполнение");
   УсреднитьПоТаблицеЗначений(ТЗДляРейтингаМесяц, ТЗДляРейтингаДень, СтруктураПоиска, "ПроцентСотрудника");
1 zak555
 
04.12.12
14:07
зачем это ?
2 PLUT
 
04.12.12
14:08
(0) "мой гений дарит вам"
3 narayanan
 
04.12.12
14:10
(0) как в лужу пёрнул и замолчал
4 zak555
 
04.12.12
14:10
что такое "САП." ?
5 mikecool
 
04.12.12
14:10
какая красота! а что это?
6 mikecool
 
04.12.12
14:11
(4) бгг +100500
7 mikecool
 
04.12.12
14:11
да, Серега уже не торт
8 Плот
 
04.12.12
14:11
(4)+100
что за Х?
9 Гений 1С
 
гуру
04.12.12
14:12
Чтобы посчитать среднее.
например, у вас есть таблица
ФИО Рост Год с ростами физлиц по датам.

Вам нужно посчитать средний рост по каждому ФИО

Функция может это сделать.

Или средний рос за каждый год
10 Гений 1С
 
гуру
04.12.12
14:12
Функция САП.ИтогПоМассивуСтрок(Строки, Колонка) Экспорт
   Р = 0;
   Для Каждого Строка ИЗ Строки Цикл
       Р = Р + Строка[Колонка];
   КонецЦикла;
   Возврат Р;
КонецФункции
11 Patrio_
O_Muerte
 
04.12.12
14:13
Может вывесить пример вывода макета сразу на печать...
12 mikecool
 
04.12.12
14:13
(9) поделись дурбазином
13 mikecool
 
04.12.12
14:13
(10) а Итог по колонке не для тебя?
14 zak555
 
04.12.12
14:14
(9) зачем среднее значение писать в каждую стоку ?
каков глубокий смысл в этом ?
15 acsent
 
04.12.12
14:15
почему бы сразу в запросе не считать?
16 zak555
 
04.12.12
14:15
(13) +1
(15) +100500
17 Гений 1С
 
гуру
04.12.12
14:15
(15) Потому что надо писать еще и запрос.
18 Гений 1С
 
гуру
04.12.12
14:15
а тут взял и усреднил, мне результат в ТЗ нужен.
19 mikecool
 
04.12.12
14:15
дарю ТЗ.Итог("Показатель")/ТЗ.Количество()
20 acsent
 
04.12.12
14:15
(17) откуда тз берется?
21 acsent
 
04.12.12
14:16
(19) не то
22 mikecool
 
04.12.12
14:16
+19 это если без запросов
23 zak555
 
04.12.12
14:16
(18) зачем писать результат в каждую строку ?
24 mikecool
 
04.12.12
14:16
(21) а че, не среднее?
25 quest
 
04.12.12
14:16
уже не торт.... про микроволновку наоборот было лучше.
26 Гений 1С
 
гуру
04.12.12
14:17
(19) Боюсь я данайцев дары приносящих, это у тебя общее среднее будет, а не построчное, смотри примеры с ростом.
27 Mikeware
 
04.12.12
14:18
(2) не "гений", а "гениталий"
28 Гений 1С
 
гуру
04.12.12
14:20
лично я использовал это для такой задачи.

Есть ТЗ с продажами по сотрудникам за даты.
Сотрудник, Дата, Продано.

Нужно получить за каждый день среднюю продажу по сотрудникам, то бишь Сотрудник, Дата - СредняяПродажа
29 mikecool
 
04.12.12
14:20
(26) нифига не понял пример
30 mikecool
 
04.12.12
14:20
(28) а, тогда Найти строки, загрузить найденное в тз и возвращаемся к моему примеру
31 mikecool
 
04.12.12
14:21
а ваще - запросом это делать надо
32 Гений 1С
 
гуру
04.12.12
14:21
(30) Ну так я так и делаю, только функция универсальная.
(31) на фига? экономить на спичках?
33 Schwonder
 
04.12.12
14:29
В баню его ещё на годик-другой... может ума наберется!!!11
34 mikecool
 
04.12.12
14:30
(32) ладно - на спичках ты не экономишь, но твой код не красивый, я бы даже сказал - овно ))
35 Ночной кошмар
 
04.12.12
14:30
И почему я сразу угадал топикстартера? :)
36 acsent
 
04.12.12
14:30
(32) ты же только что говорил про оптимизацию, там где возможно? Или ты двуличная скотина?
37 dva1c
 
04.12.12
14:32
Зато собрались все. Поучаствовать в ветке. )
38 КонецЦикла
 
04.12.12
14:38
(28) Это и даже более сложные вещи (хм?) делаются одним запросом
39 Гений 1С
 
гуру
04.12.12
14:40
(38) Я сторонник повторного использования кода. И не люблю гонять ТЗ в запрос, а потом обратно.
40 Mort
 
04.12.12
14:43
Даже если запрос юзать религия не позволяет: добавить колонку с единицей, свернуть, пробежаться и поделить. Короче, на гов*код.ру
41 Господин ПЖ
 
04.12.12
14:45
сося как всегда показал мастер-класс дерьмокода
42 Reset
 
04.12.12
14:45
(39)
Правильно, зачем каждый раз писать А+Б, можно же один раз написать функцию Сумма2(А,Б) и использовать ее.
Повторное использование кода, чо.
43 Schwonder
 
04.12.12
14:57
(42) Не.. Надо так: САП.Сумма2(А, Б)
44 Schwonder
 
04.12.12
14:57
)))))
45 Schwonder
 
04.12.12
14:58
Или САП.Инвоке("САП.СУММА2", А, Б)
46 kiruha
 
04.12.12
15:00
(0)
В цикле
Строки = ТЗПоиска.НайтиСтроки(СтруктураПоиска);

не Айс

одним проходом никак ?
47 Гений 1С
 
гуру
04.12.12
15:49
(40) То писать надо, а то повторный код, усек?
(46) подумай.
48 Schwonder
 
04.12.12
15:58
(47) Думать тебе надо было перед тем как свою очередную "нетленку" постить. Твой высер вменяемый человек использовать никогда не будет, ибо реализовать запросом будет практичнее. И раз уж сам думать не умеешь, намекну. В твоём быдлокоде тоже мог быть запрос, а не поиск строк в цикле.
49 SunFox
 
04.12.12
16:15
(28) таблица же из запроса вышла? там все и юзать - в запросе.
50 Господин ПЖ
 
04.12.12
16:17
ваш гений дарит вам кусок повторного дерьмокода...
51 Гений 1С
 
гуру
04.12.12
19:21
(48) возможно, но на моих объемах и обход нормально работает. Если нужно оптимизировать - вперед и с песней. ;-)
52 Гений 1С
 
гуру
04.12.12
19:22
(49) Нет, таблица вышла не из запроса, а собиралась долгим и кропотливым алгоритмом (в моем случае)
53 DarkWater
 
04.12.12
19:46
(0) Офигеть достижение)))) Про hello world тоже на мисту напиши, если накатаешь.
54 AlexSSSSS
 
04.12.12
19:49
(0) "и почему я угадал автора..."
55 KRV
 
04.12.12
19:49
Средняя температура по больнице...
56 ERWINS
 
04.12.12
19:56
1. загнать во временную таблицу, выполнить запрос, вернуть результат?

2. добавить колонку со значением 1
сгруппировать
разделить
удалить колонку
57 0xFFFFFF
 
04.12.12
19:56
Если каждый мистянин свою нетлеющую функцию будет выкладывать, шож это с мистой станет.
Да и нафига усреднять в ТЗ, если такие вещи проще и правильней делать в запросе...
58 МихаилМ
 
04.12.12
20:08
(0)
для этого специально создан механизм 1с Анализ данных ОбщаяСтатистика
59 БалбесВ1с
 
04.12.12
20:41
(0)Мой код проще-дарю
Среднее = ВсеСкласть\СкокаЕдиниц
60 i-rek
 
04.12.12
20:49
"а внутре у неё... НЕОНКА !!!" )))
61 zak555
 
04.12.12
20:57
62 H A D G E H O G s
 
04.12.12
20:59
Блеать, как будто в 2007 год перенесся.
Несколько раз смотрел даты сообщений, нет, все верно, близиться аппокалипсис.
63 Asmody
 
04.12.12
21:10
(0) лучше MapReduce на 1С напиши
64 etc
 
04.12.12
21:15
Любителям потаскать на сервер и обратно таблицу значений низачёт. Вы - насильники tempdb :)
Про ТС ниче не скажу. Он и так уже "попал" :)
65 Гений 1С
 
гуру
04.12.12
22:09
(64) гыгыгы, зачет! Зачем усложнять ради копеечного прироста
66 БАМБР2013
 
04.12.12
22:18
(0) > Написал функцию по расчету среднего по ТЗ

А набуя она нужна?
Впрочем как и твоя обработка на инфостарте с файлами-флагами...
67 БАМБР2013
 
04.12.12
22:21
копрокод.
Все это делается обычным запросом, а результат выкидывается в СКД
68 polymorph
 
04.12.12
22:30
внимание спойлер - раскрывается смысл ветки. гений кросаучег, решил наглядно продемонстрировать низкий уровень профессионализма и высокий неадеквата на форуме. миссион суксесс. почти все из отписавшихся толком тему не читали, что уж говорить про дальнейшие комментарии ТС.
69 Bober
 
05.12.12
06:26
(0) нет кеширования показателей расчете, см свой пример при расчете день.
70 vitek89
 
05.12.12
06:48
страшно тут у вас
71 Гений 1С
 
гуру
05.12.12
08:37
(67) А если не надо в СКД? А надо просто просчитать и дальше обработать ТЗ? У Вас не хватает воображения или опыта?
72 Гений 1С
 
гуру
05.12.12
08:37
(69) Возможно, возможно. Но на моих объемах работает, не возражаю, что есть место для оптимизации. Но суть в другом - если вдруг надо посчитать быстро среднее, можно заюзать, а уж если будет тормозить (что вряд ли) - оптимизировать
73 Fish
 
05.12.12
08:40
(0) Унылый гКод.
74 YHVVH
 
05.12.12
08:47
+(72) согласен
75 kiruha
 
05.12.12
08:57
(72)
Ну хоть индекс добавь, прежде чем искать
это ровно одна строчка
76 organizm
 
05.12.12
09:07
... по старинке как 7.7 Таблицы значений ... за что боролись к тому и вернулись...
77 organizm
 
05.12.12
09:08
(72) с ТЗ будет тормозить полюбасу. не вариант.
78 Гений 1С
 
гуру
05.12.12
10:59
(75) А ты уверен, что индекса нет? Функция не должна делать лишней работы.

(76) старое - не значит плохое. Иногда это значит надежное и проверенное.
79 mzelensky
 
05.12.12
11:05
(58) а ты применял эти анализы?! Есть норм литература с примерами по этой ерундовине?!
80 kiruha
 
05.12.12
11:37
(78)

СтрокаОтбора="Магазин, КатегорияПлана, Сотрудник"

ТЗПоиска2=ТЗПоиска.Скопировать();
ТЗПоиска2.Индексы.Добавить(СтрокаОтбора);
СтруктураПоиска = Новый Структура(СтрокаОтбора);

Для Каждого Строка Из ТЗ Цикл
       ЗаполнитьЗначенияСвойств(СтруктураПоиска, Строка);
       Строки = ТЗПоиска2.НайтиСтроки(СтруктураПоиска);
//...........

при размере  ТЗ в 1000 у (0) будет 1000*1000*k1 проходов
здесь 1000*2*k2
81 Гений 1С
 
гуру
05.12.12
11:48
(80) Кирюха, включай здравый смысл.
Иногда нужно получить среднее по средних размеров таблице, тут важнее время, затраченное на кодинг.
Я ж говорю - есть пути для оптимизации.
Зато можно повторно не писать.

Мне в двух местах нужно было посчитать среднее, я написал универсальную функцию, теперь она всегда под рукой. А то
82 Schwonder
 
05.12.12
14:25
(81) А если надо будет применить к таблице покрупнее? Писать будешь очередной высер и постить на Мисту? А повторное использование копрокода - это верх идиотизма. ИМХО.
83 Гений 1С
 
гуру
05.12.12
15:03
(82) если нужно будет покруче, доработаю и выложу на мисту в эту ветку доработанный вариант.
84 Schwonder
 
05.12.12
15:15
(83) Заведи себе блох и засерай его. Руки прочь от уютненькой.