ПараметрыОбластиКомпоновкиДанных

Типы · DataCompositionAreaParameters

Коллекция параметров.

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

ПараметрыОбластиКомпоновкиДанных (DataCompositionAreaParameters)

ПараметрыОбластиКомпоновкиДанных (DataCompositionAreaParameters)

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

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

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

Описание:

Коллекция параметров.

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

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

См. также:
ОписаниеМакетаОбластиМакетаКомпоновкиДанных, свойство Параметры
ОписаниеМакетаСхемыКомпоновкиДанных, свойство Параметры

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

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

Описание изменено в версии 8.3.22.

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

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

Макет поля СКД: реальное поле, существующая именованная область и восстановление ссылок

Создаём собственный набор с тремя явно описанными полями и четыре реальные постоянные области. Привязываем поля к именам макетов, переставляем элементы, переключаем количество на альтернативную область, удаляем и восстанавливаем привязки. На каждом этапе проверяется вся основа, ссылки и полное содержимое областей, без выполнения отчёта.

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

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

Подготовка

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

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

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

  4. Источник СвоиДанные85 типа Local и набор УчебныеОстатки85 созданы только в своей схеме. Запрос буквально объявляет A01/3/Учебный; он не исполняется. АвтоЗаполнениеДоступныхПолей=Ложь: КодТовара Строка, Количество Число, Склад Строка объявлены вручную, с совпадающими Поле/ПутьКДанным.

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

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

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

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

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

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

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

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

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

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

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

  1. Построить собственную основу: один источник, один набор, точный текст собственного запроса, три поля нужных полных типов и четыре именованных макета. В каждом макете проверить тип области, одну строку/ячейку/поле, постоянный полный текст и отсутствие параметров. Не предполагать автоматическое появление полей без их объявления.

  2. Схема.МакетыПолей readonly, но её собственная коллекция изменяется методами. Добавить возвращает МакетПоляСхемыКомпоновкиДанных. Его writable Поле и Макет — строки: имя объявленного поля и имя существующего описания в Схема.Макеты, не объекты областей.

  3. Добавить КодТовара и Количество. Для демонстрации Найти использовать их одинаковые имена поля и основного макета; Склад пока не имеет привязки. Справка говорит о поиске по имени, не уточняя свойство-ключ. Здесь не утверждается отдельная недокументированная семантика поиска после смены ссылки.

  4. Вставить привязку склада по индексу1; проверить КодТовара/Склад/Количество. Сдвинуть принимает объект Склад и относительное+1, после чего порядок КодТовара/Количество/Склад. Каждый элемент проверен через Получить,[],Индекс, обе строковые ссылки и наличие настоящего макета.

  5. Не меняя Поле="Количество", задать Макет="КоличествоВыделено85". Эта четвёртая область реально создана и содержит «Количество: 3 (выделено)». Проверить все ссылки и содержание, затем вернуть Макет="Количество". Текст запроса и три поля не меняются.

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

  7. Одиннадцать контрольных состояний оригинала завершаются новым созданием трёх привязок. Обе независимые модели проверены по полному эталону полей, типов, пути, запроса, макетов, текстов и порядка ссылок. Изменение каталога не выдаётся за готовый скомпилированный отчёт.

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

  1. Будущий результат модели: поля КодТовара/Количество/Склад с типами Строка/Число/Строка, четыре области сохранены. После восстановления три привязки ссылаются на одноимённые основные макеты в порядке0/1/2. Временное переключение количества затронуло только строковое имя макета, не поле или источник.

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

  3. runtimeVerifiedScenarios=0. Query/Local — только объявления в собственной модели; нет выполнения запроса, формирования отчёта, записи, сети, печати и обращения к рабочим конфигурациям.

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

Урок показывает различие между строковой ссылкой Макет у привязки и объектной областью Макет у описания, с реальными собственными полями и полным восстановлением.

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

  1. Макет у МакетПоляСхемыКомпоновкиДанных — Строка; у ОписаниеМакетаСхемыКомпоновкиДанных — МакетОбластиКомпоновкиДанных. Не присваивайте область строковой ссылке или неизвестное имя несуществующего макета.

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

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

  4. Для Найти в этом опыте основные имя поля и имя макета совпадают. Не заявляется проверенный в1С ключ поиска для разных имён: переключённая ссылка проверяется через текущую привязку, индекс и фактические свойства. Это ограничение явно отделено от полного контроля существования макета.

  5. Оригинал и копия не разделяют изменяемые области, поля или привязки. Очистка МакетыПолей не очищает Макеты или НаборыДанных; их полный состав и тексты проверяются заново.

  6. Здесь не компилируется макет отчёта и не доказывается внешний вид. Чтобы получать данные и выводить отчёт, нужен отдельный согласованный цикл настроек/компиляции/процессора; настоящий запуск не входит в этот опыт.

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

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

Макеты группировки СКД: именованная группа, enum типа области и два независимых каталога

На собственной схеме с объявленным полем Склад создаём реальную группировку ПоСкладу85 в обычных настройках. Привязываем существующие области к её заголовку/подвалу и отдельному каталогу заголовков, меняем ссылку, удаляем и восстанавливаем описания. Полностью контролируем источник, поля, группы, enum, области и независимую копию без выполнения отчёта.

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

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

Подготовка

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

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

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

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

  5. Обычные НастройкиПоУмолчанию содержат одну включённую группировку ПоСкладу85 по явно заданному Склад, тип группировки Элементы. Не использовать пользовательские настройки: у их элементов Имя и ПоляГруппировки недоступны.

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

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

Процедура ПроверитьСвойПустойСтенд()
    Если Метаданные.Справочники.Количество() <> 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(Запись, Поле);
        Возврат Запись.Закрыть();
    Исключение
        Запись.Закрыть();
        ВызватьИсключение;
    КонецПопытки;
КонецФункции

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

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

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

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

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

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

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

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

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

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

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

  1. Создать и проверить весь собственный источник, запрос, три полных описания полей и четыре реальные области. Добавить настоящую ГруппировкаКомпоновкиДанных в обычную Структура, дать имя ПоСкладу85 и включить использование. Добавить явное поле Склад, а не автоэлемент; задать тип Элементы.

  2. Полный путь поля проверяется через документированную XML/XDTO-сериализацию ПолеКомпоновкиДанных в памяти и такой же самостоятельно созданный эталон Склад. Не используется догадка о преобразовании произвольного дескриптора к строке. XML-писатель закрывается и при ошибке; никакие файлы не создаются.

  3. Схема.МакетыГруппировок и Схема.МакетыЗаголовковГруппировок — readonly ссылки на два каталога одного типа. Основной получает заголовок, отдельный — другую реально существующую область. На каждом шаге проверить настоящий тип описания, имя существующей группы, строковую ссылку на область, точное enum-значение и положение.

  4. Вставить основной подвал по индексу0, затем Сдвинуть(Подвал,1) возвращает порядок заголовок/подвал. Enum ТипМакетаОбластиКомпоновкиДанных.Заголовок/Подвал не заменяется строкой. Временное переключение заголовка на существующую альтернативную область проверяется полностью, затем ссылка возвращается.

  5. ПоляГруппировки у описания — readonly Массив, не коллекция настроек. В этом именованном опыте дополнительных полей выбора не задаём и явно проверяем0. Тип элементов и правила отбора этим массивом не выдумываются: пример относится к существующей группе по имени, а не к произвольной подборке полей.

  6. Независимые схема, набор, области, группировка и два каталога создаются заново. Удалить объект основной шапки, не индекс; старую шапку больше не использовать. Отдельный каталог и копия сохраняют прежние описания. Восстановить новую шапку через Вставить(0).

  7. Очистить только основной каталог, подтвердить0 при прежнем отдельном заголовке и неизменной копии. Восстановить новые основные описания. Отдельный заголовок удалить объектом и заново добавить, проверяя основной каталог неизменным.

  8. Семнадцать прямых проверок оригинальных каталогов сверяют полный состав, порядок, имена и enum, а общий контроль заново проверяет реальные поля, пути, включённую группу и всё содержимое областей. Финальное состояние обеих независимых моделей одинаково по этим полным эталонам. Отчёт не компилируется и не выводится.

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

  1. Будущий результат модели: ПоСкладу85 использует поле Склад и тип Элементы. Основной каталог содержит Склад/Заголовок и Количество/Подвал; отдельный каталог заголовков — КодТовара/Заголовок. Все три описания ссылаются на существующие области, дополнительный массив полей у каждого пуст; после восстановления копия и оригинал соответствуют полному эталону.

  2. Будущий отрицательный контроль: после заполнения первого Подвал присвоить Подвал.ТипМакета = ТипМакетаОбластиКомпоновкиДанных.Заголовок, не меняя массив ожидаемых типов. Проверка должна отказать при тех же размерах, имени группы и строках ссылок. Вернуть код, сохранить/F7 вне опыта и открыть новый собственный сеанс. Здесь контроль не выполнялся.

  3. runtimeVerifiedScenarios=0. Этот опыт проверяет собственную объектную модель и строки XML в памяти, не результат получения остатков или вид готового отчёта. Нет записей, сети, рабочих данных и печати.

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

Урок различает настоящие настройки группировки и массив полей у её макета, строки ссылок и enum, два каталога и независимую копию, с полным восстановлением.

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

  1. ПоляГруппировки у ГруппировкаКомпоновкиДанных — ПоляГруппировкиКомпоновкиДанных с Элементы. У МакетГруппировкиСхемыКомпоновкиДанных — Массив. Не переносите API между этими разными свойствами.

  2. ИмяГруппировки и Макет — writable Строка; ТипМакета — специальный enum. Самые похожие названия не означают одинаковые типы. Readonly каталоги и массивы не присваиваются новыми объектами.

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

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

  5. Сериализуется только ПолеКомпоновкиДанных, чей контракт разрешает XML/XDTO. Сериализатор не получает объекты метаданных, наборы записей или всю информационную базу. УстановитьСтроку не создаёт файл; Закрыть освобождает собственный писатель в обоих исходах.

  6. В областях буквальные учебные надписи, а не вычисленные агрегаты. Каталоги не доказывают успешное применение правил компоновщиком или дизайн отчёта: настоящее выполнение/вывод в этом уроке не заявлены.

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

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

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

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

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

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