избежать 30 февраля в запросе

1. Johney20 18.10.18 12:41 Сейчас в теме
Есть запрос, который получает график платежей (рис.1) .

Дата платежа формируется от периода затрат, способа платежа и указанного пользователем числа оплаты.

ВЫБОР
	КОГДА Итог_Вт.СпособОплаты = &СпособОплатыДоНачалаОП
		ТОГДА ДОБАВИТЬКДАТЕ(ДОБАВИТЬКДАТЕ(Итог_Вт.ПериодЗатрат.ПериодЗатрат, МЕСЯЦ, -1), ДЕНЬ, &СрокОплаты - 1)
	ИНАЧЕ ВЫБОР
			КОГДА Итог_Вт.СпособОплаты = &СпособОплатыСНачалаОП
				ТОГДА ДОБАВИТЬКДАТЕ(Итог_Вт.ПериодЗатрат.ПериодЗатрат, ДЕНЬ, &СрокОплаты - 1)
			ИНАЧЕ ВЫБОР
					КОГДА Итог_Вт.СпособОплаты = &СпособОплатыПослеНачалаОП
						ТОГДА ДОБАВИТЬКДАТЕ(ДОБАВИТЬКДАТЕ(Итог_Вт.ПериодЗатрат.ПериодЗатрат, МЕСЯЦ, 1), ДЕНЬ, &СрокОплаты - 1)
				КОНЕЦ
		КОНЕЦ
КОНЕЦ
Показать


Данный механизм работает, но в случае, если указать число 30 или 31, то, соответственно, проблемы с февралем, и вместо, например, 29.02.2018 формируется дата 02.03.2018.

Вот как избежать такой момент в запросе?
Прикрепленные файлы:
По теме из базы знаний
Найденные решения
8. Boneman 298 18.10.18 13:15 Сейчас в теме
(7) я же написал тебе
ДОБАВИТЬКДАТЕ(ДОБАВИТЬКДАТЕ(ПериодЗатрат, МЕСЯЦ, 1), ДЕНЬ, - 1);

Если у тебя в периоде 1 февраля, то она добавит месяц - получит 1 марта, потом отнимет 1 день, получит 29, или 28 февраля, смотря какой високосный или нет год.

т.е. не с количеством дней нужно заморачиваться, сколько прибавлять...а наоборот, отнимать 1 день, от первого числа следующего месяца.
А с календарем, система сама разберется
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. Xershi 1486 18.10.18 12:45 Сейчас в теме
(1) а в чем проблема то? В феврале 28 дней вы поставили 30. Значит и оплата должна быть через 30 дней, а не 30 числа, а это 02.03.2018.
4. Johney20 18.10.18 12:51 Сейчас в теме
(2) Так а мне нужно получить 29.02.2018 в таком случае. Оплата не каждые 30 дней, а каждого 30го числа каждого месяца.
5. Boneman 298 18.10.18 12:53 Сейчас в теме
(4) тогда делай, добавить к дате месяц, а потом добавить к дате -1 день. Получишь всегда последний день, месяца, независимо от количества дней в нем
6. Xershi 1486 18.10.18 12:54 Сейчас в теме
(4) 30 числа? Так в феврале нет 30 числа, в запрос тогда затычку ставьте, если февраль, то 28, а не 30.
3. Boneman 298 18.10.18 12:47 Сейчас в теме
(1) вопрос то методологический.
Если вы указываете срок оплаты 31 день, то она как должна считать ? 31 это обозначает сутки, или календарный месяц ? Что это вообще за параметр , откуда он берется ? Период затрат - я так понимаю, всегда первое число месяца так ?
С апрелем такая же проблема будет, там 30 дней, а у вас указано 31..получим 1 мая.
7. Johney20 18.10.18 13:08 Сейчас в теме
(3) Да, действительно. Здесь будут проблемы и с 31м числом. Суть в том, что оплата должна быть, например, каждого 31 числа каждого месяца Тогда получается, с месяцами, где 30 дней, например, взять апрель, при сроке оплаты - 31, дата оплаты 30.04.2018.

И вот как это в запросе написать..
8. Boneman 298 18.10.18 13:15 Сейчас в теме
(7) я же написал тебе
ДОБАВИТЬКДАТЕ(ДОБАВИТЬКДАТЕ(ПериодЗатрат, МЕСЯЦ, 1), ДЕНЬ, - 1);

Если у тебя в периоде 1 февраля, то она добавит месяц - получит 1 марта, потом отнимет 1 день, получит 29, или 28 февраля, смотря какой високосный или нет год.

т.е. не с количеством дней нужно заморачиваться, сколько прибавлять...а наоборот, отнимать 1 день, от первого числа следующего месяца.
А с календарем, система сама разберется
10. Xershi 1486 18.10.18 14:41 Сейчас в теме
(7) видите как вопрос кардинально поменялся?
50% решения это правильно поставленный вопрос!
1С умеет работать с месяцами и не важно сколько там дней.
Рекомендую также справку чаще читать там про такое пишут. Если подумать для чего!
9. antz 18.10.18 13:49 Сейчас в теме
ВЫБРАТЬ
	КОНЕЦПЕРИОДА(ДОБАВИТЬКДАТЕ(КОНЕЦПЕРИОДА(&Дата, МЕСЯЦ), ДЕНЬ, 1), МЕСЯЦ) КАК КонецСледующегоМесяца
alex-l19041; Boneman; +2 Ответить
Оставьте свое сообщение

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