ДоступныеТаблицыСхемыЗапроса

Типы · QuerySchemaAvailableTables

Коллекция доступных таблиц схемы запроса.

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

ДоступныеТаблицыСхемыЗапроса (QuerySchemaAvailableTables)

ДоступныеТаблицыСхемыЗапроса (QuerySchemaAvailableTables)

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

Элементы коллекции:
ГруппаДоступныхТаблицСхемыЗапроса, ДоступнаяТаблицаСхемыЗапроса
Для объекта доступен обход коллекции посредством оператора Для каждого … Из … Цикл. При обходе выбираются группа доступных таблиц или доступная таблица.
Возможно обращение к группе доступных таблиц или к доступной таблице посредством оператора [...]. В качестве аргумента передается индекс.

Методы:
Индекс (IndexOf)
Количество (Count)
Найти (Find)
Получить (Get)

Описание:

Коллекция доступных таблиц схемы запроса.

Доступность:

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

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

Доступен, начиная с версии 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С не выполнялся.

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

Источники схемы: доступная таблица для замены и поиск по полному имени

Переключаем свою схему списка кодов и наименований между собственным справочником товаров и собственным ПВХ. Новый источник берётся из реальных доступных таблиц этой схемы; поля пересоздаются явно. Возвращаем исходный полный текст и проверяем независимую копию без выполнения запроса.

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

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

Подготовка

  1. Нужна НОВАЯ отдельная учебная база, не копия рабочей, на точно8.5.1.1343: имя конфигурации УчебныеХарактеристики85, совместимость Не использовать. Используйте собственную модель из урока характеристик или создайте её заново по следующим пунктам. Рабочие конфигурации, расширения и данные не меняйте.

  2. Единственный справочник УчебныеТовары85 и единственный ПВХ УчебныеВиды85: оба неиерархические, код Строка3, наименование40, без реквизитов/табличных частей/обработчиков. В ПВХ Тип только Число12,2, дополнительные значения не назначены. Никаких элементов/предопределённых записей не требуется.

  3. Единственный независимый непериодический регистр УчебныеЗначения85: измерения Товар типа СправочникСсылка.УчебныеТовары85 и Вид типа ПланВидовХарактеристикСсылка.УчебныеВиды85; ресурс Значение Число12,2; без реквизитов и обработчиков. Он остаётся частью согласованного собственного стенда, но источником этого запроса не является.

  4. Общий модуль УчебныеЗадачи: Сервер=Да, Вызов сервера=Да, Клиент=Нет, Глобальный=Нет, Привилегированный=Нет. Вставьте весь основной модуль. Своя внешняя обработка УчебнаяЗаменаИсточника85 → управляемая Форма: команда/кнопка Выполнить с действием Выполнить, реквизиты не нужны. Полный отдельный модуль формы дан ниже.

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

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

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

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

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

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

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

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

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

Процедура ПроверитьПовторныйРазборИсточника(Схема, Имя)
    Повторная = Новый СхемаЗапроса;
    Повторная.РежимКомпоновкиДанных = Ложь;
    Повторная.УстановитьТекстЗапроса(Схема.ПолучитьТекстЗапроса());
    ПроверитьСвойИменованныйИсточник(Повторная, Имя);
КонецПроцедуры
УчебнаяЗаменаИсточника85.Форма

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

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

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

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

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

  1. Создать обычную СхемаЗапроса с одним физическим источником Справочник.УчебныеТовары85 и псевдонимом Данные. Проверить полный заголовок: Код/Наименование в порядке0/1, выражения Данные.Код/Данные.Наименование и по одному типу Строка у обеих колонок.

  2. НайтиПоИмени получает полное имя Справочник.УчебныеТовары85, не Данные. Сравнить результат с текущим Источники.Получить(0), его индексом0 и единственным источником. Проверить самостоятельный полный разбор и сохранить отдельную копию.

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

  4. Вызвать Источники.Заменить(0, Доступная). Метод не заявляется возвращающим новый источник: после вызова заново взять текущий Источники.Получить(0). Проверить физический тип и полное новое имя; ИсточникСхемыЗапроса.Источник readonly и не присваивается.

  5. Явно задать новому ТаблицаСхемыЗапроса.Псевдоним значение Данные. Заново Добавить два собственных выражения строками. По возвращённым ВыражениеСхемыЗапроса найти реальные колонки и назначить Код/Наименование. Не предполагается автоматическое исправление любых чужих выражений после замены.

  6. Проверить ПВХ через НайтиПоИмени, полный заголовок и новую самостоятельную схему. Исходная копия всё ещё относится к справочнику, даже когда оригинал относится к ПВХ. Затем тем же безопасным порядком вернуть справочник и сравнить полный канонический текст оригинала и копии.

  7. Три независимых контрольных разбора проверяют старт, замену и восстановление. Не проверяется только число источников или наличие имени в строке — каждый раз проверены тип, источник, псевдоним, все выражения, типы и порядок колонок. Ни одна схема не исполняется.

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

  1. Будущий результат: при замене полное имя источника меняется на ПланВидовХарактеристик.УчебныеВиды85, после восстановления — Справочник.УчебныеТовары85. Псевдоним Данные, две строковые колонки Код/Наименование и их порядок сохранены. Независимая копия всегда хранит исходный справочник.

  2. Будущий отрицательный контроль вне опыта: заменить только ожидание выражения Данные.Код на Данные.Наименование в заголовке. После сохранения/F7 до нового собственного сеанса полная проверка должна отказать при том же размере двух колонок. Вернуть код и до нового сеанса снова сохранить/F7. Здесь контроль не выполнялся.

  3. runtimeVerifiedScenarios=0. Это статически проверенный пример модели запроса, не результат чтения записей, не перенос элементов между справочником/ПВХ и не доказательство интерфейса конструктора.

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

Полный пример показывает нужный тип аргумента замены, отличие полного имени от псевдонима, согласование новых полей и восстановление собственной структуры без неизвестных объектов.

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

  1. Заменить принимает Число и доступную таблицу из своей схемы. Нельзя передавать строку имени, ТаблицаСхемыЗапроса прежнего источника или описание чужой схемы. При следующей замене доступный объект получается заново.

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

  3. Псевдоним таблицы поддерживает запись; свойство Источник readonly. После очистки/замены не обращаемся к прежним дочерним выражениям и источникам. Колонки создаются через выбираемые поля, не несуществующим Колонки.Добавить.

  4. Старые поля явно очищаются и новые создаются по согласованным кодам/наименованиям. Это не универсальный мигратор запросов с объединениями, соединениями, группировками или вложенными таблицами; для них нужна отдельная проверка зависимостей.

  5. Операции меняют только свою СхемаЗапроса в памяти. Запрос.Выполнить, записи, транзакции, сеть и рабочие базы отсутствуют. Ссылочные типы справочника и ПВХ не считаются одинаковыми: здесь выбираются только их подготовленные строковые Код и Наименование.

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

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

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

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

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