gifts2017

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

Опубликовал Павел Никифоров (Lyns_owner) в раздел Программирование - Практика программирования

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Месяц: ДФ='ММММ гггг "г."'

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

Неделя: ДФ = '"Неделя с" дд.ММ.гггг '

Квартал: ДФ = 'к "квартал" гггг "г."'

Год: ДФ = 'гггг "г."'

Декада: ДФ = '"Декада с" дд.ММ.гггг '

Полугодие: ДФ = '"Полугодие с" дд.ММ.гггг'

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

См. также

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

Комментарии

0. Павел Никифоров (Lyns_owner) 17.04.12 07:17
Учимся создавать отчет с заданной периодичностью с использованием СКД.


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

1. Serj (Serj1C) 17.04.12 07:17
Можно вычисление периода перенести на клиент в вычисляемых полях СКД. Во-первых, период там указывается в кавычках ("Месяц"), во-вторых, вычисляемые поля доступны для редактирования, т.е. можно перед выполнением СКД программно задать им формулу.
Ну и в-третьих. Можно обратиться к набору данных.Зарос в схеме компоновки данных и и сделать ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "Полугодие", "Квартал"), а потом выполнять отчет.
2. Головаченко Дима (Smaylukk) 17.04.12 09:27
А зачем делать такую иерархию вложенных условий? В тексте запроса можно применять switch case условия:
ВЫБОР КОГДА .... Тогда ....
КОГДА .... Тогда ....
КОГДА .... Тогда ....
КОНЕЦ
Гораздо более удобно и читабельно.
А по решению - рабочее, тоже так делал и не только для периодичности.
3. Павел Никифоров (Lyns_owner) 17.04.12 09:41
(2) Smaylukk, Согласен, но это я реализовывал довольно давно, уже не помню, почему так, видимо, другого не знал)

Поменяю в публикации.
4. Роман Ершов (MRAK) 18.04.12 10:10
Точно

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


КОГДА &Периодичность = ЗНАЧЕНИЕ(Перечисление.Периодичность.День)
ТОГДА НАЧАЛОПЕРИОДА(МойРегистр.Период, ДЕНЬ)
?
Lyns_owner; +1 Ответить 1
5. Павел Никифоров (Lyns_owner) 18.04.12 10:22
(4) MRAK, Спасибо) В изначальном варианте именно так) Ума не приложу, как так вышло).
6. Андрей Вовк (wowkai) 18.04.12 10:33
интересная заметка. давно задавался вопросом как корректно и легко делать группировку по периодах в отчетах на СКД. Спасибо!
7. Богдан Буляков (Laertid) 19.04.12 09:36
Я в свое время писал об этом:
http://infostart.ru/public/104819/
Упоминал три, кажется, варианта решения, один предложил, но замер времени работы показал, что принципиально ни один из них не лучше других. К сожалению.
8. Богдан Буляков (Laertid) 19.04.12 09:40
М-м, пересмотрел свою публикацию - она предлагает точь в точь тот же выход, что и предложенный автором статьи тут. Только написана мною уже давно.
Кстати, в итоге я теперь предпочитаю выносить этот ВЫБОР из запроса и создавать новое вычисляемое поле с такой же формулой. Разницы по нагрузке нету, а в разработке удобнее получается.
9. Павел Никифоров (Lyns_owner) 19.04.12 10:02
(8) Laertid, Действительно, похоже. Но, насколько я понял, вы используете предложенный мной метод, как один из возможных. Я же описываю методику от и до. Кроме того, существование вашей публикации не делает мою публикацию хуже - это не основание понижать ее рейтинг.
10. Alexandr (maloi_a) 25.04.12 08:11
Замечание.
"Когда ТаблицаДоходовИРасходов.ЭтоНачальныйОстаток = Истина"
можно заменить на простое
"Когда ТаблицаДоходовИРасходов.ЭтоНачальныйОстаток"
или опустить совсем.
rayastar; Lyns_owner; +2 Ответить 1
11. Павел Никифоров (Lyns_owner) 25.04.12 09:48
(10) maloi_a, Согласен) Кстати, не обратил внимания на этот кусок кода, он для публикации не нужен.
12. Андрей Гуляев (agulaev) 25.04.12 21:22
По-моему, очень красивый пример. Спасибо за науку!
13. Денис (Den_D) 09.06.12 11:05
Спасибо. Как хорошо, что есть данный ресурс.
Много нового можно узнать.
Научится и стать более грамотным.
14. Александр Удалов (higs) 30.07.12 22:32
Как один из вариантов работы с СКД. Большое спасибо!!!
15. Данила Елистратов (CagoBHuK) 16.08.12 11:20
А если выставить в параметрах виртуальной таблицы период в "Авто", то можно выбирать, как детализировать записи. ;)
16. Dmitry Malyshev (SaperVodichka) 15.12.12 22:40
Да, видимо он об этом не знает
17. Александр Жерздев (Al777) 11.07.14 12:19
Статья мне очень сильно помогла при написании отчета на СКД, использовал 1-й вариант.
18. Олег Пономаренко (O-Planet) 25.02.15 02:26
Спас моего коллегу от ИЦИХа с гвоздями этой статьей. Он уже залазил в него, потратив весь день на секс с СКД. но я нашел ему эту статью. Вопрос решился за 5 минут... ))
CrazyIgi; Bukaska; +2 Ответить 1
19. Павел Никифоров (Lyns_owner) 25.02.15 02:34
(18) O-Planet, Рад, что кому-то моя статья была полезна.
20. Алексей Долгополов (LSK85) 16.10.15 17:25
ох прекрасно, очень помогла. просто, легко и доступно.
21. Денис Кипень (kip32) 09.06.16 13:14
А не подскажите как сделать вывод дат даже тогда когда не было движений?
22. Павел Никифоров (Lyns_owner) 12.06.16 06:01
(21) kip32, в типовых решениях я бы использовал регистр сведений "регламентированный производственный календарь" для решения такой задачи. Получал бы записи этого регистр с необходимой периодичностью, к ним бы тянул движения (если они есть).
23. Jhon Woo (CCMD) 30.09.16 01:03
Только начал изучать СКД.
Поэтому прошу не пинать и ткнуть носом где описать условия периодичности? Где поле "Период"?
И как настроить условное оформление?
Что-то у меня не выходит получить такой отчет (((. Может есть рабочий пример?
Помогите разобраться пожалуйста.
24. Павел Никифоров (Lyns_owner) 30.09.16 09:06
(23) CCMD, Условия периодичности указываются в запросе. Поле "Период" берется из исходной таблицы (регистра).
Условное оформление задается в макете СКД.
25. Сергей Маравин (a.za4em) 10.10.16 11:20
а если потребуется получить остатки с заданной периодичностью? группировать записи уже не вариант, ибо это не приход/расход которые можно просто суммировать.
26. Павел Никифоров (Lyns_owner) 16.10.16 23:39
(25) a.za4em, Для каких задач могут потребоваться остатки с заданной периодичностью?
Напоминаю вам, что за постинг в данном форуме $m не начисляются.
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа