Обработка не учитывает года, куда копать?

1. user973528 14.01.20 12:12 Сейчас в теме
Здравствуйте, написал обработку, заполняю период с 01.01.2017 по 01.01.2019, обработка рассчитывает только значения которые я указал за 01.01.2017, то есть не учитывает года. Куда эти года можно добавить чтобы цикл выполнялся правильно? Заранее спасибо

ДатаНач = 01.01.2017
ДатаКон = 01.01.2019

Если Месяц(ДатаНач) = Месяц(ДатаКон) ИЛИ Месяц(ДатаНач) <> Месяц(ДатаКон) Тогда
		Для i = 0 По Месяц(ДатаКон) - Месяц(ДатаНач) Цикл
				
                             ДатаНачТемп = НачалоМесяца(ДобавитьМесяц(ДатаНач, i));	

			     ДатаКонТемп = КонецМесяца(ДобавитьМесяц(ДатаНач, i));	

			
			Запрос.УстановитьПараметр("ДатаНач", Новый Граница(НачалоДня(ДатаНачТемп), ВидГраницы.Включая));	
			Запрос.УстановитьПараметр("ДатаКон", Новый Граница(КонецДня(ДатаКонТемп), ВидГраницы.Включая));
			Запрос.УстановитьПараметр("ДатаНачП", НачалоДня(ДатаНачТемп));	
			Запрос.УстановитьПараметр("ДатаКонП", КонецДня(ДатаКонТемп));	
			Запрос.УстановитьПараметр("Организация", Организация);
			Запрос.УстановитьПараметр("Контрагент", Контрагент);
			Запрос.УстановитьПараметр("Договор", ДоговорКонтрагента);
			Запрос.УстановитьПараметр("Счет", Счет);
	
			РезультатЗапроса = Запрос.Выполнить();
			
			ТЗ = РезультатЗапроса.Выгрузить();
	
			ТЗ.Колонки.Добавить("ДнейПользованияЗаймом");
			ТЗ.Колонки.Добавить("СуммаНачисленная");
			ТЗ.Колонки.Добавить("ДатаНачала");
Показать
По теме из базы знаний
Вознаграждение за ответ
Показать полностью
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. tolyan_ekb 104 14.01.20 12:23 Сейчас в теме
(1)Пройдись отладчиком. Какая максимальная разность может быть для выражения Месяц(ДатаКон) - Месяц(ДатаНач)? Явно не 2 года.
3. user973528 14.01.20 12:25 Сейчас в теме
(2) 12 месяцев всегда, независимо какой год я ставлю
4. tolyan_ekb 104 14.01.20 12:29 Сейчас в теме
(3)Я условие не понял. Зачем проверка на неравенство месяцев, сделай нормальную проверку по датам и будет счастье.
6. Kovekh 14.01.20 12:35 Сейчас в теме
(3)Уважаемый, месяц возвращает что? Месяц без даты, он же число. В году сколько месяцев? 12. Вот он у вас и пройдёт 12 раз)

Месяц (Month)
Синтаксис:
Месяц(<Дата>)
Параметры:
<Дата> (обязательный)
Тип: Дата.
Исходная дата.
Возвращаемое значение:
Тип: Число.
Месяц в указанной дате.


Так что смотрите внимательно на вашу конструкцию
Для i = 0 По Месяц(ДатаКон) - Месяц(ДатаНач) Цикл
7. Kovekh 14.01.20 12:38 Сейчас в теме
(6)
РазницаВДнях = (НачалоДня(ДатаОкончания) - НачалоДня(ДатаНачала)) / (60 * 60 * 24);


Как пример. Как узнать разницу в месяцах догадаетесь, думаю. И уже по этой разнице в месяцах идите циклом
8. user973528 14.01.20 12:46 Сейчас в теме
(6) Сделал так

&НаКлиенте
Функция КоличествоМесяцевМеждуДатами(НачальнаяДата, КонечнаяДата)
	
	МесяцНачальнойДаты = Месяц(НачальнаяДата);
	
	МесяцКонечнойДаты = Месяц(КонечнаяДата);
	
	КоличествоЛет = Год(КонечнаяДата) - Год(НачальнаяДата);
	
	КоличествоМесяцев = КоличествоЛет * 12 - МесяцНачальнойДаты + МесяцКонечнойДаты; 
	
	Возврат КоличествоМесяцев;
	
КонецФункции
Показать


Для i = 0 По КоличествоМесяцев Цикл
9. Kovekh 14.01.20 12:47 Сейчас в теме
(8)Нууууу, можно, конечно, но слишком уж в дебри лезете)

С вашим подходом можно и в запрос это всё запихать чтобы воспользоваться функцией РазностьДат там)
12. sssss_aaaaa_2011 14.01.20 12:54 Сейчас в теме
(8) Фигней страдаете, батенька. Очередной изобретатель разницы дат в месяцах, без указания того, в каких месяцах. В январях или февралях? Да еще и високосных? Что за параноидальное стремление работать не с датой, а с ее отдельными частями?
11. user856012 13 14.01.20 12:51 Сейчас в теме
(1)
Если Месяц(ДатаНач) = Месяц(ДатаКон) ИЛИ Месяц(ДатаНач) <> Месяц(ДатаКон) Тогда
Феерично: это условие выполняется всегда - зачем оно вообще? Что автор хотел в нем проверить?
13. sssss_aaaaa_2011 14.01.20 12:59 Сейчас в теме
(1) Кстати, о птичках.
А запрос в цикле уже стал кошерным и не нагружающим систему?
А почему для расчета срока пользования займом вдруг используется месяц, а не дни? Какая-то старая схема с условными днями в месяцах и годах?
5. dshershen86 14.01.20 12:33 Сейчас в теме
ДатаТек = НачалоМесяца(ДатаНач)
Пока ДатаТек<=НачалоМесяца(ДатаКон) цикл

*****************************
*****************************
*****************************
ДатаТек = ДобавитьМесяц(ДатаТек ,1)
КонецЦикла
zlaya_alena; +1 Ответить
10. sssss_aaaaa_2011 14.01.20 12:51 Сейчас в теме
1. Если Месяц(ДатаНач) = Месяц(ДатаКон) ИЛИ Месяц(ДатаНач) <> Месяц(ДатаКон)
Не расскажете в каком случае сие условие станет ложным? Если не сможете, то может расскажете какой смысл в этом условии?
2. Зачем идиотские пляски с номерами месяцев, которые, кстати, повторяются в годах (вы не знали об этом?), если можно просто цикл по временным датам с увеличением их на единицу в каждом проходе цикла?
14. v3rter 15.01.20 00:41 Сейчас в теме
Прямо напрашивается в запрос:
СГРУППИРОВАТЬ ПО 
 НАЧАЛОПЕРИОДА(<ВидМоегоДокумента>.Ссылка.Дата, МЕСЯЦ),
15. alekshihanov 16.01.20 12:01 Сейчас в теме
// Процедура вычисляет количество лет, месяцев и дней между двумя датами
//
// Параметры
//  Дата1	– дата, первая дата (более поздняя, часто текущая, стаж определяется по состоянию на эту дату)
//  Дата2	– дата, вторая дата (ранняя дата, с нее начинается "течение" стажа)
//  Лет		– Число, в этот параметр будет записано кол-во лет между двумя датами (Дата1-Дата2)
//  Месяцев	– Число, в этот параметр будет записано кол-во месяцев между двумя датами (Дата1-Дата2)
//  Дней	– Число, в этот параметр будет записано кол-во дней между двумя датами (Дата1-Дата2)
//
Процедура РазобратьРазностьДат(Дата1, Дата2, Лет = 0, Месяцев = 0, Дней = 0) Экспорт
	
	Лет		= 0;
	Месяцев	= 0;
	Дней	= 0;
	Если Дата1 > Дата2 Тогда
		
		ВременнаяДата = Дата1;
		Если День(ВременнаяДата) < День(Дата2) Тогда
			Дней = (ВременнаяДата - ДобавитьМесяц(ВременнаяДата,-1))/86400;
			ВременнаяДата = ДобавитьМесяц(ВременнаяДата,-1);
		КонецЕсли;
		Если Месяц(ВременнаяДата) < Месяц(Дата2) Тогда
			ВременнаяДата = ДобавитьМесяц(ВременнаяДата,-12);
			Месяцев = 12;
		КонецЕсли;
		Лет		= Макс(			 Год(ВременнаяДата)		- Год(Дата2),	0);
		Месяцев	= Макс(Месяцев	+ Месяц(ВременнаяДата)	- Месяц(Дата2),	0);
		Дней	= Макс(Дней		+ День(ВременнаяДата)	- День(Дата2),	0);
		
		// скорректируем отображаемое значение, если "вмешалось" разное количество дней в месяцах
		Если Дата2 <> (ДобавитьМесяц(Дата1,-Лет*12-Месяцев)-Дней*86400) Тогда
			Дней = Дней + ((ДобавитьМесяц(Дата1,-Лет*12-Месяцев)-Дней*86400) - Дата2)/86400;
			//(День(КонецМесяца(Дата2)) - День(НачалоМесяца(Дата2))) - (День(КонецМесяца(ДобавитьМесяц(Дата1,-1))) - День(НачалоМесяца(ДобавитьМесяц(Дата1,-1))));
		КонецЕсли;
		
	КонецЕсли;

КонецПроцедуры	// РазобратьРазностьДат
Показать
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот