Добавляем вложенную группировку товаров под магазинами. Меняем состояние родителя и отдельно проверяем, что объект ребёнка и его собственный флаг использования сохранились.
Где и как запускать
Полный код серверного общего модуля УчебныеДиаграммы85. ВыполнитьПример() вызывается из собственного серверного обработчика учебной команды. Код не запускается автоматически в справочнике.
Подготовка
Работайте в отдельной учебной базе на платформе 8.5.1.1343. Справочники, документы, регистры и готовые макеты не нужны.
Создайте общий модуль УчебныеДиаграммы85: Сервер — Да, Клиент — Нет, Привилегированный — Нет. Полностью вставьте код одного урока, а не оборачивайте его второй процедурой.
В своей учебной обработке добавьте команду. Из её серверного обработчика вызовите УчебныеДиаграммы85.ВыполнитьПример();. Не вызывайте серверные объекты СКД непосредственно из тонкого клиента.
Запрос содержит только три собственные константные строки: Север/Книга — 750, Север/Ручка — 50, Юг/Книга — 500. Продажи Севера — 800, Юга — 500, общая сумма — 1300.
Серии будут магазинами, точки — товарами, ресурс — суммой продаж. Значение Книга складывается до 1250, Ручка — до 50. Количество единиц по всем строкам — 6, а число строк источника — 3.
Каждый урок запускайте отдельно: он заново создаёт схему и настройки в памяти. Упражнения с настройками не формируют отчёт; отдельный урок показывает компоновку и вывод.
Для просмотра объектов поставьте точку останова перед последними Сообщить. ТабличныйДокумент результата урока вывода находится в серверной переменной Результат; код не печатает, не сохраняет файл и не открывает окно клиента.
Запуск в 1С здесь не проверялся. Приведены ожидаемые проверки собственной задачи, а не доказательство успешного формирования отчёта в любой конфигурации.
Процедура ВыполнитьПример() Экспорт
Схема = Новый СхемаКомпоновкиДанных;
Источник = Схема.ИсточникиДанных.Добавить();
Источник.Имя = "УчебныеПродажи";
Источник.ТипИсточникаДанных = "Local";
Набор = Схема.НаборыДанных.Добавить(Тип("НаборДанныхЗапросСхемыКомпоновкиДанных"));
Набор.Имя = "СвоиТриСтроки";
Набор.ИсточникДанных = Источник.Имя;
Набор.АвтоЗаполнениеДоступныхПолей = Истина;
Набор.Запрос = "ВЫБРАТЬ
| ""Север"" КАК Магазин,
| ""Книга"" КАК Наименование,
| 3 КАК Количество,
| 750 КАК Сумма
|ОБЪЕДИНИТЬ ВСЕ
|ВЫБРАТЬ ""Север"", ""Ручка"", 1, 50
|ОБЪЕДИНИТЬ ВСЕ
|ВЫБРАТЬ ""Юг"", ""Книга"", 2, 500";
Для Каждого ИмяРесурса Из СтрРазделить("Сумма,Количество", ",") Цикл
Ресурс = Схема.ПоляИтога.Добавить();
Ресурс.ПутьКДанным = ИмяРесурса;
Ресурс.Выражение = "Сумма(" + ИмяРесурса + ")";
КонецЦикла;
Настройки = Схема.НастройкиПоУмолчанию;
Диаграмма = Настройки.Структура.Добавить(Тип("ДиаграммаКомпоновкиДанных"));
Диаграмма.Имя = "УчебныеПродажиПоМагазинам";
Диаграмма.Использование = Истина;
Выбранное = Диаграмма.Выбор.Элементы.Добавить(Тип("ВыбранноеПолеКомпоновкиДанных"));
Выбранное.Поле = Новый ПолеКомпоновкиДанных("Сумма");
Выбранное.Использование = Истина;
Серия = Диаграмма.Серии.Добавить();
Серия.Имя = "Магазины";
Серия.Использование = Истина;
ПолеСерии = Серия.ПоляГруппировки.Элементы.Добавить(Тип("ПолеГруппировкиКомпоновкиДанных"));
ПолеСерии.Поле = Новый ПолеКомпоновкиДанных("Магазин");
ПолеСерии.ТипГруппировки = ТипГруппировкиКомпоновкиДанных.Элементы;
ПолеСерии.Использование = Истина;
Точка = Диаграмма.Точки.Добавить();
Точка.Имя = "Товары";
Точка.Использование = Истина;
ПолеТочки = Точка.ПоляГруппировки.Элементы.Добавить(Тип("ПолеГруппировкиКомпоновкиДанных"));
ПолеТочки.Поле = Новый ПолеКомпоновкиДанных("Наименование");
ПолеТочки.ТипГруппировки = ТипГруппировкиКомпоновкиДанных.Элементы;
ПолеТочки.Использование = Истина;
Вложенная = Серия.Структура.Добавить();
Вложенная.Имя = "ТоварыВнутриМагазина";
Вложенная.Использование = Истина;
ВложенноеПоле = Вложенная.ПоляГруппировки.Элементы.Добавить(Тип("ПолеГруппировкиКомпоновкиДанных"));
ВложенноеПоле.Поле = Новый ПолеКомпоновкиДанных("Наименование");
ВложенноеПоле.ТипГруппировки = ТипГруппировкиКомпоновкиДанных.Элементы;
ВложенноеПоле.Использование = Истина;
Серия.Состояние = СостояниеЭлементаНастройкиКомпоновкиДанных.Отключен;
Сообщить(Серия.Состояние = СостояниеЭлементаНастройкиКомпоновкиДанных.Отключен);
Сообщить(Серия.Использование);
Сообщить(Вложенная.Родитель = Серия И Вложенная.Использование);
Сообщить(Серия.Структура.Количество() = 1);
Серия.Состояние = СостояниеЭлементаНастройкиКомпоновкиДанных.УдаленПользователем;
Сообщить(Серия.Структура.Получить(0) = Вложенная);
Серия.Состояние = СостояниеЭлементаНастройкиКомпоновкиДанных.Включен;
Сообщить(Серия.Состояние = СостояниеЭлементаНастройкиКомпоновкиДанных.Включен);
Диаграмма.Использование = Ложь;
Сообщить(Не Диаграмма.Использование И Вложенная.Использование);
Диаграмма.Использование = Истина;
КонецПроцедурыРазбор по шагам
Вложенная группа создаётся Серия.Структура.Добавить(), без конструктора и без параметра Тип.
Её поле Наименование определяет дополнительный уровень группировки серий, не заменяя уже существующую группировку точек.
Отключен и УдаленПользователем — состояния настройки, а не вызовы Удалить. Поэтому объект ребёнка остаётся в коллекции.
Возвращаем состояние Включен. Отдельно выключаем использование всей диаграммы и проверяем сохранение собственного флага ребёнка.
Отсутствие присваивания дочернему флагу важно: настройки могут исключаться из обработки без переписывания дерева. Здесь результат не формируется.
Как проверить результат
Ожидаются семь сравнений Истина. Вложенная группа во всех промежуточных состояниях остаётся тем же объектом.
Не интерпретируйте Истина у Вложенная.Использование как обещание её вывода при выключенной диаграмме. Проверьте эту разницу отдельной компоновкой в своей учебной базе.
Ожидаемый результат
Разделены состояние элемента, флаг использования и физическое удаление вложенных настроек.
На что обратить внимание
Состояние Отключен не равнозначно очистке Структура.
Родитель только читается; перестроение дерева выполняется через коллекции.
Вложенная группировка серий и группировка точек принадлежат разным ветвям диаграммы.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.