Черновик параметров: вставка, поиск, XML и настоящий отчёт по границам суммы

Учебные задачи

Готовим несвязанные настройки собственного отчёта: нижняя и верхняя границы суммы, временный элемент и точный порядок. Проверяем плоскую структуру параметров, восстанавливаем весь черновик из XML-строки, очищаем только независимую копию и загружаем настоящие границы в связанный редактор. Три компоновки должны дать750→800→750.

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

Полный серверный общий модуль собственного нового стенда УчебныеЧерновикиПараметров85; отдельный модуль запуска ниже.

Подготовка

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

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

  3. Конфигуратор → Обработки → УчебныеЧерновикиПараметров85 → Формы → Пульт: управляемая форма; команда Выполнить, ее действие Выполнить, кнопка с этой командой. Отдельный полный модуль формы приведен ниже; реквизиты не нужны.

  4. Сохранить собственную конфигурацию и обновить свою базу данных (F7), открыть обработку в новом своем сеансе. Это будущие ручные действия: здесь F7 и1С не запускались.

  5. Схема создается полностью в памяти. Local-запрос использует только Книга3×250=750 и Ручка1×50=50; никаких обращений к справочникам, документам или регистрам.

  6. Поставить точки останова перед XML-сохранением и перед Инициализировать редактора: увидеть границу между свободным составом черновика и составом, управляемым доступными параметрами схемы.

  7. XML хранится только строкой памяти и представляет весь НастройкиКомпоновкиДанных. Коллекция Элементы отдельно не сериализуется. Не нужны файлы, архивы, резервные копии, сеть или печать.

  8. 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.ВыполнитьПример();
КонецФункции

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

  1. Новый НастройкиКомпоновкиДанных пока не связан с источником: ДоступныеПараметры=Неопределено. Добавить нижнюю границу100 через Добавить(), верхнюю1000 вставить на позицию0 через Вставить(0). Для каждого реального значения задать Параметр, число, Использование и режим Обычный.

  2. Вставить собственный временный элемент на позицию1. Проверить реальные индексы0/1/2 и объект на позиции0; найти временный параметр методом Найти по имени его параметра, затем Удалить именно найденный объект. Останутся верхняя и нижняя границы, а индекс нижней станет1.

  3. Перед импортом проверить оба значения по точному типу и имени, числам, флагу и режиму. Родитель верхнеуровневого значения должен быть Неопределено; ЗначенияВложенныхПараметров должны быть пусты: этот конкретный импорт намеренно принимает только плоские границы. Свойства readonly не присваиваются.

  4. Сохранить и восстановить весь черновик через XDTO в XML-строку. Проверить значения, два параметра, четыре выбранных поля, одну группу деталей и полный XML. Все параметры включены: сериализация не должна отбросить выключенное значение, равное умолчанию.

  5. Создать вторую независимую копию из того же полного XML и вызвать Очистить только у ее несвязанной коллекции. Проверить пустой состав и отсутствие МинСумма85; полный исходный и восстановленный черновики должны остаться неизменными.

  6. В своей схеме описать реальные числовые МинСумма85 и МаксСумма85, использованные в тексте запроса Сумма>минимум И Сумма<=максимум. Инициализировать редактор настоящим источником и загрузить восстановленный черновик. ДоступныеПараметры теперь должны существовать.

  7. При минимуме100 получить настоящую ТаблицуЗначений из процессора: только Книга3/250/750. После связи не добавлять и не удалять элементы вручную; УстановитьЗначениеПараметра("МинСумма85",0) должен включить обе записи, количество4 и сумму800.

  8. Вернуть минимум100 и заново проверить Книгу750. Каждая таблица формируется с нуля, а приемник заранее не заполняется. Сравнить весь XML исходной схемы и обоих независимых черновиков: рабочие изменения не должны их переписать.

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

  1. Будущий успешный запуск: два реальных параметра после удаления временного; независимая копия очищена; три заново сформированных результата750→800→750.

  2. В каждой реальной таблице проверяются имена и количество колонок, наличие/отсутствие Ручки, все количества, цены и суммы. Числа не подставляются проверяющим кодом в приемник.

  3. Отдельный отрицательный опыт в своем коде: заменить верхнюю границу1000 на700 при прежних ожидаемых результатах. Книга750 не должна пройти запрос, и проверка должна отказать. Наличие параметров и правильный XML сами по себе недостаточны.

  4. Отдельный отрицательный опыт до связи: выключить Использование нижней границы или изменить режим на Авто. ПроверитьСвойПлоскийЧерновик должен отказать до загрузки; это строгое правило собственного импорта, не запрет таких значений платформой.

  5. runtimeVerifiedScenarios=0. Все суммы и ошибки выше — условия приемки будущего запуска, а не выполненный здесь тест1С.

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

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

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

  1. Добавить, Вставить, Удалить, Очистить и изменение Параметр допустимы только у коллекции, не связанной с доступными параметрами. После Инициализировать/ЗагрузитьНастройки этот урок изменяет только значения существующих параметров.

  2. Коллекция общая для значений параметров макета и настроек: возвращаемый тип определяется владельцем. Здесь владелец — ПараметрыДанных собственных НастройкиКомпоновкиДанных; проверяется именно ЗначениеПараметраНастроекКомпоновкиДанных.

  3. Родитель и ЗначенияВложенныхПараметров читаются у обычных основных значений, не у пользовательских настроек. В пользовательской коллекции эти свойства недоступны; сюда нельзя переносить такие обращения.

  4. Пустая вложенная коллекция и Родитель=Неопределено — проверка плоского формата этого собственного импорта. Не утверждается, что платформа запрещает вложенные параметры или что все параметры всегда плоские.

  5. РежимОтображения устанавливается и проверяется как параметр модели. Настоящий визуальный редактор параметров не открывался, поэтому внешний вид режима Обычный здесь не проверен.

  6. Найти принимает строковый идентификатор параметра, а НайтиЗначениеПараметра — ПараметрКомпоновкиДанных. Не путать их с ИдентификаторПользовательскойНастройки или ИдентификаторКомпоновкиДанных.

  7. Повторный XML-текст сравнивается для собственных маленьких объектов, одного состояния и одной версии платформы. Это не криптографическая канонизация XML и не безопасный импорт чужого недоверенного документа.

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

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

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

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

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