Работа с параметрами в Системе компоновки данных (СКД) в среде управляемых форм часто вызывает затруднения у начинающих разработчиков. Типичная ситуация: в коде значение параметра вроде бы установлено, отладчик показывает верные данные, но на самой форме отчета поле параметра остается пустым. Рассмотрим подробно, почему это происходит, и разберем все возможные способы решения этой задачи — от самых простых до продвинутых программных методов.
Прежде чем переходить к коду, проанализируем архитектуру работы компоновщика настроек. В управляемом приложении 1С существует две основные коллекции, где могут храниться параметры:
КомпоновщикНастроек.Настройки.ПараметрыДанных — это основные настройки схемы.КомпоновщикНастроек.ПользовательскиеНастройки — это те настройки, которые вынесены на форму для изменения пользователем.Когда вы в конструкторе СКД на закладке "Параметры" включаете галочку в колонке "Пользовательские настройки", платформа создает связь между основным параметром и элементом в коллекции пользовательских настроек. Важный нюанс: при формировании отчета приоритет имеют именно пользовательские настройки. Если вы измените значение в основной коллекции, но не синхронизируете его с пользовательской, на форме (и в результате отчета) вы увидите старое или пустое значение.
Если ваша задача — установить текущую дату или начало периода по умолчанию, самый эффективный способ — сделать это без написания кода в модулях. Выясним, как использовать поле "Выражение" в конструкторе СКД.
Рассмотрим примеры выражений для разных нужд:
ТекущаяДата()НачалоПериода(ТекущаяДата(), "День")Новый СтандартныйПериод(ВариантСтандартногоПериода.ПрошлыйМесяц)Этот метод хорош тем, что он работает "из коробки", не требует поддержки кода в форме и корректно инициализирует параметры при открытии отчета.
Если ваша конфигурация построена на базе БСП, то для установки параметров следует использовать готовые механизмы. Проанализируем работу с общим модулем КомпоновкаДанныхКлиентСервер. Метод УстановитьПараметрДанных этой библиотеки самостоятельно находит параметр и в основных настройках, и в пользовательских, обеспечивая их синхронизацию.
Пример вызова функции:
КомпоновкаДанныхКлиентСервер.УстановитьПараметрДанных(
ЭтаФорма.Отчет.КомпоновщикНастроек,
"ИмяВашегоПараметра",
ТекущаяДата()
);
Использование этого метода избавляет разработчика от необходимости знать внутренние идентификаторы настроек и гарантирует, что значение отобразится на форме.
Если необходимо реализовать логику вручную (например, в конфигурации без БСП), мы должны правильно найти элемент в коллекции ПользовательскиеНастройки. Обращение по индексу, например Элементы[0], крайне нежелательно, так как при изменении состава параметров в СКД индекс может измениться, что приведет к ошибкам.
Разберем правильный алгоритм поиска по шагам:
ИдентификаторПользовательскойНастройки этого параметра.ПользовательскиеНастройки.Посмотрим на пример кода:
// 1. Ищем параметр в основных настройках по имени
ПараметрСКД = Отчет.КомпоновщикНастроек.Настройки.ПараметрыДанных.Элементы.Найти("ДатаОтчета");
Если ПараметрСКД <> Неопределено Тогда
// 2. Получаем идентификатор для связи с пользовательскими настройками
ИдентификаторНастройки = ПараметрСКД.ИдентификаторПользовательскойНастройки;
// 3. Ищем элемент в пользовательских настройках
ЭлементПользовательскойНастройки = Отчет.КомпоновщикНастроек.ПользовательскиеНастройки.Элементы.Найти(ИдентификаторНастройки);
Если ЭлементПользовательскойНастройки <> Неопределено Тогда
ЭлементПользовательскойНастройки.Значение = ТекущаяДата();
ЭлементПользовательскойНастройки.Использование = Истина;
КонецЕсли;
КонецЕсли;
Выбор правильного события формы — залог того, что ваши программные изменения не будут затерты платформой. Проанализируем основные события:
Иногда даже при правильной установке в ПользовательскиеНастройки визуальное поле на форме остается пустым. В таких случаях мы рекомендуем выполнить следующие действия:
Во-первых, проверьте свойство Использование. Если вы установили значение, но Использование равно Ложь, платформа может проигнорировать установку визуально.
Во-вторых, можно принудительно обновить отображение данных формы, используя метод:
ЭтаФорма.ОбновитьОтображениеДанных();
В-третьих, в некоторых сложных случаях помогает явная перезагрузка настроек в компоновщик:
Отчет.КомпоновщикНастроек.ЗагрузитьПользовательскиеНастройки(Отчет.КомпоновщикНастроек.ПользовательскиеНастройки);
Если значение вашего параметра зависит от контекста (например, текущий пользователь или основная организация), рассмотрим возможность обращения к параметрам сеанса напрямую в схеме СКД. В поле "Выражение" параметра можно написать:
&ПараметрыСеанса.ТекущийПользователь
Это делает отчет автономным: ему не требуется никакой программный код в модуле формы для корректной инициализации данных, что значительно упрощает разработку и поддержку.
Таким образом, для программной передачи параметра в СКД мы рекомендуем сначала попробовать декларативный метод через выражения. Если же требуется сложная программная логика, используйте методы БСП или прямой поиск в коллекции ПользовательскиеНастройки по идентификатору, избегая обращения по индексам.