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