ДоступноеПолеСхемыЗапроса.Поля

Свойства · Fields

Тип: ДоступныеПоляСхемыЗапроса. Содержит вложенные поля доступного поля.

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

ДоступноеПолеСхемыЗапроса.Поля (QuerySchemaAvailableField.Fields)

ДоступноеПолеСхемыЗапроса (QuerySchemaAvailableField)

Поля (Fields)

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

Использование:
Только чтение.
Описание:
Тип: ДоступныеПоляСхемыЗапроса.
Содержит вложенные поля доступного поля.
Доступность:

Сервер, толстый клиент, внешнее соединение.

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

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

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

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

Доступные таблицы запроса: дерево, собственный срез и полные описания параметров

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

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

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

Подготовка

  1. Подготовка полностью самостоятельная: НОВАЯ отдельная пустая учебная база, не копия рабочей, точно8.5.1.1343. Конфигурация УчебныеПараметрыТаблицы85, совместимость Не использовать. Единственный прикладной объект — свой регистр сведений УчебнаяИстория85. Расширений базы/сеанса, подписок, заданий и внешних источников нет; все другие модули вручную пусты.

  2. Регистр УчебнаяИстория85: запись Независимый; периодичность В пределах секунды. Одно измерение КодТовара: Строка3. Один ресурс Цена: Число12,2. Реквизитов, регистраторов и обработчиков нет. Код сверяет точное имя конфигурации, версию, структуру и полные типы полей. Строки регистра не создавайте: для этой задачи используются только метаданные.

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

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

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

Процедура ВыполнитьПример() Экспорт
    ПроверитьСвойМинимальныйСтенд();
    ПроверитьСвойРегистр();
    Схема = Новый СхемаЗапроса;
    Схема.РежимКомпоновкиДанных = Ложь;
    Схема.УстановитьТекстЗапроса("ВЫБРАТЬ Срез.КодТовара КАК КодТовара, Срез.Цена КАК Цена
    |ИЗ РегистрСведений.УчебнаяИстория85.СрезПоследних(&ДатаЗапроса, КодТовара = &КодТовара) КАК Срез");
    Выбор = ПолучитьСвойЗапросВыбора(Схема);
    Доступные = Выбор.ДоступныеТаблицы;
    Путь = НайтиСвойПуть(Доступные, "РегистрСведений.УчебнаяИстория85.СрезПоследних", "", 0);
    Если Путь = Неопределено Тогда
        ВызватьИсключение "В реальном дереве нет собственной виртуальной таблицы";
    КонецЕсли;
    Найденный = Доступные.Найти("РегистрСведений.УчебнаяИстория85.СрезПоследних");
    Если ТипЗнч(Найденный) <> Тип("ДоступнаяТаблицаСхемыЗапроса") Или Найденный <> Путь.Элемент
        Или Путь.Коллекция.Получить(Путь.Индекс) <> Найденный Тогда
        ВызватьИсключение "Поиск имени и собственный путь должны вести к одному описанию таблицы";
    КонецЕсли;
    Сообщить("Путь групп: " + Путь.Путь + Найденный.Имя);
    ПервоеОписание = ПолучитьСвоёПолноеОписание(Найденный);
    Оператор = Выбор.Операторы.Получить(0);
    Источник = Оператор.Источники.Получить(0);
    РабочаяТаблица = Источник.Источник;
    Если ТипЗнч(РабочаяТаблица) <> Тип("ТаблицаСхемыЗапроса") Или РабочаяТаблица.Параметры.Количество() <> 2 Тогда
        ВызватьИсключение "Нужны два обычных выражения собственной рабочей таблицы";
    КонецЕсли;
    Период = РабочаяТаблица.Параметры.Получить(0);
    Период.Выражение = Новый ВыражениеСхемыЗапроса("&ДругаяДата");
    ВтороеОписание = ПолучитьСвоёПолноеОписание(Найденный);
    ПроверитьСохранностьОписаний(ПервоеОписание, ВтороеОписание);
    ПовторнаяСхема = Новый СхемаЗапроса;
    ПовторнаяСхема.РежимКомпоновкиДанных = Ложь;
    ПовторнаяСхема.УстановитьТекстЗапроса(Схема.ПолучитьТекстЗапроса());
    ПовторныйВыбор = ПолучитьСвойЗапросВыбора(ПовторнаяСхема);
    ПовторнаяДоступная = ПовторныйВыбор.ДоступныеТаблицы.Найти("РегистрСведений.УчебнаяИстория85.СрезПоследних");
    ТретьеОписание = ПолучитьСвоёПолноеОписание(ПовторнаяДоступная);
    ПроверитьСохранностьОписаний(ПервоеОписание, ТретьеОписание);
    Сообщить("Своя таблица найдена; оба описания параметров сохранены после изменения выражения и нового разбора");
КонецПроцедуры

Процедура ПроверитьСвойМинимальныйСтенд()
    Если Метаданные.Справочники.Количество() <> 0 Или Метаданные.Документы.Количество() <> 0 Или Метаданные.Перечисления.Количество() <> 0 Или Метаданные.РегистрыСведений.Количество() <> 1 Или Метаданные.РегистрыНакопления.Количество() <> 0 Или Метаданные.РегистрыБухгалтерии.Количество() <> 0 Или Метаданные.РегистрыРасчета.Количество() <> 0 Или Метаданные.ПланыВидовХарактеристик.Количество() <> 0 Или Метаданные.ПланыВидовРасчета.Количество() <> 0 Или Метаданные.ПланыСчетов.Количество() <> 0 Или Метаданные.ПланыОбмена.Количество() <> 0 Или Метаданные.Последовательности.Количество() <> 0 Или Метаданные.БизнесПроцессы.Количество() <> 0 Или Метаданные.Задачи.Количество() <> 0 Или Метаданные.ОбщиеРеквизиты.Количество() <> 0 Или Метаданные.ПодпискиНаСобытия.Количество() <> 0 Или Метаданные.РегламентныеЗадания.Количество() <> 0 Или Метаданные.ВнешниеИсточникиДанных.Количество() <> 0 Тогда
        ВызватьИсключение "Нужен только свой новый пустой учебный стенд";
    КонецЕсли;
    Если Метаданные.ЕстьИзмененияРасширениямиКонфигурации() Тогда
        ВызватьИсключение "Свой сеанс не должен изменяться расширениями";
    КонецЕсли;
    Источники = Новый Массив;
    Источники.Добавить(ИсточникРасширенийКонфигурации.БазаДанных);
    Источники.Добавить(ИсточникРасширенийКонфигурации.СеансАктивные);
    Источники.Добавить(ИсточникРасширенийКонфигурации.СеансОтключенные);
    Для Каждого Источник Из Источники Цикл
        Расширения = РасширенияКонфигурации.Получить(, Источник);
        Если ТипЗнч(Расширения) <> Тип("Массив") Тогда
            ВызватьИсключение "Native список расширений должен иметь тип Массив";
        КонецЕсли;
        Если Расширения.Количество() <> 0 Тогда
            ВызватьИсключение "В своём новом стенде нет расширений базы или сеанса";
        КонецЕсли;
    КонецЦикла;
    Если ТранзакцияАктивна() Тогда
        ВызватьИсключение "Чужая или вложенная активная транзакция не допускается";
    КонецЕсли;
КонецПроцедуры

Процедура ПроверитьСвойРегистр()
    Если ПривилегированныйРежим() Тогда
        ВызватьИсключение "Привилегированный режим для учебного разбора не нужен";
    КонецЕсли;
    МетаРегистр = Метаданные.РегистрыСведений.Найти("УчебнаяИстория85");
    Если МетаРегистр = Неопределено Тогда
        ВызватьИсключение "Нужен только собственный регистр УчебнаяИстория85";
    КонецЕсли;
    Если МетаРегистр.РежимЗаписи <> Метаданные.СвойстваОбъектов.РежимЗаписиРегистра.Независимый
        Или МетаРегистр.ПериодичностьРегистраСведений <> Метаданные.СвойстваОбъектов.ПериодичностьРегистраСведений.Секунда
        Или МетаРегистр.Измерения.Количество() <> 1 Или МетаРегистр.Ресурсы.Количество() <> 1
        Или МетаРегистр.Реквизиты.Количество() <> 0 Тогда
        ВызватьИсключение "Нужен независимый периодический регистр с одним измерением и ресурсом";
    КонецЕсли;
    МетаКод = МетаРегистр.Измерения.Найти("КодТовара");
    МетаЦена = МетаРегистр.Ресурсы.Найти("Цена");
    Если МетаКод = Неопределено Или МетаЦена = Неопределено Тогда
        ВызватьИсключение "Нужны свои КодТовара и Цена";
    КонецЕсли;
    КодТипы = МетаКод.Тип.Типы();
    ЦенаТипы = МетаЦена.Тип.Типы();
    Если КодТипы.Количество() <> 1 Или ЦенаТипы.Количество() <> 1 Тогда
        ВызватьИсключение "Составные типы своих полей не подходят";
    КонецЕсли;
    Если КодТипы[0] <> Тип("Строка") Или ЦенаТипы[0] <> Тип("Число")
        Или МетаКод.Тип.КвалификаторыСтроки.Длина <> 3
        Или МетаЦена.Тип.КвалификаторыЧисла.Разрядность <> 12
        Или МетаЦена.Тип.КвалификаторыЧисла.РазрядностьДробнойЧасти <> 2 Тогда
        ВызватьИсключение "Не совпали полные собственные типы полей";
    КонецЕсли;
КонецПроцедуры

Функция ПолучитьСвойЗапросВыбора(Схема)
    Если Схема.РежимКомпоновкиДанных Или Схема.ПакетЗапросов.Количество() <> 1 Тогда
        ВызватьИсключение "Нужна одна собственная обычная схема запроса";
    КонецЕсли;
    Выбор = Схема.ПакетЗапросов.Получить(0);
    Если ТипЗнч(Выбор) <> Тип("ЗапросВыбораСхемыЗапроса") Тогда
        ВызватьИсключение "Нужен реальный запрос выбора собственной схемы";
    КонецЕсли;
    Возврат Выбор;
КонецФункции

Функция НайтиСвойПуть(Коллекция, ИмяТаблицы, Путь, Глубина)
    Если ТипЗнч(Коллекция) <> Тип("ДоступныеТаблицыСхемыЗапроса") Или Глубина > 32 Тогда
        ВызватьИсключение "Не совпал тип дерева или превышена глубина собственного обхода";
    КонецЕсли;
    Для Индекс = 0 По Коллекция.Количество() - 1 Цикл
        Элемент = Коллекция.Получить(Индекс);
        Если Коллекция.Индекс(Элемент) <> Индекс Тогда
            ВызватьИсключение "Индекс относится к непосредственной коллекции, не всему дереву";
        КонецЕсли;
        Если ТипЗнч(Элемент) = Тип("ГруппаДоступныхТаблицСхемыЗапроса") Тогда
            Если ТипЗнч(Элемент.Представление) <> Тип("Строка")
                Или ТипЗнч(Элемент.Состав) <> Тип("ДоступныеТаблицыСхемыЗапроса") Тогда
                ВызватьИсключение "Не совпали реальные readonly свойства группы";
            КонецЕсли;
            Найденный = НайтиСвойПуть(Элемент.Состав, ИмяТаблицы, Путь + Элемент.Представление + "/", Глубина + 1);
            Если Найденный <> Неопределено Тогда
                Возврат Найденный;
            КонецЕсли;
        ИначеЕсли ТипЗнч(Элемент) = Тип("ДоступнаяТаблицаСхемыЗапроса") Тогда
            Если ТипЗнч(Элемент.Имя) <> Тип("Строка") Тогда
                ВызватьИсключение "Имя доступной таблицы должно быть строкой";
            КонецЕсли;
            Если НРег(Элемент.Имя) = НРег(ИмяТаблицы) Тогда
                Возврат Новый Структура("Элемент,Коллекция,Индекс,Путь", Элемент, Коллекция, Индекс, Путь);
            КонецЕсли;
        Иначе
            ВызватьИсключение "В дереве допустимы только группа или доступная таблица";
        КонецЕсли;
    КонецЦикла;
    Возврат Неопределено;
КонецФункции

Процедура ПроверитьСвоёПоле(Поля, ИмяПоля, ОжидаемыйТип)
    Если ТипЗнч(Поля) <> Тип("ДоступныеПоляСхемыЗапроса") Тогда
        ВызватьИсключение "Нужна реальная коллекция описаний полей";
    КонецЕсли;
    Поле = Поля.Найти(ИмяПоля);
    Если ТипЗнч(Поле) <> Тип("ДоступноеПолеСхемыЗапроса") Тогда
        ВызватьИсключение "Нет собственного поля " + ИмяПоля;
    КонецЕсли;
    Если ТипЗнч(Поле.Имя) <> Тип("Строка") Или Не Поле.ТипЗначения.СодержитТип(ОжидаемыйТип) Тогда
        ВызватьИсключение "Не совпали имя или тип собственного поля " + ИмяПоля;
    КонецЕсли;
КонецПроцедуры

Функция ПолучитьСвоёПолноеОписание(Таблица)
    Если ТипЗнч(Таблица) <> Тип("ДоступнаяТаблицаСхемыЗапроса")
        Или НРег(Таблица.Имя) <> НРег("РегистрСведений.УчебнаяИстория85.СрезПоследних") Тогда
        ВызватьИсключение "Нужна доступная таблица только собственного периодического регистра";
    КонецЕсли;
    ПроверитьСвоёПоле(Таблица.Поля, "КодТовара", Тип("Строка"));
    ПроверитьСвоёПоле(Таблица.Поля, "Цена", Тип("Число"));
    Параметры = Таблица.Параметры;
    Если ТипЗнч(Параметры) <> Тип("ПараметрыДоступнойТаблицыСхемыЗапроса") Или Параметры.Количество() <> 2 Тогда
        ВызватьИсключение "У своего СрезПоследних должны быть два описания параметров";
    КонецЕсли;
    Описания = Новый Массив;
    Для Индекс = 0 По 1 Цикл
        Параметр = Параметры.Получить(Индекс);
        Если ТипЗнч(Параметр) <> Тип("ПараметрДоступнойТаблицыСхемыЗапроса")
            Или ТипЗнч(Параметр.Имя) <> Тип("Строка") Или Параметр.Имя = "" Тогда
            ВызватьИсключение "Не совпали тип или имя описания собственного параметра";
        КонецЕсли;
        Если Параметры.Найти(Параметр.Имя) <> Параметр Тогда
            ВызватьИсключение "Поиск по фактическому имени должен вернуть то же собственное описание";
        КонецЕсли;
        Если ТипЗнч(Параметр.ТипПараметра) <> Тип("ТипПараметраДоступнойТаблицыСхемыЗапроса")
            Или ТипЗнч(Параметр.ТипЗначения) <> Тип("ОписаниеТипов")
            Или ТипЗнч(Параметр.Варианты) <> Тип("ФиксированныйМассив")
            Или ТипЗнч(Параметр.ДоступныеПоля) <> Тип("ДоступныеПоляСхемыЗапроса") Тогда
            ВызватьИсключение "Не совпали все native-типы собственного описания параметра";
        КонецЕсли;
        Если Индекс = 0 Тогда
            Если Параметр.ТипПараметра <> ТипПараметраДоступнойТаблицыСхемыЗапроса.Значение
                Или Не Параметр.ТипЗначения.СодержитТип(Тип("Дата")) Тогда
                ВызватьИсключение "Первый параметр своего среза — значение периода, допускающее дату";
            КонецЕсли;
        Иначе
            Если Параметр.ТипПараметра <> ТипПараметраДоступнойТаблицыСхемыЗапроса.Условие Тогда
                ВызватьИсключение "Второй параметр своего среза — условие, не скаляр периода";
            КонецЕсли;
            ПроверитьСвоёПоле(Параметр.ДоступныеПоля, "КодТовара", Тип("Строка"));
        КонецЕсли;
        Типы = Параметр.ТипЗначения.Типы();
        Варианты = Новый Массив;
        Для Каждого Вариант Из Параметр.Варианты Цикл
            Варианты.Добавить(Новый Структура("Тип,Значение", ТипЗнч(Вариант), Вариант));
        КонецЦикла;
        Поля = Новый Массив;
        СобратьСвоиПоля(Параметр.ДоступныеПоля, "", Поля, 0);
        Описания.Добавить(Новый Структура("Имя,Вид,Типы,Варианты,Поля", Параметр.Имя,
            Параметр.ТипПараметра, Типы, Варианты, Поля));
        Сообщить("Позиция " + Строка(Индекс) + ": " + Параметр.Имя + "; вид=" + Строка(Параметр.ТипПараметра)
            + "; типов=" + Строка(Типы.Количество()) + "; вариантов=" + Строка(Варианты.Количество()));
    КонецЦикла;
    Возврат Описания;
КонецФункции

Процедура СобратьСвоиПоля(Коллекция, Префикс, Результат, Глубина)
    Если ТипЗнч(Коллекция) <> Тип("ДоступныеПоляСхемыЗапроса") Или Глубина > 32 Тогда
        ВызватьИсключение "Не совпал тип описаний полей или превышена глубина";
    КонецЕсли;
    Для Каждого Поле Из Коллекция Цикл
        Если ТипЗнч(Поле) <> Тип("ДоступноеПолеСхемыЗапроса") Тогда
            ВызватьИсключение "В своём минимальном регистре не нужны вложенные таблицы";
        КонецЕсли;
        ПолныйПуть = Префикс + Поле.Имя;
        Для Каждого Прежнее Из Результат Цикл
            Если Прежнее.Путь = ПолныйПуть Тогда
                ВызватьИсключение "Повторный путь собственного поля недопустим";
            КонецЕсли;
        КонецЦикла;
        Результат.Добавить(Новый Структура("Путь,Имя,Типы", ПолныйПуть, Поле.Имя, Поле.ТипЗначения.Типы()));
        СобратьСвоиПоля(Поле.Поля, ПолныйПуть + "/", Результат, Глубина + 1);
    КонецЦикла;
КонецПроцедуры

Процедура ПроверитьСвоиНаборыТипов(До, После)
    Если До.Количество() <> После.Количество() Тогда
        ВызватьИсключение "Не совпало число собственных типов";
    КонецЕсли;
    Для Каждого ТипПоля Из До Цикл
        Если После.Найти(ТипПоля) = Неопределено Тогда
            ВызватьИсключение "Не сохранился полный состав типов";
        КонецЕсли;
    КонецЦикла;
КонецПроцедуры

Процедура ПроверитьСохранностьОписаний(Было, Стало)
    Если Было.Количество() <> 2 Или Стало.Количество() <> 2 Тогда
        ВызватьИсключение "Нужно сохранить оба полных описания";
    КонецЕсли;
    Для Индекс = 0 По 1 Цикл
        До = Было[Индекс];
        После = Стало[Индекс];
        Если До.Имя <> После.Имя Или До.Вид <> После.Вид Или До.Поля.Количество() <> После.Поля.Количество()
            Или До.Типы.Количество() <> После.Типы.Количество() Или До.Варианты.Количество() <> После.Варианты.Количество() Тогда
            ВызватьИсключение "Не сохранились свойства собственного описания параметра";
        КонецЕсли;
        ПроверитьСвоиНаборыТипов(До.Типы, После.Типы);
        Для Каждого СтароеПоле Из До.Поля Цикл
            НайденноеПоле = Неопределено;
            Для Каждого НовоеПоле Из После.Поля Цикл
                Если НовоеПоле.Путь = СтароеПоле.Путь Тогда
                    НайденноеПоле = НовоеПоле;
                    Прервать;
                КонецЕсли;
            КонецЦикла;
            Если НайденноеПоле = Неопределено Тогда
                ВызватьИсключение "Не сохранился полный путь поля параметра";
            КонецЕсли;
            Если СтароеПоле.Имя <> НайденноеПоле.Имя Тогда
                ВызватьИсключение "Изменилось имя поля параметра";
            КонецЕсли;
            ПроверитьСвоиНаборыТипов(СтароеПоле.Типы, НайденноеПоле.Типы);
        КонецЦикла;
        Для НомерВарианта = 0 По До.Варианты.Количество() - 1 Цикл
            Старый = До.Варианты[НомерВарианта];
            НовыйВариант = После.Варианты[НомерВарианта];
            Если Старый.Тип <> НовыйВариант.Тип Или Старый.Значение <> НовыйВариант.Значение Тогда
                ВызватьИсключение "Изменились тип или значение реального варианта параметра";
            КонецЕсли;
        КонецЦикла;
    КонецЦикла;
КонецПроцедуры
УчебныеДоступныеТаблицы85.Форма

Своя внешняя обработка УчебныеДоступныеТаблицы85 → управляемая Форма → Модуль

Полный отдельный модуль формы; описания таблиц и родительские схемы остаются на сервере.

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

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

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

  1. Создать свою обычную СхемаЗапроса по полному собственному тексту и получить реальный ЗапросВыбораСхемыЗапроса. Его readonly ДоступныеТаблицы — дерево описаний источников, не строки результата и не список уже выбранных источников оператора.

  2. Обойти реальное дерево: элементы бывают группами или таблицами. У группы прочитать строковое Представление и readonly Состав; это визуальный путь, не техническое имя таблицы. Индекс проверяется в непосредственной коллекции, где элемент найден. Ограничение глубины32 — защитная граница нашего обхода, не обещание платформы.

  3. Найти собственное полное имя таблицы двумя способами: обходом и Найти. Проверить тип ДоступнаяТаблицаСхемыЗапроса, равенство найденных объектов и Получить по сохранённому непосредственному индексу. Не использовать локализованный заголовок группы как имя виртуальной таблицы.

  4. Проверить свои КодТовара и Цена в readonly Поля доступной таблицы. Это определения с типами Строка и Число, а не прочитанные товары/цены. Описание параметров состоит из двух объектов: значение периода и условие. Их реальные имена берутся из описания, поиск Найти выполняется по этим именам, не по выражению &ДатаЗапроса.

  5. Прочитать все свойства каждого описания: Имя, ТипПараметра, ТипЗначения, Варианты, ДоступныеПоля. Первое допускает дату и имеет вид Значение; второе имеет вид Условие и доступное измерение КодТовара. ФиксированныйМассив вариантов не редактируется; его реальные типы/значения сохраняются в собственном снимке, пустота не подменяется выдуманными пунктами выбора.

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

  7. Новой самостоятельной схемой разобрать сформированный текст и снова получить своё доступное описание по имени. Сверить его полностью с первым снимком. Сохранять обе родительские схемы до конца; не переносить их дочерние объекты между схемами и не удалять родителя.

  8. В этой версии русская и общая установленная справка противоречиво указывают коллекцию как аргумент ПараметрыДоступнойТаблицыСхемыЗапроса.Индекс. Этот метод здесь НЕ вызывается и не засчитывается в покрытие; позиции0и1 проверяются через Получить и поиск реального имени. Остальной урок от спорной сигнатуры не зависит.

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

  1. Будущий результат: найдено реальное собственное описание РегистрСведений.УчебнаяИстория85.СрезПоследних, показан фактический путь групп; два параметра имеют виды Значение и Условие. Положительное сообщение формы появляется только после всех серверных проверок.

  2. Имена параметров, подписи групп и число возможных вариантов показываются такими, как их вернула платформа. Не обещается фиксированная локализация или число всех системных таблиц. Самостоятельно изменённое выражение &ДругаяДата не должно менять описания параметров собственной таблицы.

  3. Будущий отрицательный контроль: вне опыта изменить только ожидание типа собственного КодТовара со Строка на Число в проверяющей процедуре; сохранить/F7 до свежего сеанса. Проверка должна отказать, хотя имена и количество элементов прежние. Вернуть ожидание, снова F7 до нового сеанса. Контроль здесь не исполнялся.

  4. Запрос данных и форма в1С не выполнялись; runtimeVerifiedScenarios=0. Проверки Python сверяют подготовку, код, собственные ожидания и установленные контракты, а не доказывают исполнение этого обхода.

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

Полная собственная задача объясняет дерево источников и контракт виртуальной таблицы, отличает readonly-описания от RW-выражений и сохраняет все наблюдавшиеся сведения при изменении собственного запроса.

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

  1. ДоступныеТаблицы.Найти может вернуть группу, доступную или вложенную таблицу; проверка типа обязательна. Индекс относится к непосредственной коллекции: рекурсивно найденный объект не обязательно находится прямо в корне.

  2. Представление группы — подпись для визуальной организации; она не является стабильным техническим идентификатором. Для выбора своего источника используется полное Имя таблицы, а не перевод подписи.

  3. Все прочитанные свойства описаний readonly. Изменён только реальный RW-параметр собственного рабочего запроса. Нет записей в регистр, чтения строк, транзакций, файлов, сети и изменений рабочих конфигураций.

  4. ПараметрыДоступнойТаблицы.Найти ищет по Имя; ПараметрыТаблицы.Найти из другого урока ищет по выражению с учётом форматирования. Эти похожие методы не взаимозаменяемы.

  5. Состав Варианты зависит от вида и конкретного параметра. Пустой фиксированный массив не означает, что параметр запрещён или его значение уже задано. Здесь не создаётся список произвольных разрешённых значений.

  6. Спорный Индекс описаний параметров остаётся непроверенным: обе установленные страницы8.5.1.1343 указывают тип коллекции вместо типа её элемента. Нет предположения, что ошибка документации автоматически доказывает иной фактический аргумент. Для полного покрытия этого метода нужно отдельное надёжное доказательство контракта; запуск1С не выполнялся.

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

Найти поля своего вложенного источника

Описание поля Количество содержит имя и тип, но не число 3 или 2. Числовой результат отдельно получаем выполнением собственной группировки.

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

Учебная база: создайте серверный общий модуль УчебныеЗадачи (флаг Сервер). Код без директив вставьте в тело процедуры ВыполнитьПример() Экспорт. Вызовите её из серверного обработчика команды учебной обработки. Не запускайте в рабочей базе.

Подготовка

  1. В учебной обработке или общем модуле выполните каждый фрагмент отдельно на сервере. Все запросы используют только свои числа и параметры, без справочников, документов и регистров рабочей базы.

  2. СхемаЗапроса редактирует структуру и формирует текст, а Запрос выполняет этот текст. Родительская схема должна оставаться в переменной, пока используются её дочерние объекты.

  3. Не переносите полученные дочерние объекты между разными схемами и не обращайтесь к элементу после его удаления. Упражнения удаления работают только со своей структурой в памяти.

Схема = Новый СхемаЗапроса;
Схема.УстановитьТекстЗапроса("ВЫБРАТЬ Книги.Название КАК Название, СУММА(Книги.Количество) КАК Количество
|ИЗ (ВЫБРАТЬ ""Книга"" КАК Название, 3 КАК Количество ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ ""Книга"", 2) КАК Книги
|ГДЕ Книги.Количество > 1
|СГРУППИРОВАТЬ ПО Книги.Название");
Если Схема.ПакетЗапросов.Количество() <> 1 Тогда
    ВызватьИсключение "Ожидался один свой запрос";
КонецЕсли;
Выбор = Схема.ПакетЗапросов.Получить(0);
Если ТипЗнч(Выбор) <> Тип("ЗапросВыбораСхемыЗапроса") Тогда
    ВызватьИсключение "Ожидалась своя выборка";
КонецЕсли;
Если Выбор.Операторы.Количество() <> 1 Тогда
    ВызватьИсключение "Ожидался один внешний оператор своего запроса";
КонецЕсли;
Оператор = Выбор.Операторы.Получить(0);
Источники = Оператор.Источники;
Если Источники.Количество() <> 1 Тогда
    ВызватьИсключение "Ожидался один собственный вложенный источник";
КонецЕсли;
Источник = Источники.НайтиПоПсевдониму("Книги");
Если Источник = Неопределено Тогда
    ВызватьИсключение "Не найден собственный псевдоним Книги";
КонецЕсли;
Вложенный = Источник.Источник;
Если ТипЗнч(Вложенный) <> Тип("ВложенныйЗапросСхемыЗапроса") Тогда
    ВызватьИсключение "Источник Книги не является вложенным запросом";
КонецЕсли;
Сообщить(Источники.Индекс(Источник) = 0);
Сообщить(Источники.Получить(0) <> Неопределено);
Сообщить(Источники.ПолучитьКорневыеИсточники().Количество() = 1);
Сообщить(Источник.Соединения.Количество() = 0);
Сообщить(Вложенный.Псевдоним = "Книги");
ДоступныеПоля = Вложенный.ДоступныеПоля;
ПолеКоличество = ДоступныеПоля.Найти("Количество");
Если ПолеКоличество = Неопределено Тогда
    ВызватьИсключение "В своих данных нет поля количества";
КонецЕсли;
Если ТипЗнч(ПолеКоличество) <> Тип("ДоступноеПолеСхемыЗапроса") Тогда
    ВызватьИсключение "Нужно обычное описание поля, не вложенная таблица";
КонецЕсли;
Сообщить(ДоступныеПоля.Количество() = 2);
Сообщить(ПолеКоличество.Имя = "Количество");
Сообщить(ПолеКоличество.ТипЗначения.СодержитТип(Тип("Число")));
Сообщить(ДоступныеПоля.Индекс(ПолеКоличество) >= 0);
Сообщить(ДоступныеПоля.Получить(0) <> Неопределено);
Сообщить("Дочерних описаний поля: " + Строка(ПолеКоличество.Поля.Количество()));
Сообщить("Роль: измерение " + Строка(ПолеКоличество.Роль.Измерение) + "; ресурс " + Строка(ПолеКоличество.Роль.Ресурс));
Запрос = Новый Запрос(Схема.ПолучитьТекстЗапроса());
Итог = Запрос.Выполнить().Выгрузить();
Если Итог.Количество() <> 1 Тогда
    ВызватьИсключение "Ожидалась одна группа собственных книг";
КонецЕсли;
Сообщить(Итог[0].Название = "Книга" И Итог[0].Количество = 5);

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

  1. Внешний оператор имеет один корневой источник Книги. Находим его по настоящему псевдониму и проверяем тип описания.

  2. ИсточникСхемыЗапроса — оболочка; её Источник содержит ВложенныйЗапросСхемыЗапроса, Соединения — отдельную коллекцию.

  3. ДоступныеПоля описывает колонки вложенного запроса. Поле Количество проверяется на отсутствие и правильный тип.

  4. ТипЗначения показывает числовой тип, не конкретное значение строки. Поля и Роль также описания; диагностические флаги не приравниваем к метаданным регистра.

  5. Выполнение внешнего запроса отдельно даёт одну группу Книга с количеством 5.

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

  1. Все проверки-сравнения Истина, параметры роли и число дочерних полей диагностические.

  2. Описание поля не выдаётся за строку данных; реальный итог 5 получен выполнением запроса.

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

Разделены оболочка источника, описания полей и фактические значения результата.

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

  1. Вложенный запрос не является справочником базы.

  2. Роль поля не даёт права доступа и не создаёт ресурс регистра автоматически.

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

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

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

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

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