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