В стандартных отчетах для получения данных аналогичного периода предыдущего года используется встроенная функция примерно такого вида:
ДобавитьМесяц(ДатаОкончанияТекущегоПериода, -12) ;
Если отчет строиться поквартально, то ничего страшного, т.к. февраль не является концом квартала.
Но если получать данные по месяцам — в случае предыдущего високосного года получим:
ДатаОкончанияТекущегоПериода='20130228';
ДатаОкончанияПредыдущегоПериода= ДобавитьМесяц(ДатаОкончанияТекущегоПериода, -12);
Хотя 2012 год високосный и в феврале в нем 29 дней!!!
='20120228';ДатаОкончанияПредыдущегоПериода
И если ДатаОкончанияПредыдущегоПериода используется для получения Бухгалтерских итогов (или других данных) за период, то соответственно выпадут движения за 29/02/2012 !!!
Чтобы этого недопустить я использую конструкцию:
ДатаОкончанияПредыдущегоПериода= КонецМесяца(ДобавитьМесяц(ДатаОкончанияТекущегоПериода, -12));
Не очень понятно почему результат ДобавитьМесяц(‘20130228’, -12) = ‘20120228’ называется в статье «неправильным». Я бы как раз очень удивился, если бы вдруг оно выдало ‘20120229’.
Кстати говоря, даже если бы год и не был бы високосным — всё равно пришлось бы использовать как минимум КонецДня() чтобы не выпали обороты за 28/02.
(1) q_i,
Потому, что во всех виденным мною стандартных отчетах от 1С для получения данных прошлого периода используется метод:
Во всех случаях конец месяца текущего периода и прошлого совпадает: 31 января, 28 февраля, … 31 декабря. Да и чаще в стандартные периоды (квартал) — февраль не попадает.
Но всё таки иногда нужен и он (февраль) и может случиться неприятность о которой я и предупреждаю здесь…
(2)
Вопрос к Вам.
А какой результат будет при выполнении:
ДобавитьМесяц(‘20120229’, -12)
(3) hogik,
Как не странно, но
=’20110228′ — просто чудо!
(4)
😉
Тогда еще проще проверьте:
ДобавитьМесяц(‘20130131’, +1)
ДобавитьМесяц(‘20130228’, -1)
(5) hogik,
ДобавитьМесяц(‘20120131’, +1) 29.02.2012 00:00:00 Дата
ДобавитьМесяц(‘20130228’, -1) 28.01.2013 00:00:00 Дата
ДобавитьМесяц(‘20130228’, +1) 28.03.2013 00:00:00 Дата
ДобавитьМесяц(‘20130131’, +1) 28.02.2013 00:00:00 Дата
ДобавитьМесяц(‘20120229’, +1) 29.03.2012 00:00:00 Дата
ДобавитьМесяц(‘20120229’, +3) 29.05.2012 00:00:00 Дата
Эксперемент должен быть завершён выводом…
(6)
http://www.about1c.ru/?prog77-function-addmonth
«Особенностью функции является то, что она учитывает количество дней в месяце и возвращает тот же день результирующего месяца, который имела начальная дата. Исключение составляют случаи, когда в результирующем месяце дней недостаточно, тогда выводится максимальная дата в месяце.»(с)
Примерно, так:
И это никак не связано с високосным годом. 😉
(7) hogik,
Код из типовой конфигурации:
Показать
Пока все хорошо…
Но вот дальше…
Что мы получим за фавраль 2012 года? Правильно — исчезнет 29 число!
(8) ну, это скорее говорит о кривизне рук писателей типовых, нежели о кривизне рук писателей платформы.
скажем так: со стороны ДобавитьМесяц() и её описания всё нормально. а вот код в типовой неверный
(9) andrewks,
А я и не гроворил о платформе…
(хотя — наверно название статьи наводит на эту мысль, но трудно дать объемное и Короткое определение.)
(8)
… (AnryMc).
Поставил «плюс» под (1) и (9) сообщениями.
И ничего не поставил под публикацию. 😉
(11) hogik,
А почему Вы думаете, что цель публикации только получить «+»?
А как насчет желания поделиться «граблями» на которые наткнулся сам и хочешь предупредить других?
(12)
«А почему Вы думаете, что цель публикации только получить «+»? «(с)
А почему Вы думаете, что я так думаю? 🙂 🙂 🙂
В (11) сообщении я образно выразил свое мнение по теме «Особенности ВИСОКОСНОГО года…». Т.е. подвел итог нашей мартовской беседе. Ну, нет никаких особенностей в годе.
Хотя, думаю, имеет смысл обратить внимание других людей на «грабли» ИХ понимания функции ДобавитьМесяц().