Группировка таблицы.
Полное описание, параметры и ограничения
ГруппировкаТаблицыМакетаКомпоновкиДанных (DataCompositionTemplateTableGroup)
ГруппировкаТаблицыМакетаКомпоновкиДанных (DataCompositionTemplateTableGroup)
Доступен, начиная с версии 8.1.
Свойства:
Группировка (Group)
Идентификатор (ID)
ИерархическийПорядок (HierarchicalOrder)
Имя (Name)
КоличествоЗаписей (RecordsCount)
МакетПодвала (FooterTemplate)
МакетШапки (HeaderTemplate)
ОтборГруппировок (GroupFilter)
ОтборГруппировокСИерархией (GroupFilterWithHierarchy)
ОтборГруппировокТолькоИерархия (GroupFilterHierarchyOnly)
ОтборЗаписей (RecordsFilter)
Порядок (Order)
ПроцентЗаписей (RecordsPercent)
Тело (Body)
ТелоИерархии (HierarchicalBody)
Описание:
Группировка таблицы.
Доступность:
Сервер, толстый клиент, внешнее соединение, мобильное приложение (сервер), мобильный автономный сервер.
Данный объект может быть сериализован в/из XML. Данный объект может быть сериализован в/из XDTO. Тип XDTO, соответствующий данному объекту, определяется в пространстве имен {http://v8.1c.ru/8.1/data-composition-system/composition-template}. Имя типа XDTO: TableGroup.
Использование в версии:
Доступен, начиная с версии 8.1.
Методическая информация
Практические примеры
Разобрать группировки строк и колонок настоящей матрицы СКД
Свои магазины становятся строками, товары — колонками, сумма продаж — ресурсом. Из готового макета получаем табличные группировки и настоящие объекты их шапок и подвалов.
Где и как запускать
Полный серверный общий модуль УчебныйМакетСКД85. ВыполнитьПример() вызывается только собственным серверным обработчиком учебной команды.
Подготовка
Используйте отдельную пустую учебную базу 8.5.1.1343. Данные рабочих конфигураций, готовые отчёты и подключение к интернету не нужны.
Создайте общий модуль УчебныйМакетСКД85: Сервер — Да, Клиент — Нет, Вызов сервера — Нет, Привилегированный — Нет. Вставьте весь модуль одного урока целиком, включая вспомогательные функции.
В своей учебной обработке создайте управляемую форму и команду ВыполнитьУрок. Через конструктор обработчика добавьте клиентскую процедуру команды, вызывающую собственную процедуру ВыполнитьНаСервере() с директивой &НаСервереБезКонтекста. В её тело вставьте УчебныйМакетСКД85.ВыполнитьПример();.
В запросе только свои три строки: Север/Книга — количество 3, сумма 750; Север/Ручка — 1 и 50; Юг/Книга — 2 и 500. Сумма источника 1300, количество единиц 6. Запрос ничего не читает из справочников или регистров.
Поставьте точку останова перед последним Сообщить в ВыполнитьПример. В серверном отладчике смотрите переменные Макет, Группы и Результат; у табличного документа можно открыть просмотр значения. Не пытайтесь вернуть Макет в тонкий клиент.
Каждый запуск заново строит свою схему и макет в памяти. Код не открывает клиентское окно, не печатает, не сохраняет файлы, не меняет настройки другого пользователя и не пишет в базу.
Настройки группировок и уже скомпилированные группировки макета — разные типы. У последних нет конструктора Новый: они получаются из реального Макет.Тело после КомпоновщикМакетаКомпоновкиДанных.Выполнить.
Пример не запускался в 1С. Контрольные результаты ниже ожидаемые; статические проверки сигнатур не подтверждают фактическое оформление или размещение итогов в табличном документе.
Процедура ВыполнитьПример() Экспорт
Схема = Новый СхемаКомпоновкиДанных;
Источник = Схема.ИсточникиДанных.Добавить();
Источник.Имя = "УчебныеПродажи";
Источник.ТипИсточникаДанных = "Local";
Набор = Схема.НаборыДанных.Добавить(Тип("НаборДанныхЗапросСхемыКомпоновкиДанных"));
Набор.Имя = "СвоиТриСтроки";
Набор.ИсточникДанных = Источник.Имя;
Набор.АвтоЗаполнениеДоступныхПолей = Истина;
Набор.Запрос = "ВЫБРАТЬ
| ""Север"" КАК Магазин,
| ""Книга"" КАК Наименование,
| 3 КАК Количество,
| 750 КАК Сумма
|ОБЪЕДИНИТЬ ВСЕ
|ВЫБРАТЬ ""Север"", ""Ручка"", 1, 50
|ОБЪЕДИНИТЬ ВСЕ
|ВЫБРАТЬ ""Юг"", ""Книга"", 2, 500";
Для Каждого ИмяРесурса Из СтрРазделить("Сумма,Количество", ",") Цикл
Ресурс = Схема.ПоляИтога.Добавить();
Ресурс.ПутьКДанным = ИмяРесурса;
Ресурс.Выражение = "Сумма(" + ИмяРесурса + ")";
КонецЦикла;
Настройки = Схема.НастройкиПоУмолчанию;
ТаблицаНастроек = Настройки.Структура.Добавить(Тип("ТаблицаКомпоновкиДанных"));
ТаблицаНастроек.Имя = "УчебныеМагазиныПоТоварам";
ТаблицаНастроек.Использование = Истина;
Выбор = ТаблицаНастроек.Выбор.Элементы.Добавить(Тип("ВыбранноеПолеКомпоновкиДанных"));
Выбор.Поле = Новый ПолеКомпоновкиДанных("Сумма");
Выбор.Использование = Истина;
СтрокаНастроек = ТаблицаНастроек.Строки.Добавить();
СтрокаНастроек.Имя = "Магазины";
СтрокаНастроек.Использование = Истина;
ПолеМагазина = СтрокаНастроек.ПоляГруппировки.Элементы.Добавить(Тип("ПолеГруппировкиКомпоновкиДанных"));
ПолеМагазина.Поле = Новый ПолеКомпоновкиДанных("Магазин");
ПолеМагазина.ТипГруппировки = ТипГруппировкиКомпоновкиДанных.Элементы;
ПолеМагазина.Использование = Истина;
КолонкаНастроек = ТаблицаНастроек.Колонки.Добавить();
КолонкаНастроек.Имя = "Товары";
КолонкаНастроек.Использование = Истина;
ПолеТовара = КолонкаНастроек.ПоляГруппировки.Элементы.Добавить(Тип("ПолеГруппировкиКомпоновкиДанных"));
ПолеТовара.Поле = Новый ПолеКомпоновкиДанных("Наименование");
ПолеТовара.ТипГруппировки = ТипГруппировкиКомпоновкиДанных.Элементы;
ПолеТовара.Использование = Истина;
КонтрольныйЗапрос = Новый Запрос;
КонтрольныйЗапрос.Текст = Набор.Запрос;
ИсходныеСтроки = КонтрольныйЗапрос.Выполнить().Выгрузить();
Если ИсходныеСтроки.Количество() <> 3 Или ИсходныеСтроки.Итог("Сумма") <> 1300 Тогда
ВызватьИсключение "Изменились собственные учебные данные";
КонецЕсли;
Компоновщик = Новый КомпоновщикМакетаКомпоновкиДанных;
Макет = Компоновщик.Выполнить(Схема, Настройки);
Группы = Новый Массив;
НайтиТабличныеГруппы(Макет.Тело, Группы);
Если Группы.Количество() = 0 Тогда
ВызватьИсключение "В собственной матрице не найдены табличные группировки";
КонецЕсли;
Для Каждого ГруппаМакета Из Группы Цикл
Сообщить("Имя группировки: " + ГруппаМакета.Имя);
Сообщить("Идентификатор: " + ГруппаМакета.Идентификатор);
Сообщить("Ограничение количества: " + Строка(ГруппаМакета.КоличествоЗаписей));
Сообщить("Процент записей: " + Строка(ГруппаМакета.ПроцентЗаписей));
Сообщить("Отбор записей: " + ГруппаМакета.ОтборЗаписей);
Сообщить("Отбор группировок: " + ГруппаМакета.ОтборГруппировок);
Сообщить("Отбор группировок с иерархией: " + ГруппаМакета.ОтборГруппировокСИерархией);
Сообщить("Отбор только иерархии: " + ГруппаМакета.ОтборГруппировокТолькоИерархия);
Сообщить("Частей тела: " + Строка(ГруппаМакета.Тело.Количество()));
Сообщить("Частей иерархического тела: " + Строка(ГруппаМакета.ТелоИерархии.Количество()));
Для Каждого Поле Из ГруппаМакета.Группировка Цикл
Сообщить("Поле группировки: " + Поле.ИмяПоля + "; выражение: " + Поле.Выражение);
КонецЦикла;
Для Каждого Порядок Из ГруппаМакета.Порядок Цикл
Сообщить("Порядок: " + Порядок.Выражение + "; направление: " + Строка(Порядок.ТипУпорядочивания));
КонецЦикла;
Сообщить("Элементов иерархического порядка: " + Строка(ГруппаМакета.ИерархическийПорядок.Количество()));
Сообщить("Макет шапки полей: " + ГруппаМакета.МакетШапки.Макет);
Сообщить("Макет итогов шапки: " + ГруппаМакета.МакетШапки.МакетИтоговРесурсов);
Сообщить("Макетов ресурсов шапки: " + Строка(ГруппаМакета.МакетШапки.МакетРесурсов.Количество()));
Сообщить("Макет подвала полей: " + ГруппаМакета.МакетПодвала.Макет);
Сообщить("Макет итогов подвала: " + ГруппаМакета.МакетПодвала.МакетИтоговРесурсов);
Сообщить("Макетов ресурсов подвала: " + Строка(ГруппаМакета.МакетПодвала.МакетРесурсов.Количество()));
КонецЦикла;
Результат = СформироватьСвойДокумент(Макет);
Сообщить(Результат.ВысотаТаблицы > 0);
КонецПроцедуры
Процедура НайтиТабличныеГруппы(Тело, Найденные)
Для Каждого Часть Из Тело Цикл
Если ТипЗнч(Часть) = Тип("ТаблицаМакетаКомпоновкиДанных") Тогда
СобратьОсьМатрицы(Часть.Строки, Найденные);
СобратьОсьМатрицы(Часть.Колонки, Найденные);
ИначеЕсли ТипЗнч(Часть) = Тип("ГруппировкаМакетаКомпоновкиДанных") Тогда
НайтиТабличныеГруппы(Часть.Тело, Найденные);
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Процедура СобратьОсьМатрицы(ТелоОси, Найденные)
Для Каждого Часть Из ТелоОси Цикл
Если ТипЗнч(Часть) = Тип("ГруппировкаТаблицыМакетаКомпоновкиДанных") Тогда
Найденные.Добавить(Часть);
СобратьОсьМатрицы(Часть.Тело, Найденные);
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Функция СформироватьСвойДокумент(СвойМакет)
Процессор = Новый ПроцессорКомпоновкиДанных;
Процессор.Инициализировать(СвойМакет);
Документ = Новый ТабличныйДокумент;
Вывод = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
Вывод.ОтображатьПроцентВывода = Ложь;
Вывод.УстановитьДокумент(Документ);
РезультатВывода = Вывод.Вывести(Процессор, Ложь);
Если ТипЗнч(РезультатВывода) <> Тип("ТабличныйДокумент") Тогда
ВызватьИсключение "Не получен собственный табличный документ";
КонецЕсли;
Возврат РезультатВывода;
КонецФункции
Разбор по шагам
Схема создаёт собственный Local-источник и ресурсы Сумма(Сумма), Сумма(Количество). Контрольный запрос независимо подтверждает три исходные строки и 1300.
Поля группировки задаются в настройках. Компоновщик превращает их в исполняемый макет; коллекции макета содержат уже другие типы объектов.
Обход проверяет точный ТипЗнч и ищет группы в реальном теле собственного макета. Нет ни Новый для неконструируемого типа, ни объекта, который читатель должен неизвестно где взять.
Имя удобно читать человеку, Идентификатор связывает части макета. Их диагностируем, а не переименовываем: изменение идентификатора без исправления связей может повредить компоновку.
ОтборЗаписей действует на записи, ОтборГруппировок — перед построением иерархии, остальные два отбора имеют отдельные области применения. Выводим именно скомпилированные выражения; пустая строка сама по себе не ошибка.
Порядок и ИерархическийПорядок — разные коллекции. Тело и ТелоИерархии также различны; в нашей неиерархической задаче иерархические части могут быть пустыми.
КоличествоЗаписей и ПроцентЗаписей характеризуют ограничение вывода, а не число строк запроса. Значение -1 у количества означает все записи.
Новый процессор получает весь связанный макет, а вывод создаёт собственный ТабличныйДокумент. Ненулевая высота доказывает только наличие результата, не правильность каждого итога.
У матрицы отдельно обходим Строки и Колонки. В объектах шапки и подвала читаем имя макета полей, имя макета итогов и количество макетов ресурсов.
Как проверить результат
Найдены табличные группировки по Магазин и Наименование; заключительное сравнение высоты даёт Истина. Их точное техническое количество не фиксируется.
В Результат проверьте Север/Книга 750, Север/Ручка 50, Юг/Книга 500. Сумма книги 1250, ручки 50; источник всего 1300.
В отладчике ТипЗнч шапки и подвала — МакетГруппировкиТаблицыМакетаКомпоновкиДанных. Пустые строки или нулевые коллекции в неиспользуемых частях не считаются ошибкой.
Ожидаемый результат
Сформирована собственная матрица и показано отличие табличного заголовка-объекта от имени области обычной группировки.
На что обратить внимание
Не присваивайте readonly-контейнеры Группировка, Тело, ТелоИерархии, Порядок или ИерархическийПорядок. Возможность изменения дочерней коллекции не делает её свойство записываемым.
У обычной группировки МакетШапки — readonly-строка, МакетПодвала — записываемая строка. У табличной обе ссылки readonly и указывают на объекты МакетГруппировкиТаблицыМакетаКомпоновкиДанных; эти контракты нельзя смешивать.
Не подставляйте в отборы строки языка запросов без проверки языка выражений СКД. Для обычного фильтра меняйте настройки и пересобирайте макет.
Идентификаторы, имена областей, число частей макета и физические строки документа зависят от генератора и оформления. Урок не обещает фиксированные технические имена или высоту.
Поиск предназначен для созданной здесь простой структуры без иерархических группировок, вложенных схем и диаграмм, а не для произвольного промышленного отчёта.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.
Ограничить только магазинную ось собственной матрицы
В готовой матрице ищем ось по полю Магазин, а не по позиции в массиве. Ограничиваем и восстанавливаем её вывод, оставляя товарную ось и исходные данные нетронутыми.
Где и как запускать
Полный серверный общий модуль УчебныйМакетСКД85. ВыполнитьПример() вызывается только собственным серверным обработчиком учебной команды.
Подготовка
Используйте отдельную пустую учебную базу 8.5.1.1343. Данные рабочих конфигураций, готовые отчёты и подключение к интернету не нужны.
Создайте общий модуль УчебныйМакетСКД85: Сервер — Да, Клиент — Нет, Вызов сервера — Нет, Привилегированный — Нет. Вставьте весь модуль одного урока целиком, включая вспомогательные функции.
В своей учебной обработке создайте управляемую форму и команду ВыполнитьУрок. Через конструктор обработчика добавьте клиентскую процедуру команды, вызывающую собственную процедуру ВыполнитьНаСервере() с директивой &НаСервереБезКонтекста. В её тело вставьте УчебныйМакетСКД85.ВыполнитьПример();.
В запросе только свои три строки: Север/Книга — количество 3, сумма 750; Север/Ручка — 1 и 50; Юг/Книга — 2 и 500. Сумма источника 1300, количество единиц 6. Запрос ничего не читает из справочников или регистров.
Поставьте точку останова перед последним Сообщить в ВыполнитьПример. В серверном отладчике смотрите переменные Макет, Группы и Результат; у табличного документа можно открыть просмотр значения. Не пытайтесь вернуть Макет в тонкий клиент.
Каждый запуск заново строит свою схему и макет в памяти. Код не открывает клиентское окно, не печатает, не сохраняет файлы, не меняет настройки другого пользователя и не пишет в базу.
Настройки группировок и уже скомпилированные группировки макета — разные типы. У последних нет конструктора Новый: они получаются из реального Макет.Тело после КомпоновщикМакетаКомпоновкиДанных.Выполнить.
Пример не запускался в 1С. Контрольные результаты ниже ожидаемые; статические проверки сигнатур не подтверждают фактическое оформление или размещение итогов в табличном документе.
Процедура ВыполнитьПример() Экспорт
Схема = Новый СхемаКомпоновкиДанных;
Источник = Схема.ИсточникиДанных.Добавить();
Источник.Имя = "УчебныеПродажи";
Источник.ТипИсточникаДанных = "Local";
Набор = Схема.НаборыДанных.Добавить(Тип("НаборДанныхЗапросСхемыКомпоновкиДанных"));
Набор.Имя = "СвоиТриСтроки";
Набор.ИсточникДанных = Источник.Имя;
Набор.АвтоЗаполнениеДоступныхПолей = Истина;
Набор.Запрос = "ВЫБРАТЬ
| ""Север"" КАК Магазин,
| ""Книга"" КАК Наименование,
| 3 КАК Количество,
| 750 КАК Сумма
|ОБЪЕДИНИТЬ ВСЕ
|ВЫБРАТЬ ""Север"", ""Ручка"", 1, 50
|ОБЪЕДИНИТЬ ВСЕ
|ВЫБРАТЬ ""Юг"", ""Книга"", 2, 500";
Для Каждого ИмяРесурса Из СтрРазделить("Сумма,Количество", ",") Цикл
Ресурс = Схема.ПоляИтога.Добавить();
Ресурс.ПутьКДанным = ИмяРесурса;
Ресурс.Выражение = "Сумма(" + ИмяРесурса + ")";
КонецЦикла;
Настройки = Схема.НастройкиПоУмолчанию;
ТаблицаНастроек = Настройки.Структура.Добавить(Тип("ТаблицаКомпоновкиДанных"));
ТаблицаНастроек.Имя = "УчебныеМагазиныПоТоварам";
ТаблицаНастроек.Использование = Истина;
Выбор = ТаблицаНастроек.Выбор.Элементы.Добавить(Тип("ВыбранноеПолеКомпоновкиДанных"));
Выбор.Поле = Новый ПолеКомпоновкиДанных("Сумма");
Выбор.Использование = Истина;
СтрокаНастроек = ТаблицаНастроек.Строки.Добавить();
СтрокаНастроек.Имя = "Магазины";
СтрокаНастроек.Использование = Истина;
ПолеМагазина = СтрокаНастроек.ПоляГруппировки.Элементы.Добавить(Тип("ПолеГруппировкиКомпоновкиДанных"));
ПолеМагазина.Поле = Новый ПолеКомпоновкиДанных("Магазин");
ПолеМагазина.ТипГруппировки = ТипГруппировкиКомпоновкиДанных.Элементы;
ПолеМагазина.Использование = Истина;
КолонкаНастроек = ТаблицаНастроек.Колонки.Добавить();
КолонкаНастроек.Имя = "Товары";
КолонкаНастроек.Использование = Истина;
ПолеТовара = КолонкаНастроек.ПоляГруппировки.Элементы.Добавить(Тип("ПолеГруппировкиКомпоновкиДанных"));
ПолеТовара.Поле = Новый ПолеКомпоновкиДанных("Наименование");
ПолеТовара.ТипГруппировки = ТипГруппировкиКомпоновкиДанных.Элементы;
ПолеТовара.Использование = Истина;
КонтрольныйЗапрос = Новый Запрос;
КонтрольныйЗапрос.Текст = Набор.Запрос;
ИсходныеСтроки = КонтрольныйЗапрос.Выполнить().Выгрузить();
Если ИсходныеСтроки.Количество() <> 3 Или ИсходныеСтроки.Итог("Сумма") <> 1300 Тогда
ВызватьИсключение "Изменились собственные учебные данные";
КонецЕсли;
Компоновщик = Новый КомпоновщикМакетаКомпоновкиДанных;
Макет = Компоновщик.Выполнить(Схема, Настройки);
Группы = Новый Массив;
НайтиТабличныеГруппы(Макет.Тело, Группы);
Если Группы.Количество() = 0 Тогда
ВызватьИсключение "В собственной матрице не найдены табличные группировки";
КонецЕсли;
ДоОграничения = СформироватьСвойДокумент(Макет);
Изменено = 0;
Для Каждого ГруппаМакета Из Группы Цикл
Для Каждого Поле Из ГруппаМакета.Группировка Цикл
Если Поле.ИмяПоля = "Магазин" Тогда
ГруппаМакета.КоличествоЗаписей = 1;
Если ГруппаМакета.КоличествоЗаписей <> 1 Тогда
ВызватьИсключение "Не установлено собственное ограничение";
КонецЕсли;
Изменено = Изменено + 1;
Прервать;
КонецЕсли;
КонецЦикла;
КонецЦикла;
Если Изменено = 0 Тогда
ВызватьИсключение "Не найдена собственная ось Магазин для ограничения";
КонецЕсли;
ПослеОграничения = СформироватьСвойДокумент(Макет);
Для Каждого ГруппаМакета Из Группы Цикл
Для Каждого Поле Из ГруппаМакета.Группировка Цикл
Если Поле.ИмяПоля = "Магазин" Тогда
ГруппаМакета.КоличествоЗаписей = -1;
Прервать;
КонецЕсли;
КонецЦикла;
КонецЦикла;
Результат = СформироватьСвойДокумент(Макет);
Сообщить(ДоОграничения.ВысотаТаблицы > 0);
Сообщить(ПослеОграничения.ВысотаТаблицы > 0);
Сообщить(Результат.ВысотаТаблицы > 0);
Сообщить(ИсходныеСтроки.Количество() = 3 И ИсходныеСтроки.Итог("Сумма") = 1300);
КонецПроцедуры
Процедура НайтиТабличныеГруппы(Тело, Найденные)
Для Каждого Часть Из Тело Цикл
Если ТипЗнч(Часть) = Тип("ТаблицаМакетаКомпоновкиДанных") Тогда
СобратьОсьМатрицы(Часть.Строки, Найденные);
СобратьОсьМатрицы(Часть.Колонки, Найденные);
ИначеЕсли ТипЗнч(Часть) = Тип("ГруппировкаМакетаКомпоновкиДанных") Тогда
НайтиТабличныеГруппы(Часть.Тело, Найденные);
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Процедура СобратьОсьМатрицы(ТелоОси, Найденные)
Для Каждого Часть Из ТелоОси Цикл
Если ТипЗнч(Часть) = Тип("ГруппировкаТаблицыМакетаКомпоновкиДанных") Тогда
Найденные.Добавить(Часть);
СобратьОсьМатрицы(Часть.Тело, Найденные);
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Функция СформироватьСвойДокумент(СвойМакет)
Процессор = Новый ПроцессорКомпоновкиДанных;
Процессор.Инициализировать(СвойМакет);
Документ = Новый ТабличныйДокумент;
Вывод = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
Вывод.ОтображатьПроцентВывода = Ложь;
Вывод.УстановитьДокумент(Документ);
РезультатВывода = Вывод.Вывести(Процессор, Ложь);
Если ТипЗнч(РезультатВывода) <> Тип("ТабличныйДокумент") Тогда
ВызватьИсключение "Не получен собственный табличный документ";
КонецЕсли;
Возврат РезультатВывода;
КонецФункции
Разбор по шагам
Из трёх константных строк строим две группы магазинов; у матрицы дополнительно есть товарная ось. Исходные данные остаются отдельной таблицей проверки.
Получаем объекты группировок из настоящего скомпилированного макета, а не из дерева настроек. Проверяем поля каждой найденной группы.
Первый процессор формирует исходный документ ДоОграничения. Для следующего вывода создаём другой процессор: первый уже израсходовал поток результата.
Меняем только КоличествоЗаписей своей группы Магазин на 1; товарную ось не ограничиваем. Изменено и чтение установленного значения исключают тихое выполнение без подходящей группы.
Сохраняем ограниченный результат отдельно. Ограничение относится к выводу группировок; исходный запрос, его три строки и сумма 1300 не меняются.
Восстанавливаем -1 и снова формируем документ свежим процессором. Это возвращает все записи, а не число -1 строк.
В отладчике сравниваем три документа по содержимому магазинов, а не по физической высоте: заголовки и итоги добавляют служебные строки.
Как проверить результат
Все четыре конечных сравнения должны дать Истина. Изменено больше 0, а значение ограничения перед вторым выводом равно 1.
В ДоОграничения и Результат найдите Север и Юг; суммы магазинов 800 и 500. Во втором документе ожидается ограничение магазинной группировки до одной записи. Какой магазин попадёт первым без заданного порядка, не фиксируется.
В матрице исходные пересечения: Север/Книга 750, Север/Ручка 50, Юг/Книга 500. Ограничиваем магазины, не товары; отсутствующая Юг/Ручка не становится исходной строкой с нулём.
При сомнении проверяйте значения группировки и просмотр документа на своём стенде. Общие итоги могут оставаться итогами более широкого набора; нельзя выдавать ограничение вывода за фильтр данных.
Ожидаемый результат
Своя матрица сформирована до изменения, при ограничении магазинной оси и после восстановления полного вывода.
На что обратить внимание
КоличествоЗаписей — не ПЕРВЫЕ в тексте запроса и не лимит выгрузки ТаблицаЗначений. Данные исходного запроса здесь не сокращаются.
Не переиспользуйте уже отработавший ПроцессорКомпоновкиДанных для второго полного вывода. СформироватьСвойДокумент каждый раз создаёт и инициализирует новый процессор.
В задаче не меняется ПроцентЗаписей. Не угадывайте, какое сочетание двух ограничений даст нужный результат; для обычного отчёта предпочитайте настройки и пересборку.
Не изменяйте чужой закешированный макет. Здесь макет получен заново в пределах одного собственного запуска и не разделяется с другими отчётами.
Первый магазин без заданной сортировки не гарантирован; физическая высота документа не равна количеству выведенных магазинов.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.