Сформировать учебную диаграмму в табличный документ

Учебные задачи

Продолжаем путь от своей схемы до результата: настройки → макет → процессор → вывод. Дополнительно выполняем исходный константный запрос для проверки трёх строк и суммы 1300.

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

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

Подготовка

  1. Работайте в отдельной учебной базе на платформе 8.5.1.1343. Справочники, документы, регистры и готовые макеты не нужны.

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

  3. В своей учебной обработке добавьте команду. Из её серверного обработчика вызовите УчебныеДиаграммы85.ВыполнитьПример();. Не вызывайте серверные объекты СКД непосредственно из тонкого клиента.

  4. Запрос содержит только три собственные константные строки: Север/Книга — 750, Север/Ручка — 50, Юг/Книга — 500. Продажи Севера — 800, Юга — 500, общая сумма — 1300.

  5. Серии будут магазинами, точки — товарами, ресурс — суммой продаж. Значение Книга складывается до 1250, Ручка — до 50. Количество единиц по всем строкам — 6, а число строк источника — 3.

  6. Каждый урок запускайте отдельно: он заново создаёт схему и настройки в памяти. Упражнения с настройками не формируют отчёт; отдельный урок показывает компоновку и вывод.

  7. Для просмотра объектов поставьте точку останова перед последними Сообщить. ТабличныйДокумент результата урока вывода находится в серверной переменной Результат; код не печатает, не сохраняет файл и не открывает окно клиента.

  8. Запуск в 1С здесь не проверялся. Приведены ожидаемые проверки собственной задачи, а не доказательство успешного формирования отчёта в любой конфигурации.

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

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

  1. Устанавливаем тип Гистограмма и заголовок в параметрах самой диаграммы, не её группы серий.

  2. Контрольный запрос повторяет только собственные константы. Его итог 1300 проверяет данные, но не доказывает правильность отображения отчёта.

  3. Компоновщик создаёт исполняемый макет на основании схемы и настроек. Тип генератора специально не подменяем генератором коллекции значений: нужен табличный документ.

  4. Инициализируем процессор макетом, назначаем приёмник вывода и получаем результат Вывести.

  5. Сравниваем возвращённый документ с приёмником. Размеры и число рисунков выводим диагностически: это элементы оформления результата, а не количество продаж.

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

  1. Первые четыре сравнения ожидаются Истина: 3 строки, сумма 1300 и количество 6, тип макета, тот же документ-приёмник.

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

  3. Если компоновка выдаёт ошибку, сохраните её текст и место остановки. Проверки типов и констант не заменяют запуск и осмотр диаграммы в 1С.

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

Получен маршрут формирования результата в памяти без печати, записи и клиентских окон; фактическое отображение проверяется при учебном запуске в 1С.

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

  1. Не смешивайте настройки СКД с готовым МакетКомпоновкиДанных: это разные этапы обработки.

  2. Серверный вызов Показать не нужен и не добавлен. Для собственной формы передавайте результат в её реквизит ТабличныйДокумент из серверного обработчика.

  3. Результат.ВысотаТаблицы не равна трём строкам источника; диаграмма и заголовок занимают собственные области.

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

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

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

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

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