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

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))));
		КонецЕсли;
		
	КонецЕсли;

КонецПроцедуры	// РазобратьРазностьДат
Показать
Оставьте свое сообщение
Вакансии
Программист 1С
Казань
зарплата от 150 000 руб.
Полный день

Программист 1С:ERP
Москва
зарплата от 100 000 руб.
Полный день

Разработчик 1С
Москва
зарплата от 200 000 руб. до 300 000 руб.
Полный день

Программист 1С (удаленно)
Самара
зарплата от 230 000 руб. до 230 000 руб.
Полный день

Руководитель группы разработки 1С
Москва
зарплата от 250 000 руб. до 250 000 руб.
Полный день