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

Программист 1С v8.3 (Обычные формы) 1С:Управление торговлей Торговля и дистрибуция
← На главную

Схема компоновки данных (СКД) позволяет создавать гибкие внешние и внутренние отчеты. Однако при работе с обычными формами (например, в конфигурациях «Управление торговлей 10.3» или «Управление производственным предприятием 1.3») разработчики часто сталкиваются с вопросом: как правильно настроить несколько вариантов отчета от разработчика и предоставить пользователю удобный интерфейс для их переключения.

Рассмотрим подробнее суть вариантов настроек в СКД, способы их отображения на форме обычного приложения, а также методы адаптации логики запросов и вычисляемых полей под каждый вариант.

Суть вариантов отчета в схеме компоновки данных

Разберем базовые принципы работы вариантов СКД:

  1. Что такое вариант отчета: Вариант разработчика — это заранее сохраненная структура настроек отчета (выбранные поля, группировки, отборы, сортировки, условное оформление). Все варианты в рамках одной схемы компоновки базируются на общем описании наборов данных и связей.
  2. Работа с разной логикой расчетов: Если для первого варианта нужно вывести сумму двух полей А + Б, а для второго — А + Б + В, создавать отдельный запрос не обязательно. В СКД предусмотрено несколько способов решения такой задачи: использование пользовательских полей, условных выражений в вычисляемых полях или управление параметрами схемы.

Программное отображение и переключение вариантов в обычных формах

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

Рассмотрим практический пример создания кнопок переключения вариантов настроек на командной панели формы отчета. Данный код размещается в модуле формы отчета:


Процедура УстановитьВариантыНастроек()

    КП = ЭлементыФормы.ДействияФормы;
    НоваяКнопка = КП.Кнопки.Вставить(1, "_ВариантыОтчетов", ТипКнопкиКоманднойПанели.Подменю, "Варианты отчетов");
    НовоеДействие = Новый Действие("_СменаВариантаНастройки");
    
    ч = 1;
    Для Каждого Настройка Из СхемаКомпоновкиДанных.ВариантыНастроек Цикл
        КП.Кнопки._ВариантыОтчетов.Кнопки.Добавить("Вариант" + Строка(ч), ТипКнопкиКоманднойПанели.Действие, Настройка.Представление, НовоеДействие);
        ч = ч + 1;
    КонецЦикла;

КонецПроцедуры

Процедура _СменаВариантаНастройки(Элемент)

    Для Каждого Настройка Из СхемаКомпоновкиДанных.ВариантыНастроек Цикл
        Если Элемент.Текст = Настройка.Представление Тогда
            КомпоновщикНастроек.ЗагрузитьНастройки(Настройка.Настройки);
            
            // Если на форме есть элементы периодов, обновляем их значения
            НачПериодаПриИзменении(ЭтаФорма.ЭлементыФормы.НачПериода);
            КонПериодаПриИзменении(ЭтаФорма.ЭлементыФормы.КонПериода);
            Прервать;
        КонецЕсли;
    КонецЦикла;

КонецПроцедуры

Проанализируем алгоритм работы данного кода:

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

Альтернативный вариант: На форму обычного приложения также можно добавить стандартную кнопку командной панели с типом действия «Выбрать вариант...» или задействовать платформенный механизм ХранилищеВариантовНастроек.

Различная логика вычислений и запросов для разных вариантов

Часто возникает необходимость сделать варианты отчета существенно разной структуры или с отличающимися формулами вычислений. Выясним основные подходы к реализации такой бизнес-логики:

1. Использование пользовательских полей

Если разница заключается лишь в формуле показателя, на закладке «Настройки» конкретного варианта отчета можно добавить Пользовательское поле. В первом варианте прописать выражение А + Б, а во втором варианте — А + Б + В. В результате схема останется единой, а формулы будут меняться вместе с выбранным вариантом.

2. Условные выражения и параметры в СКД

В вычисляемых полях на закладке «Вычисляемые поля» можно использовать логические конструкции языка выражений СКД:


ВЫБОР 
    КОГДА &ВариантРасчета = 1 ТОГДА ПолеА + ПолеБ 
    ИНАЧЕ ПолеА + ПолеБ + ПолеВ 
КОНЕЦ

Значение параметра &ВариантРасчета при этом задается индивидуально на закладке «Параметры» внутри настроек каждого варианта.

3. Оптимизация неиспользуемых наборов данных платформой

Если для разных вариантов требуются разрозненные данные (разные таблицы и регистры), их можно добавить в одну СКД как разные наборы данных или сложную систему связей. Платформа 1С обладает механизмом автоматической оптимизации: если в выбранном варианте отчета не участвуют поля определенного набора данных, запрос к этому набору или соединению таблиц физически не выполняется к СУБД.

4. Динамическая подмена запроса в модуле объекта

Если условия формирования отчета принципиально различаются, вы можете модифицировать схему программно перед формированием. В модуле объекта отчета в процедуре ПриКомпоновкеРезультата перехватывается выполнение отчета:


Процедура ПриКомпоновкеРезультата(ТабличныйДокумент, СтандартнаяОбработка)
    
    Настройки = КомпоновщикНастроек.ПолучитьНастройки();
    
    // Проверяем выбранный вариант или параметр
    Если ИмяТекущегоВарианта = "ОсобыйВариант" Тогда
        // Подменяем текст запроса в наборе данных схемы
        СхемаКомпоновкиДанных.НаборыДанных.НаборДанных1.Запрос = "ВЫБРАТЬ ...";
    КонецЕсли;

КонецПроцедуры

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

← На главную