Как программно установить отбор и изменить группировки при открытии отчета СКД

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

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

Способ 1: Подготовка пользовательских настроек на сервере

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

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


&НаКлиенте
Процедура ОтчетПоЧекамТерминал(Команда)
    // Получаем сформированные настройки с сервера
    ПользовательскиеНастройки = ПолучитьПараметрыОткрытияОтчета();
    
    ПараметрыОтчета = Новый Структура;
    ПараметрыОтчета.Вставить("СформироватьПриОткрытии", Истина);
    ПараметрыОтчета.Вставить("КлючВарианта", "Основной"); // Укажите имя вашего варианта
    ПараметрыОтчета.Вставить("ПользовательскиеНастройки", ПользовательскиеНастройки);
    
    ОткрытьФорму("Отчет.ОтчетПоЧекам.Форма", ПараметрыОтчета);
КонецПроцедуры

Теперь разберем серверную часть, где происходит основная магия. Нам нужно найти идентификатор пользовательской настройки для отбора и добавить туда новый элемент. Важно помнить, что в СКД отборы могут быть как общими, так и вынесенными в пользовательские настройки.


&НаСервереБезКонтекста
Функция ПолучитьПараметрыОткрытияОтчета()
    ОтчетОбъект = Отчеты["ОтчетПоЧекам"].Создать();
    КомпоновщикНастроек = ОтчетОбъект.КомпоновщикНастроек;
    
    // Вызываем вспомогательную процедуру для установки элемента отбора
    УстановитьЭлементПользовательскогоОтбораСКД(
        КомпоновщикНастроек, 
        ВидСравненияКомпоновкиДанных.Равно, 
        "ЧекККМ.Оплата.ВидОплаты", 
        Справочники.ВидыОплатЧекаККМ.НайтиПоНаименованию("Наличные")
    );
    
    Возврат КомпоновщикНастроек.ПользовательскиеНастройки;
КонецФункции

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

    ЭлементОтбора = ПользовательскийОтбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
    ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных(ИмяПоля);
    ЭлементОтбора.ВидСравнения = ВидСравнения;
    ЭлементОтбора.ПравоеЗначение = Значение;
    ЭлементОтбора.Использование = Истина;
    // Генерируем новый ID, чтобы избежать конфликтов
    ЭлементОтбора.ИдентификаторПользовательскойНастройки = Новый УникальныйИдентификатор;
КонецПроцедуры

Важное замечание: При установке отборов по полям через точку (например, ЧекККМ.Оплата.ВидОплаты), убедитесь, что путь к данным указан точно так же, как он определен в схеме компоновки данных. Ошибка в одном символе приведет к тому, что отбор не применится.

Способ 2: Использование упрощенных параметров формы

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


ПараметрыОтчета = Новый Структура;
СтруктураОтбора = Новый Структура("Организация", ВыбОрганизация);
ПараметрыОтчета.Вставить("Отбор", СтруктураОтбора);
ПараметрыОтчета.Вставить("СформироватьПриОткрытии", Истина);

ОткрытьФорму("Отчет.ВашОтчет.Форма", ПараметрыОтчета);

Выясним причину, по которой этот способ иногда "отбрасывают": при такой передаче система может скрывать быстрые настройки от пользователя или конфликтовать с уже сохраненными настройками. Однако для простых случаев это самый быстрый вариант.

Изменение группировок при открытии

Вопрос изменения структуры отчета (группировок) является более сложным. Группировки в СКД хранятся в коллекции Настройки.Структура. Чтобы программно изменить их при открытии, нужно выполнить следующие шаги:

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

Проанализируем пример добавления группировки:


НоваяГруппировка = КомпоновщикНастроек.Настройки.Структура.Добавить(Тип("ГруппировкаКомпоновкиДанных"));
НоваяГруппировка.Использование = Истина;

ПолеГруппировки = НоваяГруппировка.ПоляГруппировки.Элементы.Добавить(Тип("ПолеГруппировкиКомпоновкиДанных"));
ПолеГруппировки.Поле = Новый ПолеКомпоновкиДанных("Номенклатура");
ПолеГруппировки.Использование = Истина;

// Добавляем выбранные поля для этой группировки (авто-поля)
ВыбранноеПоле = НоваяГруппировка.ВыбранныеПоля.Элементы.Добавить(Тип("АвтоВыбранноеПолеКомпоновкиДанных"));
ВыбранноеПоле.Использование = Истина;

Работа с Фиксированными настройками

Разберем ситуацию, когда отбор должен быть "жестким", то есть пользователь не должен иметь возможности его отключить в интерфейсе. Для этого используются ФиксированныеНастройки. Если передать их в параметры формы, они накладываются "поверх" всех пользовательских настроек.


ФиксированныеНастройки = Новый НастройкиКомпоновкиДанных;
ЭлементОтбора = ФиксированныеНастройки.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Склад");
ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
ЭлементОтбора.ПравоеЗначение = СкладСсылка;
ЭлементОтбора.Использование = Истина;

ПараметрыОтчета.Вставить("ФиксированныеНастройки", ФиксированныеНастройки);

Тонкости и нюансы

Рассмотрим подробнее важные моменты, которые часто упускают из виду:

Подводя итог, можно сказать, что управление отчетами СКД через параметры формы — это мощный инструмент. Мы рекомендуем использовать передачу ПользовательскихНастроек для гибких фильтров и ФиксированныхНастроек для обязательных ограничений данных. Для упрощения программной настройки структуры и параметров компоновки можно использовать модуль-обёртку над объектной моделью СКД.

← На главную