ТелоМакетаКомпоновкиДанных

Типы · DataCompositionTemplateBody

Тело макета компоновки данных.

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

ТелоМакетаКомпоновкиДанных (DataCompositionTemplateBody)

ТелоМакетаКомпоновкиДанных (DataCompositionTemplateBody)

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

Элементы коллекции:
МакетОбластиМакетаКомпоновкиДанных, ГруппировкаМакетаКомпоновкиДанных, ИерархическаяГруппировкаМакетаКомпоновкиДанных, ЗаписиМакетаКомпоновкиДанных, ТаблицаМакетаКомпоновкиДанных, ДиаграммаМакетаКомпоновкиДанных, ВложенныйОбъектМакетаКомпоновкиДанных
Для объекта доступен обход коллекции посредством оператора Для каждого … Из … Цикл. При обходе выбираются части компоновки данных.
Возможно обращение к части компоновки данных посредством оператора [...]. В качестве аргумента передается индекс (нумерация с 0).

Методы:
Вставить (Insert)
Добавить (Add)
Индекс (IndexOf)
Количество (Count)
Очистить (Clear)
Получить (Get)
Сдвинуть (Move)
Удалить (Delete)

Описание:

Тело макета компоновки данных.

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

Сервер, толстый клиент, внешнее соединение, мобильное приложение (сервер), мобильный автономный сервер.

См. также:
МакетКомпоновкиДанных, свойство Тело
ГруппировкаМакетаКомпоновкиДанных, свойство Тело
ГруппировкаМакетаКомпоновкиДанных, свойство ТелоИерархии
ЗаписиМакетаКомпоновкиДанных, свойство Тело

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

Доступен, начиная с версии 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С. Контрольные результаты ниже ожидаемые; статические проверки сигнатур не подтверждают фактическое оформление или размещение итогов в табличном документе.

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

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

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

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

  1. Схема создаёт собственный Local-источник и ресурсы Сумма(Сумма), Сумма(Количество). Контрольный запрос независимо подтверждает три исходные строки и 1300.

  2. Поля группировки задаются в настройках. Компоновщик превращает их в исполняемый макет; коллекции макета содержат уже другие типы объектов.

  3. Обход проверяет точный ТипЗнч и ищет группы в реальном теле собственного макета. Нет ни Новый для неконструируемого типа, ни объекта, который читатель должен неизвестно где взять.

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

  5. ОтборЗаписей действует на записи, ОтборГруппировок — перед построением иерархии, остальные два отбора имеют отдельные области применения. Выводим именно скомпилированные выражения; пустая строка сама по себе не ошибка.

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

  7. КоличествоЗаписей и ПроцентЗаписей характеризуют ограничение вывода, а не число строк запроса. Значение -1 у количества означает все записи.

  8. Новый процессор получает весь связанный макет, а вывод создаёт собственный ТабличныйДокумент. Ненулевая высота доказывает только наличие результата, не правильность каждого итога.

  9. У обычной группировки шапка и подвал содержат имена областей. Читаем строки; не подменяем их объектами заголовков матрицы.

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

  1. В Группы найдена хотя бы одна группировка по Магазин, а вывод заканчивается Истина. Поле Магазин встречается в её коллекции Группировка.

  2. В просмотре Результат найдите магазины Север и Юг: ожидаемые суммы 800 и 500, количества 4 и 2, общий источник 1300.

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

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

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

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

  1. Не присваивайте readonly-контейнеры Группировка, Тело, ТелоИерархии, Порядок или ИерархическийПорядок. Возможность изменения дочерней коллекции не делает её свойство записываемым.

  2. У обычной группировки МакетШапки — readonly-строка, МакетПодвала — записываемая строка. У табличной обе ссылки readonly и указывают на объекты МакетГруппировкиТаблицыМакетаКомпоновкиДанных; эти контракты нельзя смешивать.

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

  4. Идентификаторы, имена областей, число частей макета и физические строки документа зависят от генератора и оформления. Урок не обещает фиксированные технические имена или высоту.

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

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

Исследовать настоящий скомпилированный макет и вывести две строки

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

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

Полный серверный общий модуль собственной учебной базы; не клиентский модуль формы.

Подготовка

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

  2. Из серверной команды своей обработки вызовите УчебныеКоллекцииСКД.ВыполнитьПример(). Таблицы значений и служебные объекты макета остаются на сервере.

  3. Книга / 3 / 750 и Ручка / 1 / 50 — вымышленные собственные данные. Ни справочники, ни документы, ни регистры базы, ни внешние сервисы не читаются.

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

  5. В уроке описания расшифровки временное хранилище заполняется только новым собственным объектом, в одном вызове. В конце удаляется ровно этот созданный адрес, включая обработку ошибки.

  6. Не заменяйте собственный новый макет текущим рабочим отчётом: Очистить, Удалить и Сдвинуть в этих уроках относятся к собственной памяти.

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

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

  1. Создаём источник Local и запрос Книга/750 + Ручка/50 без обращения к конфигурационным таблицам.

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

  3. Шесть служебных свойств макета читаем как реальные коллекции/тело, а не присваиваем им новые объекты.

  4. Актуальность и её время выводятся диагностически: для собственных констант это не проверка свежести данных рабочего сервера.

  5. Инициализируем процессор этим макетом и выводим результат в собственную ТаблицаЗначений.

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

  1. Девять булевых проверок Истина: тип макета, шесть типов его частей, две строки и итог 800.

  2. Число сгенерированных областей и частей тела диагностическое; внутреннюю схему генератора не фиксируем выдуманными числами.

  3. Результат содержит собственные Книга 750 и Ручка 50, без файлового сохранения.

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

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

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

  1. Новый МакетКомпоновкиДанных без настройки не заменяет скомпилированный макет.

  2. Макет.ЗначенияПараметров не является структурой параметров объекта Запрос.

  3. Диагностика ТребуемаяАктуальностьДанных не доказывает работу копий базы или актуальность реальных остатков.

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

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

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

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

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