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

Программист 1С v8.3 (Обычные формы) Управленческий учет
← На главную

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

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

Почему программная установка параметров не видна пользователю?

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

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

Выясним, как правильно синхронизировать эти данные, чтобы пользователь видел актуальные значения.

Метод 1: Программная установка через Пользовательские настройки

Рассмотрим самый правильный с точки зрения архитектуры 1С способ. Чтобы значение отобразилось на форме, нам нужно найти соответствующий элемент в коллекции пользовательских настроек по его идентификатору. Посмотрим на пример кода, который решает эту задачу:


// Определим имя параметра, который нужно заполнить
ИмяПараметра = "Касса1";
НужноеЗначение = Справочники.Кассы.НайтиПоНаименованию("Касса 2");

// 1. Ищем параметр в основных настройках компоновщика
ПараметрОбъект = КомпоновщикНастроек.Настройки.ПараметрыДанных.Элементы.Найти(ИмяПараметра);

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

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

Метод 2: Использование типовых механизмов (для УПП и старых конфигураций)

В конфигурациях вроде УПП (Управление производственным предприятием) или УТ 10.3 отчеты часто строятся на базе "Универсального отчета". В этом случае программный код лучше размещать в модуле объекта отчета в специализированных процедурах.

Одной из таких точек входа является процедура УстановитьНачальныеНастройки. Она вызывается при инициализации отчета. Если мы работаем в модуле отчета, следует использовать следующий алгоритм:

  1. Откроем модуль объекта отчета.
  2. Найдем или создадим процедуру УстановитьНачальныеНастройки.
  3. Вставим код инициализации параметров.

Важный нюанс: в УПП настройки пользователя часто загружаются автоматически из справочника СохраненныеНастройки. Если вы хотите установить значение "по умолчанию" только при первом запуске (чтобы не затирать выбор пользователя, сделанный ранее), обязательно добавьте проверку на заполненность:


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

Метод 3: Перенос настроек через XML (визуальный способ)

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

Разберем по шагам:

  1. Запустите программу в режиме 1С:Предприятие.
  2. Откройте нужный отчет и настройте все параметры, отборы и группировки так, как они должны выглядеть «по умолчанию».
  3. Найдите в меню отчета кнопку Сохранить настройки или используйте стандартную команду Все действия — Сохранить настройки (в некоторых формах доступна выгрузка в XML через контекстное меню компоновщика).
  4. Вернитесь в Конфигуратор, откройте схему компоновки данных (СКД).
  5. Перейдите на закладку Настройки.
  6. Нажмите на кнопку Загрузить настройки (иконка с папкой) и выберите ваш сохраненный файл.

Несмотря на то, что ссылки на объекты (например, конкретный склад) могут выглядеть в конфигураторе как "Объект не найден" (битые ссылки), при запуске в той же базе данных платформа корректно сопоставит их по внутренним идентификаторам (GUID). Однако помните, что этот метод привязывает настройки к конкретной базе данных.

Где размещать код инициализации?

Выясним, в каких событиях формы или объекта лучше всего писать код для программной установки параметров:

Рассмотрим пример для управляемых форм, который учитывает очистку старых настроек:


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

Обратите внимание: использование метода Очистить() для коллекции пользовательских настроек заставляет платформу перегенерировать их на основании основных настроек, которые мы только что изменили. Это «ленивый», но эффективный способ синхронизации данных с формой.

Итоги и рекомендации

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

Посмотрим еще раз на ключевые правила:

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

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

← На главную