1С-Предприятие 8.0. Практическое пособие разработчика

       

Отчет РеестрДокументовОказаниеУслуги


Первым отчетом, на основе которого мы начнем знакомиться с языком запросов, будет отчет "РеестрДокументовОказаниеУслуги". Этот отчет просто будет выводить список существующих в базе данных документов "ОказаниеУслуги" в порядке их дат и номеров.

Создадим в конфигураторе новый объект конфигурации Отчет "РеестрДокументовОказаниеУслуги". Перейдем на закладку "Макет" и запустим конструктор выходной формы.

В качестве источника данных для запроса выберем объектную (ссылочную) таблицу документов "ОказаниеУслуги". Из этой таблицы выберем следующие поля:

·"Дата",
·"Номер",
·"Склад",
·"Мастер",
·"Клиент":

Обратите внимание, что при выборе полей "Склад", "Мастер" и "Клиент" в список выбранных полей подбираются также поля "Склад.Представление", "Мастер.Представление" и "Клиент.Представление". Дело в том, что в общем случае подразумевается, что эти поля будут выводиться в ячейки табличного документа. Поскольку соответствующие поля "Склад", "Мастер" и "Клиент" являются ссылочными, то в случае, если в качестве значения параметра для вывода будет передано значение-ссылка, система будет выполнять дополнительный запрос для получения представления этого поля (которое и будет выведено в документ), в результате чего вывод [166] отчета замедлится. Поэтому система, при выборе ссылочных полей, предлагает сразу же включить в список выбранных полей и представления ссылочных полей, в расчете на то, что именно они и будут использованы для вывода в документ.

После этого перейдем на закладку "Порядок" и укажем, что результат запроса должен быть сначала упорядочен по значению поля "Дата", а затем – по значению поля "ОказаниеУслуги.Ссылка":

Перейдем на закладку "Отчет" и сбросим флаг "Использовать построитель отчета":

Сбросим флаг "Использовать построитель отчета"...








Нажмем "ОК". Конструктор сформирует форму отчета и макет. Откроем модуль формы и найдем в нем процедуру "РеестрДокументовОказаниеУслуги". В этой процедуре как раз [167] формируется текст запроса, который будет использован для получения интересующих нас данных:

Запрос.Текст =

"ВЫБРАТЬ

   |    ОказаниеУслуги.Дата КАК Дата,

   |    ОказаниеУслуги.Номер КАК Номер,

   |    ОказаниеУслуги.Склад,

   |    ПРЕДСТАВЛЕНИЕ(ОказаниеУслуги.Склад),

   |    ОказаниеУслуги.Мастер,

   |    ПРЕДСТАВЛЕНИЕ(ОказаниеУслуги.Мастер),

   |    ОказаниеУслуги.Клиент,

   |    ПРЕДСТАВЛЕНИЕ(ОказаниеУслуги.Клиент)

   |ИЗ

   |    Документ.ОказаниеУслуги КАК ОказаниеУслуги

   |

   |УПОРЯДОЧИТЬ ПО

   |    Дата,

   |    Номер";

Текст запроса начинается, как мы говорили выше, с части описания запроса:

Запрос.Текст =

   "ВЫБРАТЬ

   |    ОказаниеУслуги.Дата КАК Дата,

   |    ОказаниеУслуги.Номер КАК Номер,

   |    ОказаниеУслуги.Склад,

   |    ПРЕДСТАВЛЕНИЕ(ОказаниеУслуги.Склад),

   |    ОказаниеУслуги.Мастер,

   |    ПРЕДСТАВЛЕНИЕ(ОказаниеУслуги.Мастер),

   |    ОказаниеУслуги.Клиент,

   |    ПРЕДСТАВЛЕНИЕ(ОказаниеУслуги.Клиент)

   |ИЗ

   |    Документ.ОказаниеУслуги КАК ОказаниеУслуги

Описание запроса начинается с обязательного ключевого слова ВЫБРАТЬ. Затем следует список полей выборки, в котором описываются поля, которые должны содержаться в результате запроса. Этот список может содержать как собственно поля, так и некоторые выражения, вычисляемые на основе значений полей. [168]



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

Такое обращение мы видим в описании полей выборки:

   "ВЫБРАТЬ

   |    ОказаниеУслуги.Дата КАК Дата,

   |    ОказаниеУслуги.Номер КАК Номер,

   |    ОказаниеУслуги.Склад,

   |    ПРЕДСТАВЛЕНИЕ(ОказаниеУслуги.Склад),

   |    ОказаниеУслуги.Мастер,

   |    ПРЕДСТАВЛЕНИЕ(ОказаниеУслуги.Мастер),

   |    ОказаниеУслуги.Клиент,

   |    ПРЕДСТАВЛЕНИЕ(ОказаниеУслуги.Клиент)

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

После части описания запроса в нашем примере следует часть упорядочивания результатов:

   |УПОРЯДОЧИТЬ ПО

   |    Дата,

   |    Номер";

Предложение УПОРЯДОЧИТЬ ПО позволяет сортировать строки в результате запроса. После этого ключевого предложения располагается выражение упорядочивания, которое, в общем случае, представляет собой перечисление полей (выражений) и порядка вывода. В нашем случае упорядочивание будет выполняться сначала По полю выборки, обращение к которому выполняется через псевдоним – "Код", а затем по полю – "Номер". В обоих случаях порядок сортировки будет по возрастанию, который является Порядком сортировки по-умолчанию. [169]



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

Процедура РеестрДокументовОказаниеУслуги(ТабДок) Экспорт

   //{{КОНСТРУКТОР_ВЫХОДНЫХ_ФОРМ(РеестрДокументовОказаниеУслуги)

   // Данный фрагмент построен конструктором.

   // При повторном использовании конструктора, внесенные вручную изменения будут утеряны!!!

   Макет = ОтчетОбъект.ПолучитьМакет("РеестрДокументовОказаниеУслуги");

   Запрос = Новый Запрос;

   Запрос.Текст =

   "ВЫБРАТЬ

   |    ОказаниеУслуги.Дата КАК Дата,

   |    ОказаниеУслуги.Номер КАК Номер,

   |    ОказаниеУслуги.Склад,

   |    ПРЕДСТАВЛЕНИЕ(ОказаниеУслуги.Склад),

   |    ОказаниеУслуги.Мастер,

   |    ПРЕДСТАВЛЕНИЕ(ОказаниеУслуги.Мастер),

   |    ОказаниеУслуги.Клиент,

   |    ПРЕДСТАВЛЕНИЕ(ОказаниеУслуги.Клиент)

   |ИЗ

   |    Документ.ОказаниеУслуги КАК ОказаниеУслуги

   |

   |УПОРЯДОЧИТЬ ПО

   |    Дата,

   |    Номер";

   Результат = Запрос.Выполнить();

   ОбластьЗаголовок = Макет.ПолучитьОбласть("Заголовок");

   ОбластьПодвал = Макет.ПолучитьОбласть("Подвал");

   ОбластьШапкаТаблицы = Макет.ПолучитьОбласть("ШапкаТаблицы");

   ОбластьПодвалТаблицы = Макет.ПолучитьОбласть("ПодвалТаблицы");

   ОбластьДетальныхЗаписей = Макет.ПолучитьОбласть("Детали");

   ТабДок.Очистить();

   ТабДок.Вывести(ОбластьЗаголовок);

   ТабДок.Вывести(ОбластьШапкаТаблицы);

   ТабДок.НачатьАвтогруппировкуСтрок();

   ВыборкаДетали = Результат.Выбрать();



   Пока ВыборкаДетали.Следующий() Цикл

       ОбластьДетальныхЗаписей.Параметры.Заполнить(ВыборкаДетали);

       ТабДок.Вывести(ОбластьДетальныхЗаписей, ВыборкаДетали.Уровень());

   КонецЦикла;

   ТабДок.ЗакончитьАвтогруппировкуСтрок();

   ТабДок.Вывести(ОбластьПодвалТаблицы);

   ТабДок.Вывести(ОбластьПодвал);

   //}}КОНСТРУКТОР_ВЫХОДНЫХ_ФОРМ

КонецПроцедуры

В форме отчета расположен элемент управления ПолеТабличногоДокумента с именем "ТабДок", который заполняется данными на основе макета, сформированного конструктором. [170]

В начале процедуры мы получаем макет отчета, из которого затем получаем существующие в нем области в соответствующие переменные:

...

   ОбластьЗаголовок = Макет.ПолучитьОбласть("Заголовок");

   ОбластьПодвал = Макет.ПолучитьОбласть("Подвал");

   ОбластьШапкаТаблицы = Макет.ПолучитьОбласть("ШапкаТаблицы");

   ОбластьПодвалТаблицы = Макет.ПолучитьОбласть("ПодвалТаблицы");

   ОбластьДетальныхЗаписей = Макет.ПолучитьОбласть("Детали");

...

Затем мы очищаем табличный документ и выводим в него те области, которые не содержат данных, получаемых из результата запроса:

...

   ТабДок.Очистить();

   ТабДок.Вывести(ОбластьЗаголовок);

   ТабДок.Вывести(ОбластьШапкаТаблицы);

   ТабДок.НачатьАвтогруппировкуСтрок();

...

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

После этого мы получаем выборку из результата запроса, которую перебираем в цикле:



   Результат = Запрос.Выполнить();

...

   ВыборкаДетали = Результат.Выбрать();

   Пока ВыборкаДетали.Следующий() Цикл

       ОбластьДетальныхЗаписей.Параметры.Заполнить(ВыборкаДетали);

       ТабДок.Вывести(ОбластьДетальныхЗаписей, ВыборкаДетали.Уровень());

   КонецЦикла; [171]

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

В заключение процедуры, мы выводим в табличный документ завершающие области макета:

...

   ТабДок.ЗакончитьАвтогруппировкуСтрок();

   ТабДок.Вывести(ОбластьПодвалТаблицы);

   ТабДок.Вывести(ОбластьПодвал);

...

Теперь запустим 1С:Предприятие в режиме отладки и посмотрим на результат работы нашего отчета:



Таким образом на примере этого отчета мы продемонстрировали, как использовать конструктор выходной формы и познакомились с некоторыми основными конструкциями языка запросов. [172]


Содержание раздела