ПоляИтогаСхемыКомпоновкиДанных.Получить

Методы · Get

Получает элемент коллекции по индексу. Работает аналогично оператору [].

Синтаксис

Получить(<Индекс>)
Полное описание, параметры и ограничения

ПоляИтогаСхемыКомпоновкиДанных.Получить (DataCompositionSchemaTotalFields.Get)

ПоляИтогаСхемыКомпоновкиДанных (DataCompositionSchemaTotalFields)

Получить (Get)

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

Синтаксис:
Получить(<Индекс>)
Параметры:

<Индекс> (обязательный)
Тип: Число.
Расположение элемента в коллекции.
Возвращаемое значение:
Тип: ПолеИтогаСхемыКомпоновкиДанных.

Описание:

Получает элемент коллекции по индексу. Работает аналогично оператору [].

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

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

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

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

Методическая информация

Практические примеры

Ресурсы СКД: количество и выручка по складу, общий итог и восстановление

Для собственного учебного отчёта объявляем числовые Количество и Выручка, реальное поле Склад, обычную группу и выбор обоих числовых полей. Создаём формулы суммирования, отличаем пустое ограничение от ОбщийИтог, переставляем и удаляем ресурсы, проверяем поиск и восстановление всего состояния без запуска отчёта.

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

Полный серверный общий модуль УчебныеЗадачи новой пустой конфигурации УчебныеРесурсы85; в1С не запускался.

Подготовка

  1. Нужна НОВАЯ отдельная учебная база, не копия рабочей: платформа точно8.5.1.1343, имя конфигурации УчебныеРесурсы85, совместимость Не использовать. Без бизнес-объектов, расширений, подписок, фоновых заданий; модули вручную пустые, кроме данного общего модуля.

  2. Конфигуратор → Общие → Общие модули → УчебныеЗадачи: Сервер=Да, Вызов сервера=Да, Клиент=Нет, Глобальный=Нет, Привилегированный=Нет. Вставьте весь основной модуль. Создайте свою внешнюю обработку УчебныеРесурсы85, управляемую Форму, команду/кнопку Выполнить с действием Выполнить. В модуль формы вставьте полный отдельный код ниже; реквизиты не нужны.

  3. Будущая ручная подготовка вне опыта: завершить прежний свой сеанс, сохранить, Конфигурация → Обновить конфигурацию базы данных (F7), открыть свежий собственный клиент и свою обработку. Здесь ни F7, ни BSL, ни компоновка, ни запрос не выполнялись.

  4. Код сам объявляет 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 → управляемая Форма → Модуль

Полный отдельный модуль своей формы с серверным вызовом; здесь не запускался.

&НаКлиенте
Процедура Выполнить(Команда)
    ВыполнитьНаСервере();
    Сообщить("Пути и формулы ресурсов, ограничения по полям и независимое восстановление проверены");
КонецПроцедуры

&НаСервереБезКонтекста
Процедура ВыполнитьНаСервере()
    УчебныеЗадачи.ВыполнитьПример();
КонецПроцедуры

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

  1. Построить всю собственную основу: точный текст запроса, три полных пути/типа, включённую обычную группу ПоСкладу85 по полю Склад и выбор используемых Количество/Выручка. Полные пути объектов ПолеКомпоновкиДанных сравниваются через собственную XML-строку в памяти, не через выдуманное строковое представление.

  2. Каталог Схема.ПоляИтога readonly, но его методы меняют собственное содержимое. Добавить без параметров возвращает реальное ПолеИтогаСхемыКомпоновкиДанных. Для Количество задать путь Количество и формулу Сумма(Количество); первоначально Группировки пусты.

  3. Вставить(0) создаёт Выручка с формулой Сумма(Выручка). В его собственный массив Группировки добавить строки Склад и ОбщийИтог. Здесь Склад — имя поля, а ПоСкладу85 — имя объекта группы настроек: подменять одно другим нельзя.

  4. Пустой массив означает расчёт для всех полей по документированному правилу, а не отсутствие расчёта. В ресурс количества добавить только ОбщийИтог: теперь ограничение задано явно. Полностью проверить оба массива по размерам, типам строк, содержимому и порядку; очистить массив количества и подтвердить возврат к первоначальному правилу.

  5. Сдвинуть(Выручка,1) принимает текущий объект и относительное смещение; Вставить принимает абсолютный индекс. Найти получает полный собственный путь, что подтверждено использованием ПоляИтога.Найти(Поле.ПутьКДанным) в коде КА2. Проверяются положительный поиск и документированное Неопределено для отсутствующего ресурса.

  6. Десять контрольных состояний оригинала каждый раз проверяют полный источник, запрос, набор/типы полей, группу/выбор, все пути и формулы ресурсов, порядок, поиск и полные ограничения. Число записей само по себе не считается доказательством корректности.

  7. Заново построить независимую собственную схему и два её ресурса. Удалить объект Количество, не индекс; старую ссылку не использовать. Копия сохраняет прежние пути/формулы/массивы. Восстановить новым Вставить(0), затем очистить только каталог оригинала, подтвердить0 при сохранённой основе и копии, заново добавить два новых описания.

  8. Readonly у Группировки запрещает замену свойства целиком, но не показанные Добавить/Очистить его собственного массива. В УНФ ОтчетыУНФ есть реальный цикл Ресурс.Группировки.Очистить(), добавление имён полей и ОбщийИтог; этот урок не вызывает тот рабочий модуль.

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

  1. Будущий результат проверки модели: два ресурса в порядке Количество/Выручка; точные формулы Сумма(Количество)/Сумма(Выручка); первый массив пуст, второй содержит Склад, ОбщийИтог. Источник, ручные типы, группа ПоСкладу85 и выбор числовых полей остаются прежними после удаления и очистки.

  2. При будущем разрешённом выполнении отчёта заданная единственная строка позволила бы ожидать количество3 и выручку1500. Сейчас эти числа — литералы декларации, а формулы — строки модели: агрегаты не вычислялись и не выдаются за полученные результаты.

  3. Будущий отрицательный контроль: после заполнения выручки заменить Выручка.Группировки[0] = "ПоСкладу85", не меняя эталон. Проверка должна отказать при прежних размерах и формуле, потому что нужен путь поля Склад. Вернуть исходный код, сохранить/F7 вне опыта и открыть новый собственный сеанс. Здесь контроль не выполнялся.

  4. runtimeVerifiedScenarios=0. Сохранность всех прежних уроков, native-контракты и поиск проверяются статически. Нет выполнения запросов, компоновщика, процессора, записи, сети, печати или изменений конфигураций пользователя.

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

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

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

  1. Группировки хранит имена полей, а не имя объекта ГруппировкаКомпоновкиДанных. Для своего строкового поля Склад не добавляется суффикс Иерархия: иерархических данных в этом опыте нет. ОбщийИтог — специальная документированная строка, не глобальный enum.

  2. Суммируются именно явно объявленные числовые Количество/Выручка. Путь ресурса и формула — разные строки; сохранённое число ресурсов не гарантирует правильный путь, выражение или ограничение расчёта.

  3. Найти может вернуть Неопределено. Не обращайтесь к свойствам отсутствующего результата; этот код проверяет отсутствие прямо. На ресурсах свои полные пути уникальны, поэтому положительный поиск не зависит от дублей.

  4. Удалить принимает ресурс, Вставить — индекс, Сдвинуть — ресурс/смещение. После Удалить и Очистить прежние ссылки ресурсов не применяются. Копия собирается из собственных строк заново; дочерние объекты одной схемы не передаются другой.

  5. Имя и ПоляГруппировки здесь доступны у обычной группы НастройкиПоУмолчанию, а не у объектов пользовательских настроек. XML-писатель сериализует только свое ПолеКомпоновкиДанных, пишет в память и закрывается при успехе и исключении.

  6. Урок показывает контракты и проверку модели, не готовое визуальное оформление отчёта. Пока нет выполнения в1С, нельзя обещать увиденные итоги или runtime-корректность.

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

Макеты итоговых полей СКД: ресурс количества, группы строк/колонок и два enum

Создаём собственный ресурс Количество с формулой Сумма(Количество), действительную таблицу обычных настроек с именованными строками по складу и колонками по коду. Итоговые описания ссылаются на обе реальные группы и существующие области. Переставляем, меняем второй enum, удаляем и восстанавливаем каталог; контролируем всю основу и независимую копию без выполнения отчёта.

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

Полный серверный общий модуль УчебныеЗадачи новой пустой конфигурации УчебныеМакетыИтогов85; в1С не запускался.

Подготовка

  1. Нужна НОВАЯ отдельная учебная база, не копия рабочей: точно8.5.1.1343, имя конфигурации УчебныеМакетыИтогов85, совместимость Не использовать. Нет бизнес-объектов, расширений, подписок и фоновых заданий; модули вручную пустые, кроме данного общего модуля.

  2. Общий модуль УчебныеЗадачи: Сервер=Да, Вызов сервера=Да, Клиент=Нет, Глобальный=Нет, Привилегированный=Нет. Вставьте весь основной модуль. Своя внешняя обработка УчебныеМакетыИтогов85 → управляемая Форма: команда/кнопка Выполнить с действием Выполнить; реквизиты не нужны. Полный отдельный модуль формы дан ниже.

  3. Будущая ручная подготовка только вне опыта: завершить прежний собственный сеанс, сохранить конфигурацию, Конфигурация → Обновить конфигурацию базы данных (F7), затем свежий собственный клиент и своя обработка. Здесь F7, BSL, отчёты, запросы и печать не запускались.

  4. Собственная основа содержит один Local-источник, один набор с буквальным запросом A01/3/Учебный, вручную объявленные КодТовара Строка/Количество Число/Склад Строка и четыре именованные области. Значения написаны в объявлении и постоянных надписях, не получены из рабочей базы.

  5. Количество в буквальном запросе равно3. Его собственное описание — Число(1,0), неотрицательное: один общий разряд, ноль дробных, допустимые целые0–9. Это предел учебного исходного поля, не диапазон количества рабочего отчёта и не описание типа агрегата Сумма(Количество).

Процедура ВыполнитьПример() Экспорт
    ПроверитьСвойПустойСтенд();
    Если ПривилегированныйРежим() Тогда
        ВызватьИсключение "Привилегированный режим не нужен";
    КонецЕсли;
    Пусто = Новый Массив;
    ДваТипа = Новый Массив;
    ДваТипа.Добавить(ТипМакетаОбластиКомпоновкиДанных.Заголовок);
    ДваТипа.Добавить(ТипМакетаОбластиКомпоновкиДанных.Подвал);
    ОдинЗаголовок = Новый Массив;
    ОдинЗаголовок.Добавить(ДваТипа[0]);
    ОдинПодвал = Новый Массив;
    ОдинПодвал.Добавить(ДваТипа[1]);
    Схема = СоздатьСвоюОсновуИтогов();
    Каталог = Схема.МакетыПолейИтога;
    ПроверитьСвоиИтоговыеМакеты(Схема, Пусто, Пусто, Пусто);
    Первый = Каталог.Добавить();
    ЗаполнитьСвойИтоговыйМакет(Схема, Первый, "Количество", ДваТипа[0], ДваТипа[0]);
    ПроверитьСвоиИтоговыеМакеты(Схема, СтрРазделить("Количество", ","), ОдинЗаголовок, ОдинЗаголовок);
    Второй = Каталог.Вставить(0);
    ЗаполнитьСвойИтоговыйМакет(Схема, Второй, "КоличествоВыделено85", ДваТипа[1], ДваТипа[1]);
    ОбратныеТипы = Новый Массив;
    ОбратныеТипы.Добавить(ДваТипа[1]);
    ОбратныеТипы.Добавить(ДваТипа[0]);
    ПроверитьСвоиИтоговыеМакеты(Схема, СтрРазделить("КоличествоВыделено85,Количество", ","), ОбратныеТипы, ОбратныеТипы);
    Каталог.Сдвинуть(Второй, 1);
    Имена = СтрРазделить("Количество,КоличествоВыделено85", ",");
    ПроверитьСвоиИтоговыеМакеты(Схема, Имена, ДваТипа, ДваТипа);
    Первый.ТипМакета2 = ДваТипа[1];
    ВременныеТипы2 = Новый Массив;
    ВременныеТипы2.Добавить(ДваТипа[1]);
    ВременныеТипы2.Добавить(ДваТипа[1]);
    ПроверитьСвоиИтоговыеМакеты(Схема, Имена, ДваТипа, ВременныеТипы2);
    Первый.ТипМакета2 = ДваТипа[0];
    ПроверитьСвоиИтоговыеМакеты(Схема, Имена, ДваТипа, ДваТипа);
    Копия = СоздатьСвоюОсновуИтогов();
    ВосстановитьСвоиИтоговыеМакеты(Копия);
    Каталог.Удалить(Первый);
    ПроверитьСвоиИтоговыеМакеты(Схема, СтрРазделить("КоличествоВыделено85", ","), ОдинПодвал, ОдинПодвал);
    ПроверитьСвоиИтоговыеМакеты(Копия, Имена, ДваТипа, ДваТипа);
    НовыйПервый = Каталог.Вставить(0);
    ЗаполнитьСвойИтоговыйМакет(Схема, НовыйПервый, "Количество", ДваТипа[0], ДваТипа[0]);
    ПроверитьСвоиИтоговыеМакеты(Схема, Имена, ДваТипа, ДваТипа);
    Каталог.Очистить();
    ПроверитьСвоиИтоговыеМакеты(Схема, Пусто, Пусто, Пусто);
    ПроверитьСвоиИтоговыеМакеты(Копия, Имена, ДваТипа, ДваТипа);
    ВосстановитьСвоиИтоговыеМакеты(Схема);
    ПроверитьСвоиИтоговыеМакеты(Схема, Имена, ДваТипа, ДваТипа);
    ПроверитьСвоиИтоговыеМакеты(Копия, Имена, ДваТипа, ДваТипа);
    Сообщить("Ресурс Сумма(Количество), строки по складу, колонки по коду и два итоговых описания восстановлены");
КонецПроцедуры

Процедура ПроверитьСвойПустойСтенд()
    Если Метаданные.Справочники.Количество() <> 0 Или Метаданные.Документы.Количество() <> 0 Или Метаданные.Перечисления.Количество() <> 0 Или Метаданные.РегистрыСведений.Количество() <> 0 Или Метаданные.РегистрыНакопления.Количество() <> 0 Или Метаданные.РегистрыБухгалтерии.Количество() <> 0 Или Метаданные.РегистрыРасчета.Количество() <> 0 Или Метаданные.ПланыВидовХарактеристик.Количество() <> 0 Или Метаданные.ПланыВидовРасчета.Количество() <> 0 Или Метаданные.ПланыСчетов.Количество() <> 0 Или Метаданные.ПланыОбмена.Количество() <> 0 Или Метаданные.Последовательности.Количество() <> 0 Или Метаданные.БизнесПроцессы.Количество() <> 0 Или Метаданные.Задачи.Количество() <> 0 Или Метаданные.ОбщиеРеквизиты.Количество() <> 0 Или Метаданные.ПодпискиНаСобытия.Количество() <> 0 Или Метаданные.РегламентныеЗадания.Количество() <> 0 Или Метаданные.ВнешниеИсточникиДанных.Количество() <> 0 Тогда
        ВызватьИсключение "Нужен только свой новый пустой учебный стенд";
    КонецЕсли;
    Если Метаданные.ЕстьИзмененияРасширениямиКонфигурации() Тогда
        ВызватьИсключение "Свой сеанс не должен изменяться расширениями";
    КонецЕсли;
    Источники = Новый Массив;
    Источники.Добавить(ИсточникРасширенийКонфигурации.БазаДанных);
    Источники.Добавить(ИсточникРасширенийКонфигурации.СеансАктивные);
    Источники.Добавить(ИсточникРасширенийКонфигурации.СеансОтключенные);
    Для Каждого Источник Из Источники Цикл
        Расширения = РасширенияКонфигурации.Получить(, Источник);
        Если ТипЗнч(Расширения) <> Тип("Массив") Тогда
            ВызватьИсключение "Native список расширений должен иметь тип Массив";
        КонецЕсли;
        Если Расширения.Количество() <> 0 Тогда
            ВызватьИсключение "В своём новом стенде нет расширений базы или сеанса";
        КонецЕсли;
    КонецЦикла;
    Если ТранзакцияАктивна() Тогда
        ВызватьИсключение "Чужая или вложенная активная транзакция не допускается";
    КонецЕсли;
КонецПроцедуры

Функция СоздатьУчебнуюОбласть(ТекстОбласти)
    Область = Новый МакетОбластиКомпоновкиДанных;
    СтрокаОбласти = Область.Добавить(Тип("СтрокаТаблицыОбластиКомпоновкиДанных"));
    Ячейка = СтрокаОбласти.Ячейки.Добавить();
    Поле = Ячейка.Элементы.Добавить(Тип("ПолеОбластиКомпоновкиДанных"));
    Поле.Значение = ТекстОбласти;
    Возврат Область;
КонецФункции

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

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

Функция СвойТипКоличестваМакета()
    Возврат Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(1, 0, ДопустимыйЗнак.Неотрицательный));
КонецФункции

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

Функция СоздатьСвоюОсновуМакетовПолей()
    Схема = Новый СхемаКомпоновкиДанных;
    Источник = Схема.ИсточникиДанных.Добавить();
    Источник.Имя = "СвоиДанные85";
    Источник.ТипИсточникаДанных = "Local";
    Набор = Схема.НаборыДанных.Добавить(Тип("НаборДанныхЗапросСхемыКомпоновкиДанных"));
    Если ТипЗнч(Набор) <> Тип("НаборДанныхЗапросСхемыКомпоновкиДанных") Тогда
        ВызватьИсключение "Нужен собственный набор запроса";
    КонецЕсли;
    Набор.Имя = "УчебныеОстатки85";
    Набор.ИсточникДанных = "СвоиДанные85";
    Набор.АвтоЗаполнениеДоступныхПолей = Ложь;
    Набор.Запрос = "ВЫБРАТЬ ""A01"" КАК КодТовара, 3 КАК Количество, ""Учебный"" КАК Склад";
    Имена = СтрРазделить("КодТовара|Количество|Склад", "|");
    Для Индекс = 0 По 2 Цикл
        Поле = Набор.Поля.Добавить(Тип("ПолеНабораДанныхСхемыКомпоновкиДанных"));
        Если ТипЗнч(Поле) <> Тип("ПолеНабораДанныхСхемыКомпоновкиДанных") Тогда
            ВызватьИсключение "Нужно простое собственное описание поля, не папка";
        КонецЕсли;
        Поле.Поле = Имена[Индекс];
        Поле.ПутьКДанным = Имена[Индекс];
        Если Индекс = 1 Тогда
            Поле.ТипЗначения = СвойТипКоличестваМакета();
        Иначе
            Поле.ТипЗначения = Новый ОписаниеТипов("Строка");
        КонецЕсли;
    КонецЦикла;
    ИменаМакетов = СтрРазделить("КодТовара|Количество|Склад|КоличествоВыделено85", "|");
    Тексты = СтрРазделить("Код: A01|Количество: 3|Склад: Учебный|Количество: 3 (выделено)", "|");
    Для Индекс = 0 По 3 Цикл
        Описание = Схема.Макеты.Добавить();
        ЗаполнитьСвойИменованныйМакет(Описание, ИменаМакетов[Индекс], Тексты[Индекс]);
    КонецЦикла;
    ПроверитьСвоюОсновуМакетовПолей(Схема);
    Возврат Схема;
КонецФункции

Процедура ПроверитьСвоюОсновуМакетовПолей(Схема)
    Если ТипЗнч(Схема) <> Тип("СхемаКомпоновкиДанных") Или Схема.ИсточникиДанных.Количество() <> 1
        Или Схема.НаборыДанных.Количество() <> 1 Или Схема.Макеты.Количество() <> 4 Тогда
        ВызватьИсключение "Нужны только собственные источник, набор и четыре согласованные области";
    КонецЕсли;
    Источник = Схема.ИсточникиДанных.Получить(0);
    Если ТипЗнч(Источник) <> Тип("ИсточникДанныхСхемыКомпоновкиДанных")
        Или Источник.Имя <> "СвоиДанные85" Или Источник.ТипИсточникаДанных <> "Local" Тогда
        ВызватьИсключение "Не совпал собственный источник";
    КонецЕсли;
    Набор = Схема.НаборыДанных.Получить(0);
    Если ТипЗнч(Набор) <> Тип("НаборДанныхЗапросСхемыКомпоновкиДанных") Тогда
        ВызватьИсключение "Нужен собственный набор запроса";
    КонецЕсли;
    Если Набор.Имя <> "УчебныеОстатки85" Или Набор.ИсточникДанных <> "СвоиДанные85"
        Или Набор.АвтоЗаполнениеДоступныхПолей Или Набор.Запрос <> "ВЫБРАТЬ ""A01"" КАК КодТовара, 3 КАК Количество, ""Учебный"" КАК Склад"
        Или Набор.Поля.Количество() <> 3 Тогда
        ВызватьИсключение "Не совпали полный собственный запрос и ручное описание полей";
    КонецЕсли;
    Имена = СтрРазделить("КодТовара|Количество|Склад", "|");
    Типы = СтрРазделить("Строка,Число,Строка", ",");
    Для Индекс = 0 По 2 Цикл
        Поле = Набор.Поля.Получить(Индекс);
        Если ТипЗнч(Поле) <> Тип("ПолеНабораДанныхСхемыКомпоновкиДанных")
            Или Поле.Поле <> Имена[Индекс] Или Поле.ПутьКДанным <> Имена[Индекс]
            Или ТипЗнч(Поле.ТипЗначения) <> Тип("ОписаниеТипов") Тогда
            ВызватьИсключение "Не совпали полный путь, имя и описание собственного поля";
        КонецЕсли;
        ПолныеТипы = Поле.ТипЗначения.Типы();
        Если ПолныеТипы.Количество() <> 1 Или ПолныеТипы[0] <> Тип(Типы[Индекс]) Тогда
            ВызватьИсключение "Не совпал полный набор типов собственного поля";
        КонецЕсли;
        Если Индекс = 1 Тогда
            ПроверитьСвоюРазрядностьМакета(Поле.ТипЗначения);
        КонецЕсли;
    КонецЦикла;
    ИменаМакетов = СтрРазделить("КодТовара|Количество|Склад|КоличествоВыделено85", "|");
    Тексты = СтрРазделить("Код: A01|Количество: 3|Склад: Учебный|Количество: 3 (выделено)", "|");
    Для Индекс = 0 По 3 Цикл
        Описание = Схема.Макеты.Получить(Индекс);
        Если ТипЗнч(Описание) <> Тип("ОписаниеМакетаСхемыКомпоновкиДанных")
            Или Описание.Имя <> ИменаМакетов[Индекс] Или Схема.Макеты.Найти(ИменаМакетов[Индекс]) <> Описание Тогда
            ВызватьИсключение "Не совпали имена и порядок существующих собственных макетов";
        КонецЕсли;
        ПроверитьСвоюПолнуюОбласть(Описание, Тексты[Индекс]);
    КонецЦикла;
КонецПроцедуры

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

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

Процедура ПроверитьСвоюГруппуТаблицы(Группа, Имя, Путь)
    Если ТипЗнч(Группа) <> Тип("ГруппировкаТаблицыКомпоновкиДанных")
        Или Группа.Имя <> Имя Или Не Группа.Использование
        Или ТипЗнч(Группа.ПоляГруппировки) <> Тип("ПоляГруппировкиКомпоновкиДанных") Тогда
        ВызватьИсключение "Не совпало собственное имя и тип группы таблицы";
    КонецЕсли;
    Если Группа.ПоляГруппировки.Элементы.Количество() <> 1 Тогда
        ВызватьИсключение "В своей группе таблицы ровно одно явно заданное поле";
    КонецЕсли;
    Поле = Группа.ПоляГруппировки.Элементы.Получить(0);
    Если ТипЗнч(Поле) <> Тип("ПолеГруппировкиКомпоновкиДанных") Или Не Поле.Использование
        Или Поле.ТипГруппировки <> ТипГруппировкиКомпоновкиДанных.Элементы Тогда
        ВызватьИсключение "Не совпал тип собственного используемого поля";
    КонецЕсли;
    Если СвоеПолеВXML(Поле.Поле) <> СвоеПолеВXML(Новый ПолеКомпоновкиДанных(Путь)) Тогда
        ВызватьИсключение "Не совпал полный собственный путь строки или колонки";
    КонецЕсли;
КонецПроцедуры

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

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

Процедура ЗаполнитьСвойИтоговыйМакет(Схема, Описание, ИмяМакета, Тип1, Тип2)
    ПроверитьСвоюОсновуИтогов(Схема);
    Если ТипЗнч(Описание) <> Тип("МакетПолейИтогаСхемыКомпоновкиДанных")
        Или ТипЗнч(Схема.Макеты.Найти(ИмяМакета)) <> Тип("ОписаниеМакетаСхемыКомпоновкиДанных") Тогда
        ВызватьИсключение "Нужны настоящее итоговое описание и существующая собственная область";
    КонецЕсли;
    Если (Тип1 <> ТипМакетаОбластиКомпоновкиДанных.Заголовок И Тип1 <> ТипМакетаОбластиКомпоновкиДанных.Подвал)
        Или (Тип2 <> ТипМакетаОбластиКомпоновкиДанных.Заголовок И Тип2 <> ТипМакетаОбластиКомпоновкиДанных.Подвал) Тогда
        ВызватьИсключение "В опыте используются только явно согласованные enum заголовка и подвала";
    КонецЕсли;
    Описание.ИмяГруппировки1 = "СтрокиПоСкладу85";
    Описание.ИмяГруппировки2 = "КолонкиПоКоду85";
    Описание.Макет = ИмяМакета;
    Описание.ТипМакета1 = Тип1;
    Описание.ТипМакета2 = Тип2;
    Если ТипЗнч(Описание.ПоляГруппировки1) <> Тип("Массив") Или ТипЗнч(Описание.ПоляГруппировки2) <> Тип("Массив")
        Или Описание.ПоляГруппировки1.Количество() <> 0 Или Описание.ПоляГруппировки2.Количество() <> 0 Тогда
        ВызватьИсключение "Дополнительные массивы выбора полей в этом именованном опыте пусты";
    КонецЕсли;
КонецПроцедуры

Процедура ПроверитьСвоиИтоговыеМакеты(Схема, Имена, Типы1, Типы2)
    ПроверитьСвоюОсновуИтогов(Схема);
    Каталог = Схема.МакетыПолейИтога;
    Если ТипЗнч(Каталог) <> Тип("МакетыПолейИтогаСхемыКомпоновкиДанных")
        Или Каталог.Количество() <> Имена.Количество() Или Типы1.Количество() <> Имена.Количество()
        Или Типы2.Количество() <> Имена.Количество() Тогда
        ВызватьИсключение "Не совпал полный размер собственного итогового каталога";
    КонецЕсли;
    Для Индекс = 0 По Имена.Количество() - 1 Цикл
        Описание = Каталог.Получить(Индекс);
        Если ТипЗнч(Описание) <> Тип("МакетПолейИтогаСхемыКомпоновкиДанных")
            Или Описание.ИмяГруппировки1 <> "СтрокиПоСкладу85" Или Описание.ИмяГруппировки2 <> "КолонкиПоКоду85"
            Или Описание.Макет <> Имена[Индекс] Или Описание.ТипМакета1 <> Типы1[Индекс] Или Описание.ТипМакета2 <> Типы2[Индекс]
            Или Каталог.Индекс(Описание) <> Индекс Или Каталог[Индекс] <> Описание Тогда
            ВызватьИсключение "Не совпали обе группы, ссылка, два enum и порядок итоговых описаний";
        КонецЕсли;
        Если ТипЗнч(Описание.ПоляГруппировки1) <> Тип("Массив") Или ТипЗнч(Описание.ПоляГруппировки2) <> Тип("Массив")
            Или Описание.ПоляГруппировки1.Количество() <> 0 Или Описание.ПоляГруппировки2.Количество() <> 0
            Или ТипЗнч(Схема.Макеты.Найти(Описание.Макет)) <> Тип("ОписаниеМакетаСхемыКомпоновкиДанных") Тогда
            ВызватьИсключение "Нужны прежние пустые массивы и существующая собственная область";
        КонецЕсли;
    КонецЦикла;
КонецПроцедуры

Процедура ВосстановитьСвоиИтоговыеМакеты(Схема)
    Пусто = Новый Массив;
    ПроверитьСвоиИтоговыеМакеты(Схема, Пусто, Пусто, Пусто);
    Первый = Схема.МакетыПолейИтога.Добавить();
    ЗаполнитьСвойИтоговыйМакет(Схема, Первый, "Количество", ТипМакетаОбластиКомпоновкиДанных.Заголовок, ТипМакетаОбластиКомпоновкиДанных.Заголовок);
    Второй = Схема.МакетыПолейИтога.Добавить();
    ЗаполнитьСвойИтоговыйМакет(Схема, Второй, "КоличествоВыделено85", ТипМакетаОбластиКомпоновкиДанных.Подвал, ТипМакетаОбластиКомпоновкиДанных.Подвал);
КонецПроцедуры
УчебныеМакетыИтогов85.Форма

Своя внешняя обработка УчебныеМакетыИтогов85 → управляемая Форма → Модуль

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

&НаКлиенте
Процедура Выполнить(Команда)
    ВыполнитьНаСервере();
    Сообщить("Ресурс количества, группы таблицы, каталог итоговых макетов и восстановление проверены");
КонецПроцедуры

&НаСервереБезКонтекста
Процедура ВыполнитьНаСервере()
    УчебныеЗадачи.ВыполнитьПример();
КонецПроцедуры

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

  1. Явно добавить ресурс в Схема.ПоляИтога: ПутьКДанным="Количество", Выражение="Сумма(Количество)". Нельзя называть макет итоговым для ресурса, которого в схеме нет. Каждый контроль сверяет весь путь и формулу, не только наличие строки в каталоге.

  2. В обычные НастройкиПоУмолчанию.Структура добавить включённую ТаблицаКомпоновкиДанных. Её Строки.Добавить() создаёт именованную СтрокиПоСкладу85 по реальному Склад, Колонки.Добавить() — КолонкиПоКоду85 по реальному КодТовара. В обеих группах явно заданы использование и тип Элементы; в Выбор выбран используемый ресурс Количество.

  3. Проверить полные пути полей через XML/XDTO в памяти и независимо созданные эталоны. Проверить настоящий тип таблицы/групп, размеры, имена, использование, типы enum, выбор, источник, три описания полей и все тексты реальных областей. Отчёт и запрос не выполняются.

  4. МакетыПолейИтога readonly, но собственная коллекция изменяется методами. Добавить возвращает МакетПолейИтогаСхемыКомпоновкиДанных. Его две строки имён групп должны совпадать с созданными группами, Макет — строковое имя существующей области. ТипМакета1/2 — независимые значения специального enum, не строки.

  5. Добавить правило заголовок/заголовок и вставить подвал/подвал по индексу0. Сдвинуть(Второй,1) — объект и относительное смещение — восстанавливает исходный порядок. В первом правиле изменить только ТипМакета2 на Подвал и проверить, что ТипМакета1 остался Заголовок; затем вернуть второй тип.

  6. Два readonly массива ПоляГруппировки1/2 проверяются как Массив с количеством0. В этом именованном опыте дополнительных условий выбора полей нет; типы элементов и алгоритм отбора этим массивом не выдумываются. Реальные поля и группы проверяются независимо.

  7. Независимую схему с источником, ресурсом, таблицей, группами, областями и правилами создать заново. Удалить текущий объект Первый, не число; старое правило не использовать. Копия сохраняет исходный каталог. Восстановить новым Вставить(0), очистить только каталог оригинала, подтвердить0 при сохранённой основе и копии, заново создать оба правила.

  8. Десять прямых проверок оригинального каталога каждый раз сверяют обе группы, два enum, строковую ссылку, порядок, массивы и полное содержимое основы. Финальные оригинал/копия проверяются по одному полному согласованному эталону. Коллекция не имеет Найти, поиск не придумывается.

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

  1. Будущий результат модели: единственный ресурс Количество/Сумма(Количество); включённая таблица с группами СтрокиПоСкладу85/КолонкиПоКоду85 и выбранным Количество. После восстановления каталог содержит Количество с Заголовок/Заголовок, затем КоличествоВыделено85 с Подвал/Подвал. У обоих правила привязаны к обеим существующим группам, дополнительные массивы пусты.

  2. Будущий отрицательный контроль: после заполнения второго правила присвоить Второй.ИмяГруппировки2 = "НетТакойКолонки85", не меняя ожидаемое имя. Полная проверка должна отказать при прежних размерах, двух enum и ссылке на существующий макет. Вернуть код, сохранить/F7 вне опыта и открыть новый собственный сеанс. Здесь контроль не выполнялся.

  3. runtimeVerifiedScenarios=0. Ресурс и его формула объявлены, не вычислены. Постоянные тексты областей не выдаются за агрегаты или готовое оформление таблицы. Нет записей, сети, рабочей конфигурации, компиляции СКД и печати.

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

Полный пример не оставляет ресурс, группы или макет неизвестными: проверяет реальную собственную основу и весь цикл восстановления итоговых описаний.

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

  1. ИмяГруппировки1/2 и Макет — Строка, ТипМакета1/2 — ТипМакетаОбластиКомпоновкиДанных, ПоляГруппировки1/2 — readonly Массив. Не заменяйте enum строкой или массив коллекцией настроек.

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

  3. Вставить — абсолютный индекс, Сдвинуть — описание и относительное смещение, Удалить — описание. Нет метода Найти. После удаления/очистки старые правила не используются; схема и независимая копия сохраняют собственных владельцев.

  4. Массивы выбора полей оставлены пустыми намеренно; их неописанные здесь типы элементов и правила отбора не выдаются за доказанный контракт. Изменение второго enum демонстрируется отдельно от первого.

  5. XML-сериализация получает только собственное ПолеКомпоновкиДанных и пишет строку в памяти. Не передаются объекты метаданных, записи или вся схема; собственный писатель закрывается в обоих исходах.

  6. Установленная справка для класса итогового описания содержит подозрительную метку XDTO GroupTemplate и ссылки на соседние каталоги. Они не используются для приведения типа или сериализации итогового правила: проверяется его фактический тип и семь документированных свойств.

  7. Без выполнения компоновщика и процессора не заявляется, что правила визуально применились. Это содержательный опыт редактирования собственной схемы и проверки ссылок, не доказательство готового отчёта.

  8. Число в ОписаниеТипов задаётся вместе со вторым аргументом КвалификаторыЧисла(1,0,Неотрицательный), а не одним именем типа. Полная проверка сначала сверяет единственный тип Число, затем тип квалификаторов, общую разрядность1, дробную0 и знак. Строковые КодТовара/Склад остаются строками без числовых квалификаторов. Не расширяйте данные за0–9 без согласованного изменения описания и его эталона; запрос и агрегат здесь не исполняются.

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

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

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

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

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