ГруппировкаТаблицыМакетаКомпоновкиДанных.Идентификатор

Свойства · ID

Тип: Строка. Идентификатор группировки таблицы.

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

ГруппировкаТаблицыМакетаКомпоновкиДанных.Идентификатор (DataCompositionTemplateTableGroup.ID)

ГруппировкаТаблицыМакетаКомпоновкиДанных (DataCompositionTemplateTableGroup)

Идентификатор (ID)

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

Использование:
Чтение и запись.
Описание:
Тип: Строка.
Идентификатор группировки таблицы.
Доступность:

Сервер, толстый клиент, внешнее соединение.

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

Доступен, начиная с версии 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. В Результат проверьте Север/Книга 750, Север/Ручка 50, Юг/Книга 500. Сумма книги 1250, ручки 50; источник всего 1300.

  3. В отладчике ТипЗнч шапки и подвала — МакетГруппировкиТаблицыМакетаКомпоновкиДанных. Пустые строки или нулевые коллекции в неиспользуемых частях не считаются ошибкой.

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

Сформирована собственная матрица и показано отличие табличного заголовка-объекта от имени области обычной группировки.

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

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

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

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

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

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

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

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

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

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

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