отчета замедлится. Поэтому система, при выборе ссылочных полей, предлагает сразу же включить в список выбранных полей и представления ссылочных полей, в расчете на то, что именно они и будут использованы для вывода в документ.
После этого перейдем на закладку «Порядок» и укажем, что результат запроса должен быть сначала упорядочен по значению поля «Дата», а затем - по значению поля «ОказаниеУслуги. Ссылка»:
![]()
Перейдем на закладку «Отчет» и сбросим флаг «Использовать построитель отчета»:
Сбросим флаг «Использовать построитель отчета»...

Нажмем «ОК». Конструктор сформирует форму отчета и макет. Откроем модуль формы и найдем в нем процедуру «РеестрДокументовОказаниеУслуги». В этой процедуре как раз

166
167
Использование основных объектов конфигурации
Создание or
ieTOB





формируется текст запроса, который будет использован для получения интересующих нас данных:
Запрос. Текст =
"ВЫБРАТЬ
| ОказаниеУслуги. Дата КАК Дата,
| ОказаниеУслуги. Номер КАК Номер,
| ОказаниеУслуги. Склад,
| ОказаниеУслуги. Склад. Представление,
| ОказаниеУслуги. Мастер,
| ОказаниеУслуги. Мастер. Представление,
| ОказаниеУслуги. Клиент,
| ОказаниеУслуги. Клиент. Представление
| ИЗ
| Документ. ОказаниеУслуги КАК ОказаниеУслуги
|
|УПОРЯДОЧИТЬ ПО
| Дата,
| Номер";
После ключевого слова ИЗ указываются источники данных - исходные таблицы запроса, содержимое которых обрабатывается в запросе. В данном случае это объектная (ссылочная) таблица «Документ. ОказаниеУслуги». После ключевого слова КАК указывается псевдоним источника данных. В нашем случае это «ОказаниеУслуги». В дальнейшем к этому источнику данных можно будет обращаться в тексте запроса, используя псевдоним.
Такое обращение мы видим в описании полей выборки:
"ВЫБРАТЬ
| ОказаниеУслуги. Дата КАК Дата,
| ОказаниеУслуги. Номер КАК Номер,
| ОказаниеУслуги. Склад,
| ОказаниеУслуги. Склад. Представление,
| ОказаниеУслуги. Мастер,
| ОказаниеУслуги. Мастер. Представление,
| ОказаниеУслуги. Клиент,
| ОказаниеУслуги. Клиент. Представление
![]()




Текст запроса начинается, как мы говорили выше, с части описания запроса:
"ВЫБРАТЬ
I ОказаниеУслуги. Дата КАК Дата,
I ОказаниеУслуги. Номер КАК Номер,
I ОказаниеУслуги. Склад,
I ОказаниеУслуги. Склад. Представление,
I ОказаниеУслуги. Мастер,
I ОказаниеУслуги. Мастер. Представление,
I ОказаниеУслуги. Клиент,
1 ОказаниеУслуги. Клиеит. Представление
1ИЗ
I Документ. ОказаниеУслуги КАК ОказаниеУслуги
Описание запроса начинается с обязательного ключевого слова ВЫБРАТЬ. Затем следует список полей выборки, в котором описываются поля, которые должны содержаться в результате запроса. Этот список может содержать как собственно поля, так и некоторые выражения, вычисляемые на основе значений полей.
Поля выборки также могут иметь псевдонимы, по которым в дальнейшем в тексте запроса можно обращаться к этому полю. В нашем случае это псевдонимы «Дата» и «Номер».
После части описания запроса в нашем примере следует часть упорядочивания результатов:
|УПОРЯДОЧИТЬ ПО
| Дата, | Номер";
Предложение УПОРЯДОЧИТЬ ПО позволяет сортировать строки в результате запроса. После этого ключевого предложения располагается выражение упорядочивания, которое, в общем случае, представляет собой перечисление полей (выражений) и порядка вывода. В нашем случае упорядочивание будет выполняться сначала По полю выборки, обращение к которому выполняется через псевдоним - «Код», а затем по полю - «Номер». В обоих случаях порядок сортировки будет по возрастанию, который является Порядком сортировки по-умолчанию.
168
169
Использование основных объектов конфигурации
Создание отчетов
![]()
Теперь обратим внимание на то, как выводится результат запроса в табличный документ.
В начале процедуры мы получаем макет отчета, из которого затем получаем существующие в нем области в соответствующие переменные:




Процедура РеестрДокументовОказаниеУслуги(ТабДок) Экспорт //{{КОНСТРУКТОР_ВЫХОДНЬК_ФОРМ(РеестрДокументовОказаниеУслугн) // Данный фрагмент построен конструктором. // При повторном использовании конструктора, // внесенные вручную изменения будут утеряны!!!
Макет = ПолучитьМакет("РеестрДокументовОказаниеУслуги"); Запрос = Новый Запрос;
ОбластьЗаголовок = Макет. ПолучитьОбласть("Заголовок"); ОбластьПодвал = Макет. ПолучитьОбласть("Подвал"); ОбластьШапкаТаблицы = Макет. ПолучитьОбласть("ШапкаТаблицы"); ОбластьПодвалТаблицы = Макет. ПолучитьОбласть("ПодвалТаблицы"'); ОбластьДетальныхЗаписей = Макет. ПолучитьОбласть("Детали");





Результат = Запрос. Выполнить();
ОбластъЗаголовок = Макет. ПолучитьОбласть("Заголовок"); ОбластьПодвал = Макет. ПолучитьОбласть("Подвал"); ОбластьШапкаТаблицы = Макет. ПолучитьОбласть("ШапкаТаблицы"); ОбластьПодвалТаблицы = Макет. ПолучитьОбласть("ПодвалТаблицы"); ОбластьДетальныхЗаписей = Макет. ПолучитьОбласть("Детали");
ТабДок. Очистить(); ТабДок. Вывести(ОбластьЗаголовок); ТабДок. Вывести(ОбластьШапкаТаблицы); ТабДок. НачатьАвтогрутшировкуСтрок();
ВыборкаДетали = Результат. Выбрать();
Пока ВыборкаДетали. Следукнций() Цикл
ОбластьДетальныхЗаписей. Параметры. Заполнить(ВыборкаДетали);
ТабДок. Вывести(ОбластьДетальньпсЗаписей, ВыборкаДетали. Уровень()); КонецЦикла;
ТабДок. ЗакончитьАвтогруппировкуСтрок();
ТабДок. Вывести(ОбластьПодвалТаблицы);
ТабДок. Вывести(ОбластьПодвал);
/Л}КОНСТРУКТОР_ВЬКОДНЫХ_ФОРМ КонецПроцедуры
В форме отчета расположен элемент управления ПолеТабличногоДокумента с именем «ТабДок», который заполняется данными на основе макета, сформированного конструктором.
Затем мы очищаем табличный документ и выводим в него те области, которые не содержат данных, получаемых из результата запроса:
ТабДок. Очистить(); ТабДок. Вывести(ОбластьЗаголовок); ТабДок. Вывести(ОбластьШапкаТаблицы); ТабДок. НачатьАвтогруппировкуСтрок();
В последней строке конструктор добавил начало автогруппировки строк. В данном примере у нас нет строк, которые нужно было бы группировать, но по умолчанию конструктор всегда предлагает выполнить группировку строк в табличном документе. На скорость вывода отчета такой вызов влиять не будет, поэтому оставим текст конструктора без изменений.
После этого мы получаем выборку из результата запроса, которую перебираем в цикле:
Результат = Запрос. Выполнить(); ВыборкаДетали = Результат. Выбрать();
Пока ВыборкаДетали. Следующий() Цикл
ОбластьДетальныхЗаписей. Параметры. Заполнить(ВыборкаДетали)-ТабДок. Вывести(ОбластьДетальныхЗаписей)-КонецЦикла;


170
171
Использование основных объектов конфигурации
Создание отчетов




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

Таким образом на примере этого отчета мы продемонстрировали, как использовать конструктор выходной формы и познакомились с некоторыми основными конструкциями языка запросов.
Отчет Рейтинг услуг
О |
тчет «Рейтинг услуг» будет содержать информацию о том, выполнение каких услуг принесло OOO «На все руки мастер» наибольшую прибыль в указанном периоде. На примере отчета «Рейтинг услуг» мы проиллюстрируем, как отбирать данные в некотором периоде, как задавать параметры запроса и как использовать в запросе данные из нескольких таблиц и включать в результат запроса все данные одного из источников.
Создадим новый объект конфигурации Отчет «РейтингУслуг». Перейдем на закладку «Макеты» и вызовем конструктор выходной формы.
Выберем объектную (ссылочную) таблицу справочника «Номенклатура» и виртуальную таблицу регистра накопления «Продажи. Обороты». Для того чтобы исключить неоднозначность имен в запросе, переименуем таблицу «Номенклатура» в «СпрНоменклатура» (контекстное меню правой кнопки мыши).
Затем установим курсор на таблицу «ПродажиОбороты» и вызовем диалог ввода параметров виртуальной таблицы:
Откроем диалог ввода параметров виртуальной таблицы


172
173
Использование основных объектов конфигурации
Создание отчетов
Укажем, что начало и конец периода будут переданы в соответствующих параметрах «ДатаНачала» и «ДатаОкончания» (символ «&» перед именем указывает, что это параметр запроса):
Единственное, что нам останется сделать, это сбросить флаг «Все» у таблицы регистра и установить его у таблицы справочника.
|

Затем выберем из таблиц поля «СпрНоменклатура. Ссылка» и «ПродажиОбороты. ВыручкаОборот»:
Будем выбирать все элементы из справочника «Номенклатура»
j.. - СпрНоменклатура. Ссылка
! _ СпрНоменклатура. Представление
'■ | ПродажиОборотыВыручкаОборот
Перейдем на закладку «Связи» и увидим, что конструктор уже создал связь между двумя выбранными таблицами - значение изменения регистра «Номенклатура» должно быть равно ссылке на элемент справочника «Номенклатура».
Установка флага «Все» у таблицы справочника будет означать, что из справочника будут выбраны все элементы и этим элементам будет поставлено в соответствие значение оборота выручки из регистра. Таким образом, в результате запроса будут присутствовать все услуги, и для некоторых из них будут указаны обороты выручки. Для тех услуг, которые не оказывались в выбранном периоде, не будет указано ничего.
Перейдем на закладку «Условия» и зададим условия выбора элементов из справочника «Номенклатура». При задании условий выбора мы снова будем использовать параметры запроса. Первым условием должно быть то, что выбранный элемент не является группой (для этого следует переключиться в режим «Произвольное условие»).
Вторым условием должно быть то, что выбранный элемент является услугой (это - «Простое условие»):
|

174
175
Использование основных объектов конфигурации
Создание отчетов




В дальнейшем, перед выполнением запроса, мы передадим в параметр «ВидНоменклатуры» - соответствующее значение перечисления.
Перейдем на закладку «Объединения/Псевдонимы» и укажем, что представление элемента справочника будет иметь псевдоним «Услуга», а поле регистра будет иметь псевдоним «Выручка»:
![]()
Перейдем на закладку «Порядок» и укажем, что результат запроса должен быть отсортирован по убыванию значения поля «Выручка».
На закладке «Итоги» определим, что нужно выводить общие итоги, и они должны представлять собой сумму значений поля «Выручка»:
![]()
На закладке «Отчет» сбросим флаг «Использовать построитель отчета».
Теперь перейдем на закладку «Выходная форма». Укажем, что параметры «ДатаОкончания» и «ДатаНачала» будут редактироваться в форме в полях ввода с типом «Дата». Для параметра «ВидНоменклатуры» мы наоборот снимем признак редактирования в форме:
В этой процедуре, в той части, где выполняется установка параметров запроса, определим значение параметра «ВидНоменклатуры» (исправления выделены жирным шрифтом):
Запрос. Текст =
"ВЫБРАТЬ
| СпрНоменклатура. Ссылка КАК Услуга,
| СпрНоменклатура. Представление КАК Представление,
| ПродажиОбороты. ВыручкаОборот КАК Выручка
|И3
| Справочник. Номенклатура КАК СпрНоменклатура
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления. Продажи, Обороты(&ДатаНачала,
| &ДатаОкончания,,)
| КАК ПродажиОбороты
| ПО ПродажиОбороты. Номенклатура = СпрНоменклатура. Ссылка
ГДЕ
| (СпрНоменклатура. ЭтоГруппа = Ложь) И
| СпрНоменклатура. ВидНоменклатуры = &ВидНоменклатуры
|УПОРЯДОЧИТЬ ПО | ВыручкаУБЫВ
|ИТОГИ СУММА(Выручка) ПО | ОБЩИЕ";
ЗапросУстановитьПараметрС'ВидНоменклатуры",
Перечисления. ВидыНоменклатуры. Услуга);
Запрос. УстановитьПараметр("ДатаНачала",ДатаНачала); Запрос. УстановитьПараметрС'ДатаОкончания", ДатаОкончания);
Теперь рассмотрим текст запроса, сформированный конструктором:





Нажмем «ОК». Платформа сформирует макет и форму отчета Откроем модуль формы и найдем в нем процедуру «РейтингУслуг».
Запрос. Текст =
"ВЫБРАТЬ
| СпрНоменклатура. Ссылка КАК Услуга,
| СпрНоменклатура. Представление КАК Представление,
|ПродажиОбороты. ВыручкаОборот КАК Выручка
| Справочник. Номенклатура КАК СпрНоменклатура
ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления. Продажи. Обороты(&ДатаНачала,


176
177
Использование основных объектов конфигурации
Создание отчетов






![]()

| КАК ПродажиОбороты
| ПО ПродажиОбороты. Номенклатура = СпрНоменклатура. Ссылка
|
|ГДЕ
| (СпрНоменклатура. ЭтоГруппа = Ложь) И
| СпрНоменклатура. ВидНоменклатуры = &ВидНоменклатуры
|
|УПОРЯДОЧИТЬ ПО
| ВыручкаУБЫВ
|
|ИТОГИ СУММА(Выручка) ПО
| ОБЩИЕ";
Сначала, как обычно, идет часть описания запроса и в ней есть новые для нас конструкции.
При описании источников запроса (после ключевого слова ИЗ), использована возможность определения нескольких источников запроса:
|из
| Справочник. Номенклатура КАК СпрНоменклатура
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления. Продажи. Обороты(&ДатаНачала,
| &ДатаОкончания,,)
| КАК ПродажиОбороты
| ПО ПродажиОбороты. Номенклатура = СпрНоменклатура. Ссылка
В данном случае выбираются записи из двух источников: «СпрНоменклатура» и «ПродажиОбороты», причем ключевым предложением ЛЕВОЕ СОЕДИНЕНИЕ... ПО описан способ, которым будут скомбинированы между собой записи этих двух источников.
ЛЕВОЕ СОЕДИНЕНИЕ означает, что в результат запроса надо включить комбинации записей из обоих источников, которые соответствуют указанному после ключевого слова ПО условию. Кроме этого, в результат запроса надо включить еще и записи из первого (указанного слева от слова СОЕДИНЕНИЕ) источника, для которых не найдено соответствующих условию записей из второго источника.
В описании первого источника и условия соединения нет для нас ничего нового, а вот при описании второго источника, используется возможность задания параметров виртуальной таблицы запроса:
| РегистрНакопления. Продажи. Обороты(&ДатаНачала, &ДатаОкончания,,)
Первым параметром передается начало периода расчета итогов, вторым - конец периода. В результате исходная таблица будет содержать только обороты, рассчитанные в переданном периоде. Здесь всегда следует помнить, что если мы передаем в качестве этих параметров дату (а в нашем случае так и будет), то дата содержит и время с точностью до секунды.
Если заранее известно, что пользователя не будут интересовать результаты работы отчета в периодах, указанных с точностью до секунд, то следует учесть следующую особенность: по умолчанию время в дате установлено в 00:00:00. Поэтому, если не предпринять специальных мер, получится, что когда пользователь задаст период отчета с 01.03.2004 по 31.03.2004, итоги регистра будут рассчитаны с начала дня 01.03.2004 00:00:00 по начало дня 31.03.2004 00:00:00. Таким образом, данные за 31 число, отличные от начала дня, в расчет не войдут, что сильно удивит пользователя.
Для того чтобы исключить эту ситуацию, следует сделать две вещи.
Во-первых, в форме отчета ограничить пользователя в возможностях ввода даты начала и даты окончания, установив для соответствующих полей ввода состав даты как «Дата»:
Определим состав даты...


178
179
Использование основных объектов конфигурации
Создание отчетов



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



ПроцедураДействияФормыРейтингУслугСформировать(Кнопка) //{{КОНСТРУКТОР_ВЫХОДНЫХ_ФОРМ_ПРОЦЕДУРА_ВЫЗОВА(РейтингУслуг) //Данный фрагмент построен конструктором. // При повторном использовании конструктора, // внесенные вручную изменения будут утеряны!!!
ТабДок = ЭлементыФормы. ТабличноеПоле;
РейтингУслуг(ТабДок, Неопределено, ДатаНачала, КонецДня(ДатаОкончания));
//}}КОНСТРУКТОР_ВЫХОДНЫХ_ФОРМ_ПРОЦЕДУРА_ВЫЗОВА
КонецПроцедуры____________________________________________________
Продолжим рассматривать текст запроса. В части описания запроса есть еще одна новая для нас конструкция - задание условий отбора данных из исходных таблиц:
"ВЫБРАТЬ
| СпрНоменклатура. Ссылка КАК Услуга,
| СпрНоменклатура. Представление КАК Представление,
| ПродажиОбороты. ВыручкаОборот КАК Выручка
|ИЗ
| Справочник. Номенклатура КАК СпрНоменклатура
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления. Продажи. Обороты(&ДатаНачала,
| &ДатаОкончания,
| КАК ПродажиОбороты
| ПО ПродажиОбороты. Номенклатура = СпрНоменклатура. Ссьшка
|ГДЕ
| СпрНоменклатура. ЭтоГруппа = Ложь И
| СпрНоменклатура. ВидНоменклатуры = &ВидНоменклатуры
|
Условию отбора всегда предшествует ключевое слово ГДЕ. После него описывается само условие. Обратите внимание, что поля исходных таблиц, на которые накладывается условие, могут и не входить в список выборки (как в нашем случае). Кроме того, в нашем условии использован параметр запроса «ВидНоменклатуры».
|ИТОГИ СУММА(Выручка) ПО
| ОБЩИЕ";
Она всегда начинается с ключевого слова ИТОГИ, за которым следует описание того, какие итоги будут присутствовать в результате запроса. Сразу после слова ИТОГИ описываются агрегатные функции, которые необходимо рассчитывать в итогах. В нашем случае будет рассчитываться сумма по полю «Выручка». Затем следует ключевое слово ПО, после которого описываются группировки, в которых должны быть рассчитаны итоги. В нашем случае они отсутствуют, и используется только ключевое слово ОБЩИЕ, которое указывает на то, что итоги будут рассчитаны по всей таблице в целом.
Теперь, когда мы закончили знакомиться с текстом запроса, запустим 1С:Предприятие в режиме отладки и посмотрим, как работает наш отчет.
Зададим период отчета с 01.03.2004 по 30.04.2004. Результат будет выглядеть следующим образом:


180
181
Использование основных объектов конфигурации
Создание отчетов
![]()
Теперь изменим дату окончания на 31.03.2004 и убедимся, что данные за 31 марта попадают в отчет:

Отчет ВыручкаМастеров
О |
тчет «Выручка мастеров» будет содержать информацию о том, какая выручка была получена OOO «На все руки мастер» благодаря работе каждого из мастеров, с детализацией по всем дням в выбранном периоде и разворотом по клиентам, обслуженным в каждый из дней. На примере этого отчета мы проиллюстрируем, как строить многоуровневые группировки в запросе, как обходить все даты в выбранном периоде и как управлять состоянием группировок в табличном документе.
Создадим новый объект конфигурации Отчет «ВыручкаМастеров». Перейдем на закладку «Макет» и запустим конструктор выходной формы.
Выберем виртуальную таблицу регистра накопления «Продажи. Обороты». Зададим для нее значения параметров «НачалоПериода», «КонецПериода» и «Периодичность»:
|
Таким образом, на примере этого отчета мы продемонстрировали, как отбирать данные в некотором периоде, как задавать параметры запроса и как использовать в запросе данные из нескольких таблиц и включать в результат запроса все данные одного из источников.


182
183
Использование основных объектов конфигурации
Создание отчетов



После этого выберем из таблицы следующие поля:
• «ПродажиОбороты. Мастер»,
• «ПродажиОбороты. Период»,
• «ПродажиОбороты. Клиент»,
• «ПродажиОбороты. ВыручкаОборот»:

Теперь перейдем на закладку «Объединения/Псевдонимы» и
зададим псевдоним «Выручка» для поля
«ПродажиОбороты. ВыручкаОборот»:

На закладке «Отчет» сбросим флаг «Использовать построитель
отчета».
На закладке «Выходная форма» отметим, что тип параметров «ДатаНачала» и «ДатаОкончания» будет Дата. Нажмем «ОК».
Сразу, как и в предыдущем отчете, определим состав даты для полей ввода, расположенных в форме, и затем в вызове процедуры «ВыручкаМастеров» уточним передачу последнего параметра при помощи функции КонецДня():
ПродедураДействияФормыВыручкаМастеровСформировать(Кнопка) //{{КОНСТРУКТОР_ВЫХОДНЬК_ФОРМ_ПРОЦЕДУРА_ВЫЗОВА //(ВыручкаМастеров)
// Данный фрагмент построен конструктором. // При повторном использовании конструктора, // внесенные вручную изменения будут утеряны!!!
ТабДок = ЭлементыФормы. ТабличноеПоле; ВыручкаМастеров(ТабДок, ДатаНачала, КонецДня(ДатаОкончанил));
//}}КОНСТРУКТОР_ВЬГХОДНЫХ_ФОРМ_ПРОЦЕДУРА_ВЫЗОВА КонецПроцедуры
Теперь обратимся к процедуре «ВыручкаМастеров» и в первую очередь рассмотрим текст запроса, сформированный конструктором:


На закладке «Порядок» определим, что результат запроса будет отсортирован по возрастанию значения поля «Период» и на закладке «Итоги» зададим получение общих итогов и промежуточных итогов по полям «Мастер» и «Период»:

Запрос. Текст =
"ВЫБРАТЬ
| ПродажиОбороты. Мастер КАК Мастер,
| ПродажиОбороты. Мастер. Представление,
| ПродажиОбороты. Период КАК Период,
| ПродажиОбороты. Клиент,
| ПродажиОбороты. Клиент. Представление,
| ПродажиОбороты. ВыручкаОборот КАК Выручка
|ИЗ
| РегистрНакопления. Продажи. Обороты(&ДатаНачала, &ДатаОкончания, День,) КАК ПродажиОбороты
|УПОРЯДОЧИТЬ ПО
| Период
|

184
185
Использование основных объектов конфигурации
Создание отчетов





ИТОГИ СУММА(Выручка) ПО | ОБЩИЕ,
| Мастер, | Период";
Теперь, чтобы наглядно продемонстрировать смысл наших дальнейших действий, запустите 1С:Предприятие в режиме отладки и посмотрите на результат работы отчета «Выручка мастеров» за период c01.03.2004no30.04.2004:




В части описания запроса обратите внимание, что у источника данных кроме задания начала и окончания периода расчета итогов задана периодичность выбираемых данных - «День»:
|из
| РегистрНакопления. Продажи. Обороты(&ДатаНачала, &ДатаОкончания, День,)
| КАК ПродажиОбороты,
|
Из за большого объема этот материал размещен на нескольких страницах:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |




