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

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

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

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

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

Этой настройкой мы форматируем наш период, чтобы все было красиво и радовало глаз)
Вот, собственно, сами форматы:
Месяц: ДФ=’ММММ гггг «г.»‘
День: ДФ = дд.ММ.гггг
Неделя: ДФ = ‘»Неделя с» дд.ММ.гггг ‘
Квартал: ДФ = ‘к «квартал» гггг «г.»‘
Год: ДФ = ‘гггг «г.»‘
Декада: ДФ = ‘»Декада с» дд.ММ.гггг ‘
Полугодие: ДФ = ‘»Полугодие с» дд.ММ.гггг’
Вот и все. На выходе имеем замечательную картину:





Учимся создавать отчет с заданной периодичностью с использованием СКД.
Перейти к публикации
Можно вычисление периода перенести на клиент в вычисляемых полях СКД. Во-первых, период там указывается в кавычках («Месяц»), во-вторых, вычисляемые поля доступны для редактирования, т.е. можно перед выполнением СКД программно задать им формулу.
Ну и в-третьих. Можно обратиться к набору данных.Зарос в схеме компоновки данных и и сделать ТекстЗапроса = СтрЗаменить(ТекстЗапроса, «Полугодие», «Квартал»), а потом выполнять отчет.
А зачем делать такую иерархию вложенных условий? В тексте запроса можно применять switch case условия:
ВЫБОР КОГДА …. Тогда ….
КОГДА …. Тогда ….
КОГДА …. Тогда ….
КОНЕЦ
Гораздо более удобно и читабельно.
А по решению — рабочее, тоже так делал и не только для периодичности.
(2) Smaylukk, Согласен, но это я реализовывал довольно давно, уже не помню, почему так, видимо, другого не знал)
Поменяю в публикации.
Точно
КОГДА &Периодичность = ЗНАЧЕНИЕ(Перечисление.Периодичность.День)
ТОГДА НАЧАЛОПЕРИОДА(&НачалоПериода, ДЕНЬ)
а не
КОГДА &Периодичность = ЗНАЧЕНИЕ(Перечисление.Периодичность.День)
ТОГДА НАЧАЛОПЕРИОДА(МойРегистр.Период, ДЕНЬ)
?
(4) MRAK, Спасибо) В изначальном варианте именно так) Ума не приложу, как так вышло).
интересная заметка. давно задавался вопросом как корректно и легко делать группировку по периодах в отчетах на СКД. Спасибо!
Я в свое время писал об этом:
Упоминал три, кажется, варианта решения, один предложил, но замер времени работы показал, что принципиально ни один из них не лучше других. К сожалению.
М-м, пересмотрел свою публикацию — она предлагает точь в точь тот же выход, что и предложенный автором статьи тут. Только написана мною уже давно.
Кстати, в итоге я теперь предпочитаю выносить этот ВЫБОР из запроса и создавать новое вычисляемое поле с такой же формулой. Разницы по нагрузке нету, а в разработке удобнее получается.
(8) Laertid, Действительно, похоже. Но, насколько я понял, вы используете предложенный мной метод, как один из возможных. Я же описываю методику от и до. Кроме того, существование вашей публикации не делает мою публикацию хуже — это не основание понижать ее рейтинг.
Замечание.
«Когда ТаблицаДоходовИРасходов.ЭтоНачальныйОстаток = Истина»
можно заменить на простое
«Когда ТаблицаДоходовИРасходов.ЭтоНачальныйОстаток»
или опустить совсем.
(10) maloi_a, Согласен) Кстати, не обратил внимания на этот кусок кода, он для публикации не нужен.
По-моему, очень красивый пример. Спасибо за науку!
Спасибо. Как хорошо, что есть данный ресурс.
Много нового можно узнать.
Научится и стать более грамотным.
Как один из вариантов работы с СКД. Большое спасибо!!!
А если выставить в параметрах виртуальной таблицы период в «Авто», то можно выбирать, как детализировать записи. 😉
Да, видимо он об этом не знает
Статья мне очень сильно помогла при написании отчета на СКД, использовал 1-й вариант.
Спас моего коллегу от ИЦИХа с гвоздями этой статьей. Он уже залазил в него, потратив весь день на секс с СКД. но я нашел ему эту статью. Вопрос решился за 5 минут… ))
(18) O-Planet, Рад, что кому-то моя статья была полезна.
ох прекрасно, очень помогла. просто, легко и доступно.
А не подскажите как сделать вывод дат даже тогда когда не было движений?
(21) kip32, в типовых решениях я бы использовал регистр сведений «регламентированный производственный календарь» для решения такой задачи. Получал бы записи этого регистр с необходимой периодичностью, к ним бы тянул движения (если они есть).
Только начал изучать СКД.
Поэтому прошу не пинать и ткнуть носом где описать условия периодичности? Где поле «Период»?
И как настроить условное оформление?
Что-то у меня не выходит получить такой отчет (((. Может есть рабочий пример?
Помогите разобраться пожалуйста.
(23) CCMD, Условия периодичности указываются в запросе. Поле «Период» берется из исходной таблицы (регистра).
Условное оформление задается в макете СКД.
а если потребуется получить остатки с заданной периодичностью? группировать записи уже не вариант, ибо это не приход/расход которые можно просто суммировать.
(25) a.za4em, Для каких задач могут потребоваться остатки с заданной периодичностью?
Напоминаю вам, что за постинг в данном форуме $m не начисляются.
Спасибо! рабочий и удобный вариант!
(25) мой отчет выводит остатки на начало периода. Использую таблицу ОстаткиИОбороты и из нее вывожу только ресурс НачальныйОстаток
Не получается у меня исправить предыдущее мое сообщение (либо настройки браузера либо переборщил с блокировками провайдер), поэтому коррекцию его делаю в этом ответе. В СКД остатки с заданной периодичностью настраиваются двумя таблицами . Вот хороший пример
ВЫБОР
КОГДА ТаблицаДоходовИРасходов.ЭтоНачальныйОстаток = ИСТИНА
ТОГДА ТаблицаДоходовИРасходов.Период
КОГДА &Периодичность = Значение(Перечисление.Периодичность.День)
ТОГДА НАЧАЛОПЕРИОДА(ТаблицаДоходовИРасходов.Период, ДЕНЬ)
КОГДА &Периодичность = Значение(Перечисление.Периодичность.Месяц)
ТОГДА НАЧАЛОПЕРИОДА(ТаблицаДоходовИРасходов.Период, МЕСЯЦ)
КОГДА &Периодичность = Значение(Перечисление.Периодичность.Год)
ТОГДА НАЧАЛОПЕРИОДА(ТаблицаДоходовИРасходов.Период, ГОД)
КОГДА &Периодичность = Значение(Перечисление.Периодичность.Квартал)
ТОГДА НАЧАЛОПЕРИОДА(ТаблицаДоходовИРасходов.Период, КВАРТАЛ)
КОГДА &Периодичность = Значение(Перечисление.Периодичность.Неделя)
ТОГДА НАЧАЛОПЕРИОДА(ТаблицаДоходовИРасходов.Период, НЕДЕЛЯ)
КОГДА &Периодичность = Значение(Перечисление.Периодичность.Декада)
ТОГДА НАЧАЛОПЕРИОДА(ТаблицаДоходовИРасходов.Период, ДЕКАДА)
КОГДА &Периодичность = Значение(Перечисление.Периодичность.Полугодие)
ТОГДА НАЧАЛОПЕРИОДА(ТаблицаДоходовИРасходов.Период, ПОЛУГОДИЕ)
КОНЕЦ
Размял пальцы…
Зачем страшный кусок однообразного кода картинкой? Вообще нафига код картинкой показывать?
(30)
Очередной комментарий ради комментария? Уважаемый, идите флудить в другое место.
(31) ни в коем случае. Гораздо удобнее было показать листинг текстом. Тема была актуальная, вот и набивал с картинки руками — поэтому крик души )) Тема хорошая, помогла
Добрый день! А никто не сталкивался с задачей вывести отчет с разной периодичностью и промежуточными итогами, имею в виду вот так:
Месяц1 | Месяц2 | Месяц3 | Квартал1 | Месяц4 | Месяц5 | Месяц6 | Квартал2 | Полугодие1 | Месяц7 |… ?
Голову сломал 🙁
На каждый итог отдельную функцию заводим и группировка периодичность не требуется.
Добрый день.
Тоже столкнулся с подобной задачей, но с дополнительным условием расчета остатков на каждый период. По описанному в статье методу остатки рассчитаются неверно, т.к. из виртуальных таблиц данные выбираются с периодичностью «Секунда» и при указании параметра &Периодичность, например, «День», в детальных записях возможно появление нескольких строк на один и тот же период.
Также способ из статьи (7) с периодичностью «Авто» не даст требуемого результата, т.к. в случае использования конструкции
Показать
развертка будет происходить по всем полям задействованным в конструкции «ВЫБОР». Независимо от того, что выбирается только одно конкретное поле. Что также способствует неверному расчету остатков.
Единственный способ, который позволил мне правильно рассчитывать остатки и изменять периодичность в настройках, заключается в такой конструкции:
РегистрБухгалтерии.Хозрасчетный.ОстаткиИОбороты(, ,ДЕНЬ {&Периодичность}, ,, , )Параметр &Периодичность число, можно ограничить списком доступных значений. Задавая в отчете разные значения параметра, развертка происходит только по выбранному значению, и остатки считаются верно.
Подскажите пожалуйста как сгруппировать записи в такой таблице? У меня в строках контрагенты, а в колонках суммы по периодам, но сумма другого периода располагается в другой записи тем самым дублируя контрагента. Группировка по контрагентам стоит в запросе. Вначале всё было ок, но когда добавил колонки периодов, то контрагенты стали задваиваться.
Ещё можно сделать группировку СКД, но тогда внутри сгруппированного контрагента появляются несколько записей с этим контрагентом, сколько по нему периодов с суммами.
Как-то можно обойтись группировкой запроса, не СКД?