Файл: Хрусталева Е. Ю. Язык запросов 1С-Предприятия 8 (2013).pdf
ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 12.03.2019
Просмотров: 51828
Скачиваний: 8725
подчиненную группу Детская обувь, которая, в свою очередь, включает товар Пинетки.
Если мы выберем элемент справочника Пинетки, то получим следующий результат (рис.
2.53).
Рис. 2.53. Получение всех родителей для элемента иерархического справочника
Этот пример можно посмотреть в демонстрационной конфигурации «Язык запросов»,
прилагающейся к книге, в обработке Работа с запросами.
Создание запроса из произвольного источника
Иногда бывает нужно сформировать и выполнить запрос из произвольного источника.
Например, требуется получить список товаров, использованных в любой табличной части
любого документа конфигурации. То есть заранее мы не знаем, из какого документа и из
какой табличной части нужно получать данные, знаем только, что интересующий нас
реквизит табличной части имеет имя Товар и ссылочный тип на справочник Товары.
Для реализации поставленной задачи с помощью свойства глобального контекста
Метаданные нам нужно обойти коллекцию всех документов, существующих в
конфигурации, и всех табличных частей этих документов. И при этом динамически
сформировать текст запроса, объединяющего запросы, которые получают данные из
каждой табличной части каждого документа (листинг 2.44).
Листинг 2.44. Динамическое формирование текста запроса
В данной процедуре организуется цикл для обхода элементов коллекции документов
конфигурации. Затем организуется вложенный в него цикл для обхода табличных частей
каждого документа. В теле этого цикла динамически формируется имя источника запроса,
исходя из имени документа и имени табличной части документа в метаданных
("Документ." + ИмяДокумента + "." + ИмяТЧ + " КАК Товары").
Текст запроса, объединяющего запросы из каждого источника, формируется в несколько
проходов вложенного цикла. Если текст запроса не пустой, то в него добавляется
конструкция ОБЪЕДИНИТЬ ВСЕ. Обратите внимание, что помимо наименования товара в
каждом запросе выбирается строковой литерал с именем табличной части документа под
псевдонимом Источник. Чтобы использовать строку с именем источника в тексте
запроса, мы должны вокруг имени источника (""" + ИмяДокумента + "." + ИмяТЧ + """ КАК
Источник) написать подряд две кавычки, плюс еще одну кавычку, которая ограничивает
присоединяемый фрагмент текста запроса.
После выхода из циклов мы присоединяем к общему запросу секцию описания итогов по
полю Источник. Это сделано просто для лучшего визуального восприятия, чтобы таким
образом сгруппировать товары, относящиеся к одному документу.
Чтобы посмотреть текст запроса, сформированного в результате обхода документов и их
табличных частей, установим точку останова на строку РезультатЗапроса =
Запрос.Выполнить(). Запустим «1С:Предприятие» в режиме отладки. После остановки
программы двойным щелчком выделим слово Запрос и нажмем кнопку Вычислить
выражение (Shift + F9) на панели инструментов Отладка конфигурации. Выделим строку
Текст в окне Результат и нажмем кнопку Показать значения в отдельном окне (или
F2) над окном результата, и мы увидим динамически сформированный текст запроса (рис.
2.54).
Рис. 2.54. Отладка текста запроса
После формирования запроса он выполняется, и список всех неповторяющихся товаров
(ВЫБРАТЬ РАЗЛИЧНЫЕ) из табличной части каждого документа выводится в окно
сообщений (рис. 2.55).
Рис. 2.55. Создание запроса из произвольного источника
В результате для каждой табличной части каждого документа конфигурации формируется
свой список товаров. Заметьте, что документы, не имеющие табличных частей (например,
документ Событие в нашей демонстрационной конфигурации), не попадают в обход.
Этот пример можно посмотреть в демонстрационной конфигурации «Язык запросов»,
прилагающейся к книге, в обработке Работа с запросами.
В случае, если нас интересует общий список товаров, независимо от того, в каком
документе он используется, то можно убрать из запроса секцию описания итогов. Для
того чтобы перечень товаров не повторялся, для объединения запросов нужно
использовать конструкцию ОБЪЕДИНИТЬ, а не ОБЪЕДИНИТЬ ВСЕ. Результат запроса в
этом случае нужно обходить линейным способом.
Создание кросс-отчета
Иногда бывает нужно обойти выборку результата отчета с типом обхода ПоГруппировкам
и при этом получить значения всех группировок в пределах другой группировки. Например,
получить итоговые значения продаж по всем клиентам для каждого товара и т. п.
Такая возможность может понадобиться при построении различных кросс-отчетов,
представляющих информацию в табличном виде. Хотя кросс-отчеты легче, быстрее и,
главное, методически правильнее формировать с помощью системы компоновки данных,
в этом разделе мы покажем, как получить данные для кросс-отчета и вывести его в
табличный документ с помощью встроенного языка.
Особенность получения данных для кросс-отчета (см. рис. 2.56) состоит в том, что при
этом нужно, чтобы запрос внутри родительской группировки (например, по товарам)
получил не только те вложенные группировки (например, по клиентам), по которым есть
данные (продажи), но и те, по которым данных нет. Например, группировку по клиенту
Орлов для товара Туфли и группировку по клиенту Соколов для товара Молоко. То есть
чтобы в каждой строке таблицы было одинаковое количество столбцов, иначе таблица
«поедет». Поэтому при получении вложенных группировок нужно использовать третий
параметр ВСЕ метода выборки Выбрать().
Рассмотрим пример. Предположим, нам необходимо получить кросс-отчет по продажам
товаров различным покупателям. Список товаров необходимо вывести в строках
таблицы, а покупателей – в колонках (рис. 2.56).
Рис. 2.56. Кросс-отчет по продажам товаров
Для получения данных о продажах мы будем использовать виртуальную таблицу
Обороты регистра накопления Продажи, при обращении к которой автоматически
формируются итоговые данные о продажах в разрезе товаров и покупателей.
подробнее
Подробнее о назначении и использовании виртуальной таблицы оборотов регистра
накопления будет рассказано в разделе «
».
Данные для отчета будут получаться при выполнении следующего запроса (листинг 2.45).
Листинг 2.45. Запрос для получения данных