Файл: Хрусталева Е. Ю. Язык запросов 1С-Предприятия 8 (2013).pdf
ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 12.03.2019
Просмотров: 51806
Скачиваний: 8725
В начале второй главы в разделе «
» мы научились создавать с
помощью конструктора объект Запрос с нужным текстом запроса на языке запросов. При
этом в тексте модуля формы, обработки и т. п. конструктор запроса создавал
соответствующий фрагмент кода. Конечно, можно подобный код написать и
самостоятельно, но если запрос достаточно большой, конструктор экономит время
разработчика и избавляет от необходимости следить за всякими тонкостями синтаксиса
языка запросов.
Таким образом, первый этап выполнения запроса, показанный на схеме (см. рис. 2.31),
нам уже хорошо знаком.
Передача параметров в запрос
Теперь рассмотрим подробно второй этап выполнения запроса, показанный на схеме (см.
рис. 2.31).
Допустим, мы хотим добавить в запрос, получающий все записи из справочника Клиенты
(см. листинг 2.10), параметризированное условие так, чтобы видеть только тех клиентов,
в наименовании которых встречается определенная подстрока. Этот пример мы
рассматривали в разделе «
Как задать произвольное значение отбора записей из
Листинг 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. Обход выборки
Результат запроса может содержать записи, не имеющие иерархии (например, список
документов) или, наоборот, записи, обладающие иерархией. Например, список
иерархического справочника, содержащий группы, и подчиненные им элементы.
Устройство иерархического справочника мы подробно рассматривали в разделе «
получить записи иерархической таблицы и расположить их в порядке иерархии
Второй случай получения иерархических записей, когда в запросе рассчитываются итоги.
Дело в том, что при расчете итогов образуется некая иерархическая структура, поскольку
записи с одинаковым значением поля (полей), для которых рассчитываются итоги, в
результате запроса собираются (группируются) вместе и достраиваются итоговой
строкой. Эта итоговая строка является по отношению к ним родительской строкой,
стоящей на более высоком уровне иерархии.