Отчет РеестрДокументовОказаниеУслуги
Первым отчетом, на основе которого мы начнем знакомиться с языком запросов, будет отчет "РеестрДокументовОказаниеУслуги". Этот отчет просто будет выводить список существующих в базе данных документов "ОказаниеУслуги" в порядке их дат и номеров.
Создадим в конфигураторе новый объект конфигурации Отчет "РеестрДокументовОказаниеУслуги". Перейдем на закладку "Макет" и запустим конструктор выходной формы.
В качестве источника данных для запроса выберем объектную (ссылочную) таблицу документов "ОказаниеУслуги". Из этой таблицы выберем следующие поля:
· | "Дата", |
· | "Номер", |
· | "Склад", |
· | "Мастер", |
· | "Клиент": |
Обратите внимание, что при выборе полей "Склад", "Мастер" и "Клиент" в список выбранных полей подбираются также поля "Склад.Представление", "Мастер.Представление" и "Клиент.Представление". Дело в том, что в общем случае подразумевается, что эти поля будут выводиться в ячейки табличного документа. Поскольку соответствующие поля "Склад", "Мастер" и "Клиент" являются ссылочными, то в случае, если в качестве значения параметра для вывода будет передано значение-ссылка, система будет выполнять дополнительный запрос для получения представления этого поля (которое и будет выведено в документ), в результате чего вывод [166] отчета замедлится. Поэтому система, при выборе ссылочных полей, предлагает сразу же включить в список выбранных полей и представления ссылочных полей, в расчете на то, что именно они и будут использованы для вывода в документ.
После этого перейдем на закладку "Порядок" и укажем, что результат запроса должен быть сначала упорядочен по значению поля "Дата", а затем – по значению поля "ОказаниеУслуги.Ссылка":
Перейдем на закладку "Отчет" и сбросим флаг "Использовать построитель отчета":
Сбросим флаг "Использовать построитель отчета"...
Нажмем "ОК". Конструктор сформирует форму отчета и макет. Откроем модуль формы и найдем в нем процедуру "РеестрДокументовОказаниеУслуги". В этой процедуре как раз [167] формируется текст запроса, который будет использован для получения интересующих нас данных:
"ВЫБРАТЬ
| ОказаниеУслуги.Дата КАК Дата,
| ОказаниеУслуги.Номер КАК Номер,
| ОказаниеУслуги.Склад,
| ПРЕДСТАВЛЕНИЕ(ОказаниеУслуги.Склад),
| ОказаниеУслуги.Мастер,
| ПРЕДСТАВЛЕНИЕ(ОказаниеУслуги.Мастер),
| ОказаниеУслуги.Клиент,
| ПРЕДСТАВЛЕНИЕ(ОказаниеУслуги.Клиент)
|ИЗ
| Документ.ОказаниеУслуги КАК ОказаниеУслуги
|
|УПОРЯДОЧИТЬ ПО
| Дата,
| Номер";
"ВЫБРАТЬ
| ОказаниеУслуги.Дата КАК Дата,
| ОказаниеУслуги.Номер КАК Номер,
| ОказаниеУслуги.Склад,
| ПРЕДСТАВЛЕНИЕ(ОказаниеУслуги.Склад),
| ОказаниеУслуги.Мастер,
| ПРЕДСТАВЛЕНИЕ(ОказаниеУслуги.Мастер),
| ОказаниеУслуги.Клиент,
| ПРЕДСТАВЛЕНИЕ(ОказаниеУслуги.Клиент)
|ИЗ
| Документ.ОказаниеУслуги КАК ОказаниеУслуги
После ключевого слова ИЗ указываются источники данных – исходные таблицы запроса, содержимое которых обрабатывается в запросе. В данном случае это объектная (ссылочная) таблица "Документ.ОказаниеУслуги". После ключевого слова КАК указывается псевдоним источника данных. В нашем случае это "ОказаниеУслуги". В дальнейшем к этому источнику данных можно будет обращаться в тексте запроса, используя псевдоним.
Такое обращение мы видим в описании полей выборки:
| ОказаниеУслуги.Дата КАК Дата,
| ОказаниеУслуги.Номер КАК Номер,
| ОказаниеУслуги.Склад,
| ПРЕДСТАВЛЕНИЕ(ОказаниеУслуги.Склад),
| ОказаниеУслуги.Мастер,
| ПРЕДСТАВЛЕНИЕ(ОказаниеУслуги.Мастер),
| ОказаниеУслуги.Клиент,
| ПРЕДСТАВЛЕНИЕ(ОказаниеУслуги.Клиент)
После части описания запроса в нашем примере следует часть упорядочивания результатов:
| Дата,
| Номер";
Теперь обратим внимание на то, как выводится результат запроса в табличный документ.
//{{КОНСТРУКТОР_ВЫХОДНЫХ_ФОРМ(РеестрДокументовОказаниеУслуги)
// Данный фрагмент построен конструктором.
// При повторном использовании конструктора, внесенные вручную изменения будут утеряны!!!
Макет = ОтчетОбъект.ПолучитьМакет("РеестрДокументовОказаниеУслуги");
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ОказаниеУслуги.Дата КАК Дата,
| ОказаниеУслуги.Номер КАК Номер,
| ОказаниеУслуги.Склад,
| ПРЕДСТАВЛЕНИЕ(ОказаниеУслуги.Склад),
| ОказаниеУслуги.Мастер,
| ПРЕДСТАВЛЕНИЕ(ОказаниеУслуги.Мастер),
| ОказаниеУслуги.Клиент,
| ПРЕДСТАВЛЕНИЕ(ОказаниеУслуги.Клиент)
|ИЗ
| Документ.ОказаниеУслуги КАК ОказаниеУслуги
|
|УПОРЯДОЧИТЬ ПО
| Дата,
| Номер";
Результат = Запрос.Выполнить();
ОбластьЗаголовок = Макет.ПолучитьОбласть("Заголовок");
ОбластьПодвал = Макет.ПолучитьОбласть("Подвал");
ОбластьШапкаТаблицы = Макет.ПолучитьОбласть("ШапкаТаблицы");
ОбластьПодвалТаблицы = Макет.ПолучитьОбласть("ПодвалТаблицы");
ОбластьДетальныхЗаписей = Макет.ПолучитьОбласть("Детали");
ТабДок.Очистить();
ТабДок.Вывести(ОбластьЗаголовок);
ТабДок.Вывести(ОбластьШапкаТаблицы);
ТабДок.НачатьАвтогруппировкуСтрок();
ВыборкаДетали = Результат.Выбрать();
Пока ВыборкаДетали.Следующий() Цикл
ОбластьДетальныхЗаписей.Параметры.Заполнить(ВыборкаДетали);
ТабДок.Вывести(ОбластьДетальныхЗаписей, ВыборкаДетали.Уровень());
КонецЦикла;
ТабДок.ЗакончитьАвтогруппировкуСтрок();
ТабДок.Вывести(ОбластьПодвалТаблицы);
ТабДок.Вывести(ОбластьПодвал);
//}}КОНСТРУКТОР_ВЫХОДНЫХ_ФОРМ
КонецПроцедуры
В начале процедуры мы получаем макет отчета, из которого затем получаем существующие в нем области в соответствующие переменные:
ОбластьЗаголовок = Макет.ПолучитьОбласть("Заголовок");
ОбластьПодвал = Макет.ПолучитьОбласть("Подвал");
ОбластьШапкаТаблицы = Макет.ПолучитьОбласть("ШапкаТаблицы");
ОбластьПодвалТаблицы = Макет.ПолучитьОбласть("ПодвалТаблицы");
ОбластьДетальныхЗаписей = Макет.ПолучитьОбласть("Детали");
...
ТабДок.Очистить();
ТабДок.Вывести(ОбластьЗаголовок);
ТабДок.Вывести(ОбластьШапкаТаблицы);
ТабДок.НачатьАвтогруппировкуСтрок();
...
После этого мы получаем выборку из результата запроса, которую перебираем в цикле:
...
ВыборкаДетали = Результат.Выбрать();
Пока ВыборкаДетали.Следующий() Цикл
ОбластьДетальныхЗаписей.Параметры.Заполнить(ВыборкаДетали);
ТабДок.Вывести(ОбластьДетальныхЗаписей, ВыборкаДетали.Уровень());
КонецЦикла; [171]
В заключение процедуры, мы выводим в табличный документ завершающие области макета:
ТабДок.ЗакончитьАвтогруппировкуСтрок();
ТабДок.Вывести(ОбластьПодвалТаблицы);
ТабДок.Вывести(ОбластьПодвал);
...
Таким образом на примере этого отчета мы продемонстрировали, как использовать конструктор выходной формы и познакомились с некоторыми основными конструкциями языка запросов. [172]