Что нового мы узнали 2 страница

// записываем движения регистров
Движения.ОстаткиМатериалов.Записать();
Движения.СтоимостьМатериалов.Записать();
Движения.Продажи.Записать();
//} }_КОНСТРУКТОР^ВИЖЕНИЙ_РЕГИСТРОВ
КонецПроцедуры___________________________

Теперь в тело созданного нами цикла вставим команды создания движений регистра «Продажи»:


Движение.Клиент = Клиент;

Движение.Мастер = Мастер;

Движение.Количество = ТекСтрокаПереченьНоменклатуры.Количество;

Движение.Выручка = ТекСтрокаПереченьНоменклатуры.Сумма;

Двнжение.Стоимость= ТекСтрокаПереченьНоменклатуры.Стоимость*

ТекСтрокаПереченьНоменклатуры.Количество;

КонецЦикла;

// записываем движения регистров Движения.ОстаткиМатериалов.Записать(); Движения.СтоимостьМатериалов.Записать(); Движения .Продажи.Записать();

//} }_КОНСТРУКТОР^ВИЖЕНИЙ_РЕГИСТРОВ КонецПроцедуры


 


Процедура ОбработкаПроведения(Отказ, Режим) //{{_КОНСТРУКТОРЛВИЖЕНИЙ_РЕГИСТРОВ // Данный фрагмент построен конструктором. // При повторном использовании конструктора, // внесенные вручную изменения будут утеряны!!!

Для Каждого ТекСтрокаПереченьНоменклатуры Из ПереченьНоменклатуры Цикл Если ТекСтрокаПереченьНоменклатуры.Номенклатура.ВидНоменклатуры <>

Перечислеиия.ВидыНоменклатуры.МатериалТогда

Продолжить; КонецЕсли;

// регистр ОстаткиМатериалов Расход

Движение = Движения.ОстаткиМатериалов.Добавить();

Движение.ВидДвижения = ВидДвиженияНакопления.Расход;

Движение.Период = Дата;

Движение.Материал = ТекСтрокаПереченьНоменклатуры.Номенклатура;

Движение.Склад = Склад;

Движение.Количество = ТекСтрокаПереченьНоменклатуры.Количество;

//КонецЦикла;

//Для Каждого ТекСтрокаПереченьНоменклатуры Из ПереченьНоменклатуры Цикл // регистр СтоимостьМатериалов Расход Движение = Движения.СтоимостьМатериалов.Добавшъ(); Движение.ВидДвижения = ВидДвиженияНакопления.Расход; Движение.Период = Дата;

Движение.Материал = ТекСтрокаПереченьНоменклатуры.Номенклатура; Движение.Стоимостъ = ТекСтрокаПереченьНоменклатуры.Стоимость * ТекСтрокаПереченьНоменклатуры.Количество;

КонецЦикла;

Для Каждого ТекСтрокаПереченьНоменклатуры Из ПереченьНоменклатуры Цикл

// регистр Продажи

Движение = Движения.Продажи.Добавить();

Движение.Период = Дата;

Движение.Номенклатура = ТекСтрокаПеречеиьНоменклатуры.Номенклатура;


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

Запустим 1С:Предприятие в режиме отладки и перепроведем все документы «Оказание услуги». Движения этих документов по регистру «Продажи» должны иметь следующий вид:

Движения документа Оказание услуги №1


 


158



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


Оборотный регистр накопления


Что нового мы узнали

Движения документа Оказание услуги №2




- что такое оборотный регистр накопления - в чем отличие между регистром накопления остатков и

оборотным регистром накопления - как выбирать реквизиты и измерения при создании

регистров накопления

- как создать оборотный регистр накопления - как создать движения документа без использования конструктора движений


Теперь у нас есть практически вся необходимая информация для анализа деятельности OOO «На все руки мастер» и в следующей главе мы займемся с вами тем, что создадим несколько отчетов, которые будут представлять нам итоговую информацию о работе предприятия.


160



Создание отчетов


Глава 5. Создание отчетов

Настало время, чтобы познакомиться ближе с одним мощным инструментом платформы 1С:Предприятие - конструктором выходной формы.

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

В основе конструктора выходной формы лежит использование механизма запросов, реализованного в платформе 1С:Предприятие. Поскольку каждый отчет, как правило, подразумевает получение сложной выборки данных, сгруппированных и отсортированных определенным образом, очевидно, что для этих целей лучше всего использовать запрос к информации базы данных. Поэтому при вызове конструктора выходной формы в него «встраивается» конструктор запроса, позволяющий визуальными средствами описать запрос, лежащий в основе отчета. Кроме создания текста запроса конструктор выходной формы помогает также создать форму и макет отчета.

Примечательной возможностью конструктора выходной формы является то, что он может создавать отчет, используя два различных объекта встроенного языка.

Во-первых, отчет может быть построен с использованием объекта встроенного языка Запрос.Такой вариант отчета является довольно простым и не предоставляет больших возможностей для настройки параметров созданного отчета.

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

Мы начнем рассматривать примеры создания отчетов в более простом варианте - без использования объекта встроенного языка ПостроительОтчета,а после того, как будем обладать достаточными знаниями - рассмотрим несколько примеров, в которых буде1 использован ПостроительОтчета.


работа с запросами

д

ля работы с запросами используется объект встроенного языка Запрос.Он позволяет получать информацию, хранящуюся в полях базы данных, в виде выборки, сформированной по заданным правилам.

Источники данных запросов

И

сходную информацию запрос получает из набора таблиц. Эти таблицы представляют данные реальных таблиц базы данных в удобном для анализа виде. Их можно разделить на две большие группы: реальные и виртуальные.

Реальные таблицы, в свою очередь, могут быть объектными (ссылочными) или не объектными (не ссылочными):

Отличительной особенностью реальных таблиц является то, что они содержат данные какой-либо одной реальной таблицы, хранящейся в базе данных. Например, реальными таблицами являются таблица «Справочник.Клиенты», соответствующая справочнику «Клиенты» или таблица «РегистрНакопления.ОстаткиМатериалов», соответствующая регистру накопления «ОстаткиМатериалов».

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

«РегистрНакопления.ОстаткиМатериалов.ОстаткиИОбороты», формируемая из нескольких таблиц регистра накопления «ОстаткиМатериалов». Иногда виртуальные таблицы могут


 


162



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


Создание отчетов


 


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

Реальные таблицы подразделяются на объектные (ссылочные) и не объектные (не ссылочные).

В объектных (ссылочных) таблицах представлена информация ссылочных типов данных (справочники, документы, планы видов характеристик и т.д.). А в не объектных (не ссылочных) - всех остальных типов данных (константы, регистры и т.д.).

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

Язык запросов

А

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

• описание запроса,

• объединение запросов,

• упорядочивание результатов,

• АВТОУПОРЯДОЧИВАНИЕ

• описание итогов.

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

Описание запроса определяет источники данных, поля выборкИ, группировки и т.д.


Объединение запросов определяет, как будут объединены результаты выполнения нескольких запросов.

Упорядочивание результатов определяет условия упорядочивания строк результата запроса.

АВТОУПОРЯДОЧИВАНИЕ позволяет включить режим автоматического упорядочивания строк результата запроса.

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

Применение различных синтаксических конструкций языка запросов подробно описано в книге «1С:Предприятие 8.0 Описание встроенного языка», поэтому мы перейдем прямо к созданию отчетов, и по пути будем комментировать создаваемый текст запросов.


 


164



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


Создание отчетов


 


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

П

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

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

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

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

• «Дата»,

• «Номер»,

• «Склад»,

• «Мастер»,

• «Клиент»:

Обратите внимание, что при выборе полей «Склад», «Мастер» и
«Клиент» в список выбранных полей подбираются также поля
«Склад.Представление», «Мастер.Представление» и

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


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

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

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

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

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


 


166



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


Создание or


ieTOB


 


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

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

"ВЫБРАТЬ

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

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

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

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

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

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

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

| ОказаниеУслуги.Клиент.Представление

| ИЗ

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

|

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

| Дата,

| Номер";


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

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

"ВЫБРАТЬ

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

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

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

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

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

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

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

| ОказаниеУслуги.Клиент.Представление


 


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

"ВЫБРАТЬ

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

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

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

I ОказаниеУслуги.Склад.Представление,

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

I ОказаниеУслуги.Мастер.Представление,

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

1 ОказаниеУслуги.Клиеит.Представление

1ИЗ

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

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


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

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

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

| Дата, |Номер";

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


 


168



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


Создание отчетов


 


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


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


 


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

Макет = ПолучитьМакет("РеестрДокументовОказаниеУслуги"); Запрос = Новый Запрос;


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


 


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

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

ТабДок.Очистить(); ТабДок.Вывести(ОбластьЗаголовок); ТабДок.Вывести(ОбластьШапкаТаблицы); ТабДок.НачатьАвтогрутшировкуСтрок();

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

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

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

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

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

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

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