Как получить значения параметров периода отчета СКД из модуля формы

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

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

Причины возникновения ошибки «Значение не является значением объектного типа»

Попытка прямого обращения к свойству через конструкцию вида ЗначениеПараметра = КомпоновщикНастроек.Настройки.ПараметрыДанных.НайтиЗначениеПараметра(...) часто приводит к ошибке выполнения. Разберем основные причины такого поведения:

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

Способ 1. Получение результирующих настроек через ПолучитьНастройки()

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

Рассмотрим пример кода для параметра составного типа СтандартныйПериод:


Настройки = Отчет.КомпоновщикНастроек.ПолучитьНастройки();
ПараметрПериод = Настройки.ПараметрыДанных.НайтиЗначениеПараметра(Новый ПараметрКомпоновкиДанных("СтандартныйПериод"));

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

Если в схеме компоновки данных используются два раздельных параметра типа Дата, обратимся к ним напрямую:


Настройки = Отчет.КомпоновщикНастроек.ПолучитьНастройки();

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

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

Способ 2. Поиск в коллекции пользовательских настроек

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


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

Способ 3. Получение параметров в обработчике расшифровки

Если параметры периода требуются в момент клика по ячейке отчета для открытия детального отчета или связанного документа, обратимся к объекту ДанныеРасшифровкиКомпоновкиДанных. Это гарантирует, что мы получим параметры именно того отчета, который отображен на экране (даже если пользователь успел изменить параметры в шапке, но еще не нажал кнопку формирования).

Посмотрим на пример обработки расшифровки на стороне сервера:


// В обработчике расшифровки на клиенте передается адрес во временном хранилище
Данные = ПолучитьИзВременногоХранилища(ДанныеРасшифровки);
НастройкиОтчета = Данные.Настройки;

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

Рекомендация по настройке параметров в схеме СКД

Для удобной работы пользователей и упрощения программной обработки рекомендуется использовать следующую связку в схеме компоновки данных:

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

Такой подход обеспечивает автоматическое заполнение точных границ интервала даже при выборе относительных дат («Прошлый месяц», «Текущий год») без написания дополнительного кода в форме.

← На главную