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