powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / [игнор отключен] [закрыт для гостей] / Алгоритм расчёта времени при пересечении периодов
7 сообщений из 7, страница 1 из 1
Алгоритм расчёта времени при пересечении периодов
    #38413785
Rudge
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Возникла следующая задача:

Имеются транспортные средства (ТС), которые расставляются во времени по проектам и подразделениям в документе (форма обычная).

Табличная часть документа расстановки:

ТС Проект Подразделение ДатаНачала ДатаОкончания КоличествоЧасов


Сначала пользователь расставляет нужные ему ТС, потом нажав кнопку "Рассчитать время" должно рассчитаться время в колонке "КоличествоЧасов" по формуле:

t(ТС, Дата) = 12 часов / К

Где t(ТС, Дата) - Время использования ТС в заданный день, К - количество проектов, на которых участвует данное ТС в заданный день. Например, если 15.05.13 выбранное ТС по данным табличной части документа работает на 4 проектах, то время работы на каждом проекте равномерно и равно 12/4 = 3 ч.

Соответственно, за заданный период ДатаНачала - ДатаОкончания в колонке "Количество Часов" должно просуммироваться время каждого дня, рассчитанного по формуле выше.

Я реализовав этот алгоритм через циклы, на небольших объёмах данных (количество ТС, проектов и продолжительность периодов ДатаНачала и ДатаОкончания) он считает достаточно быстро. На периодах планирования год (максимально 01.01.13 - 31.12.13) ОЧЕНЬ долго считает, я так и не дождался его окончания. Осложняется ещё и тем, что мне нужно выдать рассчитанное время с разбивкой помесячно, т.е. строку типа:

ТС1 Проект1 Подразделение1 01.01.13 15.03.13 КоличествоЧасов

Мне нужно сначала разбить на 3 строки и рассчитать для каждой:

ТС1 Проект1 Подразделение1 01.01.13 31.01.13 КоличествоЧасов
ТС1 Проект1 Подразделение1 01.02.13 28.02.13 КоличествоЧасов
ТС1 Проект1 Подразделение1 01.03.13 15.03.13 КоличествоЧасов



Привожу свой алгоритм:

Код: html
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
// ПланРасстановкиПомесячно - табличная часть док-та с разбивкой помесячно

МойПлан = ПланРасстановкиПомесячно.Выгрузить();
	
НовыйПлан = ПланРасстановкиПомесячно.Выгрузить();
НовыйПлан.Очистить();
	
Для Каждого ТС Из ТС_Список Цикл
		
	//Выгружаю исходную расстановку в переменную таб.значений с отбором для конкретного ТС
        Отбор = Новый Структура();
	Отбор.Вставить("ТС", ТС);
	ТабТС = МойПлан.Скопировать(Отбор);
	
        //Рассчитываю в цикле для выбранного ТС "Количество часов" для каждого дня и суммирую	
	Для Каждого Стр Из ТабТС Цикл 
			
		Стр.КоличествоЧасов = 0;
		
		КолвоДней = (Стр.КонецПериода - Стр.НачалоПериода)/86400 + 1;
		
		Стр.КоличествоДней = КолвоДней;
		
		ДатаНач = Стр.НачалоПериода;
		
		Для К = 1 по КолвоДней Цикл
			
			Стр.КоличествоЧасов = Стр.КоличествоЧасов + 12 / КоличествоПроектовВДеньТС(ДатаНач, Стр.ТС, Стр.Проект, Стр.Подразделение, Стр.НомерСтроки);
			
			ДатаНач = ДатаНач + 86400;
			
		КонецЦикла;	
		
	КонецЦикла;
		
		
	Для Каждого СтрокаТЗ Из ТабТС Цикл 
			
		ЗаполнитьЗначенияСвойств(НовыйПлан.Добавить(), СтрокаТЗ)
			
	КонецЦикла;
				
КонецЦикла;


// возвращает количество проектов для ТС в заданный день
Функция КоличествоПроектовВДеньТС(Дата, ТС, Проект, Подразделение, НомерСтроки)
	
	Колво = 1;
	
	Для Каждого Стр Из ТабТС Цикл 
		
           //Тут замудрённое условие проверки, можете его игнорировать в контексте данной задачи

		Если НомерСтроки <> Стр.НомерСтроки И Дата >= Стр.НачалоПериода И Дата <= Стр.КонецПериода И ТС = Стр.ТС И Проект <> Стр.Проект И ЗначениеЗаполнено(Стр.Проект) И ЗначениеЗаполнено(Проект)
			ИЛИ НомерСтроки <> Стр.НомерСтроки И Дата >= Стр.НачалоПериода И Дата <= Стр.КонецПериода И ТС = Стр.ТС И (НЕ ЗначениеЗаполнено(Стр.Проект) ИЛИ НЕ ЗначениеЗаполнено(Проект)) Тогда
			
			Колво = Колво + 1;
			
		КонецЕсли;
				
	КонецЦикла;
	
	Возврат Колво;
	
КонецФункции




Подскажите, можно ли как-то оптимизировать данный алгоритм расчёта?
...
Рейтинг: 0 / 0
Алгоритм расчёта времени при пересечении периодов
    #38413786
Zerro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А ЗАПРОСОМ НЕ?
...
Рейтинг: 0 / 0
Алгоритм расчёта времени при пересечении периодов
    #38413788
Rudge
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторА ЗАПРОСОМ НЕ?

Что именно запросом? Поясните, плиз.
...
Рейтинг: 0 / 0
Алгоритм расчёта времени при пересечении периодов
    #38413814
Zerro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
все)
делаешь подзапрос там групируешь по КоличествоПроектовВДеньТС.. и в следущем запросе пересекаешь 2 таблицы с делением... циклы зло))
...
Рейтинг: 0 / 0
Алгоритм расчёта времени при пересечении периодов
    #38413831
Rudge
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И ещё вопрос: насколько я знаю, максимальное количество строк в табличной части 99 999.
Вполне вероятно, что у меня может возникнуть ситуация, когда количество строк выйдет за этот предел. Как в этом случае поведёт себя система?
...
Рейтинг: 0 / 0
Алгоритм расчёта времени при пересечении периодов
    #38413884
Программист 1с
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
RudgeИ ещё вопрос: насколько я знаю, максимальное количество строк в табличной части 99 999.
Вполне вероятно, что у меня может возникнуть ситуация, когда количество строк выйдет за этот предел. Как в этом случае поведёт себя система?Разбивайте на несколько документов.
...
Рейтинг: 0 / 0
Алгоритм расчёта времени при пересечении периодов
    #38413885
Zerro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Программист 1сRudgeИ ещё вопрос: насколько я знаю, максимальное количество строк в табличной части 99 999.
Вполне вероятно, что у меня может возникнуть ситуация, когда количество строк выйдет за этот предел. Как в этом случае поведёт себя система?Разбивайте на несколько документов.
))) или табличных частей
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / [игнор отключен] [закрыт для гостей] / Алгоритм расчёта времени при пересечении периодов
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]