Тип: Массив. Массив, содержащий имена полей, для которых данное поле будет вычисляться в итогах. Через пробел после имени поля возможно указание ключевого слова Иерархия. Добавление данного ключевого слова обозначает, что выражение будет использоваться для иерархических записей группировки по полю, указанному перед словом, и всех вложенных группировок, для которых не задано собственное выражение данного ресурса. В случае, если массив пуст, итог будет вычисляться для всех полей. Может содержать строку ОбщийИтог для указания необходимости вычисления в общем итоге.
Полное описание, параметры и ограничения
ПолеИтогаСхемыКомпоновкиДанных.Группировки (DataCompositionSchemaTotalField.Groups)
ПолеИтогаСхемыКомпоновкиДанных (DataCompositionSchemaTotalField)
Группировки (Groups)
Доступен, начиная с версии 8.1.
Использование:
Только чтение.
Описание:
Тип: Массив.
Массив, содержащий имена полей, для которых данное поле будет вычисляться в итогах.
Через пробел после имени поля возможно указание ключевого слова Иерархия. Добавление данного ключевого слова обозначает, что выражение будет использоваться для иерархических записей группировки по полю, указанному перед словом, и всех вложенных группировок, для которых не задано собственное выражение данного ресурса.
В случае, если массив пуст, итог будет вычисляться для всех полей.
Может содержать строку ОбщийИтог для указания необходимости вычисления в общем итоге.
Доступность:
Сервер, толстый клиент, внешнее соединение.
Использование в версии:
Доступен, начиная с версии 8.1.
Методическая информация
Практические примеры
Ресурсы СКД: количество и выручка по складу, общий итог и восстановление
Для собственного учебного отчёта объявляем числовые Количество и Выручка, реальное поле Склад, обычную группу и выбор обоих числовых полей. Создаём формулы суммирования, отличаем пустое ограничение от ОбщийИтог, переставляем и удаляем ресурсы, проверяем поиск и восстановление всего состояния без запуска отчёта.
Где и как запускать
Полный серверный общий модуль УчебныеЗадачи новой пустой конфигурации УчебныеРесурсы85; в1С не запускался.
Подготовка
Нужна НОВАЯ отдельная учебная база, не копия рабочей: платформа точно8.5.1.1343, имя конфигурации УчебныеРесурсы85, совместимость Не использовать. Без бизнес-объектов, расширений, подписок, фоновых заданий; модули вручную пустые, кроме данного общего модуля.
Конфигуратор → Общие → Общие модули → УчебныеЗадачи: Сервер=Да, Вызов сервера=Да, Клиент=Нет, Глобальный=Нет, Привилегированный=Нет. Вставьте весь основной модуль. Создайте свою внешнюю обработку УчебныеРесурсы85, управляемую Форму, команду/кнопку Выполнить с действием Выполнить. В модуль формы вставьте полный отдельный код ниже; реквизиты не нужны.
Будущая ручная подготовка вне опыта: завершить прежний свой сеанс, сохранить, Конфигурация → Обновить конфигурацию базы данных (F7), открыть свежий собственный клиент и свою обработку. Здесь ни F7, ни BSL, ни компоновка, ни запрос не выполнялись.
Код сам объявляет Local-источник СвоиРесурсы85 и набор ОбъемИВыручка85 с буквальным запросом Склад="Учебный", Количество=3, Выручка=1500. Поля заданы вручную как Строка/Число/Число. Рабочие справочники, регистры и внешние неизвестные объекты не нужны.
Процедура ВыполнитьПример() Экспорт
ПроверитьСвойПустойСтенд();
Если ПривилегированныйРежим() Тогда
ВызватьИсключение "Привилегированный режим не нужен";
КонецЕсли;
Пусто = Новый Массив;
СкладИОбщий = СтрРазделить("Склад,ОбщийИтог", ",");
ТолькоОбщий = СтрРазделить("ОбщийИтог", ",");
ОдинПустой = Новый Массив;
ОдинПустой.Добавить(Пусто);
ОдинСклад = Новый Массив;
ОдинСклад.Добавить(СкладИОбщий);
Ограничения = Новый Массив;
Ограничения.Добавить(Пусто);
Ограничения.Добавить(СкладИОбщий);
Переставленные = Новый Массив;
Переставленные.Добавить(СкладИОбщий);
Переставленные.Добавить(Пусто);
Общие = Новый Массив;
Общие.Добавить(ТолькоОбщий);
Общие.Добавить(СкладИОбщий);
Пути = СтрРазделить("Количество,Выручка", ",");
Формулы = СтрРазделить("Сумма(Количество)|Сумма(Выручка)", "|");
Схема = СоздатьСвоюОсновуРесурсов();
Каталог = Схема.ПоляИтога;
ПроверитьСвоиРесурсы(Схема, Пусто, Пусто, Пусто);
Количество = Каталог.Добавить();
ЗаполнитьСвоеИтоговоеПоле(Схема, Количество, "Количество", "Сумма(Количество)", Пусто);
ПроверитьСвоиРесурсы(Схема, СтрРазделить("Количество", ","), СтрРазделить("Сумма(Количество)", "|"), ОдинПустой);
Выручка = Каталог.Вставить(0);
ЗаполнитьСвоеИтоговоеПоле(Схема, Выручка, "Выручка", "Сумма(Выручка)", СкладИОбщий);
ПроверитьСвоиРесурсы(Схема, СтрРазделить("Выручка,Количество", ","), СтрРазделить("Сумма(Выручка)|Сумма(Количество)", "|"), Переставленные);
Каталог.Сдвинуть(Выручка, 1);
ПроверитьСвоиРесурсы(Схема, Пути, Формулы, Ограничения);
Количество.Группировки.Добавить("ОбщийИтог");
ПроверитьСвоиРесурсы(Схема, Пути, Формулы, Общие);
Количество.Группировки.Очистить();
ПроверитьСвоиРесурсы(Схема, Пути, Формулы, Ограничения);
Копия = СоздатьСвоюОсновуРесурсов();
ВосстановитьСвоиРесурсы(Копия);
Каталог.Удалить(Количество);
ПроверитьСвоиРесурсы(Схема, СтрРазделить("Выручка", ","), СтрРазделить("Сумма(Выручка)", "|"), ОдинСклад);
Если Каталог.Найти("Количество") <> Неопределено Тогда
ВызватьИсключение "Удалённый ресурс количества не должен находиться";
КонецЕсли;
ПроверитьСвоиРесурсы(Копия, Пути, Формулы, Ограничения);
НовоеКоличество = Каталог.Вставить(0);
ЗаполнитьСвоеИтоговоеПоле(Схема, НовоеКоличество, "Количество", "Сумма(Количество)", Пусто);
ПроверитьСвоиРесурсы(Схема, Пути, Формулы, Ограничения);
Каталог.Очистить();
ПроверитьСвоиРесурсы(Схема, Пусто, Пусто, Пусто);
ПроверитьСвоиРесурсы(Копия, Пути, Формулы, Ограничения);
ВосстановитьСвоиРесурсы(Схема);
ПроверитьСвоиРесурсы(Схема, Пути, Формулы, Ограничения);
ПроверитьСвоиРесурсы(Копия, Пути, Формулы, Ограничения);
Сообщить("Количество без ограничения и Выручка для Склад/ОбщийИтог полностью восстановлены");
КонецПроцедуры
Процедура ПроверитьСвойПустойСтенд()
Если Метаданные.Справочники.Количество() <> 0 Или Метаданные.Документы.Количество() <> 0 Или Метаданные.Перечисления.Количество() <> 0 Или Метаданные.РегистрыСведений.Количество() <> 0 Или Метаданные.РегистрыНакопления.Количество() <> 0 Или Метаданные.РегистрыБухгалтерии.Количество() <> 0 Или Метаданные.РегистрыРасчета.Количество() <> 0 Или Метаданные.ПланыВидовХарактеристик.Количество() <> 0 Или Метаданные.ПланыВидовРасчета.Количество() <> 0 Или Метаданные.ПланыСчетов.Количество() <> 0 Или Метаданные.ПланыОбмена.Количество() <> 0 Или Метаданные.Последовательности.Количество() <> 0 Или Метаданные.БизнесПроцессы.Количество() <> 0 Или Метаданные.Задачи.Количество() <> 0 Или Метаданные.ОбщиеРеквизиты.Количество() <> 0 Или Метаданные.ПодпискиНаСобытия.Количество() <> 0 Или Метаданные.РегламентныеЗадания.Количество() <> 0 Или Метаданные.ВнешниеИсточникиДанных.Количество() <> 0 Тогда
ВызватьИсключение "Нужен только свой новый пустой учебный стенд";
КонецЕсли;
Если Метаданные.ЕстьИзмененияРасширениямиКонфигурации() Тогда
ВызватьИсключение "Свой сеанс не должен изменяться расширениями";
КонецЕсли;
Источники = Новый Массив;
Источники.Добавить(ИсточникРасширенийКонфигурации.БазаДанных);
Источники.Добавить(ИсточникРасширенийКонфигурации.СеансАктивные);
Источники.Добавить(ИсточникРасширенийКонфигурации.СеансОтключенные);
Для Каждого Источник Из Источники Цикл
Расширения = РасширенияКонфигурации.Получить(, Источник);
Если ТипЗнч(Расширения) <> Тип("Массив") Тогда
ВызватьИсключение "Native список расширений должен иметь тип Массив";
КонецЕсли;
Если Расширения.Количество() <> 0 Тогда
ВызватьИсключение "В своём новом стенде нет расширений базы или сеанса";
КонецЕсли;
КонецЦикла;
Если ТранзакцияАктивна() Тогда
ВызватьИсключение "Чужая или вложенная активная транзакция не допускается";
КонецЕсли;
КонецПроцедуры
Функция СвоеПолеВXML(Поле)
Если ТипЗнч(Поле) <> Тип("ПолеКомпоновкиДанных") Тогда
ВызватьИсключение "Сериализуется только собственное поле СКД, не объект или записи базы";
КонецЕсли;
Запись = Новый ЗаписьXML;
Запись.УстановитьСтроку();
Попытка
СериализаторXDTO.ЗаписатьXML(Запись, Поле);
Возврат Запись.Закрыть();
Исключение
Запись.Закрыть();
ВызватьИсключение;
КонецПопытки;
КонецФункции
Функция СоздатьСвоюОсновуРесурсов()
Схема = Новый СхемаКомпоновкиДанных;
Источник = Схема.ИсточникиДанных.Добавить();
Источник.Имя = "СвоиРесурсы85";
Источник.ТипИсточникаДанных = "Local";
Набор = Схема.НаборыДанных.Добавить(Тип("НаборДанныхЗапросСхемыКомпоновкиДанных"));
Если ТипЗнч(Набор) <> Тип("НаборДанныхЗапросСхемыКомпоновкиДанных") Тогда
ВызватьИсключение "Нужен собственный набор запроса";
КонецЕсли;
Набор.Имя = "ОбъемИВыручка85";
Набор.ИсточникДанных = "СвоиРесурсы85";
Набор.АвтоЗаполнениеДоступныхПолей = Ложь;
Набор.Запрос = "ВЫБРАТЬ ""Учебный"" КАК Склад, 3 КАК Количество, 1500 КАК Выручка";
Имена = СтрРазделить("Склад,Количество,Выручка", ",");
Типы = СтрРазделить("Строка,Число,Число", ",");
Для Индекс = 0 По 2 Цикл
Поле = Набор.Поля.Добавить(Тип("ПолеНабораДанныхСхемыКомпоновкиДанных"));
Если ТипЗнч(Поле) <> Тип("ПолеНабораДанныхСхемыКомпоновкиДанных") Тогда
ВызватьИсключение "Нужно свое явно объявленное поле, не папка";
КонецЕсли;
Поле.Поле = Имена[Индекс];
Поле.ПутьКДанным = Имена[Индекс];
Поле.ТипЗначения = Новый ОписаниеТипов(Типы[Индекс]);
КонецЦикла;
Группа = Схема.НастройкиПоУмолчанию.Структура.Добавить(Тип("ГруппировкаКомпоновкиДанных"));
Если ТипЗнч(Группа) <> Тип("ГруппировкаКомпоновкиДанных") Тогда
ВызватьИсключение "Нужна собственная обычная группа настроек";
КонецЕсли;
Группа.Имя = "ПоСкладу85";
Группа.Использование = Истина;
ПолеГруппы = Группа.ПоляГруппировки.Элементы.Добавить(Тип("ПолеГруппировкиКомпоновкиДанных"));
Если ТипЗнч(ПолеГруппы) <> Тип("ПолеГруппировкиКомпоновкиДанных") Тогда
ВызватьИсключение "Нужно собственное явное поле группировки";
КонецЕсли;
ПолеГруппы.Поле = Новый ПолеКомпоновкиДанных("Склад");
ПолеГруппы.Использование = Истина;
ПолеГруппы.ТипГруппировки = ТипГруппировкиКомпоновкиДанных.Элементы;
Для Индекс = 1 По 2 Цикл
Выбор = Схема.НастройкиПоУмолчанию.Выбор.Элементы.Добавить(Тип("ВыбранноеПолеКомпоновкиДанных"));
Если ТипЗнч(Выбор) <> Тип("ВыбранноеПолеКомпоновкиДанных") Тогда
ВызватьИсключение "Нужно собственное явное выбранное поле";
КонецЕсли;
Выбор.Поле = Новый ПолеКомпоновкиДанных(Имена[Индекс]);
Выбор.Использование = Истина;
КонецЦикла;
ПроверитьСвоюОсновуРесурсов(Схема);
Возврат Схема;
КонецФункции
Процедура ПроверитьСвоюОсновуРесурсов(Схема)
Если ТипЗнч(Схема) <> Тип("СхемаКомпоновкиДанных")
Или Схема.ИсточникиДанных.Количество() <> 1 Или Схема.НаборыДанных.Количество() <> 1
Или Схема.НастройкиПоУмолчанию.Структура.Количество() <> 1
Или Схема.НастройкиПоУмолчанию.Выбор.Элементы.Количество() <> 2 Тогда
ВызватьИсключение "Нужны прежние свои источник, набор, группа и два выбранных поля";
КонецЕсли;
Источник = Схема.ИсточникиДанных.Получить(0);
Если ТипЗнч(Источник) <> Тип("ИсточникДанныхСхемыКомпоновкиДанных")
Или Источник.Имя <> "СвоиРесурсы85" Или Источник.ТипИсточникаДанных <> "Local" Тогда
ВызватьИсключение "Не совпал полный собственный источник";
КонецЕсли;
Набор = Схема.НаборыДанных.Получить(0);
Если ТипЗнч(Набор) <> Тип("НаборДанныхЗапросСхемыКомпоновкиДанных") Тогда
ВызватьИсключение "Нужен собственный набор запроса";
КонецЕсли;
Если Набор.Имя <> "ОбъемИВыручка85" Или Набор.ИсточникДанных <> "СвоиРесурсы85"
Или Набор.АвтоЗаполнениеДоступныхПолей Или Набор.Запрос <> "ВЫБРАТЬ ""Учебный"" КАК Склад, 3 КАК Количество, 1500 КАК Выручка"
Или Набор.Поля.Количество() <> 3 Тогда
ВызватьИсключение "Не совпали полный собственный запрос и ручное объявление полей";
КонецЕсли;
Имена = СтрРазделить("Склад,Количество,Выручка", ",");
Типы = СтрРазделить("Строка,Число,Число", ",");
Для Индекс = 0 По 2 Цикл
Поле = Набор.Поля.Получить(Индекс);
Если ТипЗнч(Поле) <> Тип("ПолеНабораДанныхСхемыКомпоновкиДанных")
Или Поле.Поле <> Имена[Индекс] Или Поле.ПутьКДанным <> Имена[Индекс]
Или ТипЗнч(Поле.ТипЗначения) <> Тип("ОписаниеТипов") Тогда
ВызватьИсключение "Не совпали полные пути, порядок и типы собственных полей";
КонецЕсли;
ПолныеТипы = Поле.ТипЗначения.Типы();
Если ПолныеТипы.Количество() <> 1 Или ПолныеТипы[0] <> Тип(Типы[Индекс]) Тогда
ВызватьИсключение "Не совпал полный набор типов собственного поля";
КонецЕсли;
КонецЦикла;
Группа = Схема.НастройкиПоУмолчанию.Структура.Получить(0);
Если ТипЗнч(Группа) <> Тип("ГруппировкаКомпоновкиДанных") Или Группа.Имя <> "ПоСкладу85"
Или Не Группа.Использование Или ТипЗнч(Группа.ПоляГруппировки) <> Тип("ПоляГруппировкиКомпоновкиДанных") Тогда
ВызватьИсключение "Не совпала собственная обычная группа по складу";
КонецЕсли;
Если Группа.ПоляГруппировки.Элементы.Количество() <> 1 Тогда
ВызватьИсключение "В своей группе ровно одно явно заданное поле склада";
КонецЕсли;
ПолеГруппы = Группа.ПоляГруппировки.Элементы.Получить(0);
Если ТипЗнч(ПолеГруппы) <> Тип("ПолеГруппировкиКомпоновкиДанных") Или Не ПолеГруппы.Использование
Или ПолеГруппы.ТипГруппировки <> ТипГруппировкиКомпоновкиДанных.Элементы Тогда
ВызватьИсключение "Не совпал тип используемого собственного поля группы";
КонецЕсли;
Если СвоеПолеВXML(ПолеГруппы.Поле) <> СвоеПолеВXML(Новый ПолеКомпоновкиДанных("Склад")) Тогда
ВызватьИсключение "Не совпал полный собственный путь группировки";
КонецЕсли;
Для Индекс = 0 По 1 Цикл
Выбор = Схема.НастройкиПоУмолчанию.Выбор.Элементы.Получить(Индекс);
Если ТипЗнч(Выбор) <> Тип("ВыбранноеПолеКомпоновкиДанных") Или Не Выбор.Использование Тогда
ВызватьИсключение "Нужно используемое собственное выбранное числовое поле";
КонецЕсли;
Если СвоеПолеВXML(Выбор.Поле) <> СвоеПолеВXML(Новый ПолеКомпоновкиДанных(Имена[Индекс + 1])) Тогда
ВызватьИсключение "Не совпали полные пути и порядок выбранных ресурсов";
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Процедура ЗаполнитьСвоеИтоговоеПоле(Схема, Ресурс, Путь, Формула, Ограничения)
ПроверитьСвоюОсновуРесурсов(Схема);
Если ТипЗнч(Ресурс) <> Тип("ПолеИтогаСхемыКомпоновкиДанных") Или Схема.ПоляИтога.Индекс(Ресурс) < 0 Тогда
ВызватьИсключение "Нужен текущий собственный ресурс именно этой схемы";
КонецЕсли;
Если (Путь <> "Количество" И Путь <> "Выручка") Или Формула <> "Сумма(" + Путь + ")" Тогда
ВызватьИсключение "Суммируются только два собственных явно объявленных числовых поля";
КонецЕсли;
Если ТипЗнч(Ресурс.Группировки) <> Тип("Массив") Или Ресурс.Группировки.Количество() <> 0 Тогда
ВызватьИсключение "Заполняется новое собственное описание с пустым массивом ограничений";
КонецЕсли;
Ресурс.ПутьКДанным = Путь;
Ресурс.Выражение = Формула;
Для Каждого ИмяПоля Из Ограничения Цикл
Если ИмяПоля <> "Склад" И ИмяПоля <> "ОбщийИтог" Тогда
ВызватьИсключение "Нужно имя реального поля Склад или специальная строка ОбщийИтог";
КонецЕсли;
Ресурс.Группировки.Добавить(ИмяПоля);
КонецЦикла;
КонецПроцедуры
Процедура ПроверитьСвоиРесурсы(Схема, Пути, Формулы, Ограничения)
ПроверитьСвоюОсновуРесурсов(Схема);
Каталог = Схема.ПоляИтога;
Если ТипЗнч(Каталог) <> Тип("ПоляИтогаСхемыКомпоновкиДанных") Или Каталог.Количество() <> Пути.Количество()
Или Формулы.Количество() <> Пути.Количество() Или Ограничения.Количество() <> Пути.Количество() Тогда
ВызватьИсключение "Не совпал полный состав собственного каталога ресурсов";
КонецЕсли;
Для Индекс = 0 По Пути.Количество() - 1 Цикл
Ресурс = Каталог.Получить(Индекс);
Если ТипЗнч(Ресурс) <> Тип("ПолеИтогаСхемыКомпоновкиДанных")
Или Ресурс.ПутьКДанным <> Пути[Индекс] Или Ресурс.Выражение <> Формулы[Индекс]
Или Каталог.Индекс(Ресурс) <> Индекс Или Каталог[Индекс] <> Ресурс
Или Каталог.Найти(Пути[Индекс]) <> Ресурс Тогда
ВызватьИсключение "Не совпали полный путь, формула, поиск и порядок собственных ресурсов";
КонецЕсли;
ОжидаемыеПоля = Ограничения[Индекс];
Если ТипЗнч(Ресурс.Группировки) <> Тип("Массив") Или Ресурс.Группировки.Количество() <> ОжидаемыеПоля.Количество() Тогда
ВызватьИсключение "Не совпал полный размер собственных ограничений ресурса";
КонецЕсли;
Для Позиция = 0 По ОжидаемыеПоля.Количество() - 1 Цикл
Если ТипЗнч(Ресурс.Группировки[Позиция]) <> Тип("Строка")
Или Ресурс.Группировки[Позиция] <> ОжидаемыеПоля[Позиция] Тогда
ВызватьИсключение "Не совпали все имена полей ограничений и их порядок";
КонецЕсли;
КонецЦикла;
КонецЦикла;
Если Каталог.Найти("НетТакогоРесурса85") <> Неопределено Тогда
ВызватьИсключение "Отсутствующий собственный ресурс не должен находиться";
КонецЕсли;
КонецПроцедуры
Процедура ВосстановитьСвоиРесурсы(Схема)
Пусто = Новый Массив;
ПроверитьСвоиРесурсы(Схема, Пусто, Пусто, Пусто);
Количество = Схема.ПоляИтога.Добавить();
ЗаполнитьСвоеИтоговоеПоле(Схема, Количество, "Количество", "Сумма(Количество)", Пусто);
Выручка = Схема.ПоляИтога.Добавить();
ЗаполнитьСвоеИтоговоеПоле(Схема, Выручка, "Выручка", "Сумма(Выручка)", СтрРазделить("Склад,ОбщийИтог", ","));
КонецПроцедурыУчебныеРесурсы85.Форма
Своя внешняя обработка УчебныеРесурсы85 → управляемая Форма → Модуль
Полный отдельный модуль своей формы с серверным вызовом; здесь не запускался.
&НаКлиенте
Процедура Выполнить(Команда)
ВыполнитьНаСервере();
Сообщить("Пути и формулы ресурсов, ограничения по полям и независимое восстановление проверены");
КонецПроцедуры
&НаСервереБезКонтекста
Процедура ВыполнитьНаСервере()
УчебныеЗадачи.ВыполнитьПример();
КонецПроцедурыРазбор по шагам
Построить всю собственную основу: точный текст запроса, три полных пути/типа, включённую обычную группу ПоСкладу85 по полю Склад и выбор используемых Количество/Выручка. Полные пути объектов ПолеКомпоновкиДанных сравниваются через собственную XML-строку в памяти, не через выдуманное строковое представление.
Каталог Схема.ПоляИтога readonly, но его методы меняют собственное содержимое. Добавить без параметров возвращает реальное ПолеИтогаСхемыКомпоновкиДанных. Для Количество задать путь Количество и формулу Сумма(Количество); первоначально Группировки пусты.
Вставить(0) создаёт Выручка с формулой Сумма(Выручка). В его собственный массив Группировки добавить строки Склад и ОбщийИтог. Здесь Склад — имя поля, а ПоСкладу85 — имя объекта группы настроек: подменять одно другим нельзя.
Пустой массив означает расчёт для всех полей по документированному правилу, а не отсутствие расчёта. В ресурс количества добавить только ОбщийИтог: теперь ограничение задано явно. Полностью проверить оба массива по размерам, типам строк, содержимому и порядку; очистить массив количества и подтвердить возврат к первоначальному правилу.
Сдвинуть(Выручка,1) принимает текущий объект и относительное смещение; Вставить принимает абсолютный индекс. Найти получает полный собственный путь, что подтверждено использованием ПоляИтога.Найти(Поле.ПутьКДанным) в коде КА2. Проверяются положительный поиск и документированное Неопределено для отсутствующего ресурса.
Десять контрольных состояний оригинала каждый раз проверяют полный источник, запрос, набор/типы полей, группу/выбор, все пути и формулы ресурсов, порядок, поиск и полные ограничения. Число записей само по себе не считается доказательством корректности.
Заново построить независимую собственную схему и два её ресурса. Удалить объект Количество, не индекс; старую ссылку не использовать. Копия сохраняет прежние пути/формулы/массивы. Восстановить новым Вставить(0), затем очистить только каталог оригинала, подтвердить0 при сохранённой основе и копии, заново добавить два новых описания.
Readonly у Группировки запрещает замену свойства целиком, но не показанные Добавить/Очистить его собственного массива. В УНФ ОтчетыУНФ есть реальный цикл Ресурс.Группировки.Очистить(), добавление имён полей и ОбщийИтог; этот урок не вызывает тот рабочий модуль.
Как проверить результат
Будущий результат проверки модели: два ресурса в порядке Количество/Выручка; точные формулы Сумма(Количество)/Сумма(Выручка); первый массив пуст, второй содержит Склад, ОбщийИтог. Источник, ручные типы, группа ПоСкладу85 и выбор числовых полей остаются прежними после удаления и очистки.
При будущем разрешённом выполнении отчёта заданная единственная строка позволила бы ожидать количество3 и выручку1500. Сейчас эти числа — литералы декларации, а формулы — строки модели: агрегаты не вычислялись и не выдаются за полученные результаты.
Будущий отрицательный контроль: после заполнения выручки заменить Выручка.Группировки[0] = "ПоСкладу85", не меняя эталон. Проверка должна отказать при прежних размерах и формуле, потому что нужен путь поля Склад. Вернуть исходный код, сохранить/F7 вне опыта и открыть новый собственный сеанс. Здесь контроль не выполнялся.
runtimeVerifiedScenarios=0. Сохранность всех прежних уроков, native-контракты и поиск проверяются статически. Нет выполнения запросов, компоновщика, процессора, записи, сети, печати или изменений конфигураций пользователя.
Ожидаемый результат
Полный опыт редактирования своего отчёта: формулы для реальных собственных числовых полей, осмысленные ограничения итогов и полное независимое восстановление.
На что обратить внимание
Группировки хранит имена полей, а не имя объекта ГруппировкаКомпоновкиДанных. Для своего строкового поля Склад не добавляется суффикс Иерархия: иерархических данных в этом опыте нет. ОбщийИтог — специальная документированная строка, не глобальный enum.
Суммируются именно явно объявленные числовые Количество/Выручка. Путь ресурса и формула — разные строки; сохранённое число ресурсов не гарантирует правильный путь, выражение или ограничение расчёта.
Найти может вернуть Неопределено. Не обращайтесь к свойствам отсутствующего результата; этот код проверяет отсутствие прямо. На ресурсах свои полные пути уникальны, поэтому положительный поиск не зависит от дублей.
Удалить принимает ресурс, Вставить — индекс, Сдвинуть — ресурс/смещение. После Удалить и Очистить прежние ссылки ресурсов не применяются. Копия собирается из собственных строк заново; дочерние объекты одной схемы не передаются другой.
Имя и ПоляГруппировки здесь доступны у обычной группы НастройкиПоУмолчанию, а не у объектов пользовательских настроек. XML-писатель сериализует только свое ПолеКомпоновкиДанных, пишет в память и закрывается при успехе и исключении.
Урок показывает контракты и проверку модели, не готовое визуальное оформление отчёта. Пока нет выполнения в1С, нельзя обещать увиденные итоги или runtime-корректность.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.