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

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

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

Этот пример можно посмотреть в демонстрационной конфигурации «Язык запросов», прилагающейся к книге, в обработке Работа с запросами.

подробнее

О работе с табличным документом подробнее можно прочитать в книге «Решение специальных прикладных задач в «1С:Предприятии 8.2» из серии «Профессиональная разработка».

Вывод в диаграмму

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

2.30).

Листинг 2.30. Процедуры для вывода результата запроса в диаграмму

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

Теперь создадим собственно фрагмент кода для вывода результата запроса в диаграмму. Для этого установим курсор внутрь процедуры ЗаполнитьДиаграмму() и

вызовем из контекстного меню пункт Конструктор запроса с обработкой результата.

Подтвердим, что мы хотим создать новый запрос.

На закладке конструктора Обработка результатов в группе Тип обработки выберем опцию Вывод в диаграмму (рис. 2.44).

Рис. 2.44. Окно конструктора запроса с обработкой результата

На закладке конструктора Таблицы и поля несколько изменим запрос – уберем из списка полей выборки поля Дата и Сумма, так как они в этом примере не нужны (рис. 2.45).

Рис. 2.45. Окно конструктора запроса с обработкой результата

На закладке конструктора Итоги из итоговых полей также уберем поле Сумма (рис. 2.46).

Рис. 2.46. Окно конструктора запроса с обработкой результата

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

(листинг 2.31).

Листинг 2.31. Фрагмент процедуры для вывода результата запроса в диаграмму, созданный с помощью конструктора запроса с обработкой результата

В результате в процедуре ЗаполнитьДиаграмму() сначала создается и выполняется запрос, определенный в конструкторе. Затем диаграмма Диаграмма, переданная в функцию, очищается, и на время ее заполнения данными отключается обновление и автотранспонирование диаграммы. Тип диаграммы здесь не определяется, но по умолчанию он устанавливается как Гистограмма объемная.

Далее начинается обход двух вложенных друг в друга выборок – итоговых группировок Клиент и Товар. В цикле обхода первой выборки ВыборкаКлиент методом УстановитьСерию() определяются серии диаграммы. В цикле обхода вложенной в нее выборки ВыборкаТовар методом УстановитьТочку() определяются точки диаграммы и методом УстановитьЗначение() устанавливается значение серии диаграммы в точке.

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

Таким образом, при вызове процедуры ВыводВДиаграмму() в поле диаграммы мы получим следующий результат (рис. 2.47).

Рис. 2.47. Вывод результата запроса в диаграмму

Таким образом, мы видим те же данные о количестве заказанных товаров по клиентам, что и в поле табличного документа (см. рис. 2.43), но представленные в виде гистограммы.

Этот пример можно посмотреть в демонстрационной конфигурации «Язык запросов», прилагающейся к книге, в обработке Работа с запросами.

подробнее

О работе с диаграммой подробнее можно прочитать в книге «Решение специальных прикладных задач в «1С:Предприятии 8.2» из серии «Профессиональная разработка».

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

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

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

ТаблицаЗначений или ДеревоЗначений, в зависимости от переданного параметра

ТипОбхода.

Если устанавливается прямой тип обхода (по умолчанию), то будет создана таблица значений, иначе – дерево значений. Далее таблица значений/дерево значений может быть обработана средствами встроенного языка или показана пользователю в виде таблицы в форме (листинг 2.32).

Листинг 2.32. Варианты выгрузки результата запроса в таблицу значений

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

РасчетныеСчета.

Создадим реквизит формы СписокПоставщиков типа ТаблицаЗначений с колонками Код, Наименование и Счета, который и будет содержать данные результата запроса, и перетащим его в дерево элементов формы обработки. СписокПоставщиков будет заполняться данными в серверной процедуре ЗаполнитьТЗ() и при возвращении на клиент отображаться пользователю в соответствующей таблице формы (листинг 2.33).

Листинг 2.33. Заполнение таблицы значений результатами запроса

В данной процедуре сначала выполняется запрос к справочнику-владельцу Поставщики. Результат запроса выгружается в таблицу значений ТабЗнач. Эта таблица значений будет содержать поля, соответствующие полям выборки запроса – Код, Наименование и Владелец (ссылка на поставщика). Затем реквизит СписокПостащиков очищается.

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

Далее организуется перебор записей таблицы значений ТабЗнач с помощью цикла Для Каждого Из … Цикл. В этом цикле добавляются записи в СписокПостащиков, и поля Код и Наименование этой таблицы значений заполняются результатами первого запроса.

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

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

(рис. 2.48).

Рис. 2.48. Вывод результата запроса в таблицу значений

Этот пример можно посмотреть в демонстрационной конфигурации «Язык запросов», прилагающейся к книге, в обработке Работа с запросами.

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

подробнее

Раздел «Не использовать запросы в цикле».

Отладка запросов

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

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

Например, в предыдущем разделе в процедуре ЗаполнитьТЗ() после выполнения второго запроса и до получения выборки выгрузим результат запроса в таблицу значений

(листинг 2.34).

Листинг 2.34. Фрагмент процедуры «ЗаполнитьТЗ()»

Для того чтобы таблица значений ТЗ заполнилась значениями выполнения запроса, установим точку останова на следующую строку (Выборка = РезультатЗапроса.Выбрать()). Запустим «1С:Предприятие» в режиме отладки. Выполним команду для вывода результата запроса в таблицу значений в обработке

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

После остановки программы двойным щелчком выделим слово ТЗ и нажмем кнопку

Вычислить выражение (Shift + F9) на панели инструментов Отладка конфигурации.

Выделим строку ТЗ в окне Результат и нажмем кнопку Показать значения в отдельном окне (или F2) над окном результата, и мы увидим таблицу значений, содержащую результат выполнения запроса (рис. 2.49).

Рис. 2.49. Просмотр таблицы значений, содержащей результат запроса

Использование временных таблиц с помощью встроенного языка

В этом разделе мы рассмотрим, как использовать данные временной таблицы с помощью встроенного языка. В разделе «Временные таблицы и пакетные запросы» мы использовали данные временной таблицы в пакетном запросе. При этом в первом запросе пакета создавалась временная таблица ПоступлениеТоваров, содержащая данные о поступлении товаров за определенный период. А во втором запросе пакета таблица справочника Товары связывалась левым соединением с этой временной таблицей, и в результате выполнения данного пакетного запроса в консоли запросов мы получали список всех товаров в порядке иерархии справочника Товары с данными об их поступлении за период (листинг 2.35).

Листинг 2.35. Вывод всех товаров в порядке иерархии справочника «Товары» с данными об их поступлении за ноябрь

Теперь выполним то же самое из встроенного языка.

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

Чтобы получить доступ к этим данным, используется объект встроенного языка МенеджерВременныхТаблиц, предназначенный для хранения данных временных таблиц. Для этого следует создать программный объект МенеджерВременныхТаблиц, затем создать объект Запрос и связать его с созданным менеджером временных таблиц через свойство запроса МенеджерВременныхТаблиц (листинг 2.36).

Листинг 2.36. Создание менеджера временных таблиц и установка его связи с запросом

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

Таким образом, пакетный запрос (см. листинг 2.35) можно переписать следующим образом (листинг 2.37).

Листинг 2.37. Вывод всех товаров в порядке иерархии справочника «Товары» с данными об их поступлении за ноябрь