Вход | Регистрация
 

Как распределить часы кратно 4,8,12,16 и т.д.

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

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

 округлить в соответствии с правилами;// к 0 или к 1 - это уже как у вас в сепулькарии принято

 ОбщееКоличество = ОбщееКоличество - РаспределенноеНаТекущемШаге;
КонецЦикла
   Ненавижу 1С
 
18 - 13.10.21 - 13:28
(12) все равно криво может быть:
10 работ по 0.1 часа и 11-я работа 23 часа
   VID1234
 
19 - 13.10.21 - 13:28
Какдый сотрудник может быть в разном количестве работ, в этом примере сотрудник участвует в 7 работах, у каждой работы есть сумма в месяц, допустим у всех по 100000, 700000 на все работы, разделив 100000/700000, я получаю доли по работам. Затем количество часов по сотруднику, которое он отработал в месяц, я распределяю пропорционально этим долям в итоге, у меня получается время затраченное на каждую работу! Вот с ней я теперь и работаю, но меня не устраивает, что человек работает меньше часа, как минимум он должен отработать 1 день, т.е. 8 часов, теперь и распределяю, если у человека меньше 8 часов, то занчит он должен работать 8 часов, соответственно с другой работы нужно снять разницу и т.д.
   VID1234
 
20 - 13.10.21 - 13:30
(18) поэтому я и округляю 0,1 до 8 часов, а с 23 часов, отнимаю 7,9!
   Ненавижу 1С
 
21 - 13.10.21 - 13:30
а в целом всем раздать по 8 часов
далее если осталось - раздать от большего к меньшему еще по 8 тем у кого не меньше 1*8+4=12
далее если осталось - раздать от большего к меньшему еще по 8 тем у кого не меньше 2*8+4=20
и т.д.
   Ненавижу 1С
 
22 - 13.10.21 - 13:31
(20) их 10 работ, у тебя уже будет 8*10 = 80 часов при общем количестве 24
   acht
 
23 - 13.10.21 - 13:32
(19) > в 7 работах, у каждой работы есть сумма в месяц, допустим у всех по 100000, 700000 на все работы, разделив 100000/700000, я получаю доли по работам

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

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

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


Список тем форума
 
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.