Как программно установить параметры отчета СКД по умолчанию в 1С на управляемых формах (например, период отчета)?

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

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

Понимание объектов СКД для настройки параметров

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

Параметры данных СКД хранятся в коллекции КомпоновщикНастроек.Настройки.ПараметрыДанных.Элементы. Каждый элемент этой коллекции представляет собой объект типа ЭлементПараметраДанныхКомпоновкиДанных, у которого есть два важных свойства, которые мы будем изменять:

  1. Значение: Собственно, то значение, которое мы хотим установить для параметра (например, дата, ссылка на справочник, число).
  2. Использование: Булево значение, которое указывает, должен ли этот параметр использоваться при формировании отчета. Если установить значение, но не установить Использование = Истина, параметр не будет применен.

Способ 1: Установка параметров в процедуре ПриСозданииНаСервере с явным вызовом ВосстановитьНастройки()

Наиболее распространенный и эффективный способ установки параметров отчета по умолчанию — это изменение свойств КомпоновщикНастроек в процедуре ПриСозданииНаСервере модуля формы отчета. Это гарантирует, что параметры будут установлены еще до того, как форма отчета будет полностью сформирована и отображена пользователю, обеспечивая начальное состояние отчета.

Рассмотрим шаги, которые необходимо выполнить:

  1. Находим параметр: Мы должны получить доступ к нужному параметру через коллекцию КомпоновщикНастроек.Настройки.ПараметрыДанных.Элементы. Для этого удобно использовать метод Найти(), передав ему точное имя параметра, как оно задано в схеме компоновки данных.
  2. Устанавливаем значение и использование: После того как мы нашли параметр, присваиваем ему необходимое Значение и обязательно устанавливаем свойство Использование в Истина. Без этого флажка параметр не будет применен при формировании отчета.
  3. Восстанавливаем настройки: Самый важный шаг – после изменения параметров необходимо вызвать метод КомпоновщикНастроек.ВосстановитьНастройки(). Этот метод заставляет компоновщик настроек перечитать и применить все изменения, внесенные в его свойства, что критично для корректного отображения итогов отчета. Без этого вызова, несмотря на изменение свойств, отчет может сформироваться с предыдущими или пустыми значениями.

Посмотрим на пример кода, который устанавливает период отчета с начала текущего года до текущей даты:


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

    // Определяем период: с начала текущего года по текущую дату
    НачалоГода = НачалоГода(ТекущаяДата());
    КонецПериода = ТекущаяДата();

    // Поиск и установка параметра "НачалоПериода"
    ПараметрНачалоПериода = КомпоновщикНастроек.Настройки.ПараметрыДанных.Найти("НачалоПериода");
    Если ПараметрНачалоПериода <> Неопределено Тогда
        ПараметрНачалоПериода.Значение = НачалоГода;
        ПараметрНачалоПериода.Использование = Истина;
    КонецЕсли;

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

    // Важно: восстанавливаем настройки, чтобы изменения применились
    // Этот метод необходимо вызвать после всех изменений в КомпоновщикНастроек.Настройки
    КомпоновщикНастроек.ВосстановитьНастройки(); 

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

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

Способ 2: Использование вспомогательной процедуры для установки параметров

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

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


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

    // Определяем период: с начала текущего года по текущую дату
    НачалоГода = НачалоГода(ТекущаяДата());
    КонецПериода = ТекущаяДата();

    // Вызываем вспомогательную процедуру для каждого параметра
    УстановитьПараметрСКД("НачалоПериода", НачалоГода);
    УстановитьПараметрСКД("КонецПериода", КонецПериода);

    // Важно: восстанавливаем настройки, чтобы изменения применились
    // Вызов делается один раз после всех установок параметров
    КомпоновщикНастроек.ВосстановитьНастройки(); 

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

&НаСервере
Процедура УстановитьПараметрСКД(ИмяПараметра, ЗначениеПараметра)

    Параметр = КомпоновщикНастроек.Настройки.ПараметрыДанных.Найти(ИмяПараметра);
    Если Параметр <> Неопределено Тогда
        Параметр.Значение = ЗначениеПараметра;
        Параметр.Использование = Истина;
    КонецЕсли;

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

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

Что делать, если параметры находятся не в 'Параметрах данных' схемы?

Иногда параметры, которые нам нужно установить, не являются прямыми параметрами данных схемы компоновки данных. Они могут быть частью пользовательских настроек (КомпоновщикНастроек.ПользовательскиеНастройки), например, если они добавлены через стандартные механизмы настройки отчета как поля отбора или другие элементы. Рассмотрим такие сценарии:

  1. Параметры отбора: Если параметр, который мы хотим установить, является частью отбора, то его нужно искать в коллекции КомпоновщикНастроек.Настройки.Отбор.Элементы. Каждый элемент отбора (ЭлементОтбораКомпоновкиДанных) также имеет свои специфические свойства, такие как ВидСравнения, ЛевоеЗначение, ПравоеЗначение и Использование.

    Пример установки отбора по организации:

    
    &НаСервере
    Процедура УстановитьОтборПоОрганизации(ОрганизацияСсылка)
    
        // Попытка найти существующий элемент отбора по 'Организация'
        ЭлементОтбора = КомпоновщикНастроек.Настройки.Отбор.Элементы.Найти("Организация");
                
        // Если отбора нет, создаем новый
        Если ЭлементОтбора = Неопределено Тогда
            ЭлементОтбора = КомпоновщикНастроек.Настройки.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
            ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Организация");
            ЭлементОтбора.Имя = "Организация"; // Имя для программного доступа
        КонецЕсли;
                
        // Устанавливаем вид сравнения и значение
        ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
        ЭлементОтбора.ПравоеЗначение = ОрганизацияСсылка;
        ЭлементОтбора.Использование = Истина; // Обязательно включить использование
                
        // После всех изменений, не забываем восстановить настройки
        КомпоновщикНастроек.ВосстановитьНастройки();
    КонецПроцедуры
    

    Здесь мы сначала пытаемся найти элемент отбора. Если его нет, то мы его создаем, указывая ЛевоеЗначение как Новый ПолеКомпоновкиДанных("Организация"), что соответствует полю, по которому мы отбираем. Затем устанавливаем ВидСравнения, ПравоеЗначение (это и есть наша ссылка на организацию) и, конечно же, Использование = Истина. Для более сложных условий можно использовать расширенные возможности, например, отборы по соответствию шаблону списком.

  2. Параметры в пользовательских настройках: Более сложные сценарии могут потребовать работы с КомпоновщикНастроек.ПользовательскиеНастройки, где хранятся настройки, сохраненные пользователем. Этот механизм сложнее и обычно используется, если нам нужно эмулировать действия пользователя по выбору значений, например, для более тонкой настройки группировок или других динамических элементов отчета. Работа с пользовательскими настройками требует глубокого понимания их структуры, так как они представляют собой сложную иерархию элементов. Иногда такие задачи требуют нестандартных подходов, вплоть до использования двух разных схем в одном отчете СКД. Для простых случаев, как установка периода, этот подход обычно не применяется.

Важно понимать, что тип объекта, к которому мы обращаемся (будь то ЭлементПараметраДанныхКомпоновкиДанных или ЭлементОтбораКомпоновкиДанных), определяет доступные свойства для установки значений. Всегда проверяйте доступные свойства объекта через отладчик или в синтакс-помощнике.

Распространенные ошибки и советы

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

  1. Забыли Использование = Истина: Одна из самых частых ошибок. Если для параметра или элемента отбора не установлен флажок Использование в Истина, то его значение не будет учтено при формировании отчета, даже если само значение было присвоено. Всегда проверяйте это свойство.
  2. Забыли КомпоновщикНастроек.ВосстановитьНастройки(): Без вызова этого метода изменения, внесенные в КомпоновщикНастроек.Настройки, не будут применены, и отчет сформируется со старыми значениями параметров. Этот метод действует как "обновление" настроек компоновщика.
  3. Попытка установить параметр на клиенте: Все действия с объектом КомпоновщикНастроек и его свойствами должны выполняться на сервере. Процедура ПриСозданииНаСервере — идеальное место для этого. Если попытаться сделать это на клиенте, вы получите ошибку контекста.
  4. Неверное имя параметра: Убедитесь, что имя параметра, которое вы ищете (например, "НачалоПериода"), точно совпадает с именем параметра, заданного в схеме компоновки данных. Регистр символов важен! Опечатки – частая причина того, что параметр не находится.
  5. Параметры по умолчанию в самой СКД: Иногда самый простой способ установить значения по умолчанию — это сделать это прямо в схеме компоновки данных в режиме конфигуратора. Для параметров, которые не требуют динамического расчета (например, всегда выводить данные за последний месяц), это наиболее предпочтительный и простой вариант. Программный подход нужен тогда, когда значения зависят от текущей даты, пользователя, настроек программы или других динамических условий.
  6. Параметр есть, но не отображается в форме: Убедитесь, что параметр включен в ДоступныеПоляКомпоновкиДанных и ПараметрыДанных схемы компоновки данных, и для него разрешено редактирование пользователем, если вы ожидаете его видеть в стандартном окне настроек отчета.
  7. Производительность отчета: При работе со сложными источниками, такими как 'Набор данных - объект', важно помнить о производительности. Существуют специальные приемы, направленные на оптимизацию таких отчетов, которые помогают избежать длительного формирования.

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

← На главную