ЭлементОтбораКомпоновкиДанных.Родитель

Свойства · Parent

Тип: Неопределено, ГруппаЭлементовОтбораКомпоновкиДанных. Родительская группа элементов отбора, Неопределено для элементов отбора верхнего уровня. Данное свойство недоступно у объектов, содержащихся в коллекции пользовательских настроек компоновки данных.

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

ЭлементОтбораКомпоновкиДанных.Родитель (DataCompositionFilterItem.Parent)

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

Родитель (Parent)

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

Использование:
Только чтение.
Описание:
Тип: Неопределено, ГруппаЭлементовОтбораКомпоновкиДанных.
Родительская группа элементов отбора, Неопределено для элементов отбора верхнего уровня.
Данное свойство недоступно у объектов, содержащихся в коллекции пользовательских настроек компоновки данных.
Доступность:

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

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

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

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

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

СКД: свой вложенный отбор, readonly-родитель и режим отображения без потери данных

Полная схема в памяти создаёт Книгу, Ручку и Карандаш. Базовая группа И выбирает карандаш, ИЛИ — все три позиции. Недоступный не отключает отбор/выбранные поля: это отделено от реального изменения Использование, а каждый результат проверен целиком.

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

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

Подготовка

  1. Создайте НОВУЮ отдельную пустую учебную базу, не копию рабочей, на точно8.5.1.1343. Имя конфигурации УчебныйОтборСКД85; совместимость Не использовать. Нет прикладных метаданных, расширений базы/сеанса, общих реквизитов/подписок/заданий/внешних источников. Guard сверяет версию, точное имя, пустые коллекции и отсутствие активной транзакции. Макет отчёта или БСП не нужен: все строки заданы в собственном query из констант.

  2. Общие → Общие модули → УчебныеЗадачи: Сервер=Истина, Глобальный=Ложь, ВызовСервера=Ложь, Привилегированный=Ложь; клиентские/внешнее соединение отключены; повторное использование выключено. Вставьте весь основной модуль, включая все helpers на уровне модуля. Все другие модули/формы приложения вручную пусты; metadata guard не умеет прочитать их BSL.

  3. Создайте свою новую внешнюю обработку УчебныйБазовыйОтбор85, управляемую Форма с командой/кнопкой Выполнить и одноимённым действием. Реквизитов формы не нужно. Полный отдельный модуль формы дан ниже; серверный вызов БезКонтекста выполняет общий модуль, таблицы/СКД-объекты на клиент не возвращаются.

  4. После ВСЕХ флагов/модулей/метаданных сохраните свою конфигурацию, завершите прежний свой сеанс: активной транзакции/опыта нет. В Конфигураторе выполните Конфигурация → Обновить конфигурацию базы данных (F7), подтвердите только свою новую конфигурацию и дождитесь успеха. Затем свежий собственный сеанс и кнопка Выполнить. Здесь Конфигуратор/1С/F7 не запускались.

  5. Исходные полные данные: Книга/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 → управляемая Форма → Модуль

Полный отдельный модуль формы; серверный БезКонтекста вызывает общий модуль, результатные СКД-объекты на клиент не передаются.

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

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

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

  1. Построить свою схему/Local-набор из трёх собственных константных строк, четыре выбранных поля и детальную структуру. Инициализировать редактор от своей схемы и загрузить её базовые настройки; пустой объект неизвестного отчёта не используется. Исходный процессор должен вернуть все3строки с полными четырьмя полями.

  2. Добавить в Базовые.Отбор верхнее Количество>0 и вложенную группу И. Внутри группы два настоящих элемента: Количество>1 и Цена<100. У всех условий и группы Применение=Элементы: native говорит применять к записям-элементам; в нашем отчёте есть только детали, не иерархические итоги. Эти свойства недоступны в пользовательском отборе — здесь он не используется.

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

  4. Первый полный вывод группы И: только Карандаш/2/30/60. Книга проходит количество, но не цену; Ручка проходит цену, но не количество. Сменить именно ТипГруппы на ГруппаИли: все три записи удовлетворяют хотя бы одному условию и возвращаются целиком.

  5. Вернуть ГруппаИ. Сменить РежимОтображения каждого базового условия и каждого выбранного поля Обычный→Недоступный, не трогая Использование. Полный вывод должен всё ещё содержать только карандаш и все4колонки. Недоступный означает, что элемент не предназначен для изменения в пользовательских настройках, а не отключение отбора или удаления поля из результата.

  6. Теперь реально отключить только Количество.Использование. Группа И остаётся, Цена<100 действует: Ручка/1/50/50 и Карандаш/2/30/60. Это содержательное изменение результата, в отличие от одного ViewMode. Включить количество обратно, отключить группу целиком: снова все3строки, потому что остаётся только верхнее Количество>0.

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

  8. Каждый вывод строит новый макет с генератором ДляКоллекцииЗначений, новый процессор, свой приёмник ТаблицаЗначений и вывод всего результата. Проверка не ограничивается количеством или итогом: сверяются все строки/колонки/типы/значения и кратность одинаковых строк.

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

  1. Будущий положительный результат: исходник3строки; И1Карандаш; ИЛИ3; Недоступный1Карандаш; выключенное количество2Ручка/Карандаш; выключенная группа3; восстановленная группа1Карандаш. В Книге сумма750, Ручке50, Карандаше60; количество/цена/сумма — Число, имя — Строка. В каждом результате ровно4правильно именованных колонки.

  2. В отладчике перед первым выводом И: Верхний.Родитель=Неопределено; Количество.Родитель=Группа и Цена.Родитель=Группа; у всех свой enum Применение.Элементы; группа И и оба условия используются. После Недоступный все4выбранных поля остаются Использование=Истина, их enum ViewMode реально изменён.

  3. Отдельный будущий контроль неверного ожидания: вне опытов временно заменить сумму карандаша в КарандашОжидания с60на61, сохранить/F7 до свежего сеанса. Должна отказать полная проверка значения, хотя количество строк и название правильные; положительного финального сообщения нет. Вернуть60, повторить F7 до нового сеанса. Здесь ручной контроль не запускался.

  4. Не пытайтесь проверить Родитель/Применение у пользовательского слоя или присвоить Родитель. Это не отрицательный пример «любая ошибка подходит»: такой вызов здесь вообще не выполняется. Native ограничения разобраны отдельно; тесты Python проверяют лишь наши ожидания и проверки, не работу СКД в1С.

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

Будущий полный отчёт отличает принадлежность и область применения базового отбора, UI-политику отображения и реальное включение условий/полей. Каждый переход проверен по полному вычисленному результату, без unknown ИсходныйОбъект.

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

  1. РежимОтображения описывает отображение/редактирование элементов настроек и состав пользовательских настроек, не права доступа/RLS. В этом серверном примере нет реальной таблицы редактора настроек: конкретный внешний вид/доступность UI не заявляются как проверенные. Native Обычный доступен в табличном поле отбора при режиме Все; Недоступный не предназначен для пользовательского изменения. Getter-равенство не доказывает отрисовку.

  2. Родитель readonly, Неопределено у верхнего условия, группа у вложенного. Родитель и Применение недоступны у элементов пользовательских настроек, поэтому используются только реальные базовые элементы и никакие свойства неизвестного пользовательского объекта не читаются.

  3. Элементы, Иерархия и ТолькоИерархия — разные области применения. Наши данные содержат только детальные строки: нельзя по этому примеру обещать правильный обход каталожной иерархии/итогов. Здесь не используется ТолькоИерархия ради формального счётчика.

  4. Процессор вывода может возвращать ТаблицаЗначений или ДеревоЗначений; наш детальный макет ожидает и явно проверяет первый тип. Генератор табличного документа не подставляется вместо генератора коллекции.

  5. Нет гарантий порядка без сортировки. Сравниваются полные мультимножества, повторные совпадения учитываются через использованные индексы. Контроль только суммы/количества строк пропустил бы неверные цены/типы/имена.

  6. BSL, СКД и GUI в1С здесь не запускались; runtimeVerifiedScenarios=0. Статическая сверка installed8.5.1.1343 и Python-модель не доказывают исполнение отчёта или доступность UI. Все данные свои, исходники рабочих конфигураций и базы не менялись.

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

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

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

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

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