Добавляет новый элемент коллекции и возвращает его.
Синтаксис
Добавить(<ДоступнаяТаблица>, <Псевдоним>)Добавить(<Тип>, <Псевдоним>)Добавить(<Тип>, <Имя>, <Псевдоним>)Полное описание, параметры и ограничения
ИсточникиСхемыЗапроса.Добавить (QuerySchemaSources.Add)
ИсточникиСхемыЗапроса (QuerySchemaSources)
Добавить (Add)
Доступен, начиная с версии 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 или остаток на складе не выдумываются как полученные данные.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.
Изменить условие соединения и проверить исчезновение строки
Добавляем к совпадению имени условие количества больше 3. У книги количество ровно 3: внутреннее соединение временно даёт пустой результат.
Где и как запускать
Учебная база: создайте серверный общий модуль УчебныеЗадачи (флаг Сервер). Код без директив вставьте в тело процедуры ВыполнитьПример() Экспорт. Вызовите её из серверного обработчика команды учебной обработки. Не запускайте в рабочей базе.
Подготовка
В учебной обработке или общем модуле выполните каждый фрагмент отдельно на сервере. Все запросы используют только свои числа и параметры, без справочников, документов и регистров рабочей базы.
СхемаЗапроса редактирует структуру и формирует текст, а Запрос выполняет этот текст. Родительская схема должна оставаться в переменной, пока используются её дочерние объекты.
Не переносите полученные дочерние объекты между разными схемами и не обращайтесь к элементу после его удаления. Упражнения удаления работают только со своей структурой в памяти.
Схема = Новый СхемаЗапроса;
Схема.УстановитьТекстЗапроса("ВЫБРАТЬ 3 КАК Количество, 250 КАК Цена");
Если Схема.ПакетЗапросов.Количество() <> 1 Тогда
ВызватьИсключение "Ожидался один собственный запрос";
КонецЕсли;
Выбор = Схема.ПакетЗапросов.Получить(0);
Если ТипЗнч(Выбор) <> Тип("ЗапросВыбораСхемыЗапроса") Тогда
ВызватьИсключение "Первый собственный запрос не является выборкой";
КонецЕсли;
Если Выбор.Операторы.Количество() <> 1 Тогда
ВызватьИсключение "Ожидался один собственный оператор ВЫБРАТЬ";
КонецЕсли;
Оператор = Выбор.Операторы.Получить(0);
Источники = Оператор.Источники;
ТоварыИсточник = Источники.Добавить(Тип("ВложенныйЗапросСхемыЗапроса"), "Товары");
ЦеныИсточник = Источники.Добавить(Тип("ВложенныйЗапросСхемыЗапроса"), "Цены");
ТоварыИсточник.Источник.Запрос.УстановитьТекстЗапроса("ВЫБРАТЬ ""Книга"" КАК Наименование, 3 КАК Количество ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ ""Ручка"", 1");
ЦеныИсточник.Источник.Запрос.УстановитьТекстЗапроса("ВЫБРАТЬ ""Книга"" КАК Наименование, 250 КАК Цена");
Поля = Оператор.ВыбираемыеПоля;
Поля.Очистить();
ПолеИмя = Поля.Добавить("Товары.Наименование");
ПолеКоличество = Поля.Добавить("Товары.Количество");
ПолеЦена = Поля.Добавить("ЕСТЬNULL(Цены.Цена, 0)");
КолонкаИмя = Выбор.Колонки.Найти(ПолеИмя);
КолонкаКоличество = Выбор.Колонки.Найти(ПолеКоличество);
КолонкаЦена = Выбор.Колонки.Найти(ПолеЦена);
Если КолонкаИмя = Неопределено Или КолонкаКоличество = Неопределено Или КолонкаЦена = Неопределено Тогда
ВызватьИсключение "Нет колонок собственных товаров и цен";
КонецЕсли;
КолонкаИмя.Псевдоним = "Наименование";
КолонкаКоличество.Псевдоним = "Количество";
КолонкаЦена.Псевдоним = "Цена";
Соединения = ТоварыИсточник.Соединения;
Связь = Соединения.Добавить(ЦеныИсточник, "Товары.Наименование = Цены.Наименование");
Связь.ТипСоединения = ТипСоединенияСхемыЗапроса.ЛевоеВнешнее;
Связь.ТипСоединения = ТипСоединенияСхемыЗапроса.Внутреннее;
Запрос = Новый Запрос(Схема.ПолучитьТекстЗапроса());
До = Запрос.Выполнить().Выгрузить();
Если До.Количество() <> 1 Тогда
ВызватьИсключение "Неожиданное число собственных строк соединения";
КонецЕсли;
Связь.Условие = Новый ВыражениеСхемыЗапроса("Товары.Наименование = Цены.Наименование И Товары.Количество > 3");
Сообщить(Не Связь.Условие.СодержитАгрегатнуюФункцию());
Сообщить(Связь.Условие.ТипЗначения().СодержитТип(Тип("Булево")));
Запрос = Новый Запрос(Схема.ПолучитьТекстЗапроса());
После = Запрос.Выполнить().Выгрузить();
Если После.Количество() <> 0 Тогда
ВызватьИсключение "Неожиданное число собственных строк соединения";
КонецЕсли;
Связь.Условие = Новый ВыражениеСхемыЗапроса("Товары.Наименование = Цены.Наименование");
Запрос = Новый Запрос(Схема.ПолучитьТекстЗапроса());
Восстановлено = Запрос.Выполнить().Выгрузить();
Если Восстановлено.Количество() <> 1 Тогда
ВызватьИсключение "Неожиданное число собственных строк соединения";
КонецЕсли;
Сообщить(До[0].Количество = 3);
Сообщить(После.Количество() = 0);
Сообщить(Восстановлено[0].Количество * Восстановлено[0].Цена = 750);Разбор по шагам
Сначала внутреннее соединение находит собственную книгу; число строк проверено до индексного доступа.
Условие — объект ВыражениеСхемыЗапроса, не строковое свойство. Создаём выражение конструктором и присваиваем целиком.
Логическое выражение не содержит агрегатной функции; рекомендуемый тип содержит Булево.
Число 3 не больше 3, поэтому совпадений после изменения нет. Пустой результат не индексируем.
Восстановив прежнее условие, отдельно выполняем запрос и проверяем сумму 750.
Как проверить результат
Пять сообщений Истина.
Количество строк До/После/Восстановлено: 1/0/1.
Ожидаемый результат
Видно влияние настоящего условия связи, а не только чтение свойства.
На что обратить внимание
Условия соединения и внешний ГДЕ могут давать разные результаты для внешних соединений.
Не подставляйте непроверенный пользовательский текст в выражение. Здесь весь текст собственный.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.