Тип: РежимОтображенияЭлементаНастройкиКомпоновкиДанных. Определяет режим отображения. Используется при отображении списка в зависимости от режима отображения табличного поля (см. соответствующие свойства у расширений табличного поля отбора и пользовательских настроек). Кроме того, если элемент принадлежит пользовательским выбранным полям, свойство используется при формировании начального состава пользовательских выбранных полей и при применении пользовательских выбранных полей к базовым.
Полное описание, параметры и ограничения
ВыбранноеПолеКомпоновкиДанных.РежимОтображения (DataCompositionSelectedField.ViewMode)
ВыбранноеПолеКомпоновкиДанных (DataCompositionSelectedField)
РежимОтображения (ViewMode)
Доступен, начиная с версии 8.2.
Использование:
Чтение и запись.
Описание:
Тип: РежимОтображенияЭлементаНастройкиКомпоновкиДанных.
Определяет режим отображения.
Используется при отображении списка в зависимости от режима отображения табличного поля (см. соответствующие свойства у расширений табличного поля отбора и пользовательских настроек).
Кроме того, если элемент принадлежит пользовательским выбранным полям, свойство используется при формировании начального состава пользовательских выбранных полей и при применении пользовательских выбранных полей к базовым.
Доступность:
Тонкий клиент, веб-клиент, сервер, толстый клиент, внешнее соединение.
Использование в версии:
Доступен, начиная с версии 8.2.
Методическая информация
Практические примеры
СКД: свой вложенный отбор, readonly-родитель и режим отображения без потери данных
Полная схема в памяти создаёт Книгу, Ручку и Карандаш. Базовая группа И выбирает карандаш, ИЛИ — все три позиции. Недоступный не отключает отбор/выбранные поля: это отделено от реального изменения Использование, а каждый результат проверен целиком.
Где и как запускать
Полный серверный общий модуль УчебныеЗадачи только нового собственного стенда УчебныйОтборСКД85. Схема/данные/отбор/результаты целиком в памяти; нет операций с рабочими записями. Запуск в 1С не проверялся.
Подготовка
Создайте НОВУЮ отдельную пустую учебную базу, не копию рабочей, на точно8.5.1.1343. Имя конфигурации УчебныйОтборСКД85; совместимость Не использовать. Нет прикладных метаданных, расширений базы/сеанса, общих реквизитов/подписок/заданий/внешних источников. Guard сверяет версию, точное имя, пустые коллекции и отсутствие активной транзакции. Макет отчёта или БСП не нужен: все строки заданы в собственном query из констант.
Общие → Общие модули → УчебныеЗадачи: Сервер=Истина, Глобальный=Ложь, ВызовСервера=Ложь, Привилегированный=Ложь; клиентские/внешнее соединение отключены; повторное использование выключено. Вставьте весь основной модуль, включая все helpers на уровне модуля. Все другие модули/формы приложения вручную пусты; metadata guard не умеет прочитать их BSL.
Создайте свою новую внешнюю обработку УчебныйБазовыйОтбор85, управляемую Форма с командой/кнопкой Выполнить и одноимённым действием. Реквизитов формы не нужно. Полный отдельный модуль формы дан ниже; серверный вызов БезКонтекста выполняет общий модуль, таблицы/СКД-объекты на клиент не возвращаются.
После ВСЕХ флагов/модулей/метаданных сохраните свою конфигурацию, завершите прежний свой сеанс: активной транзакции/опыта нет. В Конфигураторе выполните Конфигурация → Обновить конфигурацию базы данных (F7), подтвердите только свою новую конфигурацию и дождитесь успеха. Затем свежий собственный сеанс и кнопка Выполнить. Здесь Конфигуратор/1С/F7 не запускались.
Исходные полные данные: Книга/3/250/750, Ручка/1/50/50, Карандаш/2/30/60. Порядок без сортировки не обещается; сравнивается полное мультимножество всех строк и четырёх колонок с точными типами, значениями и повторами. Нет записей в базу, файлов, сети или транзакций.
Процедура ВыполнитьПример() Экспорт
ПроверитьСвойПустойСтенд();
Схема = Новый СхемаКомпоновкиДанных;
Источник = Схема.ИсточникиДанных.Добавить();
Источник.Имя = "УчебныйИсточник";
Источник.ТипИсточникаДанных = "Local";
Набор = Схема.НаборыДанных.Добавить(Тип("НаборДанныхЗапросСхемыКомпоновкиДанных"));
Набор.Имя = "УчебныеТовары";
Набор.ИсточникДанных = Источник.Имя;
Набор.АвтоЗаполнениеДоступныхПолей = Истина;
Набор.Запрос = "ВЫБРАТЬ ""Книга"" КАК Наименование, 3 КАК Количество, 250 КАК Цена, 750 КАК Сумма
|ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ ""Ручка"", 1, 50, 50
|ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ ""Карандаш"", 2, 30, 60";
Настройки = Схема.НастройкиПоУмолчанию;
Для Каждого ИмяПоля Из СтрРазделить("Наименование,Количество,Цена,Сумма", ",") Цикл
Выбранное = Настройки.Выбор.Элементы.Добавить(Тип("ВыбранноеПолеКомпоновкиДанных"));
Выбранное.Поле = Новый ПолеКомпоновкиДанных(ИмяПоля);
Выбранное.Использование = Истина;
КонецЦикла;
Детали = Настройки.Структура.Добавить(Тип("ГруппировкаКомпоновкиДанных"));
Детали.Использование = Истина;
АвтоВыбор = Детали.Выбор.Элементы.Добавить(Тип("АвтоВыбранноеПолеКомпоновкиДанных"));
АвтоВыбор.Использование = Истина;
Доступные = Новый ИсточникДоступныхНастроекКомпоновкиДанных(Схема);
Редактор = Новый КомпоновщикНастроекКомпоновкиДанных;
Редактор.Инициализировать(Доступные);
Редактор.ЗагрузитьНастройки(Настройки);
ВсеОжидания = Новый Массив;
ВсеОжидания.Добавить(Новый Структура("Наименование,Количество,Цена,Сумма", "Книга", 3, 250, 750));
ВсеОжидания.Добавить(Новый Структура("Наименование,Количество,Цена,Сумма", "Ручка", 1, 50, 50));
ВсеОжидания.Добавить(Новый Структура("Наименование,Количество,Цена,Сумма", "Карандаш", 2, 30, 60));
Исходный = ПолучитьСвойПолныйРезультат(Схема, Редактор.ПолучитьНастройки());
ПроверитьСвойПолныйСостав(Исходный, ВсеОжидания);
Базовые = Редактор.Настройки;
Верхний = Базовые.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
Верхний.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Количество");
Верхний.ВидСравнения = ВидСравненияКомпоновкиДанных.Больше;
Верхний.ПравоеЗначение = 0;
Верхний.Использование = Истина;
Верхний.Применение = ТипПримененияОтбораКомпоновкиДанных.Элементы;
Группа = Базовые.Отбор.Элементы.Добавить(Тип("ГруппаЭлементовОтбораКомпоновкиДанных"));
Группа.ТипГруппы = ТипГруппыЭлементовОтбораКомпоновкиДанных.ГруппаИ;
Группа.Использование = Истина;
Группа.Применение = ТипПримененияОтбораКомпоновкиДанных.Элементы;
Количество = Группа.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
Количество.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Количество");
Количество.ВидСравнения = ВидСравненияКомпоновкиДанных.Больше;
Количество.ПравоеЗначение = 1;
Количество.Использование = Истина;
Количество.Применение = ТипПримененияОтбораКомпоновкиДанных.Элементы;
Цена = Группа.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
Цена.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Цена");
Цена.ВидСравнения = ВидСравненияКомпоновкиДанных.Меньше;
Цена.ПравоеЗначение = 100;
Цена.Использование = Истина;
Цена.Применение = ТипПримененияОтбораКомпоновкиДанных.Элементы;
Для Каждого Условие Из СвоиТриУсловия(Верхний, Количество, Цена) Цикл
Условие.РежимОтображения = РежимОтображенияЭлементаНастройкиКомпоновкиДанных.Обычный;
КонецЦикла;
Для Каждого Выбранное Из Базовые.Выбор.Элементы Цикл
Выбранное.РежимОтображения = РежимОтображенияЭлементаНастройкиКомпоновкиДанных.Обычный;
КонецЦикла;
ПроверитьСвоёДерево(Базовые, Верхний, Группа, Количество, Цена, Истина, Истина, РежимОтображенияЭлементаНастройкиКомпоновкиДанных.Обычный);
КарандашОжидания = Новый Массив;
КарандашОжидания.Добавить(Новый Структура("Наименование,Количество,Цена,Сумма", "Карандаш", 2, 30, 60));
РезультатИ = ПолучитьСвойПолныйРезультат(Схема, Редактор.ПолучитьНастройки());
ПроверитьСвойПолныйСостав(РезультатИ, КарандашОжидания);
Группа.ТипГруппы = ТипГруппыЭлементовОтбораКомпоновкиДанных.ГруппаИли;
ПроверитьСвоёДерево(Базовые, Верхний, Группа, Количество, Цена, Ложь, Истина, РежимОтображенияЭлементаНастройкиКомпоновкиДанных.Обычный);
РезультатИли = ПолучитьСвойПолныйРезультат(Схема, Редактор.ПолучитьНастройки());
ПроверитьСвойПолныйСостав(РезультатИли, ВсеОжидания);
Группа.ТипГруппы = ТипГруппыЭлементовОтбораКомпоновкиДанных.ГруппаИ;
Для Каждого Условие Из СвоиТриУсловия(Верхний, Количество, Цена) Цикл
Условие.РежимОтображения = РежимОтображенияЭлементаНастройкиКомпоновкиДанных.Недоступный;
КонецЦикла;
Для Каждого Выбранное Из Базовые.Выбор.Элементы Цикл
Выбранное.РежимОтображения = РежимОтображенияЭлементаНастройкиКомпоновкиДанных.Недоступный;
КонецЦикла;
ПроверитьСвоёДерево(Базовые, Верхний, Группа, Количество, Цена, Истина, Истина, РежимОтображенияЭлементаНастройкиКомпоновкиДанных.Недоступный);
РезультатНедоступный = ПолучитьСвойПолныйРезультат(Схема, Редактор.ПолучитьНастройки());
ПроверитьСвойПолныйСостав(РезультатНедоступный, КарандашОжидания);
Количество.Использование = Ложь;
ПроверитьСвоёДерево(Базовые, Верхний, Группа, Количество, Цена, Истина, Ложь, РежимОтображенияЭлементаНастройкиКомпоновкиДанных.Недоступный);
ДешёвыеОжидания = Новый Массив;
ДешёвыеОжидания.Добавить(Новый Структура("Наименование,Количество,Цена,Сумма", "Ручка", 1, 50, 50));
ДешёвыеОжидания.Добавить(Новый Структура("Наименование,Количество,Цена,Сумма", "Карандаш", 2, 30, 60));
РезультатБезКоличества = ПолучитьСвойПолныйРезультат(Схема, Редактор.ПолучитьНастройки());
ПроверитьСвойПолныйСостав(РезультатБезКоличества, ДешёвыеОжидания);
Количество.Использование = Истина;
Группа.Использование = Ложь;
РезультатБезГруппы = ПолучитьСвойПолныйРезультат(Схема, Редактор.ПолучитьНастройки());
ПроверитьСвойПолныйСостав(РезультатБезГруппы, ВсеОжидания);
Группа.Использование = Истина;
Для Каждого Условие Из СвоиТриУсловия(Верхний, Количество, Цена) Цикл
Условие.РежимОтображения = РежимОтображенияЭлементаНастройкиКомпоновкиДанных.Обычный;
КонецЦикла;
Для Каждого Выбранное Из Базовые.Выбор.Элементы Цикл
Выбранное.РежимОтображения = РежимОтображенияЭлементаНастройкиКомпоновкиДанных.Обычный;
КонецЦикла;
ПроверитьСвоёДерево(Базовые, Верхний, Группа, Количество, Цена, Истина, Истина, РежимОтображенияЭлементаНастройкиКомпоновкиДанных.Обычный);
Восстановленный = ПолучитьСвойПолныйРезультат(Схема, Редактор.ПолучитьНастройки());
ПроверитьСвойПолныйСостав(Восстановленный, КарандашОжидания);
ПроверитьСвойПолныйСостав(Исходный, ВсеОжидания);
Сообщить("Полные составы: исходник3, И1, ИЛИ3, Недоступный1, без количества2, без группы3, восстановление1");
КонецПроцедуры
Процедура ПроверитьСвойПустойСтенд()
Если Метаданные.Справочники.Количество() <> 0 Или Метаданные.Документы.Количество() <> 0 Или Метаданные.Перечисления.Количество() <> 0 Или Метаданные.РегистрыСведений.Количество() <> 0 Или Метаданные.РегистрыНакопления.Количество() <> 0 Или Метаданные.РегистрыБухгалтерии.Количество() <> 0 Или Метаданные.РегистрыРасчета.Количество() <> 0 Или Метаданные.ПланыВидовХарактеристик.Количество() <> 0 Или Метаданные.ПланыВидовРасчета.Количество() <> 0 Или Метаданные.ПланыСчетов.Количество() <> 0 Или Метаданные.ПланыОбмена.Количество() <> 0 Или Метаданные.Последовательности.Количество() <> 0 Или Метаданные.БизнесПроцессы.Количество() <> 0 Или Метаданные.Задачи.Количество() <> 0 Или Метаданные.ОбщиеРеквизиты.Количество() <> 0 Или Метаданные.ПодпискиНаСобытия.Количество() <> 0 Или Метаданные.РегламентныеЗадания.Количество() <> 0 Или Метаданные.ВнешниеИсточникиДанных.Количество() <> 0 Тогда
ВызватьИсключение "Нужен только свой новый пустой учебный стенд";
КонецЕсли;
Если Метаданные.ЕстьИзмененияРасширениямиКонфигурации() Тогда
ВызватьИсключение "Свой сеанс не должен изменяться расширениями";
КонецЕсли;
Источники = Новый Массив;
Источники.Добавить(ИсточникРасширенийКонфигурации.БазаДанных);
Источники.Добавить(ИсточникРасширенийКонфигурации.СеансАктивные);
Источники.Добавить(ИсточникРасширенийКонфигурации.СеансОтключенные);
Для Каждого Источник Из Источники Цикл
Расширения = РасширенияКонфигурации.Получить(, Источник);
Если ТипЗнч(Расширения) <> Тип("Массив") Тогда
ВызватьИсключение "Native список расширений должен иметь тип Массив";
КонецЕсли;
Если Расширения.Количество() <> 0 Тогда
ВызватьИсключение "В своём новом стенде нет расширений базы или сеанса";
КонецЕсли;
КонецЦикла;
Если ТранзакцияАктивна() Тогда
ВызватьИсключение "Чужая или вложенная активная транзакция не допускается";
КонецЕсли;
КонецПроцедуры
Процедура ПроверитьСвоёДерево(Настройки, Верхний, Группа, Количество, Цена, ГруппаИ, КоличествоВключено, Режим)
Если Настройки.Отбор.Элементы.Количество() <> 2 Или Группа.Элементы.Количество() <> 2 Тогда
ВызватьИсключение "Нужны точно два верхних элемента и два условия своей группы";
КонецЕсли;
Если ТипЗнч(Верхний) <> Тип("ЭлементОтбораКомпоновкиДанных") Или ТипЗнч(Группа) <> Тип("ГруппаЭлементовОтбораКомпоновкиДанных")
Или ТипЗнч(Количество) <> Тип("ЭлементОтбораКомпоновкиДанных") Или ТипЗнч(Цена) <> Тип("ЭлементОтбораКомпоновкиДанных") Тогда
ВызватьИсключение "Не совпали реальные типы собственного базового отбора";
КонецЕсли;
Если Верхний.Родитель <> Неопределено Или Количество.Родитель <> Группа Или Цена.Родитель <> Группа Тогда
ВызватьИсключение "Реальная readonly принадлежность базовых условий не совпала";
КонецЕсли;
Если ГруппаИ Тогда
ОжидаемаяГруппа = ТипГруппыЭлементовОтбораКомпоновкиДанных.ГруппаИ;
Иначе
ОжидаемаяГруппа = ТипГруппыЭлементовОтбораКомпоновкиДанных.ГруппаИли;
КонецЕсли;
Если Группа.ТипГруппы <> ОжидаемаяГруппа Или Не Группа.Использование Тогда
ВызватьИсключение "Не совпал собственный тип или использование группы";
КонецЕсли;
Если Верхний.ЛевоеЗначение <> Новый ПолеКомпоновкиДанных("Количество") Или Верхний.ВидСравнения <> ВидСравненияКомпоновкиДанных.Больше
Или ТипЗнч(Верхний.ПравоеЗначение) <> Тип("Число") Или Верхний.ПравоеЗначение <> 0 Или Не Верхний.Использование Тогда
ВызватьИсключение "Не совпало полное верхнее условие";
КонецЕсли;
Если Количество.ЛевоеЗначение <> Новый ПолеКомпоновкиДанных("Количество") Или Количество.ВидСравнения <> ВидСравненияКомпоновкиДанных.Больше
Или ТипЗнч(Количество.ПравоеЗначение) <> Тип("Число") Или Количество.ПравоеЗначение <> 1
Или Количество.Использование <> КоличествоВключено Тогда
ВызватьИсключение "Не совпало полное собственное условие количества";
КонецЕсли;
Если Цена.ЛевоеЗначение <> Новый ПолеКомпоновкиДанных("Цена") Или Цена.ВидСравнения <> ВидСравненияКомпоновкиДанных.Меньше
Или ТипЗнч(Цена.ПравоеЗначение) <> Тип("Число") Или Цена.ПравоеЗначение <> 100 Или Не Цена.Использование Тогда
ВызватьИсключение "Не совпало полное собственное условие цены";
КонецЕсли;
Для Каждого Условие Из СвоиТриУсловия(Верхний, Количество, Цена) Цикл
Если ТипЗнч(Условие.Применение) <> Тип("ТипПримененияОтбораКомпоновкиДанных")
Или Условие.Применение <> ТипПримененияОтбораКомпоновкиДанных.Элементы Тогда
ВызватьИсключение "Свой отбор применяется именно к элементам";
КонецЕсли;
Если ТипЗнч(Условие.РежимОтображения) <> Тип("РежимОтображенияЭлементаНастройкиКомпоновкиДанных")
Или Условие.РежимОтображения <> Режим Тогда
ВызватьИсключение "Не сохранён собственный режим отображения условия";
КонецЕсли;
КонецЦикла;
Если Группа.Применение <> ТипПримененияОтбораКомпоновкиДанных.Элементы Тогда
ВызватьИсключение "Группа тоже должна применяться к элементам";
КонецЕсли;
Если Настройки.Выбор.Элементы.Количество() <> 4 Тогда
ВызватьИсключение "Должны сохраняться все четыре выбранных поля";
КонецЕсли;
Для Каждого Выбранное Из Настройки.Выбор.Элементы Цикл
Если ТипЗнч(Выбранное) <> Тип("ВыбранноеПолеКомпоновкиДанных") Или Не Выбранное.Использование
Или Выбранное.РежимОтображения <> Режим Тогда
ВызватьИсключение "Режим выбранного поля не должен отключать его использование";
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Функция СвоиТриУсловия(Верхний, Количество, Цена)
Условия = Новый Массив;
Условия.Добавить(Верхний);
Условия.Добавить(Количество);
Условия.Добавить(Цена);
Возврат Условия;
КонецФункции
Функция ПолучитьСвойПолныйРезультат(Схема, Настройки)
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
Макет = КомпоновщикМакета.Выполнить(Схема, Настройки, , , Тип("ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений"));
Процессор = Новый ПроцессорКомпоновкиДанных;
Процессор.Инициализировать(Макет);
Приемник = Новый ТаблицаЗначений;
Вывод = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений;
Вывод.ОтображатьПроцентВывода = Ложь;
Вывод.УстановитьОбъект(Приемник);
Результат = Вывод.Вывести(Процессор, Ложь);
Если ТипЗнч(Результат) <> Тип("ТаблицаЗначений") Тогда
ВызватьИсключение "Свой детальный отчёт должен вернуть реальную ТаблицаЗначений";
КонецЕсли;
Возврат Результат;
КонецФункции
Процедура ПроверитьСвойПолныйСостав(Таблица, Ожидания)
Если Таблица.Количество() <> Ожидания.Количество() Или Таблица.Колонки.Количество() <> 4 Тогда
ВызватьИсключение "Не совпали все размеры собственного результата";
КонецЕсли;
Поля = Новый Массив;
Поля.Добавить("Наименование");
Поля.Добавить("Количество");
Поля.Добавить("Цена");
Поля.Добавить("Сумма");
Для Каждого Поле Из Поля Цикл
Если Таблица.Колонки.Найти(Поле) = Неопределено Тогда
ВызватьИсключение "Нет собственной колонки " + Поле;
КонецЕсли;
КонецЦикла;
Использованные = Новый Массив;
Для Каждого СтрокаРезультата Из Таблица Цикл
Найден = -1;
Для Индекс = 0 По Ожидания.Количество() - 1 Цикл
Если Использованные.Найти(Индекс) = Неопределено Тогда
Ожидание = Ожидания[Индекс];
Если ТипЗнч(СтрокаРезультата.Наименование) = Тип("Строка") И ТипЗнч(СтрокаРезультата.Количество) = Тип("Число")
И ТипЗнч(СтрокаРезультата.Цена) = Тип("Число") И ТипЗнч(СтрокаРезультата.Сумма) = Тип("Число") Тогда
Если СтрокаРезультата.Наименование = Ожидание.Наименование И СтрокаРезультата.Количество = Ожидание.Количество
И СтрокаРезультата.Цена = Ожидание.Цена И СтрокаРезультата.Сумма = Ожидание.Сумма Тогда
Найден = Индекс;
Прервать;
КонецЕсли;
КонецЕсли;
КонецЕсли;
КонецЦикла;
Если Найден < 0 Тогда
ВызватьИсключение "Не совпали все значения/типы/повторы собственной строки";
КонецЕсли;
Использованные.Добавить(Найден);
КонецЦикла;
КонецПроцедурыУчебныйБазовыйОтбор85.Форма
Своя новая внешняя обработка УчебныйБазовыйОтбор85 → управляемая Форма → Модуль
Полный отдельный модуль формы; серверный БезКонтекста вызывает общий модуль, результатные СКД-объекты на клиент не передаются.
&НаКлиенте
Процедура Выполнить(Команда)
ВыполнитьНаСервере();
Сообщить("Все полные проверки собственного отбора и сохранности данных завершены");
КонецПроцедуры
&НаСервереБезКонтекста
Процедура ВыполнитьНаСервере()
УчебныеЗадачи.ВыполнитьПример();
КонецПроцедурыРазбор по шагам
Построить свою схему/Local-набор из трёх собственных константных строк, четыре выбранных поля и детальную структуру. Инициализировать редактор от своей схемы и загрузить её базовые настройки; пустой объект неизвестного отчёта не используется. Исходный процессор должен вернуть все3строки с полными четырьмя полями.
Добавить в Базовые.Отбор верхнее Количество>0 и вложенную группу И. Внутри группы два настоящих элемента: Количество>1 и Цена<100. У всех условий и группы Применение=Элементы: native говорит применять к записям-элементам; в нашем отчёте есть только детали, не иерархические итоги. Эти свойства недоступны в пользовательском отборе — здесь он не используется.
Прочитать readonly Родитель у верхнего условия: Неопределено. У обоих вложенных условий — та же реальная созданная группа. Родителю ничего не присваивается; принадлежность задаёт коллекция, в которую элемент добавлен. Проверяются типы, число элементов, точные пути/сравнения/числовые границы и Использование.
Первый полный вывод группы И: только Карандаш/2/30/60. Книга проходит количество, но не цену; Ручка проходит цену, но не количество. Сменить именно ТипГруппы на ГруппаИли: все три записи удовлетворяют хотя бы одному условию и возвращаются целиком.
Вернуть ГруппаИ. Сменить РежимОтображения каждого базового условия и каждого выбранного поля Обычный→Недоступный, не трогая Использование. Полный вывод должен всё ещё содержать только карандаш и все4колонки. Недоступный означает, что элемент не предназначен для изменения в пользовательских настройках, а не отключение отбора или удаления поля из результата.
Теперь реально отключить только Количество.Использование. Группа И остаётся, Цена<100 действует: Ручка/1/50/50 и Карандаш/2/30/60. Это содержательное изменение результата, в отличие от одного ViewMode. Включить количество обратно, отключить группу целиком: снова все3строки, потому что остаётся только верхнее Количество>0.
Восстановить группу И, оба условия и Обычный для условий/полей. Проверить всё дерево и реальный результат карандаша повторно. Исходная уже выгруженная таблица всё ещё содержит все3полные строки; изменения настроек не пересчитывают её задним числом.
Каждый вывод строит новый макет с генератором ДляКоллекцииЗначений, новый процессор, свой приёмник ТаблицаЗначений и вывод всего результата. Проверка не ограничивается количеством или итогом: сверяются все строки/колонки/типы/значения и кратность одинаковых строк.
Как проверить результат
Будущий положительный результат: исходник3строки; И1Карандаш; ИЛИ3; Недоступный1Карандаш; выключенное количество2Ручка/Карандаш; выключенная группа3; восстановленная группа1Карандаш. В Книге сумма750, Ручке50, Карандаше60; количество/цена/сумма — Число, имя — Строка. В каждом результате ровно4правильно именованных колонки.
В отладчике перед первым выводом И: Верхний.Родитель=Неопределено; Количество.Родитель=Группа и Цена.Родитель=Группа; у всех свой enum Применение.Элементы; группа И и оба условия используются. После Недоступный все4выбранных поля остаются Использование=Истина, их enum ViewMode реально изменён.
Отдельный будущий контроль неверного ожидания: вне опытов временно заменить сумму карандаша в КарандашОжидания с60на61, сохранить/F7 до свежего сеанса. Должна отказать полная проверка значения, хотя количество строк и название правильные; положительного финального сообщения нет. Вернуть60, повторить F7 до нового сеанса. Здесь ручной контроль не запускался.
Не пытайтесь проверить Родитель/Применение у пользовательского слоя или присвоить Родитель. Это не отрицательный пример «любая ошибка подходит»: такой вызов здесь вообще не выполняется. Native ограничения разобраны отдельно; тесты Python проверяют лишь наши ожидания и проверки, не работу СКД в1С.
Ожидаемый результат
Будущий полный отчёт отличает принадлежность и область применения базового отбора, UI-политику отображения и реальное включение условий/полей. Каждый переход проверен по полному вычисленному результату, без unknown ИсходныйОбъект.
На что обратить внимание
РежимОтображения описывает отображение/редактирование элементов настроек и состав пользовательских настроек, не права доступа/RLS. В этом серверном примере нет реальной таблицы редактора настроек: конкретный внешний вид/доступность UI не заявляются как проверенные. Native Обычный доступен в табличном поле отбора при режиме Все; Недоступный не предназначен для пользовательского изменения. Getter-равенство не доказывает отрисовку.
Родитель readonly, Неопределено у верхнего условия, группа у вложенного. Родитель и Применение недоступны у элементов пользовательских настроек, поэтому используются только реальные базовые элементы и никакие свойства неизвестного пользовательского объекта не читаются.
Элементы, Иерархия и ТолькоИерархия — разные области применения. Наши данные содержат только детальные строки: нельзя по этому примеру обещать правильный обход каталожной иерархии/итогов. Здесь не используется ТолькоИерархия ради формального счётчика.
Процессор вывода может возвращать ТаблицаЗначений или ДеревоЗначений; наш детальный макет ожидает и явно проверяет первый тип. Генератор табличного документа не подставляется вместо генератора коллекции.
Нет гарантий порядка без сортировки. Сравниваются полные мультимножества, повторные совпадения учитываются через использованные индексы. Контроль только суммы/количества строк пропустил бы неверные цены/типы/имена.
BSL, СКД и GUI в1С здесь не запускались; runtimeVerifiedScenarios=0. Статическая сверка installed8.5.1.1343 и Python-модель не доказывают исполнение отчёта или доступность UI. Все данные свои, исходники рабочих конфигураций и базы не менялись.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.