При работе с отчетами в Системе Компоновки Данных (СКД) часто возникает необходимость указывать стандартные или произвольные периоды. Одной из таких типовых задач является установка значения "Конец прошлого месяца" для параметра отчета. На первый взгляд может показаться, что для этого потребуется сложное программное заполнение или даже создание собственной формы выбора, как это обсуждалось на форумах 1С. Однако, как мы выясним, платформа 1С предоставляет удобные и эффективные механизмы для решения этой задачи.
В этой статье мы подробно рассмотрим несколько подходов к решению проблемы установки "Конец прошлого месяца" в СКД, начиная от самого удобного и стандартного, до более гибких, но трудоемких вариантов.
Наиболее элегантным и рекомендуемым способом работы со стандартными периодами в СКД является использование типа данных "СтандартныйПериод" для соответствующего параметра отчета. Этот механизм значительно упрощает взаимодействие пользователя с отчетом и автоматизирует расчет дат.
Разберем по шагам, как настроить этот механизм:
Создание параметра типа "СтандартныйПериод"
В схеме компоновки данных (на закладке "Параметры") создайте новый параметр. Присвойте ему понятное имя, например, ПериодОтчета. Самое главное — установите для него тип "СтандартныйПериод". Вы можете установить значение по умолчанию, например, "Прошлый месяц", чтобы отчет при открытии автоматически формировался за нужный интервал.
Использование параметра в запросе
После создания параметра ПериодОтчета, вы можете легко получить начало и конец выбранного периода в тексте запроса СКД. Для этого используйте предопределенные свойства объекта СтандартныйПериод: ДатаНачала и ДатаОкончания.
Посмотрим на пример запроса, где мы хотим получить данные за прошлый месяц:
ВЫБРАТЬ
Документ.Ссылка,
Документ.Дата,
Документ.Номер
ИЗ
Документ.РеализацияТоваровУслуг КАК Документ
ГДЕ
Документ.Дата МЕЖДУ &ПериодОтчета.ДатаНачала И &ПериодОтчета.ДатаОкончания
Обратите внимание: платформа 1С автоматически обрабатывает время для этих свойств. &ПериодОтчета.ДатаНачала будет содержать дату с временем 00:00:00, а &ПериодОтчета.ДатаОкончания — с временем 23:59:59. Это означает, что нет необходимости дополнительно использовать функцию КонецПериода() для конечной даты, весь последний день выбранного периода будет включен в отчет.
Удобство для пользователя
При использовании типа СтандартныйПериод, пользовательский интерфейс для выбора периода будет представлен удобным выпадающим списком с готовыми вариантами, такими как "Этот месяц", "Прошлый месяц", "Эта неделя", "Прошлая неделя" и т.д. Это значительно повышает юзабилити отчета, избавляя пользователя от ручного ввода дат и снижая вероятность ошибок.
Особенности работы с виртуальными таблицами
При использовании СтандартныйПериод совместно с виртуальными таблицами (например, ОстаткиИОбороты) в запросе СКД, может потребоваться убрать параметры из самой виртуальной таблицы и добавить их на закладке "Компоновка данных" в СКД для корректной работы и использования стандартного механизма. Мы должны позволить СКД самой управлять параметрами периода для виртуальных таблиц, используя наш параметр СтандартныйПериод.
Хотя СтандартныйПериод решает большинство типовых задач, существуют ситуации, когда требуется более сложная логика или нестандартный расчет периода. В таких случаях нам на помощь приходит программное заполнение параметров СКД.
Этот подход мы будем использовать, когда:
Рассмотрим подробнее, как реализовать программное заполнение:
Определение параметров в СКД
На закладке "Параметры" схемы компоновки данных создайте два параметра с типом "Дата". Например, НачалоПериода и КонецПериода. Установите им флаг "Ограничение доступности" и снимите флаг "Включать в пользовательские настройки", если вы не хотите, чтобы пользователь мог их изменять вручную.
Программное заполнение в обработчике ПриКомпоновкеРезультата
Основная логика программного заполнения реализуется в процедуре ПриКомпоновкеРезультата модуля отчета. В этой процедуре мы получаем доступ к объекту НастройкиКомпоновкиДанных и через него к параметрам СКД. Здесь мы можем вычислить необходимые даты, используя встроенные функции работы с датами 1С.
Посмотрим на пример кода, который вычисляет "Конец прошлого месяца" и устанавливает его в параметр КонецПериода, а также устанавливает начало прошлого месяца:
Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
// Получаем текущую дату
ТекущаяДата = ТекущаяДата();
// Вычисляем первый день текущего месяца
НачалоТекущегоМесяца = НачалоМесяца(ТекущаяДата);
// Вычисляем конец прошлого месяца
// От начала текущего месяца отнимаем 1 секунду, чтобы получить конец предыдущего дня,
// который является концом прошлого месяца.
КонецПрошлогоМесяца = НачалоТекущегоМесяца - 1;
// Вычисляем начало прошлого месяца
НачалоПрошлогоМесяца = НачалоМесяца(КонецПрошлогоМесяца);
// Устанавливаем значения параметров
КомпоновщикМакета.Настройки.ПараметрыДанных.УстановитьЗначениеПараметра("НачалоПериода", НачалоПрошлогоМесяца);
КомпоновщикМакета.Настройки.ПараметрыДанных.УстановитьЗначениеПараметра("КонецПериода", КонецПрошлогоМесяца);
// Выполняем компоновку
КомпоновщикМакета.Выполнить(МакетКомпоновкиДанных, КомпоновщикМакета.Настройки, ДанныеРасшифровки);
КонецПроцедуры
Мы используем функции НачалоМесяца() для получения первого дня месяца и простые арифметические операции с датами для вычисления конца прошлого месяца. Важно помнить, что вычитание числа из даты в 1С означает вычитание дней, а вычитание 1 секунды из начала текущего месяца даст нам конец предыдущего дня, который и будет концом прошлого месяца.
В запросе СКД эти параметры будут использоваться стандартным образом:
ВЫБРАТЬ
Документ.Ссылка,
Документ.Дата,
Документ.Номер
ИЗ
Документ.РеализацияТоваровУслуг КАК Документ
ГДЕ
Документ.Дата МЕЖДУ &НачалоПериода И &КонецПериода
В некоторых очень специфических случаях, когда стандартные механизмы СКД и программное заполнение не позволяют реализовать необходимую логику выбора периода (например, требуется сложный интерактивный выбор с дополнительными условиями, которые не вписываются в стандартную парадигму СКД), мы можем рассмотреть вариант создания собственной формы выбора периода.
Этот подход является наиболее трудоемким и требует значительных усилий по разработке, но предоставляет максимальную гибкость:
Разработка формы
Нам потребуется создать отдельную форму, на которой разместим элементы управления для выбора периода: поля ввода даты, кнопки выбора стандартных периодов (например, "Прошлый месяц", "Этот квартал") и т.д. В этой форме мы сами будем реализовывать всю логику расчета и установки дат.
Передача параметров в СКД
После того как пользователь выберет период на нашей кастомной форме, мы должны будем программно передать эти даты в параметры СКД перед формированием отчета. Это можно сделать, например, путем вызова процедуры формирования отчета и передачи ей рассчитанных дат.
На форумах 1С часто упоминалось, что "платформенного такого списка нет" (имея в виду сложный выбор периодов), что подталкивало к мысли о создании собственной формы. Однако, как мы выяснили, тип СтандартныйПериод значительно снижает необходимость в такой сложной разработке для большинства типовых задач.
Подведем итог: для большинства случаев работы с типовыми периодами, такими как "Конец прошлого месяца", рекомендуем использовать тип параметра "СтандартныйПериод" в СКД. Это наиболее простой, удобный и поддерживаемый платформой способ. Программное заполнение пригодится для более сложных, нестандартных сценариев, а создание собственной формы — это крайняя мера для уникальных и очень специфичных требований.
← К списку