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