При разработке отчетов на базе Системы компоновки данных (СКД) часто возникает задача сделать интерфейс максимально удобным для пользователя. Типичный пример: вместо выбора конкретного дня в календаре (например, 01.01.2024) пользователю нужно дать возможность выбирать месяц и год (Январь 2024), при этом не создавая кастомную форму отчета и не прибегая к программированию в модулях. Разберем, почему стандартный подход с «Формой выбора» не работает для простых типов данных и как решить эту задачу штатными средствами СКД.
Проанализируем ситуацию: в настройках параметра СКД есть поле Параметры редактирования, где можно указать Форма выбора. Однако, если тип параметра — Дата, платформа 1С зачастую игнорирует указанную там форму (например, ОбщаяФорма.ВыборПериода) и все равно открывает стандартный системный календарь.
Выясним причину этого поведения. В 1С:Предприятии свойства выбора для примитивных типов (Число, Строка, Дата) жестко зашиты в ядро платформы при использовании автогенерируемых форм. Свойство Форма выбора эффективно работает для ссылочных типов (Справочники, Документы), где нам нужно подменить одну форму списка на другую. Для типа Дата стандартная панель настроек отчета всегда будет вызывать системный календарь, если мы не перехватываем событие начала выбора программно. Поскольку наша цель — обойтись без кода, рассмотрим альтернативные методы решения.
Рассмотрим наиболее эффективный способ, который позволяет пользователю выбирать именно месяц, а не день. Вместо параметра с типом Дата мы будем использовать СтандартныйПериод. Это дает нам доступ к мощному механизму настройки периодов.
Выполним следующие шаги в конструкторе СКД:
ПериодОтчета) и установим ему тип СтандартныйПериод.Параметры редактирования найдем свойство Доступные периоды.Теперь при нажатии на кнопку выбора в панели настроек отчета пользователь увидит не огромный календарь или произвольный интервал, а лаконичный список месяцев. Это именно то поведение, которого пытался добиться автор темы. Для дальнейшей работы с временными интервалами в СКД пригодится пример настройки вывода группировок по неделям и месяцам в шапке отчета.
Чтобы использовать этот выбор в запросе, где нужна конкретная дата (например, начало месяца), создадим второй параметр ДатаРасчета (скрытый от пользователя) и в поле Выражение пропишем:
&ПериодОтчета.ДатаНачала
Так мы сохраняем удобство интерфейса для пользователя и получаем технически корректную дату для логики запроса.
Посмотрим на вторую часть вопроса: как сделать так, чтобы в поле ввода вместо «01.01.2024» отображалось «Январь 2024». Многие путают свойство Формат со свойством Формат редактирования.
Важно понимать разницу:
Формат — определяет, как значение будет выведено в сформированном табличном документе (в самом отчете).Формат редактирования — определяет, как значение выглядит непосредственно в поле ввода на панели настроек, когда пользователь с ним работает.Чтобы настроить представление «Месяц Год», выполним следующие действия в параметрах СКД:
Параметры редактирования.ДФ='MMMM yyyy'.После этого, даже если типом параметра остается Дата, в интерфейсе пользователь будет видеть название месяца и год прописью.
Если нам нужно максимально упростить выбор и ограничить пользователя (например, дать возможность выбирать только из месяцев текущего года), мы можем использовать механизм Доступных значений. Этот метод превращает поле ввода в выпадающий список.
Проанализируем ситуацию по шагам:
Дата.В этом случае пользователю вообще не потребуется открывать формы выбора или календарь. Он просто выберет нужное текстовое представление из списка, а СКД подставит в запрос соответствующее значение даты. Это самый стабильный способ работы без использования кода, если набор периодов заранее известен или ограничен.
Мы проанализировали ограничения платформы и нашли способы обхода системного поведения. Подводя итоги, отметим, что задача «подменить форму выбора для Даты без кода» решается сменой подхода к проектированию интерфейса:
ДФ='MMMM yyyy' для красивого отображения.Эти методы позволяют полностью реализовать требования заказчика, оставаясь в рамках стандартных возможностей СКД и не усложняя поддержку отчета лишним программным кодом.