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

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

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

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

Добавлен: 12.03.2019

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

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

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

Из текста запроса видно, что в результате запроса должны присутствовать общие итоги,
а также итоги по полям Товар и Клиент. Для обхода итоговых группировок мы будем
использовать обход выборки из результата запроса с типом обхода ПоГруппировкам.

Этот тип обхода мы рассматривали подробно в разделе «

Обход по группировкам

». Как

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

Вторым параметром в метод выборки Выбрать() передается список группировок,
разделенных запятыми, по которым будет производиться обход, а третьим параметром –
список группировок, из которых будут выбираться значения группировок для обхода.

Поясним назначение этих параметров на конкретном примере. Для решения поставленной
задачи создадим следующую клиентскую процедуру (листинг 2.46).

Листинг 2.46. Вывод результата отчета в табличном документе

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

Процедура формирования табличного документа выглядит следующим образом (листинг
2.47).

Листинг 2.47. Заполнение данными табличного документа


background image

background image

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

Рис. 2.57. Макет табличного документа

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

Далее получаются итоговые данные по клиентам. Для этого из результата запроса
получается выборка ВыборкаКлиентИтог с типом обхода ПоГруппировкам и списком
группировок для обхода "Клиент" (второй параметр метода Выбрать()). В результате
обхода этой выборки заполняются наименования клиентов в колонках. Соответствующие
области выводятся в результирующий табличный документ методом Присоединить(), т.
е. слева направо.

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

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


background image

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

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

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

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

В заключение в табличный документ выводится область подвала документа, полученная
из макета.

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

Рис. 2.58. Кросс-отчет по продажам товаров

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

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


background image

зависимости от того, были ли продажи за конкретную неделю или нет.

Для решения поставленной задачи нужно рассчитать итоги по полю типа Дата с
использованием конструкции языка запросов ПЕРИОДАМИ. Данная конструкция
указывается в предложении ИТОГИ после имени поля, по которому нужно рассчитать
итоги. После ключевого слова ПЕРИОДАМИ в скобках указывается вид периода
(СекундаМинутаЧасДеньНеделя и т. д.), а также могут быть указаны начальная и
конечные даты интересуемого периода. В случае, если начальные и конечные даты не
указаны, будут использованы первая и последняя даты, участвующие в результате
запроса.

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

Листинг 2.48. Вывод результата отчета в табличном документе

В серверную внеконтекстную функцию СформироватьОтчетСДополнениемДат()
помимо самого табличного документа передаются также даты начала и окончания
отчетного периода, которые вводятся в полях формы обработки перед формированием
табличного документа.

Процедура формирования табличного документа выглядит следующим образом (листинг
2.49).

Листинг 2.49. Заполнение данными табличного документа