Как программно установить параметры СКД (Стандартный период) при открытии внешнего отчета

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

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

Разберем проблему: почему простая установка даты не работает

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

Рассмотрим по шагам, как правильно работать с этим объектом и настройками компоновщика.

Решение 1: Использование конструктора СтандартныйПериод в коде формы

Если вы решили использовать собственную форму отчета, наиболее правильным местом для инициализации параметров будет серверная процедура ПриСозданииНаСервере. Рассмотрим пример кода, который позволит нам установить конкретный диапазон дат.

Проанализируем ситуацию: нам нужно создать объект нужного типа и записать его в настройки компоновщика.


&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)

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

КонецПроцедуры

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

Решение 2: Работа с пользовательскими настройками

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

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

Посмотрим на пример правильной установки через пользовательские настройки:


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

Решение 3: Установка периода без программирования (через Выражения)

Рассмотрим ситуацию, когда нам не нужно динамически вычислять даты в коде, а достаточно установить логический период (например, "Текущий месяц" или "Начало года"). Это можно сделать напрямую в Конфигураторе в схеме СКД.

  1. Откройте схему компоновки данных (макет ОсновнаяСхемаКомпоновкиДанных).
  2. Перейдите на закладку Параметры.
  3. Для параметра «Период» в колонке Выражение напишите одну из функций встроенного языка СКД:
    • Новый СтандартныйПериод(НачалоПериода(&ТекущаяДата, "Месяц"), КонецПериода(&ТекущаяДата, "Месяц"))
    • Или просто задайте относительный вариант через код, если параметр позволяет это сделать через стандартные значения.
  4. В колонке Использование выберите значение Всегда.

Этот способ самый надежный, так как он работает автоматически при создании компоновщика и не требует написания кода в формах.

Решение 4: Использование механизмов БСП (для внешних отчетов)

Если ваш отчет интегрирован в типовую конфигурацию (например, УТ 11, ERP или БСП-ориентированные базы), лучше использовать стандартную форму отчета. В модуле объекта внешнего отчета можно переопределить процедуру инициализации.

Проанализируем преимущества: вам не нужно создавать свою форму, вы используете весь мощный функционал типовой конфигурации (рассылки отчетов, варианты отчетов и т.д.).

В модуле объекта внешнего отчета можно использовать следующий подход:


// В модуле объекта внешнего отчета
Процедура ОпределитьНастройкиФормы(Форма, КлючВарианта, Настройки) Экспорт
    
    // Здесь можно программно повлиять на настройки до того, как форма будет открыта
    // Например, передать параметры через структуру Настройки
    
КонецПроцедуры

Рекомендации по выбору метода

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

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

← На главную