Создаем отчет с заданной периодичностью на СКД

Учимся создавать отчет с заданной периодичностью с использованием СКД.

Когда-то мне была поставлена задача создать некий отчет, который будет предоставлять данные не просто за период, а за период с заданной периодичностью. Поясню: пользователь выбирает период, а также выбирает периодичность отчета, к примеру — месяц, и отчет должен вывести данные в разрезе стольких месяцев, сколько в заданном периоде месяцев. Такие решения есть в универсальном отчете, но это не тот вариант решения, который я для себя считаю приемлемым. Также видел на Инфостарте вариант решения, но и он не показалс я мне оптимальным. В данной статье я бы хотел поделиться своей реализацией данного вопроса.

Итак, начнем.

Для простоты понимая пример будем строить на одном простом оборотном регистре накопления.

В моем случае это регистр накопления «Незавершенное производство бухгалтерский учет».

Его параметры для примера укажем жестко (не через мягкое накладывание параметров на СКД):

Обратим внимание, периодичность виртуальной таблицы — «Запись».

Далее выбираем период из виртуальной таблицы и нужные нам поля.

Но, как было замечаено выше, период нам нужен в разрезе периодичности, поэтому поле «Период» я предлагаю вычислить следующим путем (несовсем красиво, но лучше вариантов я не видел):

Как видно из скриншота, в запрос передается параметр, который пользователь указывает на форме: Значение перечисления «Периодичность» — данное перечисление есть практически во всех типовых решениях.

Его доустпные типы укажем на вкладке «Параметры»:

Далее, в настройках СКД создаем таблицу, в ней — колонку «Период» (вертикальная группировка):

Далее следует важный момент настройки условного оформления:

Этой настройкой мы форматируем наш период, чтобы все было красиво и радовало глаз)

Вот, собственно, сами форматы:

Месяц: ДФ=’ММММ гггг «г.»‘

День: ДФ = дд.ММ.гггг

Неделя: ДФ = ‘»Неделя с» дд.ММ.гггг ‘

Квартал: ДФ = ‘к «квартал» гггг «г.»‘

Год: ДФ = ‘гггг «г.»‘

Декада: ДФ = ‘»Декада с» дд.ММ.гггг ‘

Полугодие: ДФ = ‘»Полугодие с» дд.ММ.гггг’

Вот и все. На выходе имеем замечательную картину:

37 Comments

  1. Lyns_owner

    Учимся создавать отчет с заданной периодичностью с использованием СКД.

    Перейти к публикации

    Reply
  2. Serj1C

    Можно вычисление периода перенести на клиент в вычисляемых полях СКД. Во-первых, период там указывается в кавычках («Месяц»), во-вторых, вычисляемые поля доступны для редактирования, т.е. можно перед выполнением СКД программно задать им формулу.

    Ну и в-третьих. Можно обратиться к набору данных.Зарос в схеме компоновки данных и и сделать ТекстЗапроса = СтрЗаменить(ТекстЗапроса, «Полугодие», «Квартал»), а потом выполнять отчет.

    Reply
  3. Smaylukk

    А зачем делать такую иерархию вложенных условий? В тексте запроса можно применять switch case условия:

    ВЫБОР КОГДА …. Тогда ….

    КОГДА …. Тогда ….

    КОГДА …. Тогда ….

    КОНЕЦ

    Гораздо более удобно и читабельно.

    А по решению — рабочее, тоже так делал и не только для периодичности.

    Reply
  4. Lyns_owner

    (2) Smaylukk, Согласен, но это я реализовывал довольно давно, уже не помню, почему так, видимо, другого не знал)

    Поменяю в публикации.

    Reply
  5. MRAK

    Точно

    КОГДА &Периодичность = ЗНАЧЕНИЕ(Перечисление.Периодичность.День)

    ТОГДА НАЧАЛОПЕРИОДА(&НачалоПериода, ДЕНЬ)

    а не

    КОГДА &Периодичность = ЗНАЧЕНИЕ(Перечисление.Периодичность.День)

    ТОГДА НАЧАЛОПЕРИОДА(МойРегистр.Период, ДЕНЬ)

    ?

    Reply
  6. Lyns_owner

    (4) MRAK, Спасибо) В изначальном варианте именно так) Ума не приложу, как так вышло).

    Reply
  7. wowkai

    интересная заметка. давно задавался вопросом как корректно и легко делать группировку по периодах в отчетах на СКД. Спасибо!

    Reply
  8. Laertid

    Я в свое время писал об этом:

    http://infostart.ru/public/104819/

    Упоминал три, кажется, варианта решения, один предложил, но замер времени работы показал, что принципиально ни один из них не лучше других. К сожалению.

    Reply
  9. Laertid

    М-м, пересмотрел свою публикацию — она предлагает точь в точь тот же выход, что и предложенный автором статьи тут. Только написана мною уже давно.

    Кстати, в итоге я теперь предпочитаю выносить этот ВЫБОР из запроса и создавать новое вычисляемое поле с такой же формулой. Разницы по нагрузке нету, а в разработке удобнее получается.

    Reply
  10. Lyns_owner

    (8) Laertid, Действительно, похоже. Но, насколько я понял, вы используете предложенный мной метод, как один из возможных. Я же описываю методику от и до. Кроме того, существование вашей публикации не делает мою публикацию хуже — это не основание понижать ее рейтинг.

    Reply
  11. maloi_a

    Замечание.

    «Когда ТаблицаДоходовИРасходов.ЭтоНачальныйОстаток = Истина»

    можно заменить на простое

    «Когда ТаблицаДоходовИРасходов.ЭтоНачальныйОстаток»

    или опустить совсем.

    Reply
  12. Lyns_owner

    (10) maloi_a, Согласен) Кстати, не обратил внимания на этот кусок кода, он для публикации не нужен.

    Reply
  13. agulaev

    По-моему, очень красивый пример. Спасибо за науку!

    Reply
  14. Den_D

    Спасибо. Как хорошо, что есть данный ресурс.

    Много нового можно узнать.

    Научится и стать более грамотным.

    Reply
  15. higs

    Как один из вариантов работы с СКД. Большое спасибо!!!

    Reply
  16. CagoBHuK

    А если выставить в параметрах виртуальной таблицы период в «Авто», то можно выбирать, как детализировать записи. 😉

    Reply
  17. sapervodichka

    Да, видимо он об этом не знает

    Reply
  18. Al777

    Статья мне очень сильно помогла при написании отчета на СКД, использовал 1-й вариант.

    Reply
  19. O-Planet

    Спас моего коллегу от ИЦИХа с гвоздями этой статьей. Он уже залазил в него, потратив весь день на секс с СКД. но я нашел ему эту статью. Вопрос решился за 5 минут… ))

    Reply
  20. Lyns_owner

    (18) O-Planet, Рад, что кому-то моя статья была полезна.

    Reply
  21. LSK85

    ох прекрасно, очень помогла. просто, легко и доступно.

    Reply
  22. kip32

    А не подскажите как сделать вывод дат даже тогда когда не было движений?

    Reply
  23. Lyns_owner

    (21) kip32, в типовых решениях я бы использовал регистр сведений «регламентированный производственный календарь» для решения такой задачи. Получал бы записи этого регистр с необходимой периодичностью, к ним бы тянул движения (если они есть).

    Reply
  24. CCMD

    Только начал изучать СКД.

    Поэтому прошу не пинать и ткнуть носом где описать условия периодичности? Где поле «Период»?

    И как настроить условное оформление?

    Что-то у меня не выходит получить такой отчет (((. Может есть рабочий пример?

    Помогите разобраться пожалуйста.

    Reply
  25. Lyns_owner

    (23) CCMD, Условия периодичности указываются в запросе. Поле «Период» берется из исходной таблицы (регистра).

    Условное оформление задается в макете СКД.

    Reply
  26. a.za4em

    а если потребуется получить остатки с заданной периодичностью? группировать записи уже не вариант, ибо это не приход/расход которые можно просто суммировать.

    Reply
  27. Lyns_owner

    (25) a.za4em, Для каких задач могут потребоваться остатки с заданной периодичностью?

    Напоминаю вам, что за постинг в данном форуме $m не начисляются.

    Reply
  28. AlenaSa

    Спасибо! рабочий и удобный вариант!

    (25) мой отчет выводит остатки на начало периода. Использую таблицу ОстаткиИОбороты и из нее вывожу только ресурс НачальныйОстаток

    Reply
  29. AlenaSa

    Не получается у меня исправить предыдущее мое сообщение (либо настройки браузера либо переборщил с блокировками провайдер), поэтому коррекцию его делаю в этом ответе. В СКД остатки с заданной периодичностью настраиваются двумя таблицами . Вот хороший пример http://1c-wiki.ru/wiki/%D0%95%D0%B6%D0%B5%D0%B4%D0%BD%D0%B5%D0%B2%D0%BD%D1%­8B%D0%B5_%D0%BE%D1%81%D1%82%D0%B0%D1%82%D0%BA%D0%B8

    Reply
  30. buzzzard

    ВЫБОР

    КОГДА ТаблицаДоходовИРасходов.ЭтоНачальныйОстаток = ИСТИНА

    ТОГДА ТаблицаДоходовИРасходов.Период

    КОГДА &Периодичность = Значение(Перечисление.Периодичность.День)

    ТОГДА НАЧАЛОПЕРИОДА(ТаблицаДоходовИРасходов.Период, ДЕНЬ)

    КОГДА &Периодичность = Значение(Перечисление.Периодичность.Месяц)

    ТОГДА НАЧАЛОПЕРИОДА(ТаблицаДоходовИРасходов.Период, МЕСЯЦ)

    КОГДА &Периодичность = Значение(Перечисление.Периодичность.Год)

    ТОГДА НАЧАЛОПЕРИОДА(ТаблицаДоходовИРасходов.Период, ГОД)

    КОГДА &Периодичность = Значение(Перечисление.Периодичность.Квартал)

    ТОГДА НАЧАЛОПЕРИОДА(ТаблицаДоходовИРасходов.Период, КВАРТАЛ)

    КОГДА &Периодичность = Значение(Перечисление.Периодичность.Неделя)

    ТОГДА НАЧАЛОПЕРИОДА(ТаблицаДоходовИРасходов.Период, НЕДЕЛЯ)

    КОГДА &Периодичность = Значение(Перечисление.Периодичность.Декада)

    ТОГДА НАЧАЛОПЕРИОДА(ТаблицаДоходовИРасходов.Период, ДЕКАДА)

    КОГДА &Периодичность = Значение(Перечисление.Периодичность.Полугодие)

    ТОГДА НАЧАЛОПЕРИОДА(ТаблицаДоходовИРасходов.Период, ПОЛУГОДИЕ)

    КОНЕЦ

    Размял пальцы…

    Reply
  31. sinto

    Зачем страшный кусок однообразного кода картинкой? Вообще нафига код картинкой показывать?

    Reply
  32. Lyns_owner

    (30)

    страшный кусок однообразного кода картинкой? Вообще нафига код картинкой показывать?

    Очередной комментарий ради комментария? Уважаемый, идите флудить в другое место.

    Reply
  33. sinto

    (31) ни в коем случае. Гораздо удобнее было показать листинг текстом. Тема была актуальная, вот и набивал с картинки руками — поэтому крик души )) Тема хорошая, помогла

    Reply
  34. Myxa

    Добрый день! А никто не сталкивался с задачей вывести отчет с разной периодичностью и промежуточными итогами, имею в виду вот так:

    Месяц1 | Месяц2 | Месяц3 | Квартал1 | Месяц4 | Месяц5 | Месяц6 | Квартал2 | Полугодие1 | Месяц7 |… ?

    Голову сломал 🙁

    Reply
  35. acanta

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

    Reply
  36. deaddy64

    Добрый день.

    Тоже столкнулся с подобной задачей, но с дополнительным условием расчета остатков на каждый период. По описанному в статье методу остатки рассчитаются неверно, т.к. из виртуальных таблиц данные выбираются с периодичностью «Секунда» и при указании параметра &Периодичность, например, «День», в детальных записях возможно появление нескольких строк на один и тот же период.

    Также способ из статьи (7) с периодичностью «Авто» не даст требуемого результата, т.к. в случае использования конструкции

     ВЫБОР &Периодичность
    КОГДА «СЕКУНДА»
    ТОГДА ХозрасчетныйОстаткиИОбороты.ПериодСекунда
    КОГДА «День»
    ТОГДА ХозрасчетныйОстаткиИОбороты.ПериодДень
    КОГДА «Неделя»
    ТОГДА ХозрасчетныйОстаткиИОбороты.ПериодНеделя
    КОГДА «Месяц»
    ТОГДА ХозрасчетныйОстаткиИОбороты.ПериодМесяц
    КОГДА «Квартал»
    ТОГДА ХозрасчетныйОстаткиИОбороты.ПериодКвартал
    КОНЕЦ КАК Период
    ИЗ
    РегистрБухгалтерии.Хозрасчетный.ОстаткиИОбороты(, ,АВТО, ,, , ) КАК ХозрасчетныйОстаткиИОбороты
    

    Показать

    развертка будет происходить по всем полям задействованным в конструкции «ВЫБОР». Независимо от того, что выбирается только одно конкретное поле. Что также способствует неверному расчету остатков.

    Единственный способ, который позволил мне правильно рассчитывать остатки и изменять периодичность в настройках, заключается в такой конструкции:

    РегистрБухгалтерии.Хозрасчетный.ОстаткиИОбороты(, ,ДЕНЬ {&Периодичность}, ,, , )

    Параметр &Периодичность число, можно ограничить списком доступных значений. Задавая в отчете разные значения параметра, развертка происходит только по выбранному значению, и остатки считаются верно.

    Reply
  37. newvideo

    Подскажите пожалуйста как сгруппировать записи в такой таблице? У меня в строках контрагенты, а в колонках суммы по периодам, но сумма другого периода располагается в другой записи тем самым дублируя контрагента. Группировка по контрагентам стоит в запросе. Вначале всё было ок, но когда добавил колонки периодов, то контрагенты стали задваиваться.

    Ещё можно сделать группировку СКД, но тогда внутри сгруппированного контрагента появляются несколько записей с этим контрагентом, сколько по нему периодов с суммами.

    Как-то можно обойтись группировкой запроса, не СКД?

    Reply

Leave a Comment

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