Добавил:
sora.alai.102@gmail.com Делаю работы на заказ. Какие именно? Пишите. Или регайтесь на бирже, где я работаю: https://vsesdal.com/promo?ref=748568 Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Хрусталева Е. Ю. Язык запросов 1С-Предприятия 8 (2013)

.pdf
Скачиваний:
2185
Добавлен:
25.11.2018
Размер:
31.3 Mб
Скачать

Рис. 2.26. Окно конструктора запроса

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

ПоступлениеТоваров.Товар.Наименование.

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

Сформируем исходные данные для второго запроса. Перенесем справочник Товары в список источников запроса и выберем из этой таблицы поля Наименование и Производитель. Из временной таблицы ПоступлениеТоваров выберем поля Дата и Поставщик (рис. 2.27).

Рис. 2.27. Окно конструктора запроса

Поскольку в списке источников запроса содержатся две таблицы, свяжем левым соединением таблицу Товары с временной таблицей ПоступлениеТоваров (рис. 2.28).

Рис. 2.28. Окно конструктора запроса

подробнее

Раздел «Связи источников запроса».

В заключение на закладке Порядок зададим упорядочивание записей результата запроса по наименованиям товаров в порядке иерархии (рис. 2.29).

Рис. 2.29. Окно конструктора запроса

Поскольку при описании временной таблицы ПоступлениеТоваров мы задали тип значения ее полей, то мы могли бы выбрать все нужные для второго запроса поля из этой таблицы, не используя таблицу Товары (рис. 2.30).

Рис. 2.30. Окно конструктора запроса

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

Нажмем ОК и вернемся в модуль формы. Запрос, сформированный с помощью конструктора запроса, будет выглядеть следующим образом (листинг 2.9).

Листинг 2.9. Запрос, созданный конструктором

В результате мы получили текст пакетного запроса, аналогичный тому, который мы писали вручную (см. листинг 2.8).

Выполнение запросов из встроенного языка

На данном этапе изучения языка запросов мы можем, наконец, более подробно остановиться на том моменте, который раньше опускали в целях упрощения восприятия материала. Речь пойдет о выполнении запросов и обработке их результатов во встроенном языке.

В разделе «Общая схема выполнения запросов» мы рассматривали в самом простейшем виде схему выполнения запроса. Теперь рассмотрим ее более подробно. Выполнение запроса во встроенном языке состоит из следующих этапов:

Создание объекта Запрос с нужным текстом запроса на языке запросов. Установка параметров запроса с помощью метода УстановитьПараметр. Выполнение запроса.

Затем либо:

Получение выборки из результата запроса.

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

Либо:

1. Выгрузка результата в таблицу значений или дерево значений.

2. Обработка данных таблицы/дерева значений (например, перебор строк).

Графически это можно представить следующим образом (рис. 2.31):

Рис. 2.31. Схема выполнения запроса

Для формирования и выполнения запроса, а также для получения и обработки его результатов во встроенном языке предназначены следующие программные объекты:

Запрос, РезультатЗапроса,

ВыборкаИзРезультатаЗапроса.

Важно помнить, что вся работа с запросами выполняется только на сервере.

Создание запроса

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

Клиенты (листинг 2.10).

Листинг 2.10. Пример запроса, созданного во встроенном языке

В начале второй главы в разделе «Конструктор запроса» мы научились создавать с помощью конструктора объект Запрос с нужным текстом запроса на языке запросов. При этом в тексте модуля формы, обработки и т. п. конструктор запроса создавал соответствующий фрагмент кода. Конечно, можно подобный код написать и самостоятельно, но если запрос достаточно большой, конструктор экономит время разработчика и избавляет от необходимости следить за всякими тонкостями синтаксиса языка запросов.

Таким образом, первый этап выполнения запроса, показанный на схеме (см. рис. 2.31), нам уже хорошо знаком.

Передача параметров в запрос

Теперь рассмотрим подробно второй этап выполнения запроса, показанный на схеме (см.

рис. 2.31).

Допустим, мы хотим добавить в запрос, получающий все записи из справочника Клиенты (см. листинг 2.10), параметризированное условие так, чтобы видеть только тех клиентов, в наименовании которых встречается определенная подстрока. Этот пример мы рассматривали в разделе «Как задать произвольное значение отбора записей из таблицы» (листинг 2.11).

Листинг 2.11. Отбор записей из справочника «Клиенты» по параметризированному условию

В этом запросе мы использовали параметр ЧастьНаименования. Символ «%» заменяет в шаблоне строки любую последовательность символов, а значение параметра &ЧастьНаименования будет содержать подстроку для поиска в наименовании клиента.

Однако приведенный текст запроса (см. листинг 2.11) мы писали и выполняли в консоли запросов. Чтобы создать нужный фрагмент кода на встроенном языке, поместим курсор внутрь текста запроса без условия (см. листинг 2.10) и откроем конструктор запроса.

Затем на закладке Условия создадим требуемое параметризированное условие (рис. 2.32).

Рис. 2.32. Окно конструктора запроса

В результате конструктор запроса создаст следующий запрос (листинг 2.12).

Листинг 2.12. Запрос, созданный конструктором

Обратите внимание, что в процедуре на встроенном языке, в отличие от текста запроса в консоли запросов, каждую кавычку («"») в шаблоне строки нужно удваивать (листинг

2.13).

Листинг 2.13. Запись условия отбора

В условии отбора мы используем литерал строкового типа ("%"), который представляет собой набор символов, заключенных в кавычки. Во встроенном языке для задания в строке символа «"» (кавычка) необходимо записать две кавычки подряд.

Итак, мы написали на встроенном языке текст запроса, содержащего параметризированное условие (см. листинг 2.12). Но если текст запроса содержит параметры, то перед выполнением запроса значения параметров должны быть переданы

в запрос.

Это выполняется с помощью метода УстановитьПараметр() объекта Запрос (листинг

2.14).

Листинг 2.14. Установка параметров запроса во встроенном языке

Первым параметром в метод УстановитьПараметр() передается строка с именем параметра запроса ("ЧастьНаименования"), а вторым параметром передается значение реквизита формы обработки ЧастьНаименования. Этот фрагмент можно посмотреть в демонстрационной конфигурации «Язык запросов», прилагающейся к книге, в обработке

Работа с запросами.

Рассмотрим еще один подобный пример. Напишем на встроенном языке запрос для отбора из справочника тех клиентов, телефоны которых не соответствуют заданному шаблону. Условие отбора этого запроса содержит параметр ШаблонТелефона, значение которого перед выполнением запроса передается в запрос (листинг 2.15).

Листинг 2.15. Установка параметров запроса во встроенном языке

Первым параметром в метод УстановитьПараметр() передается строка с именем параметра запроса ("ШаблонТелефона"), а вторым параметром передается значение реквизита формы обработки ШаблонТелефона. Этот фрагмент можно посмотреть в демонстрационной конфигурации «Язык запросов», прилагающейся к книге, в обработке

Работа с запросами.

Получение выборки из результата запроса

После присвоения текста и установки параметров запрос запускается на выполнение с помощью метода Выполнить() объекта Запрос. Именно в этот момент и происходит чтение данных из базы данных. Прочитанные данные возвращаются в виде объекта РезультатЗапроса, содержащего выбранные данные из базы данных (листинг 2.16).

Листинг 2.16. Выполнение запроса

Таким образом, происходит третий этап выполнения запроса, показанный на схеме (см.

рис. 2.31).

Результат выполнения запроса может не содержать строк. Проверку этого следует выполнять с помощью метода Пустой() объекта РезультатЗапроса (листинг 2.17).

Листинг 2.17. Проверка результата запроса на наличие записей

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

Далее, чтобы обработать данные, содержащиеся в объекте РезультатЗапроса, из него получается выборка с помощью метода Выбрать(), который возвращает новый объект ВыборкаИзРезультатаЗапроса, то есть коллекцию данных, предназначенную для обхода ее элементов (листинг 2.18).

Листинг 2.18. Получение выборки из результата запроса

Таким образом, происходит четвертый этап выполнения запроса, показанный на схеме

(см. рис. 2.31).

Обход выборки из результата запроса

Теперь рассмотрим подробно пятый этап выполнения запроса, показанный на схеме (см. рис. 2.31). На этом этапе и происходит то, ради чего, собственно, создавался и выполнялся запрос – программная обработка результатов запроса для последующего представления их пользователю, например, вывода результатов запроса в табличный документ.

Для обхода выборки из результата запроса нужно организовать цикл, в котором перебираются элементы коллекции данных, содержащихся в объекте

ВыборкаИзРезультатаЗапроса. Для этого используется метод выборки Следующий(),

который позволяет перейти к следующей записи результата запроса в соответствии с порядком обхода выборки (об этом будет рассказано ниже).

Этот метод вызывается в цикле Пока Выборка.Следующий() … Цикл до тех пор, пока не будет получено значение Ложь. При первом проходе цикла метод Следующий() позиционирует выборку на первую запись.

Следует иметь в виду, что если выборка из результата запроса получена, но ее метод Следующий() еще ни разу не вызывался (то есть выборка еще не спозиционирована), то значения полей выборки будут не определены, например, их нельзя будет посмотреть в отладчике.

При обходе выборки в теле цикла производятся необходимые действия над данными, полученными с помощью запроса (листинг 2.19).

Листинг 2.19. Обход выборки

Результат запроса может содержать записи, не имеющие иерархии (например, список документов) или, наоборот, записи, обладающие иерархией. Например, список иерархического справочника, содержащий группы, и подчиненные им элементы. Устройство иерархического справочника мы подробно рассматривали в разделе «Как получить записи иерархической таблицы и расположить их в порядке иерархии».

Второй случай получения иерархических записей, когда в запросе рассчитываются итоги. Дело в том, что при расчете итогов образуется некая иерархическая структура, поскольку записи с одинаковым значением поля (полей), для которых рассчитываются итоги, в результате запроса собираются (группируются) вместе и достраиваются итоговой строкой. Эта итоговая строка является по отношению к ним родительской строкой, стоящей на более высоком уровне иерархии.