gifts2017

Особенности ВИСОКОСНОГО года в СТАНДАРТНЫХ ОТЧЕТАХ

Опубликовал anry mc (AnryMc) в раздел Программирование - Практика программирования

Иногда требуется сравнивать текущий период с аналогичным прошлого года (Например, в "Отчете о финансовых результатах"), но стандартные методы в случае високосного года могут дать "неправильный" результат...

    В  стандартных отчетах для получения данных аналогичного периода предыдущего года используется встроенная функция примерно такого вида:

ДобавитьМесяц(ДатаОкончанияТекущегоПериода, -12) ;

Если отчет строиться поквартально, то ничего страшного, т.к. февраль не является концом квартала.

Но если получать данные по месяцам - в случае предыдущего високосного года получим:

ДатаОкончанияТекущегоПериода='20130228';

ДатаОкончанияПредыдущегоПериода= ДобавитьМесяц(ДатаОкончанияТекущегоПериода, -12);

ДатаОкончанияПредыдущегоПериода ='20120228'; Хотя 2012 год високосный и в феврале в нем 29 дней!!! 

 И если ДатаОкончанияПредыдущегоПериода используется для получения Бухгалтерских итогов (или других данных) за период, то соответственно выпадут движения за 29/02/2012 !!!

Чтобы этого недопустить я использую конструкцию:

ДатаОкончанияПредыдущегоПериода= КонецМесяца(ДобавитьМесяц(ДатаОкончанияТекущегоПериода, -12));

См. также

Подписаться Добавить вознаграждение

Комментарии

1. q_i 09.03.13 13:37
Не очень понятно почему результат ДобавитьМесяц('20130228', -12) = '20120228' называется в статье "неправильным". Я бы как раз очень удивился, если бы вдруг оно выдало '20120229'.
Кстати говоря, даже если бы год и не был бы високосным - всё равно пришлось бы использовать как минимум КонецДня() чтобы не выпали обороты за 28/02.
hogik; Said; Diversus; +3 Ответить 2
2. anry mc (AnryMc) 09.03.13 16:06
(1) q_i,

Не очень понятно почему результат ДобавитьМесяц('20130228', -12) = '20120228' называется в статье "неправильным".


Потому, что во всех виденным мною стандартных отчетах от 1С для получения данных прошлого периода используется метод:
 ДобавитьМесяц( , -12)


Во всех случаях конец месяца текущего периода и прошлого совпадает: 31 января, 28 февраля, ... 31 декабря. Да и чаще в стандартные периоды (квартал) - февраль не попадает.

Но всё таки иногда нужен и он (февраль) и может случиться неприятность о которой я и предупреждаю здесь...
3. Владимир (hogik) 09.03.13 16:17
(2)
Вопрос к Вам.
А какой результат будет при выполнении:
ДобавитьМесяц('20120229', -12)
4. anry mc (AnryMc) 09.03.13 16:42
(3) hogik,

Как не странно, но
ДобавитьМесяц('20120229', -12)
='20110228' - просто чудо!
5. Владимир (hogik) 09.03.13 17:12
(4)
;-)
Тогда еще проще проверьте:
ДобавитьМесяц('20130131', +1)
ДобавитьМесяц('20130228', -1)
6. anry mc (AnryMc) 09.03.13 19:12
(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 Дата

Эксперемент должен быть завершён выводом...
7. Владимир (hogik) 09.03.13 19:27
(6)
"Особенностью функции является то, что она учитывает количество дней в месяце и возвращает тот же день результирующего месяца, который имела начальная дата. Исключение составляют случаи, когда в результирующем месяце дней недостаточно, тогда выводится максимальная дата в месяце."(с)
Примерно, так: http://www.about1c.ru/?prog77-function-addmonth
И это никак не связано с високосным годом. ;-)
8. anry mc (AnryMc) 10.03.13 10:53
(7) hogik,

Код из типовой конфигурации:

// Процедура устанавливает границы периода построения отчета.
//
// Параметры:
//  Шаг          - число, количество стандартных периодов, на которое необходимо
//                 сдвигать период построения отчета;
//
Процедура ИзменитьПериод(Шаг)

	Если Периодичность = Перечисления.Периодичность.Месяц Тогда
		мДатаКонцаПериодаОтчета  = КонецМесяца(ДобавитьМесяц(мДатаКонцаПериодаОтчета, Шаг));
		мДатаНачалаПериодаОтчета = НачалоМесяца(мДатаКонцаПериодаОтчета);

	ИначеЕсли Периодичность = Перечисления.Периодичность.Квартал Тогда
		мДатаКонцаПериодаОтчета  = КонецКвартала(ДобавитьМесяц(мДатаКонцаПериодаОтчета, Шаг*3));
		мДатаНачалаПериодаОтчета = НачалоКвартала(мДатаКонцаПериодаОтчета);

	КонецЕсли;

	ПоказатьПериод();

КонецПроцедуры // ИзменитьПериод()
...Показать Скрыть


Пока все хорошо...
Но вот дальше...

	
// Расчет итогов за аналогичный период прошлого года
	мБухИтоги22.РассчитатьИтоги("Хозрасчетный", Итоги, "Сумма", "Счет,КорСчет", НачалоГода (ДобавитьМесяц(мДатаНачалаПериодаОтчета,-12)), ДобавитьМесяц(мДатаКонцаПериодаОтчета, -12), , , , , , "Организация", Организация);


Что мы получим за фавраль 2012 года? Правильно - исчезнет 29 число!
9. andrewks 10.03.13 10:58
(8) AnryMc, ну, это скорее говорит о кривизне рук писателей типовых, нежели о кривизне рук писателей платформы.

скажем так: со стороны ДобавитьМесяц() и её описания всё нормально. а вот код в типовой неверный
10. anry mc (AnryMc) 10.03.13 11:05
(9) andrewks,

А я и не гроворил о платформе...

(хотя - наверно название статьи наводит на эту мысль, но трудно дать объемное и Короткое определение.)
11. Владимир (hogik) 10.03.13 17:36
(8)
... (AnryMc).
Поставил "плюс" под (1) и (9) сообщениями.
И ничего не поставил под публикацию. ;-)
12. anry mc (AnryMc) 27.05.13 09:03
(11) hogik,

А почему Вы думаете, что цель публикации только получить "+"?
А как насчет желания поделиться "граблями" на которые наткнулся сам и хочешь предупредить других?
13. Владимир (hogik) 27.05.13 16:58
(12)
"А почему Вы думаете, что цель публикации только получить "+"? "(с)
А почему Вы думаете, что я так думаю? :-) :-) :-)
В (11) сообщении я образно выразил свое мнение по теме "Особенности ВИСОКОСНОГО года...". Т.е. подвел итог нашей мартовской беседе. Ну, нет никаких особенностей в годе.
Хотя, думаю, имеет смысл обратить внимание других людей на "грабли" ИХ понимания функции ДобавитьМесяц().
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа