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