СоединенияИсточникаЗапросаСхемыЗапроса.Количество

Методы · Count

Получает количество элементов в коллекции.

Синтаксис

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

СоединенияИсточникаЗапросаСхемыЗапроса.Количество (QuerySchemaQuerySourceJoins.Count)

СоединенияИсточникаЗапросаСхемыЗапроса (QuerySchemaQuerySourceJoins)

Количество (Count)

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

Синтаксис:
Количество()
Возвращаемое значение:
Тип: Число.

Описание:

Получает количество элементов в коллекции.

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

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

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

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

Методическая информация

Практические примеры

Найти и удалить только свою связь источников

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

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

Учебная база: создайте серверный общий модуль УчебныеЗадачи (флаг Сервер). Код без директив вставьте в тело процедуры ВыполнитьПример() Экспорт. Вызовите её из серверного обработчика команды учебной обработки. Не запускайте в рабочей базе.

Подготовка

  1. В учебной обработке или общем модуле выполните каждый фрагмент отдельно на сервере. Все запросы используют только свои числа и параметры, без справочников, документов и регистров рабочей базы.

  2. СхемаЗапроса редактирует структуру и формирует текст, а Запрос выполняет этот текст. Родительская схема должна оставаться в переменной, пока используются её дочерние объекты.

  3. Не переносите полученные дочерние объекты между разными схемами и не обращайтесь к элементу после его удаления. Упражнения удаления работают только со своей структурой в памяти.

Схема = Новый СхемаЗапроса;
Схема.УстановитьТекстЗапроса("ВЫБРАТЬ 3 КАК Количество, 250 КАК Цена");
Если Схема.ПакетЗапросов.Количество() <> 1 Тогда
    ВызватьИсключение "Ожидался один собственный запрос";
КонецЕсли;
Выбор = Схема.ПакетЗапросов.Получить(0);
Если ТипЗнч(Выбор) <> Тип("ЗапросВыбораСхемыЗапроса") Тогда
    ВызватьИсключение "Первый собственный запрос не является выборкой";
КонецЕсли;
Если Выбор.Операторы.Количество() <> 1 Тогда
    ВызватьИсключение "Ожидался один собственный оператор ВЫБРАТЬ";
КонецЕсли;
Оператор = Выбор.Операторы.Получить(0);
Источники = Оператор.Источники;
ТоварыИсточник = Источники.Добавить(Тип("ВложенныйЗапросСхемыЗапроса"), "Товары");
ЦеныИсточник = Источники.Добавить(Тип("ВложенныйЗапросСхемыЗапроса"), "Цены");
ТоварыИсточник.Источник.Запрос.УстановитьТекстЗапроса("ВЫБРАТЬ ""Книга"" КАК Наименование, 3 КАК Количество ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ ""Ручка"", 1");
ЦеныИсточник.Источник.Запрос.УстановитьТекстЗапроса("ВЫБРАТЬ ""Книга"" КАК Наименование, 250 КАК Цена");
Поля = Оператор.ВыбираемыеПоля;
Поля.Очистить();
ПолеИмя = Поля.Добавить("Товары.Наименование");
ПолеКоличество = Поля.Добавить("Товары.Количество");
ПолеЦена = Поля.Добавить("ЕСТЬNULL(Цены.Цена, 0)");
КолонкаИмя = Выбор.Колонки.Найти(ПолеИмя);
КолонкаКоличество = Выбор.Колонки.Найти(ПолеКоличество);
КолонкаЦена = Выбор.Колонки.Найти(ПолеЦена);
Если КолонкаИмя = Неопределено Или КолонкаКоличество = Неопределено Или КолонкаЦена = Неопределено Тогда
    ВызватьИсключение "Нет колонок собственных товаров и цен";
КонецЕсли;
КолонкаИмя.Псевдоним = "Наименование";
КолонкаКоличество.Псевдоним = "Количество";
КолонкаЦена.Псевдоним = "Цена";
Соединения = ТоварыИсточник.Соединения;
Связь = Соединения.Добавить(ЦеныИсточник, "Товары.Наименование = Цены.Наименование");
Связь.ТипСоединения = ТипСоединенияСхемыЗапроса.ЛевоеВнешнее;
Найденная = Соединения.НайтиПоПсевдониму("Цены");
Если Найденная = Неопределено Тогда
    ВызватьИсключение "Не найдена собственная связь с ценами";
КонецЕсли;
Если Соединения.Количество() <> 1 Тогда
    ВызватьИсключение "Ожидалась одна собственная связь";
КонецЕсли;
ИндексСвязи = Соединения.Индекс(Найденная);
Если ИндексСвязи < 0 Или ИндексСвязи >= Соединения.Количество() Тогда
    ВызватьИсключение "Недопустимый индекс собственной связи";
КонецЕсли;
Сообщить(Соединения.Получить(ИндексСвязи).Источник = ЦеныИсточник);
Сообщить(Соединения.НайтиПоИмени("НетТакойУчебнойТаблицы") = Неопределено);
Запрос = Новый Запрос(Схема.ПолучитьТекстЗапроса());
ДоУдаления = Запрос.Выполнить().Выгрузить();
Если ДоУдаления.Количество() <> 2 Тогда
    ВызватьИсключение "Неожиданное число собственных строк соединения";
КонецЕсли;
Сообщить(ДоУдаления.Количество() = 2);
Соединения.Удалить(ИндексСвязи);
Сообщить(Соединения.Количество() = 0);
Соединения.Очистить();
Сообщить(Соединения.Количество() = 0);

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

  1. Ищем связь по псевдониму созданного нами источника, а не по подписи товара.

  2. НайтиПоИмени предназначен для полного имени таблицы. У вложенного источника нет имени Справочник.Товары, поэтому проверяем отдельный случай отсутствия.

  3. Индекс проверен на оба края до Получить и Удалить.

  4. Пока связь существует, выполняем свой запрос и получаем оба товара.

  5. Удаляем элемент собственной коллекции в памяти. После этого не используем Связь или Найденная и не выполняем старую структуру запроса.

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

  1. Пять сообщений Истина.

  2. После удаления и очистки собственная коллекция соединений пуста.

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

Разобран жизненный цикл дочернего объекта связи.

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

  1. Удаление связи может изменить смысл запроса; без осознанной перестройки его не выполняют.

  2. Очистить здесь не удаляет ни товары, ни цены из базы.

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

Пересоздать свою связь по псевдониму

Метод Добавить принимает не только объект источника, но и его строковый псевдоним. Флаги необязательных соединений читаем отдельно от фактического типа связи.

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

Учебная база: создайте серверный общий модуль УчебныеЗадачи (флаг Сервер). Код без директив вставьте в тело процедуры ВыполнитьПример() Экспорт. Вызовите её из серверного обработчика команды учебной обработки. Не запускайте в рабочей базе.

Подготовка

  1. В учебной обработке или общем модуле выполните каждый фрагмент отдельно на сервере. Все запросы используют только свои числа и параметры, без справочников, документов и регистров рабочей базы.

  2. СхемаЗапроса редактирует структуру и формирует текст, а Запрос выполняет этот текст. Родительская схема должна оставаться в переменной, пока используются её дочерние объекты.

  3. Не переносите полученные дочерние объекты между разными схемами и не обращайтесь к элементу после его удаления. Упражнения удаления работают только со своей структурой в памяти.

Схема = Новый СхемаЗапроса;
Схема.УстановитьТекстЗапроса("ВЫБРАТЬ 3 КАК Количество, 250 КАК Цена");
Если Схема.ПакетЗапросов.Количество() <> 1 Тогда
    ВызватьИсключение "Ожидался один собственный запрос";
КонецЕсли;
Выбор = Схема.ПакетЗапросов.Получить(0);
Если ТипЗнч(Выбор) <> Тип("ЗапросВыбораСхемыЗапроса") Тогда
    ВызватьИсключение "Первый собственный запрос не является выборкой";
КонецЕсли;
Если Выбор.Операторы.Количество() <> 1 Тогда
    ВызватьИсключение "Ожидался один собственный оператор ВЫБРАТЬ";
КонецЕсли;
Оператор = Выбор.Операторы.Получить(0);
Источники = Оператор.Источники;
ТоварыИсточник = Источники.Добавить(Тип("ВложенныйЗапросСхемыЗапроса"), "Товары");
ЦеныИсточник = Источники.Добавить(Тип("ВложенныйЗапросСхемыЗапроса"), "Цены");
ТоварыИсточник.Источник.Запрос.УстановитьТекстЗапроса("ВЫБРАТЬ ""Книга"" КАК Наименование, 3 КАК Количество ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ ""Ручка"", 1");
ЦеныИсточник.Источник.Запрос.УстановитьТекстЗапроса("ВЫБРАТЬ ""Книга"" КАК Наименование, 250 КАК Цена");
Поля = Оператор.ВыбираемыеПоля;
Поля.Очистить();
ПолеИмя = Поля.Добавить("Товары.Наименование");
ПолеКоличество = Поля.Добавить("Товары.Количество");
ПолеЦена = Поля.Добавить("ЕСТЬNULL(Цены.Цена, 0)");
КолонкаИмя = Выбор.Колонки.Найти(ПолеИмя);
КолонкаКоличество = Выбор.Колонки.Найти(ПолеКоличество);
КолонкаЦена = Выбор.Колонки.Найти(ПолеЦена);
Если КолонкаИмя = Неопределено Или КолонкаКоличество = Неопределено Или КолонкаЦена = Неопределено Тогда
    ВызватьИсключение "Нет колонок собственных товаров и цен";
КонецЕсли;
КолонкаИмя.Псевдоним = "Наименование";
КолонкаКоличество.Псевдоним = "Количество";
КолонкаЦена.Псевдоним = "Цена";
Соединения = ТоварыИсточник.Соединения;
Связь = Соединения.Добавить(ЦеныИсточник, "Товары.Наименование = Цены.Наименование");
Связь.ТипСоединения = ТипСоединенияСхемыЗапроса.ЛевоеВнешнее;
Если Соединения.Количество() <> 1 Тогда
    ВызватьИсключение "Ожидалась одна собственная связь перед заменой";
КонецЕсли;
Соединения.Удалить(0);
НоваяСвязь = Соединения.Добавить("Цены", "Товары.Наименование = Цены.Наименование");
НоваяСвязь.ТипСоединения = ТипСоединенияСхемыЗапроса.Внутреннее;
НоваяСвязь.ОбязательноеСоединение = Истина;
НоваяСвязь.НачалоГруппыНеобязательныхСоединений = Ложь;
Сообщить(НоваяСвязь.ОбязательноеСоединение);
Сообщить(Не НоваяСвязь.НачалоГруппыНеобязательныхСоединений);
Сообщить(НоваяСвязь.Источник = ЦеныИсточник);
Запрос = Новый Запрос(Схема.ПолучитьТекстЗапроса());
Итог = Запрос.Выполнить().Выгрузить();
Если Итог.Количество() <> 1 Тогда
    ВызватьИсключение "Неожиданное число собственных строк соединения";
КонецЕсли;
Сообщить(Итог[0].Наименование = "Книга" И Итог[0].Цена = 250);

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

  1. Первое соединение создано по объекту ЦеныИсточник. Удаляем только его, не удаляя сам источник из родительской схемы.

  2. Второе соединение создаётся по строке Цены. Она должна совпадать с существующим псевдонимом, иначе Добавить выбросит исключение.

  3. Флаги ОбязательноеСоединение и НачалоГруппыНеобязательныхСоединений описывают специальные группы соединений; они не заменяют ТипСоединения.

  4. В обычном учебном запросе тип явно Внутреннее. Не приписываем изменение результата одним лишь флагам.

  5. НоваяСвязь указывает на собственный источник цен; выполнение возвращает книгу с ценой 250.

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

  1. Четыре сообщения Истина.

  2. Удалённая Связь не используется; результат проверен через новый объект соединения.

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

Показаны обе формы параметра Добавить и различие флагов связи.

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

  1. Этот урок не настраивает произвольную схему компоновки данных.

  2. Не обращайтесь к прежнему объекту Связь после Удалить.

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

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

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

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

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