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