Как распределить часы кратно 4,8,12,16 и т.д.
Здравствуйте. Ребята подскажите пожалуйста, как мне распределить часы, я получил таблицу значений пропорционально сумме работ, в этой таблице пропорционально разбились часы, но разбились они не целым числом, а с десятыми и сотыми, а мне нужно чтобы часы были кратны 8 часам.
Как правильно написать цикл.
Я думаю так, но может лучше что-нибудь есть?
Ну и так далее, пока не дойду до максимального итога по часам (80), но у некоторых 176, здесь бы подошел скорее всего цикл пока или счетчик, но я пока еще не разобрался.
Как правильно написать цикл.
Я думаю так, но может лучше что-нибудь есть?
Отбор = Новый Структура();
Отбор.Вставить("Сотрудник",Сотрудника.Сотрудник);
СтрокаТЗ_ДоляЧасовВПроекте = ТЗ_ДоляЧасовВПроекте.НайтиСтроки(Отбор);
Если СтрокаТЗ_ДоляЧасовВПроекте.Количество()= 0 Тогда Продолжить; КонецЕсли;
МаксЗначение = 0;
Для Каждого Строки Из СтрокаТЗ_ДоляЧасовВПроекте Цикл
Если Строки.Часы > МаксЗначение Тогда
МаксЗначение = Строки.Часы;
КонецЕсли;
КонецЦикла;
Для Каждого Строки Из СтрокаТЗ_ДоляЧасовВПроекте Цикл
Если Строки.Часы < 8 И Строки.Часы <> МаксЗначение Тогда
Разница = 8 - Строки.Часы;
СтрокаТЗ_ДоляЧасовВПроекте[0].Часы + Разница;
Отбор.Вставить("Часы",МаксЗначение);
СтрокаСМаксимальнымЗначением = ТЗ_ДоляЧасовВПроекте.НайтиСтроки(Отбор);
КонецЕсли;
СтрокаСМаксимальнымЗначением[0].Часы = СтрокаСМаксимальнымЗначением[0].Часы - Разница;
//обновляем максимум
Для Каждого Строки Из СтрокаТЗ_ДоляЧасовВПроекте Цикл
Если Строки.Часы > МаксЗначение Тогда
МаксЗначение = Строки.Часы;
КонецЕсли;
КонецЦикла;
ИначеЕсли Если Строки.Часы > 8 И Строки.Часы < 16 Строки.Часы <> МаксЗначение Тогда
Разница = 16 - Строки.Часы;
СтрокаТЗ_ДоляЧасовВПроекте[0].Часы + Разница;
Отбор.Вставить("Часы",МаксЗначение);
СтрокаСМаксимальнымЗначением = ТЗ_ДоляЧасовВПроекте.НайтиСтроки(Отбор);
КонецЕсли;
СтрокаСМаксимальнымЗначением[0].Часы = СтрокаСМаксимальнымЗначением[0].Часы - Разница;
//обновляем максимум
Для Каждого Строки Из СтрокаТЗ_ДоляЧасовВПроекте Цикл
Если Строки.Часы > МаксЗначение Тогда
МаксЗначение = Строки.Часы;
КонецЕсли;
КонецЦикла;
КонецЕсли;
КонецЦикла;
ПоказатьНу и так далее, пока не дойду до максимального итога по часам (80), но у некоторых 176, здесь бы подошел скорее всего цикл пока или счетчик, но я пока еще не разобрался.
Прикрепленные файлы:
Ответы
В избранное
Подписаться на ответы
Сортировка:
Древо развёрнутое
Свернуть все
(3) Что-то у вас какая-то путаница в коде.
Получатся массив строк, а имя переменной Строка...:
Обрабатываются последовательно строки из этого массива строк, переменная строки называется Строки:
Да ещё вложенные циклы с теми же переменными цикличности.
И что значит это "должен завершится на работе с наименьшим числом"? Числом чего? Может номером? Можете объяснить?
Но, если я правильно понял задачу, то можно как-то так, например:
Нужно ещё бы потестировать, но на вашем примере работает.
Получатся массив строк, а имя переменной Строка...:
СтрокаТЗ_ДоляЧасовВПроекте = ТЗ_ДоляЧасовВПроекте.НайтиСтроки(Отбор);
Обрабатываются последовательно строки из этого массива строк, переменная строки называется Строки:
Для Каждого Строки Из СтрокаТЗ_ДоляЧасовВПроекте Цикл
Да ещё вложенные циклы с теми же переменными цикличности.
И что значит это "должен завершится на работе с наименьшим числом"? Числом чего? Может номером? Можете объяснить?
Но, если я правильно понял задачу, то можно как-то так, например:
РазницаНакопленная = 0;
ЧасовДоступно = ТаблицаДанных.Итог("Часы");
Для каждого СтрокаДанных Из ТаблицаДанных Цикл
Если ЧасовДоступно = 0 Тогда
Прервать;
КонецЕсли;
Часы = СтрокаДанных.Часы;
ЧасыМин8 = Макс(Часы, 8);
ЧасыВИтоге = Мин(Цел(Макс(ЧасыМин8 - РазницаНакопленная, 8) / 8) * 8, ЧасовДоступно);
Разница = ЧасыМин - РазницаНакопленная;
Разница = ?(ЧасыВИтоге > Разница, 8 - Разница, ЧасыВИтоге - Разница);
РазницаНакопленная = ЧасыМин8 - Часы + Разница;
ЧасовДоступно = ЧасовДоступно - ЧасыВИтоге;
СтрокаДанных.ЧасыВИтоге = ЧасыВИтоге;
КонецЦикла;
ПоказатьНужно ещё бы потестировать, но на вашем примере работает.
Прикрепленные файлы:
4)
Допустим работ 10, но по долям попадут не все, сначала у кого доля распределения (Часы) больше, те в приоритете, как только закончилось время (80), цикл прерывается и та работа которая не попала, остается без чудесного Иванова, но есть и другие сотрудники у которых доля к этой работе больше, они и займутся ей!
"И что значит это "должен завершится на работе с наименьшим числом"? Числом чего? Может номером? Можете объяснить?"
Допустим работ 10, но по долям попадут не все, сначала у кого доля распределения (Часы) больше, те в приоритете, как только закончилось время (80), цикл прерывается и та работа которая не попала, остается без чудесного Иванова, но есть и другие сотрудники у которых доля к этой работе больше, они и займутся ей!
(7) Это я уже сделал, у меня формируется общая таблица по всем работам и сотрудникам, с долях к той или иной работе. В этой таблице повторяются сотрудники с различными работами и их время распределено на то количество, в котором они участвуют! если у сотрудника 1 работа и 176 часов, то доля 176, если 2 работы, то у одной например 100 у другой 76 и т.п.
(9)Сделано, но не до конца, теперь мне бы из этой таблице проанализировать кого нужно отсеять, а кто влезет в предел по часам и по сумме.
Что-то вроде этого?"
для каждого Работа из Объект.Работы Цикл
Отбор = Новый Структура;
Отбор.Вставить("Работа", Работа.Работа);
МассивОтбора = ТаблицаДанных.НайтиСтроки(Отбор);
НакапливаемаяСумма = 0;
Для Каждого Стр Из МассивОтбора Цикл
НакапливаемаяСумма = НакапливаемаяСумма + Стр.СуммаПоСотруднику;
Если Работа.СуммаПлана < НакапливаемаяСумма Тогда Прервать; КонецЕсли;
КонецЦикла;
конецЦикла;
ПоказатьЧто-то вроде этого?"
А попробуйте так:
1. делимчасы в проекте и общую сумму часов, которую нужно распределить на число кратности
2. вызываем ОбщегоНазначенияКлиентСервер.РаспределитьСуммуПропорциональноКоэффициентам( делёнаяСуммаЧасов, массивЧасовПроекта);
3. числа из результирующего массива умножаем на число кратности.
UPD: в шаге 1 часы в поекте делить не надо
1. делим
2. вызываем ОбщегоНазначенияКлиентСервер.РаспределитьСуммуПропорциональноКоэффициентам( делёнаяСуммаЧасов, массивЧасовПроекта);
3. числа из результирующего массива умножаем на число кратности.
UPD: в шаге 1 часы в поекте делить не надо