ГруппировкаДиаграммыМакетаКомпоновкиДанных

Типы · DataCompositionTemplateChartGroup

Группировка диаграммы.

Полное описание, параметры и ограничения

ГруппировкаДиаграммыМакетаКомпоновкиДанных (DataCompositionTemplateChartGroup)

ГруппировкаДиаграммыМакетаКомпоновкиДанных (DataCompositionTemplateChartGroup)

Доступен, начиная с версии 8.1.

Свойства:
Группировка (Group)
Идентификатор (ID)
ИерархическийПорядок (HierarchicalOrder)
Имя (Name)
КоличествоЗаписей (RecordsCount)
ОтборГруппировок (GroupFilter)
ОтборГруппировокСИерархией (GroupFilterWithHierarchy)
ОтборГруппировокТолькоИерархия (GroupFilterHierarchyOnly)
ОтборЗаписей (RecordsFilter)
Порядок (Order)
ПроцентЗаписей (RecordsPercent)
Тело (Body)
ТелоИерархии (HierarchicalBody)

Описание:

Группировка диаграммы.

Доступность:

Сервер, толстый клиент, внешнее соединение, мобильное приложение (сервер), мобильный автономный сервер.
Данный объект может быть сериализован в/из XML. Данный объект может быть сериализован в/из XDTO. Тип XDTO, соответствующий данному объекту, определяется в пространстве имен {http://v8.1c.ru/8.1/data-composition-system/composition-template}. Имя типа XDTO: ChartGroup.

См. также:
ГруппировкиДиаграммыМакетаКомпоновкиДанных, метод Вставить
ГруппировкиДиаграммыМакетаКомпоновкиДанных, метод Добавить
ГруппировкиДиаграммыМакетаКомпоновкиДанных, метод Получить
ГруппировкиДиаграммыМакетаКомпоновкиДанных, метод Индекс
ГруппировкиДиаграммыМакетаКомпоновкиДанных, метод Сдвинуть
ГруппировкиДиаграммыМакетаКомпоновкиДанных, метод Удалить

Использование в версии:

Доступен, начиная с версии 8.1.

Методическая информация

Практические примеры

Исследовать серии и точки настоящего макета диаграммы СКД

Строим свою гистограмму из трёх продаж, затем разбираем созданные компоновщиком группировки серий и точек, выражения, ограничения, сортировки и области ресурсов.

Где и как запускать

Полный серверный общий модуль УчебныйМакетДиаграммы85; запускается только из собственной серверной учебной команды.

Подготовка

  1. Используйте отдельную пустую учебную базу 8.5.1.1343. Данные рабочих конфигураций, готовые отчёты и подключение к интернету не нужны.

  2. Создайте общий модуль УчебныйМакетДиаграммы85: Сервер — Да, Клиент — Нет, Вызов сервера — Нет, Привилегированный — Нет. Вставьте весь модуль одного урока целиком, включая вспомогательные функции.

  3. В своей учебной обработке создайте управляемую форму и команду ВыполнитьУрок. Через конструктор обработчика добавьте клиентскую процедуру команды, вызывающую собственную процедуру ВыполнитьНаСервере() с директивой &НаСервереБезКонтекста. В её тело вставьте УчебныйМакетДиаграммы85.ВыполнитьПример();.

  4. В запросе только свои три строки: Север/Книга — количество 3, сумма 750; Север/Ручка — 1 и 50; Юг/Книга — 2 и 500. Сумма источника 1300, количество единиц 6. Запрос ничего не читает из справочников или регистров.

  5. Поставьте точку останова перед последним Сообщить в ВыполнитьПример. В серверном отладчике смотрите переменные Макет, Группы и Результат; у табличного документа можно открыть просмотр значения. Не пытайтесь вернуть Макет в тонкий клиент.

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

  7. Магазины — серии, товары — точки, ресурс — сумма. Группировка настроек, группировка скомпилированного макета и готовая серия рисунка — разные объекты. У группировки макета нет конструктора Новый; она получается обходом собственных Макет.Тело → Диаграмма → Серии/Точки.

  8. Пример не запускался в 1С. Контрольные результаты ниже ожидаемые; статические проверки сигнатур не подтверждают фактическое оформление или размещение итогов в табличном документе.

  9. Наш запрос не содержит Юг/Ручка. Отсутствующая комбинация — не отдельная исходная строка с нулём. Суммы магазина Север 800, Юга 500, товара Книга 1250 и Ручка 50.

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

Процедура НайтиГруппыДиаграмм(Тело, Найденные)
    Для Каждого Часть Из Тело Цикл
        Если ТипЗнч(Часть) = Тип("ДиаграммаМакетаКомпоновкиДанных") Тогда
            Сообщить("Диаграмма: " + Часть.Имя);
            Сообщить("Идентификатор диаграммы: " + Часть.Идентификатор);
            Сообщить("Макет диаграммы: " + Часть.Макет);
            Сообщить("Макет ресурсов диаграммы: " + Часть.МакетРесурсов);
            СобратьГруппыОси(Часть.Серии, Найденные);
            СобратьГруппыОси(Часть.Точки, Найденные);
        ИначеЕсли ТипЗнч(Часть) = Тип("ГруппировкаМакетаКомпоновкиДанных") Тогда
            НайтиГруппыДиаграмм(Часть.Тело, Найденные);
        КонецЕсли;
    КонецЦикла;
КонецПроцедуры

Процедура СобратьГруппыОси(ТелоОси, Найденные)
    Для Каждого Часть Из ТелоОси Цикл
        Если ТипЗнч(Часть) = Тип("ГруппировкаДиаграммыМакетаКомпоновкиДанных") Тогда
            Найденные.Добавить(Часть);
            СобратьГруппыОси(Часть.Тело, Найденные);
        КонецЕсли;
    КонецЦикла;
КонецПроцедуры

Функция СформироватьСвойДокумент(СвойМакет)
    Процессор = Новый ПроцессорКомпоновкиДанных;
    Процессор.Инициализировать(СвойМакет);
    Документ = Новый ТабличныйДокумент;
    Вывод = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
    Вывод.ОтображатьПроцентВывода = Ложь;
    Вывод.УстановитьДокумент(Документ);
    РезультатВывода = Вывод.Вывести(Процессор, Ложь);
    Если ТипЗнч(РезультатВывода) <> Тип("ТабличныйДокумент") Тогда
        ВызватьИсключение "Не получен собственный табличный документ";
    КонецЕсли;
    Возврат РезультатВывода;
КонецФункции

Разбор по шагам

  1. Источник Local содержит только собственные константы. Сумма и Количество объявлены ресурсами, но в диаграмму выбираем Сумма.

  2. Настройки задают Магазин для серий и Наименование для точек; ТипГруппировки Элементы не запрашивает иерархию справочника.

  3. Схема и настройки передаются компоновщику. Полученный МакетКомпоновкиДанных ещё не является рисунком или ТабличнымДокументом.

  4. В реальном теле ищем точный тип ДиаграммаМакетаКомпоновкиДанных. Его Серии и Точки — отдельные readonly-коллекции группировок макета; не присваиваем им новые массивы.

  5. Тип каждого узла проверяется перед чтением. Рекурсия обходит простые неиерархические группировки своей диаграммы; пустое тело не превращается в выдуманный объект.

  6. Группировка описывает поля и выражения оси. Имя и Идентификатор читаем для диагностики, не переименовываем связанную часть макета.

  7. Четыре области отбора, обычный и иерархический порядок относятся к разным этапам. Пустые выражения и отсутствие иерархического тела допустимы в этой простой задаче.

  8. В теле группы отдельно проверяем МакетГруппировкиДиаграммыМакетаКомпоновкиДанных: Макет — строковое имя области, МакетРесурсов — коллекция объектов. У каждого объекта читаем свои Макет и МакетГруппировки.

  9. Свежий процессор и процессор вывода создают собственный табличный документ с диаграммой. В отладчике можно сопоставить описание группировок с фактическими сериями и точками.

Как проверить результат

  1. Группы не пусты. Среди полей найдите Магазин и Наименование, заключительное сравнение высоты документа должно дать Истина.

  2. В просмотре результата ожидаются две серии Север и Юг, точки Книга и Ручка. Значения имеющихся пересечений: 750, 50 и 500; исходная общая сумма 1300.

  3. Проверьте в отладчике типы коллекций и частей тела. Техническое число областей, их имена и заполнение неиспользуемых иерархических частей не фиксируются.

  4. Отсутствующая Юг/Ручка может оформляться как пустое значение; по её виду нельзя заключать, что исходный запрос содержал четвёртую продажу.

Ожидаемый результат

Получена собственная диаграмма и полноценный диагностический разбор её реального макета, без неизвестных входных объектов и записи в рабочую базу.

На что обратить внимание

  1. ГруппировкаДиаграммыМакетаКомпоновкиДанных не равна ГруппировкаДиаграммыКомпоновкиДанных из настроек и не равна СерияДиаграммы готового рисунка.

  2. Не присваивайте readonly-ссылки Группировка, Порядок, ИерархическийПорядок, Тело и ТелоИерархии. Строковые имена областей нельзя подменять объектами.

  3. У группировки диаграммы нет МакетШапки и МакетПодвала, в отличие от других группировок. Области вывода ищутся в её теле.

  4. Не вставляйте SQL или текст запроса в скомпилированные отборы без проверки языка выражений СКД. Для обычного изменения фильтра корректируйте настройки и пересобирайте макет.

  5. Обход рассчитан на созданную здесь простую диаграмму без иерархических группировок и вложенных схем; это не универсальный инспектор чужих отчётов.

  6. Статические проверки не подтверждают оформление диаграммы на экране. Здесь агент не запускает 1С, не вызывает сеть, печать или сохранение файла.

Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.

Ограничить магазинные серии диаграммы и вернуть полный вывод

Из одного своего макета создаём три независимых результата. Ограничиваем только группировку Магазин до одной записи и возвращаем -1; точки товаров и исходные продажи остаются прежними.

Где и как запускать

Полный серверный общий модуль УчебныйМакетДиаграммы85; запускается только из собственной серверной учебной команды.

Подготовка

  1. Используйте отдельную пустую учебную базу 8.5.1.1343. Данные рабочих конфигураций, готовые отчёты и подключение к интернету не нужны.

  2. Создайте общий модуль УчебныйМакетДиаграммы85: Сервер — Да, Клиент — Нет, Вызов сервера — Нет, Привилегированный — Нет. Вставьте весь модуль одного урока целиком, включая вспомогательные функции.

  3. В своей учебной обработке создайте управляемую форму и команду ВыполнитьУрок. Через конструктор обработчика добавьте клиентскую процедуру команды, вызывающую собственную процедуру ВыполнитьНаСервере() с директивой &НаСервереБезКонтекста. В её тело вставьте УчебныйМакетДиаграммы85.ВыполнитьПример();.

  4. В запросе только свои три строки: Север/Книга — количество 3, сумма 750; Север/Ручка — 1 и 50; Юг/Книга — 2 и 500. Сумма источника 1300, количество единиц 6. Запрос ничего не читает из справочников или регистров.

  5. Поставьте точку останова перед последним Сообщить в ВыполнитьПример. В серверном отладчике смотрите переменные Макет, Группы и Результат; у табличного документа можно открыть просмотр значения. Не пытайтесь вернуть Макет в тонкий клиент.

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

  7. Магазины — серии, товары — точки, ресурс — сумма. Группировка настроек, группировка скомпилированного макета и готовая серия рисунка — разные объекты. У группировки макета нет конструктора Новый; она получается обходом собственных Макет.Тело → Диаграмма → Серии/Точки.

  8. Пример не запускался в 1С. Контрольные результаты ниже ожидаемые; статические проверки сигнатур не подтверждают фактическое оформление или размещение итогов в табличном документе.

  9. Наш запрос не содержит Юг/Ручка. Отсутствующая комбинация — не отдельная исходная строка с нулём. Суммы магазина Север 800, Юга 500, товара Книга 1250 и Ручка 50.

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

Процедура НайтиГруппыДиаграмм(Тело, Найденные)
    Для Каждого Часть Из Тело Цикл
        Если ТипЗнч(Часть) = Тип("ДиаграммаМакетаКомпоновкиДанных") Тогда
            Сообщить("Диаграмма: " + Часть.Имя);
            Сообщить("Идентификатор диаграммы: " + Часть.Идентификатор);
            Сообщить("Макет диаграммы: " + Часть.Макет);
            Сообщить("Макет ресурсов диаграммы: " + Часть.МакетРесурсов);
            СобратьГруппыОси(Часть.Серии, Найденные);
            СобратьГруппыОси(Часть.Точки, Найденные);
        ИначеЕсли ТипЗнч(Часть) = Тип("ГруппировкаМакетаКомпоновкиДанных") Тогда
            НайтиГруппыДиаграмм(Часть.Тело, Найденные);
        КонецЕсли;
    КонецЦикла;
КонецПроцедуры

Процедура СобратьГруппыОси(ТелоОси, Найденные)
    Для Каждого Часть Из ТелоОси Цикл
        Если ТипЗнч(Часть) = Тип("ГруппировкаДиаграммыМакетаКомпоновкиДанных") Тогда
            Найденные.Добавить(Часть);
            СобратьГруппыОси(Часть.Тело, Найденные);
        КонецЕсли;
    КонецЦикла;
КонецПроцедуры

Функция СформироватьСвойДокумент(СвойМакет)
    Процессор = Новый ПроцессорКомпоновкиДанных;
    Процессор.Инициализировать(СвойМакет);
    Документ = Новый ТабличныйДокумент;
    Вывод = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
    Вывод.ОтображатьПроцентВывода = Ложь;
    Вывод.УстановитьДокумент(Документ);
    РезультатВывода = Вывод.Вывести(Процессор, Ложь);
    Если ТипЗнч(РезультатВывода) <> Тип("ТабличныйДокумент") Тогда
        ВызватьИсключение "Не получен собственный табличный документ";
    КонецЕсли;
    Возврат РезультатВывода;
КонецФункции

Разбор по шагам

  1. Создаём собственный источник трёх продаж, ресурсы и гистограмму: магазин задаёт серии, наименование — точки.

  2. Компонуем макет и находим его реальные группировки точными проверками типов, не берём случайный первый элемент коллекции.

  3. ДоОграничения формируется свежим процессором. Это независимый табличный документ, который остаётся доступным для сравнения.

  4. В каждой найденной группе проверяем ИмяПоля. Только при Магазин устанавливаем КоличествоЗаписей=1 и проверяем записанное значение.

  5. Если подходящая группа не найдена, выдаём понятную ошибку вместо тихого успеха. Товарную группу Наименование не меняем.

  6. ПослеОграничения получает новый процессор; старый поток не используется повторно. Ограничение вывода серий не меняет запрос и три исходные строки.

  7. Возвращаем -1 только магазинным группам и формируем Результат третьим процессором. По справке -1 означает все записи.

  8. В отладчике сравниваем содержимое диаграмм в трёх документах. Проверяем источник: он по-прежнему содержит три строки и сумму 1300.

Как проверить результат

  1. Четыре конечных сравнения должны дать Истина. Изменено больше нуля, во время второго вывода КоличествоЗаписей магазинной группы равно 1.

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

  3. Сравните точки Книга/Ручка и исходные суммы. Не принимайте ограничение рисунка за фильтр исходных данных или гарантию уменьшения общих итогов до суммы видимой серии.

Ожидаемый результат

Собственная диаграмма сформирована до ограничения, при нём и после его отмены; исходный запрос и товарная ось не изменены.

На что обратить внимание

  1. КоличествоЗаписей не изменяет текст запроса и не равно числу элементов коллекции Серии готового рисунка.

  2. ПроцентЗаписей здесь не меняется: сочетание процентного и числового ограничения не угадывается. Пользовательские ограничения обычного отчёта предпочтительно задавать в настройках.

  3. Для каждого полного вывода нужен новый инициализированный процессор. Повторное чтение уже исчерпанного потока — другое действие.

  4. Макет построен в этом собственном запуске. Не применяйте такую правку к общему закешированному макету чужого отчёта.

  5. Не сравнивайте число серий с физической высотой ТабличногоДокумента и не обещайте порядок магазинов без настройки сортировки.

Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.

Не хотите разбираться сами?

Адаптируем это решение под вашу базу. Оценка бесплатно.

Оставить задачу

1С, 1С:Предприятие — товарные знаки ООО «1С». Сайт не является официальным представительством фирмы «1С» и не аффилирован с ней.