При разработке отчетов на Системе Компоновки Данных (СКД) мы часто сталкиваемся с требованием ограничить выбор периода — для этого есть инструментарий для разработки и отладки в 1С. Стандартный тип СтандартныйПериод предлагает пользователю слишком широкий выбор: день, неделя, декада, квартал, год и произвольный интервал. Однако бизнес-логика часто требует, чтобы пользователь мог выбрать строго один конкретный месяц или один конкретный год. Для расширения возможностей построения подобных отчетов на стороне клиента можно также использовать инструмент Пользовательская СКД.
Давайте подробно разберем, как мы можем реализовать такой интерфейс, используя возможности платформы 1С:Предприятие и механизмы СКД — поможет создание интерфейсов и рабочих столов для отчетов. Мы рассмотрим несколько подходов: от использования специальных параметров до программной настройки через БСП.
По умолчанию, если мы выносим в настройки отчета стандартный период, пользователь видит кнопку с точками, открывающую диалог выбора. В этом диалоге доступны все варианты периодичности. К сожалению, в обычной схеме компоновки данных нет простых "галочек", чтобы отключить, например, выбор "Квартала" или "Произвольного периода".
Поэтому нам приходится применять обходные пути. Давайте рассмотрим их по порядку, в зависимости от поставленной задачи: выбор года или выбор месяца.
Если специфика отчета такова, что он строится строго за календарный год, использование стандартного периода может запутать пользователя. Самый элегантный способ решения этой задачи — использование числового параметра.
Шаг 1. Создание параметра
В схеме компоновки данных (на закладке "Параметры") создадим новый параметр, назовем его, например, ОтчетныйГод. Установим ему тип значения Число, длину 4 и точность 0. Это позволит пользователю вводить год в привычном формате, например, 2024.
Шаг 2. Настройка формата
Чтобы число отображалось без разделителей групп разрядов (то есть "2024", а не "2 024"), в свойствах параметра ОтчетныйГод в колонке "Формат редактирования" пропишем:
ЧГ=
Это уберет группировку разрядов.
Шаг 3. Связь с периодом запроса
Теперь нам нужно превратить это число в даты начала и окончания периода, которые поймет запрос. Обычно в запросах СКД используются стандартные параметры НачалоПериода и КонецПериода. Нам нужно вычислить их на основании введенного года.
Для параметра НачалоПериода в колонке "Выражение" пропишем формулу:
ДАТА(&ОтчетныйГод, 1, 1)
Для параметра КонецПериода используем функцию, которая вернет конец года:
КОНЕЦПЕРИОДА(ДАТА(&ОтчетныйГод, 1, 1), "Год")
Шаг 4. Настройка доступности
Последний штрих: нам нужно скрыть от пользователя технические параметры дат и показать только выбор года. Для параметров НачалоПериода и КонецПериода установим галочку "Ограничение доступности". А параметр ОтчетныйГод включим в пользовательские настройки (свойство "Включать в пользовательские настройки").
Для выбора месяца подход с числом не очень удобен, так как месяц без года не имеет смысла. Здесь мы воспользуемся хитростью с форматом даты.
Шаг 1. Создание параметра
Создадим параметр ОтчетныйМесяц с типом Дата. В составе даты укажем "Дата", так как время нам не нужно.
Шаг 2. Визуальное оформление
Чтобы поле ввода выглядело как выбор месяца (например, "Январь 2024"), зададим формат редактирования. В свойствах параметра пропишем:
ДФ='ММММ yyyy'
При таком формате, даже если пользователь выберет конкретное число в календаре (например, 15 января), в поле он увидит только "Январь 2024". Это создает правильное визуальное восприятие интерфейса.
Шаг 3. Вычисление границ периода
В выражениях для стандартных параметров периода (НачалоПериода и КонецПериода) нам нужно "растянуть" выбранную пользователем дату на полный месяц. Используем функцию НАЧАЛОПЕРИОДА и КОНЕЦПЕРИОДА с периодичностью "Месяц".
Для НачалоПериода:
НАЧАЛОПЕРИОДА(&ОтчетныйМесяц, "Месяц")
Для КонецПериода:
КОНЕЦПЕРИОДА(&ОтчетныйМесяц, "Месяц")
Таким образом, какое бы число внутри месяца пользователь ни выбрал, отчет сформируется за полный месяц.
Если ваша конфигурация построена на базе БСП (например, 1С:Бухгалтерия, 1С:ERP, 1С:УТ), то у вас есть мощный инструмент для управления настройками формы отчета (удобно через контроль ввода данных и управление элементами форм) без создания самой формы. Чтобы быстро найти нужные функции, полезно иметь под рукой справочник по методам БСП с примерами использования.
В модуле объекта отчета (или в модуле менеджера, в зависимости от версии БСП) существует процедура ОпределитьНастройкиФормы. Она позволяет задавать поведение стандартных элементов.
Давайте посмотрим, как можно задать настройки периода через этот механизм. В процедуре мы можем обратиться к коллекции настроек и установить необходимые параметры.
Процедура ОпределитьНастройкиФормы(Форма, КлючВарианта, Настройки) Экспорт
// Настройки - это структура, управляющая поведением формы
// Пример установки фиксированного варианта периода, если это поддерживается версией БСП
Настройки.События.ПриИзмененииНастроек = Истина;
КонецПроцедуры
Однако чаще всего для жесткого ограничения (только год или месяц) через БСП удобнее использовать предопределенные варианты отчетов или модифицировать компоновщик настроек программно при загрузке варианта.
Если стандартных средств настройки недостаточно и требуется сложная логика (например, переключение между выбором "По годам" и "По месяцам" на лету), нам стоит создать собственную управляемую форму отчета. При разработке таких форм для ускорения процесса можно использовать специальный общий модуль для программного изменения форм.
Алгоритм действий:
МесяцОтчета (Дата) и ГодОтчета (Число).В исключительных случаях, когда бизнес-логика требует кардинально разного представления данных для разных периодов, разработчики иногда применяют две разных схемы в одном отчете СКД.
Рассмотрим пример кода, который обрабатывает изменение года на форме и передает его в СКД. Создадим обработчик события ПриИзменении для поля года.
&НаКлиенте
Процедура ГодОтчетаПриИзменении(Элемент)
// Вычисляем даты
НоваяДатаНачала = Дата(ГодОтчета, 1, 1);
НоваяДатаОкончания = КонецДня(Дата(ГодОтчета, 12, 31));
// Передаем в СКД
УстановитьПериодВКомпоновщике(НоваяДатаНачала, НоваяДатаОкончания);
КонецПроцедуры
&НаСервере
Процедура УстановитьПериодВКомпоновщике(ДатаНач, ДатаКон)
// Получаем доступ к пользовательским настройкам
Настройки = Отчет.КомпоновщикНастроек.ПользовательскиеНастройки;
// Ищем параметр НачалоПериода и устанавливаем значение
// Важно: здесь мы ищем по имени параметра или его идентификатору
Для Каждого ЭлементНастройки Из Настройки.Элементы Цикл
Если ТипЗнч(ЭлементНастройки) = Тип("ЗначениеПараметраНастроекКомпоновкиДанных") Тогда
ИмяПараметра = Строка(ЭлементНастройки.Параметр);
Если ИмяПараметра = "НачалоПериода" Тогда
ЭлементНастройки.Значение = ДатаНач;
ЭлементНастройки.Использование = Истина;
ИначеЕсли ИмяПараметра = "КонецПериода" Тогда
ЭлементНастройки.Значение = ДатаКон;
ЭлементНастройки.Использование = Истина;
КонецЕсли;
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Этот метод дает максимальную гибкость. Вы можете разместить на форме переключатель "Вид периода" (Месяц/Год) и в зависимости от его положения показывать или поле ввода года, или поле ввода даты с форматом месяца.
Выбор метода зависит от требований к удобству пользователя:
Число с выражением в СКД.Дата с форматом ДФ='ММММ yyyy'.