Файл: Хрусталева Е. Ю. Язык запросов 1С-Предприятия 8 (2013).pdf
ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 12.03.2019
Просмотров: 51823
Скачиваний: 8725
В процедуре сначала создается менеджер временных таблиц МенеджерВТ, затем
создается запрос Запрос, выбирающий данные о поступлении товаров за период. С ним
связывается менеджер временных таблиц. При выполнении этого запроса
(Запрос.Выполнить()) данные, выбранные запросом, помещаются во временную таблицу
ПоступлениеТоваров. Результат выполнения первого запроса включает одну колонку
Количество, содержащую количество строк, помещенных во временную таблицу.
Затем создается второй запрос Запрос2. В качестве менеджера временных таблиц для
него также указывается МенеджерВТ. Это значит, что второй запрос получает доступ к
временной таблице, созданной при выполнении первого запроса. То есть он может
использовать временную таблицу ПоступлениеТоваров в качестве источника данных
точно так же, как и таблицу базы данных.
После выполнения второго запроса выполняется обход выборки результата запроса, и в
итоге в окне сообщений мы получаем аналогичный результат, что и при выполнении
пакетного запроса (см. листинг 2.35) в консоли запросов (рис. 2.50).
Рис. 2.50. Использование данных временной таблицы с помощью встроенного языка
Этот пример можно посмотреть в демонстрационной конфигурации «Язык запросов»,
прилагающейся к книге, в обработке Работа с запросами.
При этом запросов, использующих общий менеджер временных таблиц, может быть
несколько, и во всех этих запросах будут доступны данные всех временных таблиц,
созданных с помощью запросов с использованием того же менеджера временных таблиц.
Необходимо учитывать, что временные таблицы будут существовать в памяти
компьютера до закрытия менеджера временных таблиц (автоматически или
принудительно методом Закрыть()) или до исполнения запроса, связанного с этим
менеджером, уничтожающего временную таблицу с помощью конструкции УНИЧТОЖИТЬ.
Необходимо учитывать, что в одном прикладном решении может быть создано
произвольное количество менеджеров временных таблиц, каждый из которых хранит свой
набор временных таблиц. Каждая временная таблица однозначно идентифицируется
своим именем, и в пределах одного менеджера временных таблиц все временные
таблицы должны иметь уникальные имена.
Использование таблицы значений в качестве источника временной таблицы
Временная таблица может быть создана как на основе таблиц базы данных, так и на
основе внешнего источника данных. В качестве внешнего источника могут выступать:
таблица значений,
табличная часть,
результат запроса.
Для того чтобы создать временную таблицу на основании внешнего источника, следует в
тексте запроса в списке источников указать имя параметра, в который будет помещен
внешний источник. Остальной синтаксис идентичен обычному созданию временной
таблицы.
Рассмотрим пример создания временной таблицы на основе таблицы значений и
дальнейшее использование этих данных в других запросах. Предположим, существует
некая таблица значений, хранящая данные об оценках товаров (в числовом выражении),
поставленных покупателями при покупке товаров. У каждого товара может быть
множество оценок в этой таблице значений. Нам требуется вывести список всех товаров
из справочника Товары и наряду с наименованием товара вывести соответствующую ему
среднюю оценку пользователей, полученную из таблицы значений.
Как это реализовать? Для выполнения поставленной задачи сначала нам потребуется
поместить данные из таблицы значений во временную таблицу. Затем запросом к этой
временной таблице сгруппировать данные по товарам, получить среднюю оценку для
каждого товара и поместить результат группировки в другую временную таблицу. После
этого в основном запросе нам нужно связать левым соединением справочник товаров со
второй временной таблицей по наименованиям товаров, выбрать нужные поля из таблиц и
затем программно обработать результаты этого основного запроса.
Начнем выполнять наш план по частям и разбирать наши действия по мере выполнения.
Прежде всего, создадим таблицу значений об оценках товаров, поставленных
покупателями, и заполним ее простым добавлением строк. Конечно, на самом деле
таблица значений программно заполняется данными более сложным образом, но нас
сейчас это не интересует. Мы рассмотрим самый простой вариант (листинг 2.38).
Листинг 2.38. Создание и заполнение таблицы значений
В данной функции мы создаем и заполняем данными таблицу значений ТЗ. Она будет
содержать две колонки: Товар (типа Строка) и Оценка (типа Число). Здесь очень важен
один нюанс. Обратите внимание, что при добавлении колонок в коллекцию колонок
таблицы значений вторым параметром передается объект ОписаниеТипов, описывающий
допустимые типы значений для колонки. Это важно. Если этого не сделать, то при
выполнении запроса, в котором таблица значений выступает как источник данных, будет
получена следующая ошибка (рис. 2.51).
Рис. 2.51. Ошибка при использовании в запросе нетипизированной таблицы значений
Таким образом, чтобы запрос мог использовать в качестве внешнего источника таблицу
значений, у этой таблицы значений должны быть явно указаны типы значений,
содержащиеся в колонках. Фрагмент кода для создания типизированной таблицы
значений выделен в листинге 2.38 жирным шрифтом.
Теперь поместим данные из таблицы значений во временную таблицу (листинг 2.39).
Листинг 2.39. Использование таблицы значений в качестве источника запроса
В данном фрагменте кода мы вызываем функцию ЗаполнитьТаблицуЗначений(), которая
возвращает заполненную данными типизированную таблицу значений. После этого мы
создаем менеджер временных таблиц МенеджерВТ, затем создаем запрос Запрос,
который помещает данные из таблицы значений во временную таблицу ОценкиТоваров. С
ним связывается менеджер временных таблиц. Это значит, что все другие запросы,
использующие этот менеджер, будут иметь доступ к данным временной таблицы.
Особенность использования внешнего источника в качестве источника запроса состоит в
том, что в списке источников в предложении ИЗ мы указываем параметр
&ВнешнийИсточник и затем при установке значения параметра передаем в него таблицу
значений ТЗ.
Теперь, поскольку у каждого товара может быть множество оценок в таблице значений,
нам нужно сгруппировать данные полученной временной таблицы ОценкиТоваров по
товарам, получить среднюю оценку для каждого товара и поместить результат
группировки в другую временную таблицу (листинг 2.40).
Листинг 2.40. Группировка данных временной таблицы, получение усредненных оценок по каждому товару