Как в отчете на СКД ограничить выбор периода одним месяцем?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

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

Проанализируем два основных способа решения этой задачи: настройка параметров непосредственно в схеме компоновки данных и создание пользовательской формы отчета для более гибкого управления.

Решение 1: Настройка параметров в схеме СКД

Этот способ является наиболее простым и предпочтительным, так как не требует написания кода в форме отчета. Вся логика задается декларативно в конструкторе СКД.

Разберем процесс по шагам.

  1. Удаляем стандартный период.

    Если в вашем отчете уже есть параметр СтандартныйПериод, удалите его. Вместо него мы создадим свои параметры, которые обеспечат нужную нам логику.

  2. Создаем основной параметр для выбора месяца.

    Перейдем на закладку "Параметры" в схеме компоновки данных. Создадим новый параметр, назовем его, например, ВыбранныйМесяц. Установим для него тип Дата. Этот параметр будет виден пользователю, и именно через него он будет указывать интересующий его месяц.

    Важный момент: Чтобы сделать поле выбора даты более удобным, можно настроить его формат. В свойствах параметра ВыбранныйМесяц найдите поле "Формат редактирования" и укажите в нем строку формата, например, 'ДФ=MMMM.yyyy'. В этом случае пользователь увидит в поле выбора название месяца и год, например, "Апрель 2024".

  3. Создаем служебные параметры для границ периода.

    Для корректной работы запроса нам по-прежнему нужны две даты: начало и конец периода. Создадим еще два параметра: НачалоПериода и КонецПериода. Оба должны иметь тип Дата.

    Ключевое отличие этих параметров в том, что они не должны быть видны пользователю. Для этого снимите для них флажок в колонке "Включать в пользовательские настройки".

  4. Настраиваем вычисление границ месяца.

    Теперь самое главное — свяжем наши служебные параметры с основным. Для этого воспользуемся языком выражений СКД. В колонке "Выражение" для наших служебных параметров пропишем следующие формулы:

    • Для параметра НачалоПериода: НачалоПериода(&ВыбранныйМесяц, "МЕСЯЦ")
    • Для параметра КонецПериода: КонецПериода(&ВыбранныйМесяц, "МЕСЯЦ")

    Проанализируем синтаксис. Функция НачалоПериода() — это специальная функция языка выражений СКД. Она принимает два аргумента: дату и строковое представление типа периода ("ДЕНЬ", "НЕДЕЛЯ", "МЕСЯЦ", "КВАРТАЛ", "ГОД"). Мы передаем ей значение из нашего видимого параметра &ВыбранныйМесяц (обратите внимание на амперсанд &, который обязателен при обращении к другому параметру) и указываем, что нам нужно начало месяца. Аналогично работает функция КонецПериода().

    Частая ошибка: Не путайте функции языка выражений СКД (НачалоПериода, КонецПериода) с функциями встроенного языка 1С (НачалоМесяца, КонецМесяца). В поле "Выражение" на закладке "Параметры" СКД нужно использовать именно первый вариант.

  5. Используем параметры в запросе.

    Осталось использовать наши служебные параметры в тексте запроса на закладке "Наборы данных". Например, для виртуальной таблицы оборотов регистра накопления это будет выглядеть так:

    
    ВЫБРАТЬ
        ПродажиОбороты.Номенклатура,
        ПродажиОбороты.КоличествоОборот,
        ПродажиОбороты.СуммаОборот
    ИЗ
        РегистрНакопления.Продажи.Обороты(&НачалоПериода, &КонецПериода, Авто, ) КАК ПродажиОбороты
    

    Теперь, когда пользователь выберет в форме отчета любую дату, например, 15 апреля 2024 года, СКД автоматически вычислит параметры НачалоПериода (01.04.2024 00:00:00) и КонецПериода (30.04.2024 23:59:59) и подставит их в запрос.

Решение 2: Создание пользовательской формы отчета

Этот метод предоставляет максимальную гибкость, но требует программного кода. Он полезен, если логика выбора периода сложнее или нужно выполнить дополнительные действия перед формированием отчета.

Рассмотрим основной алгоритм.

  1. Создаем основную форму отчета.

    В конфигураторе для объекта отчета создайте новую основную форму.

  2. Добавляем реквизит и элемент формы.

    На форме создайте реквизит, например, ВыбранныйМесяц с типом Дата. Разместите его на форме. Как и в первом способе, вы можете настроить формат редактирования для этого поля, чтобы оно отображало только месяц и год.

  3. Добавляем кнопку "Сформировать".

    Создайте на форме кнопку и команду для нее, например, СформироватьОтчет. Эта кнопка будет инициировать формирование отчета.

  4. Пишем код для установки параметров.

    В модуле формы, в обработчике команды кнопки, нужно программно установить значения параметров СКД перед вызовом компоновки. Параметры НачалоПериода и КонецПериода должны быть предварительно созданы в схеме СКД (как в шаге 3 из первого решения), но для них можно не задавать выражения.

    Посмотрим на пример кода:

    
    &НаКлиенте
    Процедура СформироватьОтчет(Команда)
    
        // Получаем текущие настройки компоновщика
        Настройки = КомпоновщикНастроек.ПолучитьНастройки();
    
        // Вычисляем начало и конец месяца на основе значения из поля на форме
        ДатаНачало = НачалоМесяца(ВыбранныйМесяц);
        ДатаКонец = КонецМесяца(ВыбранныйМесяц);
        
        // Находим параметр "НачалоПериода" в настройках и устанавливаем ему значение
        ПараметрНачало = Настройки.ПараметрыДанных.НайтиЗначениеПараметра(Новый ПараметрКомпоновкиДанных("НачалоПериода"));
        Если ПараметрНачало <> Неопределено Тогда
            ПараметрНачало.Значение = ДатаНачало;
            ПараметрНачало.Использование = Истина;
        КонецЕсли;
    
        // Находим параметр "КонецПериода" в настройках и устанавливаем ему значение
        ПараметрКонец = Настройки.ПараметрыДанных.НайтиЗначениеПараметра(Новый ПараметрКомпоновкиДанных("КонецПериода"));
        Если ПараметрКонец <> Неопределено Тогда
            ПараметрКонец.Значение = ДатаКонец;
            ПараметрКонец.Использование = Истина;
        КонецЕсли;
    
        // Загружаем измененные настройки обратно в компоновщик
        КомпоновщикНастроек.ЗагрузитьНастройки(Настройки);
        
        // Вызываем стандартную команду формирования отчета
        Сформировать();
    
    КонецПроцедуры
    

    В этом коде мы используем уже функции встроенного языка 1С НачалоМесяца() и КонецМесяца(), так как работаем в модуле формы, а не в конструкторе СКД. Мы получаем объект настроек, находим в нем нужные параметры по имени, устанавливаем их значения и флаг использования, после чего загружаем настройки обратно и вызываем стандартный механизм формирования отчета.

В большинстве случаев первый способ (настройка выражений в параметрах СКД) является достаточным, более простым и быстрым в реализации. Второй способ стоит применять, когда требуется нестандартная логика или сложная взаимосвязь между элементами управления на форме отчета.

← На главную