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

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

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

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

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

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

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

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

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

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

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

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

13 Comments

  1. q_i

    Не очень понятно почему результат ДобавитьМесяц(‘20130228’, -12) = ‘20120228’ называется в статье «неправильным». Я бы как раз очень удивился, если бы вдруг оно выдало ‘20120229’.

    Кстати говоря, даже если бы год и не был бы високосным — всё равно пришлось бы использовать как минимум КонецДня() чтобы не выпали обороты за 28/02.

    Reply
  2. AnryMc

    (1) q_i,

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

    Потому, что во всех виденным мною стандартных отчетах от 1С для получения данных прошлого периода используется метод:

     ДобавитьМесяц( , -12)

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

    Но всё таки иногда нужен и он (февраль) и может случиться неприятность о которой я и предупреждаю здесь…

    Reply
  3. hogik

    (2)

    Вопрос к Вам.

    А какой результат будет при выполнении:

    ДобавитьМесяц(‘20120229’, -12)

    Reply
  4. AnryMc

    (3) hogik,

    Как не странно, но

    ДобавитьМесяц(‘20120229’, -12)

    =’20110228′ — просто чудо!

    Reply
  5. hogik

    (4)

    😉

    Тогда еще проще проверьте:

    ДобавитьМесяц(‘20130131’, +1)

    ДобавитьМесяц(‘20130228’, -1)

    Reply
  6. AnryMc

    (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 Дата

    Эксперемент должен быть завершён выводом…

    Reply
  7. hogik

    (6)

    «Особенностью функции является то, что она учитывает количество дней в месяце и возвращает тот же день результирующего месяца, который имела начальная дата. Исключение составляют случаи, когда в результирующем месяце дней недостаточно, тогда выводится максимальная дата в месяце.»(с)

    Примерно, так: http://www.about1c.ru/?prog77-function-addmonth

    И это никак не связано с високосным годом. 😉

    Reply
  8. AnryMc

    (7) hogik,

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

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

    Показать

    Пока все хорошо…

    Но вот дальше…

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

    Что мы получим за фавраль 2012 года? Правильно — исчезнет 29 число!

    Reply
  9. andrewks

    (8) ну, это скорее говорит о кривизне рук писателей типовых, нежели о кривизне рук писателей платформы.

    скажем так: со стороны ДобавитьМесяц() и её описания всё нормально. а вот код в типовой неверный

    Reply
  10. AnryMc

    (9) andrewks,

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

    (хотя — наверно название статьи наводит на эту мысль, но трудно дать объемное и Короткое определение.)

    Reply
  11. hogik

    (8)

    … (AnryMc).

    Поставил «плюс» под (1) и (9) сообщениями.

    И ничего не поставил под публикацию. 😉

    Reply
  12. AnryMc

    (11) hogik,

    А почему Вы думаете, что цель публикации только получить «+»?

    А как насчет желания поделиться «граблями» на которые наткнулся сам и хочешь предупредить других?

    Reply
  13. hogik

    (12)

    «А почему Вы думаете, что цель публикации только получить «+»? «(с)

    А почему Вы думаете, что я так думаю? 🙂 🙂 🙂

    В (11) сообщении я образно выразил свое мнение по теме «Особенности ВИСОКОСНОГО года…». Т.е. подвел итог нашей мартовской беседе. Ну, нет никаких особенностей в годе.

    Хотя, думаю, имеет смысл обратить внимание других людей на «грабли» ИХ понимания функции ДобавитьМесяц().

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *