Готовим несвязанные настройки собственного отчёта: нижняя и верхняя границы суммы, временный элемент и точный порядок. Проверяем плоскую структуру параметров, восстанавливаем весь черновик из XML-строки, очищаем только независимую копию и загружаем настоящие границы в связанный редактор. Три компоновки должны дать750→800→750.
Где и как запускать
Полный серверный общий модуль собственного нового стенда УчебныеЧерновикиПараметров85; отдельный модуль запуска ниже.
Подготовка
Создать НОВУЮ отдельную пустую учебную базу ровно8.5.1.1343: конфигурация УчебныеЧерновикиПараметров85, совместимость Не использовать. Не рабочую базу и не ее копию; без бизнес-объектов, заданий, подписок и расширений.
Конфигуратор → Общие → Общие модули → УчебныеЧерновикиПараметров85: Сервер=Да, Вызов сервера=Да, Клиент=Нет, Глобальный=Нет, Привилегированный=Нет. Вставить полный основной код урока, включая все вспомогательные функции.
Конфигуратор → Обработки → УчебныеЧерновикиПараметров85 → Формы → Пульт: управляемая форма; команда Выполнить, ее действие Выполнить, кнопка с этой командой. Отдельный полный модуль формы приведен ниже; реквизиты не нужны.
Сохранить собственную конфигурацию и обновить свою базу данных (F7), открыть обработку в новом своем сеансе. Это будущие ручные действия: здесь F7 и1С не запускались.
Схема создается полностью в памяти. Local-запрос использует только Книга3×250=750 и Ручка1×50=50; никаких обращений к справочникам, документам или регистрам.
Поставить точки останова перед XML-сохранением и перед Инициализировать редактора: увидеть границу между свободным составом черновика и составом, управляемым доступными параметрами схемы.
XML хранится только строкой памяти и представляет весь НастройкиКомпоновкиДанных. Коллекция Элементы отдельно не сериализуется. Не нужны файлы, архивы, резервные копии, сеть или печать.
runtimeVerifiedScenarios=0. Код сверялся статически с установленной справкой; фактическое выполнение, пользовательский интерфейс и результаты1С здесь не подтверждены.
Функция ВыполнитьПример() Экспорт
ПроверитьСвойПустойСтенд();
Черновик = Новый НастройкиКомпоновкиДанных;
ЗаполнитьСвоиНачальныеНастройки(Черновик);
Если Черновик.ПараметрыДанных.ДоступныеПараметры <> Неопределено Тогда
ВызватьИсключение "Черновик должен быть своим новым и еще не связанным с источником";
КонецЕсли;
Элементы = Черновик.ПараметрыДанных.Элементы;
Если Элементы.Количество() <> 0 Тогда
ВызватьИсключение "Заполняется только свой пустой черновик параметров";
КонецЕсли;
Нижняя = Элементы.Добавить();
ЗаполнитьСвоюГраницу(Нижняя, "МинСумма85", 100);
Верхняя = Элементы.Вставить(0);
ЗаполнитьСвоюГраницу(Верхняя, "МаксСумма85", 1000);
Временная = Элементы.Вставить(1);
ЗаполнитьСвоюГраницу(Временная, "Временная85", 999);
Если Элементы.Количество() <> 3 Или Элементы.Индекс(Верхняя) <> 0
Или Элементы.Индекс(Временная) <> 1 Или Элементы.Индекс(Нижняя) <> 2
Или Элементы.Получить(0) <> Верхняя Тогда
ВызватьИсключение "Вставка меняет настоящий порядок собственного черновика";
КонецЕсли;
Найденная = Элементы.Найти("Временная85");
Если Найденная <> Временная Тогда
ВызватьИсключение "Поиск должен вернуть свою временную границу, не похожую копию";
КонецЕсли;
Элементы.Удалить(Найденная);
Если Элементы.Найти("Временная85") <> Неопределено Или Элементы.Количество() <> 2
Или Элементы.Индекс(Нижняя) <> 1 Тогда
ВызватьИсключение "Удаляется только найденный временный элемент; обе реальные границы остаются";
КонецЕсли;
ПроверитьСвойПлоскийЧерновик(Черновик, 100, 1000);
ТекстЧерновика = СвойОбъектРасшифровкиВСтроку(Черновик);
Восстановленные = СвойОбъектРасшифровкиИзСтроки(ТекстЧерновика, Тип("НастройкиКомпоновкиДанных"));
ПроверитьСвойПлоскийЧерновик(Восстановленные, 100, 1000);
Если СвойОбъектРасшифровкиВСтроку(Восстановленные) <> ТекстЧерновика Тогда
ВызватьИсключение "Весь свой черновик, включая выбор, структуру и значения, должен восстановиться";
КонецЕсли;
КопияДляОчистки = СвойОбъектРасшифровкиИзСтроки(ТекстЧерновика, Тип("НастройкиКомпоновкиДанных"));
Если КопияДляОчистки.ПараметрыДанных.ДоступныеПараметры <> Неопределено Тогда
ВызватьИсключение "Очистка разрешена только отдельному несвязанному черновику";
КонецЕсли;
КопияДляОчистки.ПараметрыДанных.Элементы.Очистить();
Если КопияДляОчистки.ПараметрыДанных.Элементы.Количество() <> 0
Или КопияДляОчистки.ПараметрыДанных.Элементы.Найти("МинСумма85") <> Неопределено
Или СвойОбъектРасшифровкиВСтроку(Черновик) <> ТекстЧерновика
Или СвойОбъектРасшифровкиВСтроку(Восстановленные) <> ТекстЧерновика Тогда
ВызватьИсключение "Очистка собственной независимой копии не должна менять исходный или восстановленный черновик";
КонецЕсли;
Схема = Новый СхемаКомпоновкиДанных;
ЗаполнитьСвоиДанные(Схема);
ЗаполнитьСвоиНачальныеНастройки(Схема.НастройкиПоУмолчанию);
Для Каждого ИмяГраницы Из СтрРазделить("МинСумма85,МаксСумма85", ",") Цикл
ПараметрСхемы = Схема.Параметры.Добавить();
ПараметрСхемы.Имя = ИмяГраницы;
ПараметрСхемы.Заголовок = "Граница суммы " + ИмяГраницы;
ПараметрСхемы.ТипЗначения = Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(10, 2, ДопустимыйЗнак.Неотрицательный));
ПараметрСхемы.Значение = ?(ИмяГраницы = "МинСумма85", 0, 1000);
ПараметрСхемы.Использование = ИспользованиеПараметраКомпоновкиДанных.Всегда;
КонецЦикла;
ТекстСхемы = СвойОбъектРасшифровкиВСтроку(Схема);
Редактор = Новый КомпоновщикНастроекКомпоновкиДанных;
Редактор.Инициализировать(Новый ИсточникДоступныхНастроекКомпоновкиДанных(Схема));
Редактор.ЗагрузитьНастройки(Восстановленные);
Если Редактор.Настройки.ПараметрыДанных.ДоступныеПараметры = Неопределено Тогда
ВызватьИсключение "После загрузки границы должны быть связаны с настоящими параметрами своей схемы";
КонецЕсли;
ПроверитьСвоиРабочиеГраницы(Редактор.Настройки, 100, 1000);
ПроверитьСвоиСтроки(Схема, Редактор.ПолучитьНастройки(), Истина, Ложь, "");
Редактор.Настройки.ПараметрыДанных.УстановитьЗначениеПараметра("МинСумма85", 0);
ПроверитьСвоиРабочиеГраницы(Редактор.Настройки, 0, 1000);
ПроверитьСвоиСтроки(Схема, Редактор.ПолучитьНастройки(), Ложь, Ложь, "");
Редактор.Настройки.ПараметрыДанных.УстановитьЗначениеПараметра("МинСумма85", 100);
ПроверитьСвоиРабочиеГраницы(Редактор.Настройки, 100, 1000);
ПроверитьСвоиСтроки(Схема, Редактор.ПолучитьНастройки(), Истина, Ложь, "");
Если СвойОбъектРасшифровкиВСтроку(Схема) <> ТекстСхемы
Или СвойОбъектРасшифровкиВСтроку(Черновик) <> ТекстЧерновика
Или СвойОбъектРасшифровкиВСтроку(Восстановленные) <> ТекстЧерновика Тогда
ВызватьИсключение "Изменение рабочих границ не должно переписать схему или два независимых черновика";
КонецЕсли;
Возврат "Черновик восстановлен; суммы при минимуме100→0→100:750→800→750. Очистилась только отдельная копия";
КонецФункции
Процедура ПроверитьСвойПустойСтенд()
Если Метаданные.Справочники.Количество() <> 0 Или Метаданные.Документы.Количество() <> 0 Или Метаданные.Перечисления.Количество() <> 0 Или Метаданные.РегистрыСведений.Количество() <> 0 Или Метаданные.РегистрыНакопления.Количество() <> 0 Или Метаданные.РегистрыБухгалтерии.Количество() <> 0 Или Метаданные.РегистрыРасчета.Количество() <> 0 Или Метаданные.ПланыВидовХарактеристик.Количество() <> 0 Или Метаданные.ПланыВидовРасчета.Количество() <> 0 Или Метаданные.ПланыСчетов.Количество() <> 0 Или Метаданные.ПланыОбмена.Количество() <> 0 Или Метаданные.Последовательности.Количество() <> 0 Или Метаданные.БизнесПроцессы.Количество() <> 0 Или Метаданные.Задачи.Количество() <> 0 Или Метаданные.ОбщиеРеквизиты.Количество() <> 0 Или Метаданные.ПодпискиНаСобытия.Количество() <> 0 Или Метаданные.РегламентныеЗадания.Количество() <> 0 Или Метаданные.ВнешниеИсточникиДанных.Количество() <> 0 Тогда
ВызватьИсключение "Нужен только свой новый пустой учебный стенд";
КонецЕсли;
Если Метаданные.ЕстьИзмененияРасширениямиКонфигурации() Тогда
ВызватьИсключение "Свой сеанс не должен изменяться расширениями";
КонецЕсли;
Источники = Новый Массив;
Источники.Добавить(ИсточникРасширенийКонфигурации.БазаДанных);
Источники.Добавить(ИсточникРасширенийКонфигурации.СеансАктивные);
Источники.Добавить(ИсточникРасширенийКонфигурации.СеансОтключенные);
Для Каждого Источник Из Источники Цикл
Расширения = РасширенияКонфигурации.Получить(, Источник);
Если ТипЗнч(Расширения) <> Тип("Массив") Тогда
ВызватьИсключение "Native список расширений должен иметь тип Массив";
КонецЕсли;
Если Расширения.Количество() <> 0 Тогда
ВызватьИсключение "В своём новом стенде нет расширений базы или сеанса";
КонецЕсли;
КонецЦикла;
Если ТранзакцияАктивна() Тогда
ВызватьИсключение "Чужая или вложенная активная транзакция не допускается";
КонецЕсли;
КонецПроцедуры
Процедура ЗаполнитьСвоиДанные(Схема)
Источник = Схема.ИсточникиДанных.Добавить();
Источник.Имя = "УчебныйИсточник";
Источник.ТипИсточникаДанных = "Local";
Набор = Схема.НаборыДанных.Добавить(Тип("НаборДанныхЗапросСхемыКомпоновкиДанных"));
Набор.Имя = "УчебныеТовары";
Набор.ИсточникДанных = Источник.Имя;
Набор.АвтоЗаполнениеДоступныхПолей = Истина;
Набор.Запрос = "ВЫБРАТЬ Товары.Наименование, Товары.Количество, Товары.Цена, Товары.Сумма
|ИЗ
| (ВЫБРАТЬ ""Книга"" КАК Наименование, 3 КАК Количество, 250 КАК Цена, 750 КАК Сумма
| ОБЪЕДИНИТЬ ВСЕ
| ВЫБРАТЬ ""Ручка"", 1, 50, 50) КАК Товары
|ГДЕ Товары.Сумма > &МинСумма85 И Товары.Сумма <= &МаксСумма85";
КонецПроцедуры
Процедура ЗаполнитьСвоиНачальныеНастройки(Настройки)
Для Каждого ИмяПоля Из СтрРазделить("Наименование,Количество,Цена,Сумма", ",") Цикл
Выбранное = Настройки.Выбор.Элементы.Добавить(Тип("ВыбранноеПолеКомпоновкиДанных"));
Выбранное.Поле = Новый ПолеКомпоновкиДанных(ИмяПоля);
Выбранное.Использование = Истина;
КонецЦикла;
Детали = Настройки.Структура.Добавить(Тип("ГруппировкаКомпоновкиДанных"));
Детали.Использование = Истина;
АвтоВыбор = Детали.Выбор.Элементы.Добавить(Тип("АвтоВыбранноеПолеКомпоновкиДанных"));
АвтоВыбор.Использование = Истина;
КонецПроцедуры
Процедура ЗаполнитьСвоюГраницу(Элемент, Имя, Значение)
Если ТипЗнч(Элемент) <> Тип("ЗначениеПараметраНастроекКомпоновкиДанных") Тогда
ВызватьИсключение "В собственных параметрах данных нужен именно элемент настроек, не параметр макета";
КонецЕсли;
Элемент.Параметр = Новый ПараметрКомпоновкиДанных(Имя);
Элемент.Значение = Значение;
Элемент.Использование = Истина;
Элемент.РежимОтображения = РежимОтображенияЭлементаНастройкиКомпоновкиДанных.Обычный;
КонецПроцедуры
Процедура ПроверитьСвойПлоскийЧерновик(Настройки, Минимум, Максимум)
Если ТипЗнч(Настройки) <> Тип("НастройкиКомпоновкиДанных")
Или Настройки.ПараметрыДанных.ДоступныеПараметры <> Неопределено
Или Настройки.ПараметрыДанных.Элементы.Количество() <> 2
Или Настройки.Выбор.Элементы.Количество() <> 4 Или Настройки.Структура.Количество() <> 1 Тогда
ВызватьИсключение "Нужен свой несвязанный черновик: две границы, четыре поля, одна группа деталей";
КонецЕсли;
Для Каждого Имя Из СтрРазделить("МинСумма85,МаксСумма85", ",") Цикл
Элемент = Настройки.ПараметрыДанных.Элементы.Найти(Имя);
Если Элемент = Неопределено Тогда
ВызватьИсключение "В черновике отсутствует собственная граница " + Имя;
КонецЕсли;
Если ТипЗнч(Элемент) <> Тип("ЗначениеПараметраНастроекКомпоновкиДанных")
Или Элемент.Параметр <> Новый ПараметрКомпоновкиДанных(Имя)
Или ТипЗнч(Элемент.Значение) <> Тип("Число")
Или Элемент.Значение <> ?(Имя = "МинСумма85", Минимум, Максимум)
Или Не Элемент.Использование
Или Элемент.РежимОтображения <> РежимОтображенияЭлементаНастройкиКомпоновкиДанных.Обычный
Или Элемент.Родитель <> Неопределено
Или Элемент.ЗначенияВложенныхПараметров.Количество() <> 0 Тогда
ВызватьИсключение "Свой импорт принимает только используемые плоские числовые границы с режимом Обычный";
КонецЕсли;
КонецЦикла;
Если Минимум < 0 Или Минимум >= Максимум Тогда
ВызватьИсключение "Интервал суммы должен быть неотрицательным и непустым";
КонецЕсли;
КонецПроцедуры
Процедура ПроверитьСвоиРабочиеГраницы(Настройки, Минимум, Максимум)
Для Каждого Имя Из СтрРазделить("МинСумма85,МаксСумма85", ",") Цикл
Элемент = Настройки.ПараметрыДанных.НайтиЗначениеПараметра(Новый ПараметрКомпоновкиДанных(Имя));
Если Элемент = Неопределено Тогда
ВызватьИсключение "В связанной модели отсутствует реальный параметр " + Имя;
КонецЕсли;
Если Не Элемент.Использование Или ТипЗнч(Элемент.Значение) <> Тип("Число")
Или Элемент.Значение <> ?(Имя = "МинСумма85", Минимум, Максимум) Тогда
ВызватьИсключение "Не совпала реальная используемая рабочая граница";
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Функция СвойОбъектРасшифровкиВСтроку(Объект)
Запись = Новый ЗаписьXML;
Запись.УстановитьСтроку();
СериализаторXDTO.ЗаписатьXML(Запись, Объект);
Возврат Запись.Закрыть();
КонецФункции
Функция СвойОбъектРасшифровкиИзСтроки(СтрокаXML, ТребуемыйТип)
Чтение = Новый ЧтениеXML;
Чтение.УстановитьСтроку(СтрокаXML);
Попытка
Объект = СериализаторXDTO.ПрочитатьXML(Чтение, ТребуемыйТип);
Исключение
Чтение.Закрыть();
ВызватьИсключение;
КонецПопытки;
Чтение.Закрыть();
Если ТипЗнч(Объект) <> ТребуемыйТип Тогда
ВызватьИсключение "Нужен полный собственный типизированный объект, не кусок ссылок";
КонецЕсли;
Возврат Объект;
КонецФункции
Процедура ПроверитьСвоиСтроки(Схема, Настройки, ТолькоКнига, БезЦены, ПервыйТовар)
Компоновщик = Новый КомпоновщикМакетаКомпоновкиДанных;
Макет = Компоновщик.Выполнить(Схема, Настройки, , , Тип("ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений"));
Процессор = Новый ПроцессорКомпоновкиДанных;
Процессор.Инициализировать(Макет);
Вывод = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений;
Приемник = Новый ТаблицаЗначений;
Вывод.ОтображатьПроцентВывода = Ложь;
Вывод.УстановитьОбъект(Приемник);
Результат = Вывод.Вывести(Процессор, Ложь);
Если ТипЗнч(Результат) <> Тип("ТаблицаЗначений") Тогда
ВызватьИсключение "Нужны настоящие строки собственного вывода, не заранее заполненный приемник";
КонецЕсли;
Если Результат.Количество() <> ?(ТолькоКнига, 1, 2) Или Результат.Колонки.Количество() <> ?(БезЦены, 3, 4) Тогда
ВызватьИсключение "Не совпали фактические строки или пользовательский состав колонок";
КонецЕсли;
Для Каждого ИмяПоля Из СтрРазделить("Наименование,Количество,Сумма", ",") Цикл
Если Результат.Колонки.Найти(ИмяПоля) = Неопределено Тогда
ВызватьИсключение "Не найдена реальная колонка " + ИмяПоля;
КонецЕсли;
КонецЦикла;
Если БезЦены Тогда
Если Результат.Колонки.Найти("Цена") <> Неопределено Тогда
ВызватьИсключение "Пользователь выключил Цена: эта колонка не должна выводиться";
КонецЕсли;
ИначеЕсли Результат.Колонки.Найти("Цена") = Неопределено Тогда
ВызватьИсключение "В первоначальном отчете нужна настоящая колонка Цена";
КонецЕсли;
Книга = Результат.Найти("Книга", "Наименование");
Ручка = Результат.Найти("Ручка", "Наименование");
Если Книга = Неопределено Тогда
ВызватьИсключение "В собственном результате должна сохраниться Книга";
КонецЕсли;
Если Книга.Количество <> 3 Или Книга.Сумма <> 750 Тогда
ВызватьИсключение "Неверные настоящие числа Книги";
КонецЕсли;
Если ТолькоКнига Тогда
Если Ручка <> Неопределено Тогда
ВызватьИсключение "Ручка не должна пройти отбор Сумма больше100";
КонецЕсли;
Иначе
Если Ручка = Неопределено Тогда
ВызватьИсключение "Пользовательские настройки должны сохранить Ручку";
КонецЕсли;
Если Ручка.Количество <> 1 Или Ручка.Сумма <> 50 Тогда
ВызватьИсключение "Неверные настоящие числа Ручки";
КонецЕсли;
КонецЕсли;
Если Не БезЦены Тогда
Если Книга.Цена <> 250 Тогда
ВызватьИсключение "Неверная настоящая цена Книги";
КонецЕсли;
Если Не ТолькоКнига И Ручка.Цена <> 50 Тогда
ВызватьИсключение "Неверная настоящая цена Ручки";
КонецЕсли;
КонецЕсли;
Если Результат.Итог("Количество") <> ?(ТолькоКнига, 3, 4) Или Результат.Итог("Сумма") <> ?(ТолькоКнига, 750, 800) Тогда
ВызватьИсключение "Итоги должны рассчитываться из фактических отфильтрованных строк";
КонецЕсли;
Если ПервыйТовар <> "" И Результат[0].Наименование <> ПервыйТовар Тогда
ВызватьИсключение "Пользовательская сортировка должна изменить фактическую первую строку";
КонецЕсли;
КонецПроцедурыУчебныеЧерновикиПараметров85.Пульт
УчебныеЧерновикиПараметров85 → Обработки → УчебныеЧерновикиПараметров85 → Формы → Пульт → Модуль
Полный модуль собственной управляемой формы; здесь не выполнялся.
&НаКлиенте
Процедура Выполнить(Команда)
Сообщить(ВыполнитьНаСервере());
КонецПроцедуры
&НаСервереБезКонтекста
Функция ВыполнитьНаСервере()
Возврат УчебныеЧерновикиПараметров85.ВыполнитьПример();
КонецФункцииРазбор по шагам
Новый НастройкиКомпоновкиДанных пока не связан с источником: ДоступныеПараметры=Неопределено. Добавить нижнюю границу100 через Добавить(), верхнюю1000 вставить на позицию0 через Вставить(0). Для каждого реального значения задать Параметр, число, Использование и режим Обычный.
Вставить собственный временный элемент на позицию1. Проверить реальные индексы0/1/2 и объект на позиции0; найти временный параметр методом Найти по имени его параметра, затем Удалить именно найденный объект. Останутся верхняя и нижняя границы, а индекс нижней станет1.
Перед импортом проверить оба значения по точному типу и имени, числам, флагу и режиму. Родитель верхнеуровневого значения должен быть Неопределено; ЗначенияВложенныхПараметров должны быть пусты: этот конкретный импорт намеренно принимает только плоские границы. Свойства readonly не присваиваются.
Сохранить и восстановить весь черновик через XDTO в XML-строку. Проверить значения, два параметра, четыре выбранных поля, одну группу деталей и полный XML. Все параметры включены: сериализация не должна отбросить выключенное значение, равное умолчанию.
Создать вторую независимую копию из того же полного XML и вызвать Очистить только у ее несвязанной коллекции. Проверить пустой состав и отсутствие МинСумма85; полный исходный и восстановленный черновики должны остаться неизменными.
В своей схеме описать реальные числовые МинСумма85 и МаксСумма85, использованные в тексте запроса Сумма>минимум И Сумма<=максимум. Инициализировать редактор настоящим источником и загрузить восстановленный черновик. ДоступныеПараметры теперь должны существовать.
При минимуме100 получить настоящую ТаблицуЗначений из процессора: только Книга3/250/750. После связи не добавлять и не удалять элементы вручную; УстановитьЗначениеПараметра("МинСумма85",0) должен включить обе записи, количество4 и сумму800.
Вернуть минимум100 и заново проверить Книгу750. Каждая таблица формируется с нуля, а приемник заранее не заполняется. Сравнить весь XML исходной схемы и обоих независимых черновиков: рабочие изменения не должны их переписать.
Как проверить результат
Будущий успешный запуск: два реальных параметра после удаления временного; независимая копия очищена; три заново сформированных результата750→800→750.
В каждой реальной таблице проверяются имена и количество колонок, наличие/отсутствие Ручки, все количества, цены и суммы. Числа не подставляются проверяющим кодом в приемник.
Отдельный отрицательный опыт в своем коде: заменить верхнюю границу1000 на700 при прежних ожидаемых результатах. Книга750 не должна пройти запрос, и проверка должна отказать. Наличие параметров и правильный XML сами по себе недостаточны.
Отдельный отрицательный опыт до связи: выключить Использование нижней границы или изменить режим на Авто. ПроверитьСвойПлоскийЧерновик должен отказать до загрузки; это строгое правило собственного импорта, не запрет таких значений платформой.
runtimeVerifiedScenarios=0. Все суммы и ошибки выше — условия приемки будущего запуска, а не выполненный здесь тест1С.
Ожидаемый результат
Подготовлен полный урок с собственным черновиком, независимым XML-восстановлением и проверкой реальных строк параметризованного отчёта. В1С не запускался.
На что обратить внимание
Добавить, Вставить, Удалить, Очистить и изменение Параметр допустимы только у коллекции, не связанной с доступными параметрами. После Инициализировать/ЗагрузитьНастройки этот урок изменяет только значения существующих параметров.
Коллекция общая для значений параметров макета и настроек: возвращаемый тип определяется владельцем. Здесь владелец — ПараметрыДанных собственных НастройкиКомпоновкиДанных; проверяется именно ЗначениеПараметраНастроекКомпоновкиДанных.
Родитель и ЗначенияВложенныхПараметров читаются у обычных основных значений, не у пользовательских настроек. В пользовательской коллекции эти свойства недоступны; сюда нельзя переносить такие обращения.
Пустая вложенная коллекция и Родитель=Неопределено — проверка плоского формата этого собственного импорта. Не утверждается, что платформа запрещает вложенные параметры или что все параметры всегда плоские.
РежимОтображения устанавливается и проверяется как параметр модели. Настоящий визуальный редактор параметров не открывался, поэтому внешний вид режима Обычный здесь не проверен.
Найти принимает строковый идентификатор параметра, а НайтиЗначениеПараметра — ПараметрКомпоновкиДанных. Не путать их с ИдентификаторПользовательскойНастройки или ИдентификаторКомпоновкиДанных.
Повторный XML-текст сравнивается для собственных маленьких объектов, одного состояния и одной версии платформы. Это не криптографическая канонизация XML и не безопасный импорт чужого недоверенного документа.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.