Тип: ПараметрыОбластиКомпоновкиДанных. Содержит описание параметров макета.
Полное описание, параметры и ограничения
ОписаниеМакетаСхемыКомпоновкиДанных.Параметры (DataCompositionSchemaTemplateDescription.Parameters)
ОписаниеМакетаСхемыКомпоновкиДанных (DataCompositionSchemaTemplateDescription)
Параметры (Parameters)
Доступен, начиная с версии 8.1.
Использование:
Только чтение.
Описание:
Тип: ПараметрыОбластиКомпоновкиДанных.
Содержит описание параметров макета.
Доступность:
Сервер, толстый клиент, внешнее соединение.
Использование в версии:
Доступен, начиная с версии 8.1.
Методическая информация
Практические примеры
Макет поля СКД: реальное поле, существующая именованная область и восстановление ссылок
Создаём собственный набор с тремя явно описанными полями и четыре реальные постоянные области. Привязываем поля к именам макетов, переставляем элементы, переключаем количество на альтернативную область, удаляем и восстанавливаем привязки. На каждом этапе проверяется вся основа, ссылки и полное содержимое областей, без выполнения отчёта.
Где и как запускать
Полный серверный общий модуль УчебныеЗадачи новой пустой конфигурации УчебныеМакетыПолей85; в1С не запускался.
Подготовка
Нужна НОВАЯ отдельная учебная база, не копия рабочей: точно8.5.1.1343, имя конфигурации УчебныеМакетыПолей85, совместимость Не использовать. Нет бизнес-объектов, расширений, подписок и фоновых заданий. Модули вручную пустые, кроме данного общего модуля; реальные записи не нужны.
Общий модуль УчебныеЗадачи: Сервер=Да, Вызов сервера=Да, Клиент=Нет, Глобальный=Нет, Привилегированный=Нет. Вставьте весь основной модуль. Своя внешняя обработка УчебныеМакетыПолей85 → управляемая Форма: команда/кнопка Выполнить с действием Выполнить; реквизиты не нужны. Полный отдельный модуль формы дан ниже.
Будущая ручная подготовка только вне опыта: завершить прежний собственный сеанс, сохранить конфигурацию, Конфигурация → Обновить конфигурацию базы данных (F7), затем свежий собственный клиент и своя обработка. Здесь F7, BSL, компоновщик, запросы, вывод и печать не запускались.
Источник СвоиДанные85 типа Local и набор УчебныеОстатки85 созданы только в своей схеме. Запрос буквально объявляет A01/3/Учебный; он не исполняется. АвтоЗаполнениеДоступныхПолей=Ложь: КодТовара Строка, Количество Число, Склад Строка объявлены вручную, с совпадающими Поле/ПутьКДанным.
Количество в буквальном запросе равно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 → управляемая Форма → Модуль
Полный отдельный модуль собственной формы с серверным вызовом; здесь не запускался.
&НаКлиенте
Процедура Выполнить(Команда)
ВыполнитьНаСервере();
Сообщить("Привязки к существующим полям и макетам, переключение ссылки и восстановление проверены");
КонецПроцедуры
&НаСервереБезКонтекста
Процедура ВыполнитьНаСервере()
УчебныеЗадачи.ВыполнитьПример();
КонецПроцедурыРазбор по шагам
Построить собственную основу: один источник, один набор, точный текст собственного запроса, три поля нужных полных типов и четыре именованных макета. В каждом макете проверить тип области, одну строку/ячейку/поле, постоянный полный текст и отсутствие параметров. Не предполагать автоматическое появление полей без их объявления.
Схема.МакетыПолей readonly, но её собственная коллекция изменяется методами. Добавить возвращает МакетПоляСхемыКомпоновкиДанных. Его writable Поле и Макет — строки: имя объявленного поля и имя существующего описания в Схема.Макеты, не объекты областей.
Добавить КодТовара и Количество. Для демонстрации Найти использовать их одинаковые имена поля и основного макета; Склад пока не имеет привязки. Справка говорит о поиске по имени, не уточняя свойство-ключ. Здесь не утверждается отдельная недокументированная семантика поиска после смены ссылки.
Вставить привязку склада по индексу1; проверить КодТовара/Склад/Количество. Сдвинуть принимает объект Склад и относительное+1, после чего порядок КодТовара/Количество/Склад. Каждый элемент проверен через Получить,[],Индекс, обе строковые ссылки и наличие настоящего макета.
Не меняя Поле="Количество", задать Макет="КоличествоВыделено85". Эта четвёртая область реально создана и содержит «Количество: 3 (выделено)». Проверить все ссылки и содержание, затем вернуть Макет="Количество". Текст запроса и три поля не меняются.
Независимую схему, источник, поля, области и привязки создать заново из собственных строк/типов. Удалить текущий объект Количество, не индекс1; после удаления его не использовать. Копия сохраняет исходные ссылки. Восстановить новым Вставить(1), затем очистить только привязки оригинала и подтвердить их0 при сохранённых полях/областях.
Одиннадцать контрольных состояний оригинала завершаются новым созданием трёх привязок. Обе независимые модели проверены по полному эталону полей, типов, пути, запроса, макетов, текстов и порядка ссылок. Изменение каталога не выдаётся за готовый скомпилированный отчёт.
Как проверить результат
Будущий результат модели: поля КодТовара/Количество/Склад с типами Строка/Число/Строка, четыре области сохранены. После восстановления три привязки ссылаются на одноимённые основные макеты в порядке0/1/2. Временное переключение количества затронуло только строковое имя макета, не поле или источник.
Будущий отрицательный контроль: сразу после Количество.Макет = "КоличествоВыделено85" заменить это имя на "НетТакогоУчебногоМакета85", сохранив ожидаемое имя альтернативной области. Проверка должна отказать по полному значению ссылки при том же размере3. Вернуть код, сохранить/F7 вне опыта и открыть новый свой сеанс. Здесь контроль не выполнялся.
runtimeVerifiedScenarios=0. Query/Local — только объявления в собственной модели; нет выполнения запроса, формирования отчёта, записи, сети, печати и обращения к рабочим конфигурациям.
Ожидаемый результат
Урок показывает различие между строковой ссылкой Макет у привязки и объектной областью Макет у описания, с реальными собственными полями и полным восстановлением.
На что обратить внимание
Макет у МакетПоляСхемыКомпоновкиДанных — Строка; у ОписаниеМакетаСхемыКомпоновкиДанных — МакетОбластиКомпоновкиДанных. Не присваивайте область строковой ссылке или неизвестное имя несуществующего макета.
ПутьКДанным определяет имя поля в выражениях/настройках. В этом простом собственном наборе он намеренно равен Поле, поэтому разночтений нет. Состав полей объявлен вручную и каждый раз проверяется, не берётся из неизвестной конфигурации.
Вставить — абсолютный индекс, Сдвинуть — объект и относительное смещение, Удалить — объект. Оператор[] этой коллекции документирован по индексу, не по имени. После удаления/очистки старые привязки не используются.
Для Найти в этом опыте основные имя поля и имя макета совпадают. Не заявляется проверенный в1С ключ поиска для разных имён: переключённая ссылка проверяется через текущую привязку, индекс и фактические свойства. Это ограничение явно отделено от полного контроля существования макета.
Оригинал и копия не разделяют изменяемые области, поля или привязки. Очистка МакетыПолей не очищает Макеты или НаборыДанных; их полный состав и тексты проверяются заново.
Здесь не компилируется макет отчёта и не доказывается внешний вид. Чтобы получать данные и выводить отчёт, нужен отдельный согласованный цикл настроек/компиляции/процессора; настоящий запуск не входит в этот опыт.
Число в ОписаниеТипов задаётся вместе со вторым аргументом КвалификаторыЧисла(1,0,Неотрицательный), а не одним именем типа. Полная проверка сначала сверяет единственный тип Число, затем тип квалификаторов, общую разрядность1, дробную0 и знак. Строковые КодТовара/Склад остаются строками без числовых квалификаторов. Не расширяйте данные за0–9 без согласованного изменения описания и его эталона; запрос и агрегат здесь не исполняются.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.
Макеты группировки СКД: именованная группа, enum типа области и два независимых каталога
На собственной схеме с объявленным полем Склад создаём реальную группировку ПоСкладу85 в обычных настройках. Привязываем существующие области к её заголовку/подвалу и отдельному каталогу заголовков, меняем ссылку, удаляем и восстанавливаем описания. Полностью контролируем источник, поля, группы, enum, области и независимую копию без выполнения отчёта.
Где и как запускать
Полный серверный общий модуль УчебныеЗадачи новой пустой конфигурации УчебныеМакетыГруппировок85; в1С не запускался.
Подготовка
Нужна НОВАЯ отдельная учебная база, не копия рабочей: точно8.5.1.1343, имя конфигурации УчебныеМакетыГруппировок85, совместимость Не использовать. Нет бизнес-объектов, расширений, подписок и фоновых заданий; модули вручную пустые, кроме данного общего модуля.
Общий модуль УчебныеЗадачи: Сервер=Да, Вызов сервера=Да, Клиент=Нет, Глобальный=Нет, Привилегированный=Нет. Вставьте весь основной модуль. Своя внешняя обработка УчебныеМакетыГруппировок85 → управляемая Форма: команда/кнопка Выполнить с действием Выполнить; реквизиты не нужны. Полный отдельный модуль формы дан ниже.
Будущая ручная подготовка только вне опыта: завершить прежний собственный сеанс, сохранить конфигурацию, Конфигурация → Обновить конфигурацию базы данных (F7), затем свежий собственный клиент и своя обработка. Здесь F7, BSL, отчёты, запросы и печать не запускались.
Собственная основа создаётся целиком: один Local-источник, один набор с буквальным запросом A01/3/Учебный, вручную объявленные поля КодТовара Строка/Количество Число/Склад Строка, четыре именованные области со своими постоянными текстами. Это объявления в модели, не полученные записи.
Обычные НастройкиПоУмолчанию содержат одну включённую группировку ПоСкладу85 по явно заданному Склад, тип группировки Элементы. Не использовать пользовательские настройки: у их элементов Имя и ПоляГруппировки недоступны.
Количество в буквальном запросе равно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 → управляемая Форма → Модуль
Полный отдельный модуль собственной формы с серверным вызовом; здесь не запускался.
&НаКлиенте
Процедура Выполнить(Команда)
ВыполнитьНаСервере();
Сообщить("Именованная группировка, два каталога макетов и независимое восстановление проверены");
КонецПроцедуры
&НаСервереБезКонтекста
Процедура ВыполнитьНаСервере()
УчебныеЗадачи.ВыполнитьПример();
КонецПроцедурыРазбор по шагам
Создать и проверить весь собственный источник, запрос, три полных описания полей и четыре реальные области. Добавить настоящую ГруппировкаКомпоновкиДанных в обычную Структура, дать имя ПоСкладу85 и включить использование. Добавить явное поле Склад, а не автоэлемент; задать тип Элементы.
Полный путь поля проверяется через документированную XML/XDTO-сериализацию ПолеКомпоновкиДанных в памяти и такой же самостоятельно созданный эталон Склад. Не используется догадка о преобразовании произвольного дескриптора к строке. XML-писатель закрывается и при ошибке; никакие файлы не создаются.
Схема.МакетыГруппировок и Схема.МакетыЗаголовковГруппировок — readonly ссылки на два каталога одного типа. Основной получает заголовок, отдельный — другую реально существующую область. На каждом шаге проверить настоящий тип описания, имя существующей группы, строковую ссылку на область, точное enum-значение и положение.
Вставить основной подвал по индексу0, затем Сдвинуть(Подвал,1) возвращает порядок заголовок/подвал. Enum ТипМакетаОбластиКомпоновкиДанных.Заголовок/Подвал не заменяется строкой. Временное переключение заголовка на существующую альтернативную область проверяется полностью, затем ссылка возвращается.
ПоляГруппировки у описания — readonly Массив, не коллекция настроек. В этом именованном опыте дополнительных полей выбора не задаём и явно проверяем0. Тип элементов и правила отбора этим массивом не выдумываются: пример относится к существующей группе по имени, а не к произвольной подборке полей.
Независимые схема, набор, области, группировка и два каталога создаются заново. Удалить объект основной шапки, не индекс; старую шапку больше не использовать. Отдельный каталог и копия сохраняют прежние описания. Восстановить новую шапку через Вставить(0).
Очистить только основной каталог, подтвердить0 при прежнем отдельном заголовке и неизменной копии. Восстановить новые основные описания. Отдельный заголовок удалить объектом и заново добавить, проверяя основной каталог неизменным.
Семнадцать прямых проверок оригинальных каталогов сверяют полный состав, порядок, имена и enum, а общий контроль заново проверяет реальные поля, пути, включённую группу и всё содержимое областей. Финальное состояние обеих независимых моделей одинаково по этим полным эталонам. Отчёт не компилируется и не выводится.
Как проверить результат
Будущий результат модели: ПоСкладу85 использует поле Склад и тип Элементы. Основной каталог содержит Склад/Заголовок и Количество/Подвал; отдельный каталог заголовков — КодТовара/Заголовок. Все три описания ссылаются на существующие области, дополнительный массив полей у каждого пуст; после восстановления копия и оригинал соответствуют полному эталону.
Будущий отрицательный контроль: после заполнения первого Подвал присвоить Подвал.ТипМакета = ТипМакетаОбластиКомпоновкиДанных.Заголовок, не меняя массив ожидаемых типов. Проверка должна отказать при тех же размерах, имени группы и строках ссылок. Вернуть код, сохранить/F7 вне опыта и открыть новый собственный сеанс. Здесь контроль не выполнялся.
runtimeVerifiedScenarios=0. Этот опыт проверяет собственную объектную модель и строки XML в памяти, не результат получения остатков или вид готового отчёта. Нет записей, сети, рабочих данных и печати.
Ожидаемый результат
Урок различает настоящие настройки группировки и массив полей у её макета, строки ссылок и enum, два каталога и независимую копию, с полным восстановлением.
На что обратить внимание
ПоляГруппировки у ГруппировкаКомпоновкиДанных — ПоляГруппировкиКомпоновкиДанных с Элементы. У МакетГруппировкиСхемыКомпоновкиДанных — Массив. Не переносите API между этими разными свойствами.
ИмяГруппировки и Макет — writable Строка; ТипМакета — специальный enum. Самые похожие названия не означают одинаковые типы. Readonly каталоги и массивы не присваиваются новыми объектами.
Вставить — абсолютный индекс, Сдвинуть — описание и относительное смещение, Удалить — описание. У данной коллекции нет Найти; индекс/объект не подменяются вызовом соседней коллекции.
Массив дополнительных полей оставлен пустым намеренно: его недокументированный здесь тип элементов и алгоритм выбора не выдаются за проверенный контракт. Наличие группы и её реального поля проверено независимо.
Сериализуется только ПолеКомпоновкиДанных, чей контракт разрешает XML/XDTO. Сериализатор не получает объекты метаданных, наборы записей или всю информационную базу. УстановитьСтроку не создаёт файл; Закрыть освобождает собственный писатель в обоих исходах.
В областях буквальные учебные надписи, а не вычисленные агрегаты. Каталоги не доказывают успешное применение правил компоновщиком или дизайн отчёта: настоящее выполнение/вывод в этом уроке не заявлены.
Число в ОписаниеТипов задаётся вместе со вторым аргументом КвалификаторыЧисла(1,0,Неотрицательный), а не одним именем типа. Полная проверка сначала сверяет единственный тип Число, затем тип квалификаторов, общую разрядность1, дробную0 и знак. Строковые КодТовара/Склад остаются строками без числовых квалификаторов. Не расширяйте данные за0–9 без согласованного изменения описания и его эталона; запрос и агрегат здесь не исполняются.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.