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