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

ВУЗ: Не указан

Категория: Не указан

Дисциплина: Не указана

Добавлен: 12.03.2019

Просмотров: 51827

Скачиваний: 8725

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.
background image

В данном фрагменте кода мы создаем второй запрос Запрос2. В качестве менеджера
временных таблиц для него также указываем МенеджерВТ. Это значит, что второй запрос
получает доступ к временной таблице, созданной при выполнении первого запроса.

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

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

Подробнее

Документация «1С:Предприятие 8.3. Руководство разработчика», раздел 8.2 «Язык
запросов», а также встроенная справка 

Справка > Содержание справки >

1С:Предприятие > Встроенный язык > Работа с запросами > Выполнение и
работа с запросами во встроенном языке > Работа с временными таблицами

.

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

Листинг 2.41. Вывод всех товаров из справочника «Товары» с соответствующими им усредненными пользовательскими
оценками


background image

В данном фрагменте кода мы создаем третий запрос Запрос3. В качестве менеджера
временных таблиц для него также указываем МенеджерВТ. Это значит, что третий запрос
получает доступ к временным таблицам, созданным при выполнении первого и второго
запросов.

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

Как уже говорилось ранее, для тех товаров из справочника, для которых не найдено
соответствий во временной таблице, в поле выборки запроса Оценка будут находиться
значения типа NULL. При этом если посмотреть значение этого поля в отладчике, то мы
увидим просто пустую строку, так как представление NULL значений – пустая строка.
Чтобы иметь возможность при обходе выборки обращаться к значениям поля Оценка как
к числовым значениям, мы при помощи функции языка запросов ЕСТЬNULL() заменяем
значения типа NULL числом 0.

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


background image

Рис. 2.52. Использование таблицы значений в качестве источника временной таблицы

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

Примеры решения различных задач с использованием запросов

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

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

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

Листинг 2.42. Получение всех родителей для элемента иерархического справочника


background image

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

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

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

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


background image

элемента.

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

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

Листинг 2.43. Получение всех родителей для элемента иерархического справочника

Например, в корне справочника Товары есть группа товаров Обувь. Эта группа содержит