Имя: Пароль:
1C
 
Как распределить часы кратно 4,8,12,16 и т.д.
,
0 VID1234
 
13.10.21
13:00
Здравствуйте. Ребята подскажите пожалуйста, как мне распределить часы, я получил таблицу значений пропорционально сумме работ, в этой таблице пропорционально разбились часы, но разбились они не целым числом, а с десятыми и сотыми, а мне нужно чтобы часы были кратны 8 часам.
Как правильно написать цикл.
Я думаю так, но может лучше что-нибудь есть?
Отбор = Новый Структура();
                    Отбор.Вставить("Сотрудник",Сотрудника.Сотрудник);
                    СтрокаТЗ_ДоляЧасовВПроекте = ТЗ_ДоляЧасовВПроекте.НайтиСтроки(Отбор);
                                       Если СтрокаТЗ_ДоляЧасовВПроекте.Количество()= 0 Тогда Продолжить; КонецЕсли;
                                        МаксЗначение = 0;
                     Для Каждого Строки Из СтрокаТЗ_ДоляЧасовВПроекте Цикл
                            Если Строки.Часы > МаксЗначение Тогда
                            МаксЗначение = Строки.Часы;
                        КонецЕсли;
                    КонецЦикла;
Для Каждого Строки Из СтрокаТЗ_ДоляЧасовВПроекте Цикл
                            Если Строки.Часы < 8 И Строки.Часы <> МаксЗначение Тогда
                            Разница = 8 - Строки.Часы;
                                                        СтрокаТЗ_ДоляЧасовВПроекте[0].Часы + Разница;
                                                        Отбор.Вставить("Часы",МаксЗначение);
                                     СтрокаСМаксимальнымЗначением = ТЗ_ДоляЧасовВПроекте.НайтиСтроки(Отбор);
                                 КонецЕсли;
СтрокаСМаксимальнымЗначением[0].Часы = СтрокаСМаксимальнымЗначением[0].Часы - Разница;
//обновляем максимум                                        
                     Для Каждого Строки Из СтрокаТЗ_ДоляЧасовВПроекте Цикл
                            Если Строки.Часы > МаксЗначение Тогда
                            МаксЗначение = Строки.Часы;
                        КонецЕсли;
                    КонецЦикла;
ИначеЕсли Если Строки.Часы > 8 И Строки.Часы < 16  Строки.Часы <> МаксЗначение Тогда
            Разница = 16 - Строки.Часы;
                                                        СтрокаТЗ_ДоляЧасовВПроекте[0].Часы + Разница;
                                                        Отбор.Вставить("Часы",МаксЗначение);
                                     СтрокаСМаксимальнымЗначением = ТЗ_ДоляЧасовВПроекте.НайтиСтроки(Отбор);
                                 КонецЕсли;
СтрокаСМаксимальнымЗначением[0].Часы = СтрокаСМаксимальнымЗначением[0].Часы - Разница;
//обновляем максимум                                        
                     Для Каждого Строки Из СтрокаТЗ_ДоляЧасовВПроекте Цикл
                            Если Строки.Часы > МаксЗначение Тогда
                            МаксЗначение = Строки.Часы;
                        КонецЕсли;
                    КонецЦикла;        
КонецЕсли;
КонецЦикла;
Ну и так далее, пока не дойду до максимального итога по часам, здесь бы подошел скорее всего цикл пока или счетчик, но я пока еще не разобрался.
1 Garykom
 
гуру
13.10.21
13:04
гугл-программист напоролся на реальность?
2 acht
 
13.10.21
13:06
Переведи свои часы в сепульки, каждая из которых состоит из четрых часов и проводи пропорциональное разбиение в сепульках с точностью 0 знаков после запятой.
3 acht
 
13.10.21
13:07
(0) Это, конечно, если я правильно прованговал что ты хочешь
4 VID1234
 
13.10.21
13:08
(2) ))) Сепульки, а как? я поэтому и прошу помощи
5 Малыш Джон
 
13.10.21
13:09
Боже...
Арифметика школьного уровня...

ОкругленныеЧасы = Окр(Часы/4)*4;
6 VID1234
 
13.10.21
13:09
(3) а как рисунок прикрепить или если не сложно https://forum.infostart.ru/forum9/topic270693/?result#postform, там есть рисунок!
7 VID1234
 
13.10.21
13:11
(5) Здравствуйте, так у меня на некоторые работы всего 0,8 часа
8 VID1234
 
13.10.21
13:12
(1) Вроде того! Ну таким образом кстати лучше осваивается материал.
\
9 Базис
 
naïve
13.10.21
13:12
(7) Ноль же ничего не значит? Вычёркивай, а там и запятую можно не заметить.
10 acht
 
13.10.21
13:13
(6) Как у иванова по работе 4 из 21.9 получилось 16?
11 Ненавижу 1С
 
гуру
13.10.21
13:13
(6) а если будет 8 работ и все по 1 часу?
12 VID1234
 
13.10.21
13:16
(11) такого не будет, есть общее время, которое на одной из работ будет больше на порядок чем в других
13 VID1234
 
13.10.21
13:18
(10) сначала я в первой строке нашел разницу между 8 часами, затем ее прибавил, и эту разницу отнял у  работы, с максимальным количеством часов, затем вторую строку и т.д., сначала максималька была на 5 работе, но после нескольких отнимании, максимальное стало у 4 работы, поэтому я начал отнимать от нее!
14 VID1234
 
13.10.21
13:20
(10) сначала я отнял 2,53, а затем прибавил 2,95, потому-что у седьмой работы время ближе к 8 часам нежели к 16.
15 mikecool
 
13.10.21
13:22
только я ничего не понимаю?
16 acht
 
13.10.21
13:22
(15) Не, не только ты
17 Злопчинский
 
13.10.21
13:27
ОбщееКоличество = 100;
Цикл ПоКоличествуОбъектов
ОпределитьДолюЦикла для текущего объекта; // допустим 0.8
округлить в соответствии с правилами; // к 0 или к 1 - это уже как у вас в сепулькарии принято
ОбщееКоличество = ОбщееКоличество - РаспределенноеНаТекущемШаге;
КонецЦикла
18 Ненавижу 1С
 
гуру
13.10.21
13:28
(12) все равно криво может быть:
10 работ по 0.1 часа и 11-я работа 23 часа
19 VID1234
 
13.10.21
13:28
Какдый сотрудник может быть в разном количестве работ, в этом примере сотрудник участвует в 7 работах, у каждой работы есть сумма в месяц, допустим у всех по 100000, 700000 на все работы, разделив 100000/700000, я получаю доли по работам. Затем количество часов по сотруднику, которое он отработал в месяц, я распределяю пропорционально этим долям в итоге, у меня получается время затраченное на каждую работу! Вот с ней я теперь и работаю, но меня не устраивает, что человек работает меньше часа, как минимум он должен отработать 1 день, т.е. 8 часов, теперь и распределяю, если у человека меньше 8 часов, то занчит он должен работать 8 часов, соответственно с другой работы нужно снять разницу и т.д.
20 VID1234
 
13.10.21
13:30
(18) поэтому я и округляю 0,1 до 8 часов, а с 23 часов, отнимаю 7,9!
21 Ненавижу 1С
 
гуру
13.10.21
13:30
а в целом всем раздать по 8 часов
далее если осталось - раздать от большего к меньшему еще по 8 тем у кого не меньше 1*8+4=12
далее если осталось - раздать от большего к меньшему еще по 8 тем у кого не меньше 2*8+4=20
и т.д.
22 Ненавижу 1С
 
гуру
13.10.21
13:31
(20) их 10 работ, у тебя уже будет 8*10 = 80 часов при общем количестве 24
23 acht
 
13.10.21
13:32
(19) > в 7 работах, у каждой работы есть сумма в месяц, допустим у всех по 100000, 700000 на все работы, разделив 100000/700000, я получаю доли по работам

Это был контрольный выстрел что-ли? Переход от денег к часам?
А что происходит с другими кратностями, 4, 12, 16, которые тебе нужны?
24 VID1234
 
13.10.21
13:34
(21) как вариант нужно попробовать!
25 VID1234
 
13.10.21
13:35
(22) можно отсечь работу, если не хватило, то ничего страшного! значит что в этом месяце сотрудник в этой работе не участвовал!
26 VID1234
 
13.10.21
13:37
(23) 4 видимо лучше уже исключить, чтобы проще было, а 16 и 24 у меня происходит дублирование кода, до 176 часов)) знаю что это не оптимально, но пока только так могу, сейчас уже хочу закончить с этим, а потом буду пытаться оптимизировать!
27 Малыш Джон
 
13.10.21
13:37
(20)>>поэтому я и округляю 0,1 до 8 часов, а с 23 часов, отнимаю 7,9!

Тогда ты слово "округляю" как  то по своему понимаешь.
28 exwill
 
13.10.21
13:38
Делай за два цикла. Сначала все округляешь вверх до 8(или 4) часов. На втором цикле распределяешь разницу пропорционально весу. Разницу так-же округляешь вверх. Если будет остаток, вычитаешь его из самого большого
29 Базис
 
naïve
13.10.21
13:39
Прокуратура (если бюджет) или минфин (если ГОЗ) удивятся вашей математике.
30 VID1234
 
13.10.21
13:42
(29) ))
31 VID1234
 
13.10.21
13:42
(28) а как цикл выглядит распределения?
32 VID1234
 
13.10.21
13:43
(27) ну т.е. догоняю число до нужного!
33 Малыш Джон
 
13.10.21
14:23
(32) Тогда вообще все просто:

ОкругленныеЧасы = Нужное;