Тип: ДоступныеПоляСхемыЗапроса. Содержит вложенные поля доступного поля.
Полное описание, параметры и ограничения
ДоступноеПолеСхемыЗапроса.Поля (QuerySchemaAvailableField.Fields)
ДоступноеПолеСхемыЗапроса (QuerySchemaAvailableField)
Поля (Fields)
Доступен, начиная с версии 8.3.5.
Использование:
Только чтение.
Описание:
Тип: ДоступныеПоляСхемыЗапроса.
Содержит вложенные поля доступного поля.
Доступность:
Сервер, толстый клиент, внешнее соединение.
Использование в версии:
Доступен, начиная с версии 8.3.5.
Методическая информация
Практические примеры
Доступные таблицы запроса: дерево, собственный срез и полные описания параметров
До выполнения запроса найти свой СрезПоследних в дереве доступных таблиц, отделить группировку от имени источника и описание параметра от его выражения. Изменение периода и новый разбор текста не должны менять контракт собственной таблицы.
Где и как запускать
Полный серверный общий модуль УчебныеЗадачи только нового собственного стенда УчебныеПараметрыТаблицы85. Только метаданные и структуры в памяти; исполнение в1С не проверялось.
Подготовка
Подготовка полностью самостоятельная: НОВАЯ отдельная пустая учебная база, не копия рабочей, точно8.5.1.1343. Конфигурация УчебныеПараметрыТаблицы85, совместимость Не использовать. Единственный прикладной объект — свой регистр сведений УчебнаяИстория85. Расширений базы/сеанса, подписок, заданий и внешних источников нет; все другие модули вручную пусты.
Регистр УчебнаяИстория85: запись Независимый; периодичность В пределах секунды. Одно измерение КодТовара: Строка3. Один ресурс Цена: Число12,2. Реквизитов, регистраторов и обработчиков нет. Код сверяет точное имя конфигурации, версию, структуру и полные типы полей. Строки регистра не создавайте: для этой задачи используются только метаданные.
Общие → Общие модули → УчебныеЗадачи: Сервер=Истина, Глобальный=Ложь, ВызовСервера=Ложь, Привилегированный=Ложь; клиенты/внешнее соединение и повторное использование выключены. Вставьте ВЕСЬ основной модуль. Если этот собственный модуль был занят предыдущим упражнением, сохраните его копию отдельно и замените весь код только в своей учебной базе, не соединяйте два ВыполнитьПример.
Создайте свою внешнюю обработку УчебныеДоступныеТаблицы85 с управляемой Формой, командой/кнопкой Выполнить и действием Выполнить. Реквизитов формы не нужно. Полный отдельный модуль формы приведён ниже; объекты схем и описания остаются на сервере.
Вне активного опыта сохраните свою конфигурацию, закройте прежний свой сеанс без транзакции; Конфигурация → Обновить конфигурацию базы данных (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 → управляемая Форма → Модуль
Полный отдельный модуль формы; описания таблиц и родительские схемы остаются на сервере.
&НаКлиенте
Процедура Выполнить(Команда)
ВыполнитьНаСервере();
Сообщить("Доступная таблица, путь, описания параметров и сохранность метаданных проверены");
КонецПроцедуры
&НаСервереБезКонтекста
Процедура ВыполнитьНаСервере()
УчебныеЗадачи.ВыполнитьПример();
КонецПроцедурыРазбор по шагам
Создать свою обычную СхемаЗапроса по полному собственному тексту и получить реальный ЗапросВыбораСхемыЗапроса. Его readonly ДоступныеТаблицы — дерево описаний источников, не строки результата и не список уже выбранных источников оператора.
Обойти реальное дерево: элементы бывают группами или таблицами. У группы прочитать строковое Представление и readonly Состав; это визуальный путь, не техническое имя таблицы. Индекс проверяется в непосредственной коллекции, где элемент найден. Ограничение глубины32 — защитная граница нашего обхода, не обещание платформы.
Найти собственное полное имя таблицы двумя способами: обходом и Найти. Проверить тип ДоступнаяТаблицаСхемыЗапроса, равенство найденных объектов и Получить по сохранённому непосредственному индексу. Не использовать локализованный заголовок группы как имя виртуальной таблицы.
Проверить свои КодТовара и Цена в readonly Поля доступной таблицы. Это определения с типами Строка и Число, а не прочитанные товары/цены. Описание параметров состоит из двух объектов: значение периода и условие. Их реальные имена берутся из описания, поиск Найти выполняется по этим именам, не по выражению &ДатаЗапроса.
Прочитать все свойства каждого описания: Имя, ТипПараметра, ТипЗначения, Варианты, ДоступныеПоля. Первое допускает дату и имеет вид Значение; второе имеет вид Условие и доступное измерение КодТовара. ФиксированныйМассив вариантов не редактируется; его реальные типы/значения сохраняются в собственном снимке, пустота не подменяется выдуманными пунктами выбора.
Отдельно изменить Выражение периода рабочей ТаблицаСхемыЗапроса в &ДругаяДата. Полное описание доступной таблицы должно остаться прежним: имя/вид каждого параметра, весь состав типов, все пути/имена/типы доступных полей и все типы/значения вариантов сверяются со снимком. Порядок перечисления типов и полей не предполагается; повторные пути отклоняются. Контракт параметра не равен выбранному текстовому выражению.
Новой самостоятельной схемой разобрать сформированный текст и снова получить своё доступное описание по имени. Сверить его полностью с первым снимком. Сохранять обе родительские схемы до конца; не переносить их дочерние объекты между схемами и не удалять родителя.
В этой версии русская и общая установленная справка противоречиво указывают коллекцию как аргумент ПараметрыДоступнойТаблицыСхемыЗапроса.Индекс. Этот метод здесь НЕ вызывается и не засчитывается в покрытие; позиции0и1 проверяются через Получить и поиск реального имени. Остальной урок от спорной сигнатуры не зависит.
Как проверить результат
Будущий результат: найдено реальное собственное описание РегистрСведений.УчебнаяИстория85.СрезПоследних, показан фактический путь групп; два параметра имеют виды Значение и Условие. Положительное сообщение формы появляется только после всех серверных проверок.
Имена параметров, подписи групп и число возможных вариантов показываются такими, как их вернула платформа. Не обещается фиксированная локализация или число всех системных таблиц. Самостоятельно изменённое выражение &ДругаяДата не должно менять описания параметров собственной таблицы.
Будущий отрицательный контроль: вне опыта изменить только ожидание типа собственного КодТовара со Строка на Число в проверяющей процедуре; сохранить/F7 до свежего сеанса. Проверка должна отказать, хотя имена и количество элементов прежние. Вернуть ожидание, снова F7 до нового сеанса. Контроль здесь не исполнялся.
Запрос данных и форма в1С не выполнялись; runtimeVerifiedScenarios=0. Проверки Python сверяют подготовку, код, собственные ожидания и установленные контракты, а не доказывают исполнение этого обхода.
Ожидаемый результат
Полная собственная задача объясняет дерево источников и контракт виртуальной таблицы, отличает readonly-описания от RW-выражений и сохраняет все наблюдавшиеся сведения при изменении собственного запроса.
На что обратить внимание
ДоступныеТаблицы.Найти может вернуть группу, доступную или вложенную таблицу; проверка типа обязательна. Индекс относится к непосредственной коллекции: рекурсивно найденный объект не обязательно находится прямо в корне.
Представление группы — подпись для визуальной организации; она не является стабильным техническим идентификатором. Для выбора своего источника используется полное Имя таблицы, а не перевод подписи.
Все прочитанные свойства описаний readonly. Изменён только реальный RW-параметр собственного рабочего запроса. Нет записей в регистр, чтения строк, транзакций, файлов, сети и изменений рабочих конфигураций.
ПараметрыДоступнойТаблицы.Найти ищет по Имя; ПараметрыТаблицы.Найти из другого урока ищет по выражению с учётом форматирования. Эти похожие методы не взаимозаменяемы.
Состав Варианты зависит от вида и конкретного параметра. Пустой фиксированный массив не означает, что параметр запрещён или его значение уже задано. Здесь не создаётся список произвольных разрешённых значений.
Спорный Индекс описаний параметров остаётся непроверенным: обе установленные страницы8.5.1.1343 указывают тип коллекции вместо типа её элемента. Нет предположения, что ошибка документации автоматически доказывает иной фактический аргумент. Для полного покрытия этого метода нужно отдельное надёжное доказательство контракта; запуск1С не выполнялся.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.
Найти поля своего вложенного источника
Описание поля Количество содержит имя и тип, но не число 3 или 2. Числовой результат отдельно получаем выполнением собственной группировки.
Где и как запускать
Учебная база: создайте серверный общий модуль УчебныеЗадачи (флаг Сервер). Код без директив вставьте в тело процедуры ВыполнитьПример() Экспорт. Вызовите её из серверного обработчика команды учебной обработки. Не запускайте в рабочей базе.
Подготовка
В учебной обработке или общем модуле выполните каждый фрагмент отдельно на сервере. Все запросы используют только свои числа и параметры, без справочников, документов и регистров рабочей базы.
СхемаЗапроса редактирует структуру и формирует текст, а Запрос выполняет этот текст. Родительская схема должна оставаться в переменной, пока используются её дочерние объекты.
Не переносите полученные дочерние объекты между разными схемами и не обращайтесь к элементу после его удаления. Упражнения удаления работают только со своей структурой в памяти.
Схема = Новый СхемаЗапроса;
Схема.УстановитьТекстЗапроса("ВЫБРАТЬ Книги.Название КАК Название, СУММА(Книги.Количество) КАК Количество
|ИЗ (ВЫБРАТЬ ""Книга"" КАК Название, 3 КАК Количество ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ ""Книга"", 2) КАК Книги
|ГДЕ Книги.Количество > 1
|СГРУППИРОВАТЬ ПО Книги.Название");
Если Схема.ПакетЗапросов.Количество() <> 1 Тогда
ВызватьИсключение "Ожидался один свой запрос";
КонецЕсли;
Выбор = Схема.ПакетЗапросов.Получить(0);
Если ТипЗнч(Выбор) <> Тип("ЗапросВыбораСхемыЗапроса") Тогда
ВызватьИсключение "Ожидалась своя выборка";
КонецЕсли;
Если Выбор.Операторы.Количество() <> 1 Тогда
ВызватьИсключение "Ожидался один внешний оператор своего запроса";
КонецЕсли;
Оператор = Выбор.Операторы.Получить(0);
Источники = Оператор.Источники;
Если Источники.Количество() <> 1 Тогда
ВызватьИсключение "Ожидался один собственный вложенный источник";
КонецЕсли;
Источник = Источники.НайтиПоПсевдониму("Книги");
Если Источник = Неопределено Тогда
ВызватьИсключение "Не найден собственный псевдоним Книги";
КонецЕсли;
Вложенный = Источник.Источник;
Если ТипЗнч(Вложенный) <> Тип("ВложенныйЗапросСхемыЗапроса") Тогда
ВызватьИсключение "Источник Книги не является вложенным запросом";
КонецЕсли;
Сообщить(Источники.Индекс(Источник) = 0);
Сообщить(Источники.Получить(0) <> Неопределено);
Сообщить(Источники.ПолучитьКорневыеИсточники().Количество() = 1);
Сообщить(Источник.Соединения.Количество() = 0);
Сообщить(Вложенный.Псевдоним = "Книги");
ДоступныеПоля = Вложенный.ДоступныеПоля;
ПолеКоличество = ДоступныеПоля.Найти("Количество");
Если ПолеКоличество = Неопределено Тогда
ВызватьИсключение "В своих данных нет поля количества";
КонецЕсли;
Если ТипЗнч(ПолеКоличество) <> Тип("ДоступноеПолеСхемыЗапроса") Тогда
ВызватьИсключение "Нужно обычное описание поля, не вложенная таблица";
КонецЕсли;
Сообщить(ДоступныеПоля.Количество() = 2);
Сообщить(ПолеКоличество.Имя = "Количество");
Сообщить(ПолеКоличество.ТипЗначения.СодержитТип(Тип("Число")));
Сообщить(ДоступныеПоля.Индекс(ПолеКоличество) >= 0);
Сообщить(ДоступныеПоля.Получить(0) <> Неопределено);
Сообщить("Дочерних описаний поля: " + Строка(ПолеКоличество.Поля.Количество()));
Сообщить("Роль: измерение " + Строка(ПолеКоличество.Роль.Измерение) + "; ресурс " + Строка(ПолеКоличество.Роль.Ресурс));
Запрос = Новый Запрос(Схема.ПолучитьТекстЗапроса());
Итог = Запрос.Выполнить().Выгрузить();
Если Итог.Количество() <> 1 Тогда
ВызватьИсключение "Ожидалась одна группа собственных книг";
КонецЕсли;
Сообщить(Итог[0].Название = "Книга" И Итог[0].Количество = 5);
Разбор по шагам
Внешний оператор имеет один корневой источник Книги. Находим его по настоящему псевдониму и проверяем тип описания.
ИсточникСхемыЗапроса — оболочка; её Источник содержит ВложенныйЗапросСхемыЗапроса, Соединения — отдельную коллекцию.
ДоступныеПоля описывает колонки вложенного запроса. Поле Количество проверяется на отсутствие и правильный тип.
ТипЗначения показывает числовой тип, не конкретное значение строки. Поля и Роль также описания; диагностические флаги не приравниваем к метаданным регистра.
Выполнение внешнего запроса отдельно даёт одну группу Книга с количеством 5.
Как проверить результат
Все проверки-сравнения Истина, параметры роли и число дочерних полей диагностические.
Описание поля не выдаётся за строку данных; реальный итог 5 получен выполнением запроса.
Ожидаемый результат
Разделены оболочка источника, описания полей и фактические значения результата.
На что обратить внимание
Вложенный запрос не является справочником базы.
Роль поля не даёт права доступа и не создаёт ресурс регистра автоматически.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.