Главная
Статьи
Ресурсы
Информация

Часть II. Использование основных объектов конфигурации. Глава 1 - 5


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

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

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

 

Глава 1. Периодический регистр сведений

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

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

 

Зачем нужен периодический регистр сведений?

Н

ачнем мы с того, что обратим ваше внимание на документ «ОказаниеУслуги». Как вы помните, в этом документе мы выбираем услугу, которая оказывается, и затем указываем цену.

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

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

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

Поэтому для хранения стоимости услуг мы используем новый пока еще для нас объект - регистр сведений.

 

Периодический регистр сведений

 

 

 

Объект конфигурации регистр сведений

О

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

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

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

Периодичность регистра сведений можно определить одним из следующих значений:

• в пределах секунды,

• в пределах дня,

• в пределах месяца,

• в пределах квартала,

• в пределах года.

• в пределах регистратора (если установлен режим записи -

«Подчинение регистратору»)

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

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

Ключом записи, однозначно идентифицирующим запись, является в данном случае совокупность значений измерений регистра и периода (в случае, если регистр сведений периодический). Регистр сведений не может содержать несколько записей с одинаковыми ключами.

Если продолжать сравнение с регистром накопления, то можно сказать, что регистр сведений предоставляет больше свободы в редактировании хранимых данных. Наряду с тем, что регистр сведений может использоваться в режиме подчинения регистратору (когда записи регистра сведений «привязаны» к документу-регистратору), регистр сведений может использоваться и в независимом режиме, в котором пользователю предоставляется полная свобода интерактивной работы с данными регистра. Регистр сведений, не использующий подчинение регистратору, называют независимым регистром сведений.

Узнай больше!

О структуре объектов встроенного языка, предназначенных для работы с регистрами сведений можно прочитать в главе «Регистры сведений» на странице 593.

 

 

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

Создание периодического регистра сведений Цены

П

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

Откроем конфигуратор и создадим новый объект конфигурации Регистр сведений. Назовем его «Цены». Установим периодичность этого регистра в пределах секунды.

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

Создадим измерение «Номенклатура» и укажем, что оно будет ведущим...

 

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

 

Периодический регистр сведений

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

После этого создадим новый ресурс «Цена», тип Число, длина 15, точность 2, неотрицательное.

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

После этого зададим розничные цены на материалы:

Зададим стоимость услуг нашего 000 «На все руки мастер» следующим образом:

 

 

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

Теперь посмотрим, как можно использовать заданные нами цены в Документе «ОказаниеУслуги».

 

 

Создание функции РозничнаяЦена()

С

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

Разместим в нем следующий текст:

Значения ресурсов возвращаются в структуре, поэтому в

следующей строке мы получаем искомую нами розничную цену

просто указав имя нужного нам ресурса регистра через точку

(ЗначенияРесурсов.Цена).    у

Теперь проверим, как работает эта функция.

 

 

Функция РозничнаяЦена(АктуальнаяДата, ЭлементНоменклатуры)

Экспорт //создать вспомогательный объект Отбор

Отбор = Новый Структура("Номенклатура",ЭлементНоменклатуры);

//получить актуальные значения ресурсов регистра

ЗначенияРесурсов = РегистрыСведений.Цены

.ПолучитьПоследнее(АктуальнаяДата, Отбор); Возврат ЗначенияРесурсов.Цена; КонецФуикции

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

• АктуальнаяДата - параметр типа Дата, который будет

определять точку на оси времени, на которую нас интересует

значение розничной цены

• ЭлементНоменклатуры - ссылка на элемент справочника

«Номенклатура», для которого мы хотим получить розничную

цену.

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

Во второй строке мы обращаемся к менеджеру регистра сведений «Цены» (РегистрыСведений.Цены) и выполняем метод ПолучитьПоследнее(), который возвращает нам значения ресурсов наиболее поздней записи регистра, которая соответствует передаваемой дате («АктуальнаяДата») и значениям измерений регистра («Отбор»).

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

 

 

Автоматическое заполнение цены в документе ОказаниеУслуги

И

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

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

ПроцедураПереченьНоменклагурыНоменклатураПриИзменении(Элемент) //получить текущую строку табличной части

СтрокаТабличнойЧасти = ЭлементыФормы.ПереченьНоменклатуры.ТекущиеДанные;

//установить цену

СтрокаТабличнойЧасти.Цена = РозничнаяЦенаДата, Элемент.Значение);

//пересчитать сумму строки

РассчитатьСумму(СтрокаТабличнойЧасти); КонецПроцедуры

Прокомментируем содержимое обработчика.

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

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

В заключение мы вызываем нашу процедуру «РассчитатьСумму» из общего модуля «РаботаСДокументами» для того, чтобы она пересчитала итоговую сумму в строке нашего документа.

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

 

Теперь откроем документ ОказаниеУслуги No1. Как вы помните, этим документом мы как раз «израсходовали» один такой транзистор.

Установим дату документа равной той дате, когда было задано первое значение цены транзистора, и повторим выбор транзистора в колонке «Номенклатура» табличной части документа. Автоматически установится первое значение цены:

 

 

 

Теперь изменим дату документа на следующий день и снова повторим выбор транзистора. Будет установлено новое значение цены:

 

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

 

 

 

 

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

 

- для чего предназначен объект конфигурации Регистр сведений

- какими особенностями обладает объект конфигурации Регистр сведений

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

- какие поля определяют ключ уникальности регистра

накопления - что такое периодический регистр сведений и что такое

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

записей регистра средствами встроенного языка

 

 

 

Перечисление

 

Глава 2. Перечисление

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

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

В этой главе мы создадим у справочника «Номенклатура»

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

еще для нас объектом конфигурации Перечисление. Это поможет нам

в дальнейшем легко определять, чем является элемент справочника

«Номенклатура»: услугой или материалом. Кроме этого, мы

скорректируем процедуру проведения документа ОказаниеУслуги и

покажем, как работать с перечислением средствами встроенного

языка.    ™

 

Объект конфигурации Перечисление

О

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

В реальной жизни этому объекту может соответствовать, например, перечисление вариантов указания цены («включая НДС», «без НДС»).

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

Из этого следует важная особенность перечисления: значения перечисления не «обезличены» для конфигурации, на них могут опираться алгоритмы работы программы.

тех, ктоработал с версией 7.7

Перечисления могут теперь иметь формы (в том числе основную форму списка и выбора), а также макеты.

" Узнай больше!

О структуре объектов встроенного языка, предназначенных для работы с перечислениями можно прочитать в главе «Перечисления» на странице 584.

 

Реорганизация справочника Номенклатура

О

ткроем конфигуратор и создадим сначала новый объек

конфигурации    Перечисление    с    имене\

«ВидыНоменклатуры».

 

На закладке «Данные» добавим два значен» перечисления: «Материал» и «Услуга»:

После этого запустим 1С:Предприятие в режиме отладки и зададим для каждого элемента справочника «Номенклатура» соответствующее значение реквизита «ВидНоменклатуры»:

 

Теперь посмотрим, как можно использовать новые данные,

полученные    благодаря    использованию    перечисления

«ВидыНоменклатуры».

 

Затем добавим в справочник «Номенклатура» новый реквизит

«ВидНоменклатуры»    с    типом

ПеречислениеСсылка.ВидыНоменклатуры:

 

 

 

 

Изменение процедуры проведения документа ОказаниеУслуги

Е

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

Теперь мы займемся тем, что доработаем документ таким образом, чтобы в регистре появлялись только записи, относящиеся к расходу материалов. Эта доработка будет не совсем эффективна с точки зрения производительности, зато позволит нам получить нужные данные в регистре «ОстаткиМатериалов».

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

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

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

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

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

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

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

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

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

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

 

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

КонецЦикла;

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

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

Добавленный текст исключает из выполнения операторов цикла те

строки документа, в которых номенклатура не является материалом. К

значению перечисления «Материал» мы обращаемся, используя

менеджер    перечисления    «ВидыНоменклатуры»

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

Запустим 1С:Предприятие в режиме отладки и проверим работу процедуры проведения документа «ОказаниеУслуги».

Откроем документ Оказание услуги No1 и внесем в него следующие изменения (обратите внимание, что изменен не только состав номенклатуры в табличной части, но и время документа):

 

Перед тем, как провести документ, откроем список регистра «ОстаткиМатериалов», содержащий движения этого документа. Для этого выполним команду Перейти | Остатки материалов из командной панели документа.

 

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

 

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

 

 

- для чего предназначен объект конфигурации

Перечисление

- как создать новое перечисление - как с помощью перечисления задать принадлежность

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

встроенного языка

 

 

Глава 3. Проведение документа по нескольким регистрам

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

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

 

Зачем нужно проведение документа по нескольким регистрам?

Д

о сих пор мы с вами учитывали только количественное движение материалов в OOO «На все руки мастер». Для этих целей мы создали регистр накопления «ОстаткиМатериалов». Однако, как вы, наверное, догадываетесь, одного только количественного учета совершенно недостаточно для нужд нашего 000.

Очевидно, что необходимо также знать, какие денежные средства были затрачены на приобретение тех или иных материалов, и каковы материальные запасы OOO «На все руки мастер» в денежном выражении.

После того, как мы начали автоматизировать наше предприятие, руководство 000 «На все руки мастер» высказало пожелание, чтобы весь суммовой учет материалов велся бы теперь по средней стоимости. To есть, при закупке материалов они должны учитываться в ценах приобретения, а при расходе - по средней стоимости, которая рассчитывается исходя из общей суммы закупок данного материала и общего количества этого материала, находящегося в OOO.

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

Таким образом, документы «ПриходнаяНакладная» и «ОказаниеУслуги» должны будут создавать движения не только в регистре «ОстаткиМатериалов», но, одновременно, и в регистре «СтоимостьМатериалов», отражая изменения суммового учета.

 

Создание регистра СтоимостьМатериалов

:

Р

егистр «СтоимостьМатериалов» совсем не сложен, поэтому мы не будем подробно останавливаться на его создании. Этот регистр будет иметь всего одно измерение - «Материал» с типом СправочникСсылка.Номенклатура и один ресурс -«Стоимость» с длиной 15 и точностью 2.

После создания, регистр «СтоимостьМатериалов» должен выглядеть в дереве конфигурации следующим образом:

 

 

Изменение процедуры проведения документа ПриходнаяНакладная

О

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

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

Для ресурса «Стоимость» выберем значения реквизита табличной части «Сумма»:

 

 

Теперь мы можем приступить к внесению изменений в процедуры проведения документов.

Начнем с самого простого - документа «ПриходнаяНакладная».

 

Добавим в список регистров новый регистр...

 

 

 

Нажмем «ОК» и посмотрим на текст, который сформировал конструктор:

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

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

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

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

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

Движение.Материал = ТекСтрокаМатериалы.Материал;

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

Движеиие.Количество = ТекСтрокаМатериалы.Количество; КонецЦикла; Для Каждого ТекСтрокаМатериалы Из Материалы Цикл

// регистр СтоимостьМатериалов

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

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

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

Движение.Материал = ТекСтрокаМатериалы.Материал;

Движение.Стоимость = ТекСтрокаМатериалы.Сумма; КонецЦикла;

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

 

//внесенные вручную изменения будут утеряны!!!

Для Каждого ТекСтрокаМатериалы Из Материалы Цикл

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

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

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

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

Движение.Материал = ТекСтрокаМатериалы.Материал;

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

Движение.Количество = ТекСтрокаМатериалы.Количество; //КонецЦикла; //Для Каждого ТекСтрокаМатериалы Из Материалы Цикл

// регистр СтоимостьМатериалов

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

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

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

Движение.Материал = ТекСтрокаМатериалы.Материал;

Движение.Стоимость = ТекСтрокаМатериалы.Сумма; КонецЦикла;

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

и перепроведем

Запустим 1С:Предприятие в режиме отладки документ Приходная накладная No1.

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

 

 

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

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

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

 

 

Изменение процедуры проведения документа ОказаниеУслуги

И

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

Поскольку в документе «ОказаниеУслуги» у нас отражена только цена номенклатуры, нам понадобится добавить в табличную часть документа еще одно поле, в котором будет указываться стоимость номенклатуры.

Откроем в конфигураторе окно редактирования объекта конфигурации Документ «ОказаниеУслуги», перейдем на закладку «Данные» и создадим новый реквизит табличной части документа с именем «Стоимость», типом Число, длиной 15 и точностью 2:

 

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

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

 

 

Теперь создадим движения документа «ОказаниеУслуги» таким же образом, как мы делали это для документа «ПриходнаяНакладная».

Откроем в конфигураторе окно редактирования объекта конфигурации Документ «ОказаниеУслуги» и укажем, что он будет создавать движения по регистру накопления «СтоимостьМатериалов».

 

 

Нажмем «ОК» и в тексте, сформированном конструктором, восстановим изменения, внесенные нами ранее, а также объединим два цикла обхода табличной части документа в один (изменения выделены жирным шрифтом):

 

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

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

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

КонецЕсли;

// регистр ОстаткиМатериалов Расход Движение = Движения.ОстаткиМатериалов.Добавить(); Движение.ВидДвижения = ВидДвиженияНакопления.Расход; Движение.Период = Дата;

 

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

 

Проведение документа по нескольким регистрам

 

 

 

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

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

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

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

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

// регистр СтоимостьМатериалов Расход Движение = Движения.СтоимостьМатериалов.Добавить(); Движение.ВидДвижения = ВидДвиженияНакопления.Расход; Движение.Период = Дата;

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

КонецЦикла;

// записываем движения регистров

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

Движения.СтоимостьМатериалов.Записать();

//} }_КОНСТРУКТОР_ДВИЖЕНИЙ_РЕГИСТРОВ

Проведем документ Оказание услуги No1 и посмотрим на движения этого документа по регистру «СтоимостьМатериалов»:

 

Теперь создадим и проведем еще два документа «ОказаниеУслуги». Эти документы понадобятся нам в дальнейшем, поэтому будьте внимательны и обратите внимание на то, что эти документы созданы другими датами:

 

 

Проверим, как теперь работает проведение документа «ОказаниеУслуги».

Запустим 1С:Предприятие в режиме отладки и укажем стоимость выбранных материалов:

 

 

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

 

 

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

нескольким регистрам

? как с помощью конструктора создать движения

документа по нескольким регистрам

? исходя из каких соображений, конструктор формирует

текст процедуры проведения по нескольким регистрам

?

Движения документов Оказание услуги No2 и No3 должны выглядеть, соответственно, следующим образом:

 

 

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

В этой главе мы с вами познакомимся с еще одним видом регистра накопления - оборотным регистром накопления.

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

 

Зачем нужно создавать еще один регистр

П

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

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

• какие именно услуги были оказаны (чтобы составить рейтинг

услуг)

• какому именно клиенту оказывались услуги (чтобы

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

например)

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

заработную плату)

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

 

Создание оборотного регистра накопления Продажи

К

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

Регистры накопления могут быть регистрами остатков и регистрами оборотов.

Существующие в нашей учебной конфигурации регистры «ОстаткиМатериалов» и «СтоимостьМатериалов» являются регистрами остатков. Если вы вспомните момент, когда мы создавали отчет «Материалы», то в конструкторе отчета мы видели, что для таких регистров система создает три виртуальные таблицы: таблица остатков, оборотов и совокупная таблица остатков и оборотов.

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

В остальном оборотный регистр ни чем не отличается от регистра остатков.

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

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

Совсем иная ситуация в случае регистра накопления поддерживающего накопление остатков. Для него выбор измерений должен выполняться исходя из того, что движения регистра могут быть осуществлены «в две стороны»: приход и расход. Таким образоМ, в качестве измерений нужно выбирать те параметры, по которым движения точно будут осуществляться как в одну, так и в другуЮ сторону.

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

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

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

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

Для реквизитов регистра этот принцип неважен, по реквизитам регистра ресурсы могут только приходоваться или только расходоваться.

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

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

На закладке «Данные» создадим измерения регистра:

• «Номенклатура», тип СправочникСсылка.Номенклатура,

• «Клиент», тип СправочникСсылка.Кпиенты,

• «Мастер», тип СправочникСсылка.Сотрудники.

 

 

У регистра будет три ресурса:

• «Количество», тип Число, длина 15, точность 3,

• «Выручка»,тип Число, длина 15, точность 2,

• «Стоимость», тип Число, длина 15, точность 2.

Откроем окно редактирования объекта конфигурации Документ «ОказаниеУслуги» и на закладке «Движения» укажем, что этот документ будет создавать движения по регистру «Продажи».

Запустим 1С:Предприятие в режиме отладки и откроем формы списка регистров накопления «Продажи» и «ОстаткиМатериалов». Обратите внимание, что формы практически одинаковы, за исключением состава измерений и ресурсов.

 

Изменение процедуры проведения документа ОказаниеУслуги

Н

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

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

Создадим еще один цикл обхода табличной части и команду записи движений регистра (добавления выделены жирным шрифтом):

 

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

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

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

КонедЕсли;

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

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

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

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

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

.Номенклатура; Движение.Склад = Склад;

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

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

// регистр СтоимостьМатериалов Расход

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

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

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

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

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

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

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

Цикл

157

 

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

 

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

 

 

 

// регистр Продажи КонецЦикла;

// записываем движения регистров

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

Движения.СтоимостьМатериалов.Записать();

Движения.Продажи.Записать();

//} }_КОНСТРУКТОР^ВИЖЕНИЙ_РЕГИСТРОВ

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

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

 

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

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

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

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

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

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

КонецЦикла;

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

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

 

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

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

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

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

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

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

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

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

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

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

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

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

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

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

КонецЦикла;

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

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

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

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

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

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

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

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

 

 

 

 

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

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

 

 

 

 

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

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

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

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

 

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

 

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

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

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

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

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

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

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

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

 

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

д

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

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

И

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

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

 

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

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

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

является    таблица

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

 

 

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

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

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

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

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

А

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

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

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

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

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

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

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

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

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

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

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

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

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

 

 

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

П

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

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

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

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

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

• «Дата»,

• «Номер»,

• «Склад»,

• «Мастер»,

• «Клиент»:

 

Обратите внимание, что при выборе полей «Склад», «Мастер» и

«Клиент» в список выбранных полей подбираются также поля

«Склад.Представление»,    «Мастер.Представление»    и

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

 

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

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

 

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

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

 

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

 

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

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

"ВЫБРАТЬ

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

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

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

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

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

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

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

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

| ИЗ

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

|

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

| Дата,

| Номер";

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

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

"ВЫБРАТЬ

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

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

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

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

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

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

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

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

 

 

 

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

"ВЫБРАТЬ

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

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

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

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

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

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

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

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

1ИЗ

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

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

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

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

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

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

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

 

 

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

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

 

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

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

 

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

 

 

 

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

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

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

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

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

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

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

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

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

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

/Л}КОНСТРУКТОР_ВЬКОДНЫХ_ФОРМ КонецПроцедуры

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

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

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

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

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

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

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

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

 

 

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

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

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

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

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

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

 

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

 

Отчет Рейтинг услуг

О

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

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

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

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

Откроем диалог ввода параметров виртуальной таблицы

 

 

Укажем, что начало и конец периода будут переданы в соответствующих параметрах «ДатаНачала» и «ДатаОкончания» (символ «&» перед именем указывает, что это параметр запроса):

Единственное, что нам останется сделать, это сбросить флаг «Все» у таблицы регистра и установить его у таблицы справочника.

 

 

 

Затем выберем из таблиц поля «СпрНоменклатура.Ссылка» и «ПродажиОбороты.ВыручкаОборот»:

 

Будем выбирать все элементы из справочника «Номенклатура»

 

 

 

j    - СпрНоменклатура.Ссылка

!    _ СпрНоменклатура.Представление

'?    | ПродажиОборотыВыручкаОборот

Перейдем на закладку «Связи» и увидим, что конструктор уже создал связь между двумя выбранными таблицами - значение изменения регистра «Номенклатура» должно быть равно ссылке на элемент справочника «Номенклатура».

Установка флага «Все» у таблицы справочника будет означать, что из справочника будут выбраны все элементы и этим элементам будет поставлено в соответствие значение оборота выручки из регистра. Таким образом, в результате запроса будут присутствовать все услуги, и для некоторых из них будут указаны обороты выручки. Для тех услуг, которые не оказывались в выбранном периоде, не будет указано ничего.

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

Вторым условием должно быть то, что выбранный элемент является услугой (это - «Простое условие»):

 

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

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

 

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

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

 

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

Теперь перейдем на закладку «Выходная форма». Укажем, что параметры «ДатаОкончания» и «ДатаНачала» будут редактироваться в форме в полях ввода с типом «Дата». Для параметра «ВидНоменклатуры» мы наоборот снимем признак редактирования в форме:

В этой процедуре, в той части, где выполняется установка параметров запроса, определим значение параметра «ВидНоменклатуры» (исправления выделены жирным шрифтом):

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

"ВЫБРАТЬ

| СпрНоменклатура.Ссылка КАК Услуга,

| СпрНоменклатура.Представление КАК Представление,

| ПродажиОбороты.ВыручкаОборот КАК Выручка

|И3

| Справочник.Номенклатура КАК СпрНоменклатура

| ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.Продажи,Обороты(&ДатаНачала,

|    &ДатаОкончания,,)

| КАК ПродажиОбороты

| ПО ПродажиОбороты.Номенклатура = СпрНоменклатура.Ссылка

ГДЕ

| (СпрНоменклатура.ЭтоГруппа = Ложь) И

| СпрНоменклатура.ВидНоменклатуры = &ВидНоменклатуры

|УПОРЯДОЧИТЬ ПО | ВыручкаУБЫВ

|ИТОГИ СУММА(Выручка) ПО | ОБЩИЕ";

ЗапросУстановитьПараметрС'ВидНоменклатуры",

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

Запрос.УстановитьПараметр("ДатаНачала",ДатаНачала); Запрос.УстановитьПараметрС'ДатаОкончания", ДатаОкончания);

Теперь рассмотрим текст запроса, сформированный конструктором:

 

 

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

 

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

"ВЫБРАТЬ

| СпрНоменклатура.Ссылка КАК Услуга,

| СпрНоменклатура.Представление КАК Представление,

|ПродажиОбороты.ВыручкаОборот КАК Выручка

| Справочник.Номенклатура КАК СпрНоменклатура

ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.Продажи.Обороты(&ДатаНачала,

 

 

| КАК ПродажиОбороты

| ПО ПродажиОбороты.Номенклатура = СпрНоменклатура.Ссылка

|

|ГДЕ

| (СпрНоменклатура.ЭтоГруппа = Ложь) И

| СпрНоменклатура.ВидНоменклатуры = &ВидНоменклатуры

|

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

| ВыручкаУБЫВ

|

|ИТОГИ СУММА(Выручка) ПО

| ОБЩИЕ";

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

При описании источников запроса (после ключевого слова ИЗ), использована возможность определения нескольких источников запроса:

|из

| Справочник.Номенклатура КАК СпрНоменклатура

| ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.Продажи.Обороты(&ДатаНачала,

|    &ДатаОкончания,,)

| КАК ПродажиОбороты

| ПО ПродажиОбороты.Номенклатура = СпрНоменклатура.Ссылка

В данном случае выбираются записи из двух источников: «СпрНоменклатура» и «ПродажиОбороты», причем ключевым предложением ЛЕВОЕ СОЕДИНЕНИЕ... ПО описан способ, которым будут скомбинированы между собой записи этих двух источников.

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

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

| РегистрНакопления.Продажи.Обороты(&ДатаНачала, &ДатаОкончания,,)

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

Если заранее известно, что пользователя не будут интересовать результаты работы отчета в периодах, указанных с точностью до секунд, то следует учесть следующую особенность: по умолчанию время в дате установлено в 00:00:00. Поэтому, если не предпринять специальных мер, получится, что когда пользователь задаст период отчета с 01.03.2004 по 31.03.2004, итоги регистра будут рассчитаны с начала дня 01.03.2004 00:00:00 по начало дня 31.03.2004 00:00:00. Таким образом, данные за 31 число, отличные от начала дня, в расчет не войдут, что сильно удивит пользователя.

Для того чтобы исключить эту ситуацию, следует сделать две вещи.

Во-первых, в форме отчета ограничить пользователя в возможностях ввода даты начала и даты окончания, установив для соответствующих полей ввода состав даты как «Дата»:

Определим состав даты...

 

 

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

Далее в запросе следует часть упорядочивания результатов, а за ней - новая для нас часть, которая не встречалась ранее - описание итогов:

 

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

ТабДок = ЭлементыФормы.ТабличноеПоле;

РейтингУслуг(ТабДок, Неопределено, ДатаНачала, КонецДня(ДатаОкончания));

//}}КОНСТРУКТОР_ВЫХОДНЫХ_ФОРМ_ПРОЦЕДУРА_ВЫЗОВА

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

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

"ВЫБРАТЬ

| СпрНоменклатура.Ссылка КАК Услуга,

| СпрНоменклатура.Представление КАК Представление,

| ПродажиОбороты.ВыручкаОборот КАК Выручка

|ИЗ

| Справочник.Номенклатура КАК СпрНоменклатура

| ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.Продажи.Обороты(&ДатаНачала,

|    &ДатаОкончания,

| КАК ПродажиОбороты

| ПО ПродажиОбороты.Номенклатура = СпрНоменклатура.Ссьшка

|ГДЕ

| СпрНоменклатура.ЭтоГруппа = Ложь И

| СпрНоменклатура.ВидНоменклатуры = &ВидНоменклатуры

|

Условию отбора всегда предшествует ключевое слово ГДЕ. После него описывается само условие. Обратите внимание, что поля исходных таблиц, на которые накладывается условие, могут и не входить в список выборки (как в нашем случае). Кроме того, в нашем условии использован параметр запроса «ВидНоменклатуры».

 

|ИТОГИ СУММА(Выручка) ПО

| ОБЩИЕ";

Она всегда начинается с ключевого слова ИТОГИ, за которым следует описание того, какие итоги будут присутствовать в результате запроса. Сразу после слова ИТОГИ описываются агрегатные функции, которые необходимо рассчитывать в итогах. В нашем случае будет рассчитываться сумма по полю «Выручка». Затем следует ключевое слово ПО, после которого описываются группировки, в которых должны быть рассчитаны итоги. В нашем случае они отсутствуют, и используется только ключевое слово ОБЩИЕ, которое указывает на то, что итоги будут рассчитаны по всей таблице в целом.

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

Зададим период отчета с 01.03.2004 по 30.04.2004. Результат будет выглядеть следующим образом:

 

Теперь изменим дату окончания на 31.03.2004 и убедимся, что данные за 31 марта попадают в отчет:

 

 

Отчет ВыручкаМастеров

О

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

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

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

 

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

 

После этого выберем из таблицы следующие поля:

• «ПродажиОбороты.Мастер»,

• «ПродажиОбороты.Период»,

• «ПродажиОбороты.Клиент»,

• «ПродажиОбороты.ВыручкаОборот»:

 

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

зададим    псевдоним    «Выручка»    для    поля

«ПродажиОбороты.ВыручкаОборот»:

 

 

На закладке «Отчет» сбросим флаг «Использовать построитель

отчета».

На закладке «Выходная форма» отметим, что тип параметров «ДатаНачала» и «ДатаОкончания» будет Дата. Нажмем «ОК».

Сразу, как и в предыдущем отчете, определим состав даты для полей ввода, расположенных в форме, и затем в вызове процедуры «ВыручкаМастеров» уточним передачу последнего параметра при помощи функции КонецДня():

ПродедураДействияФормыВыручкаМастеровСформировать(Кнопка) //{{КОНСТРУКТОР_ВЫХОДНЬК_ФОРМ_ПРОЦЕДУРА_ВЫЗОВА //(ВыручкаМастеров)

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

ТабДок = ЭлементыФормы.ТабличноеПоле; ВыручкаМастеров(ТабДок, ДатаНачала, КонецДня(ДатаОкончанил));

//}}КОНСТРУКТОР_ВЬГХОДНЫХ_ФОРМ_ПРОЦЕДУРА_ВЫЗОВА КонецПроцедуры

Теперь обратимся к процедуре «ВыручкаМастеров» и в первую очередь рассмотрим текст запроса, сформированный конструктором:

 

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

 

 

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

"ВЫБРАТЬ

| ПродажиОбороты.Мастер КАК Мастер,

| ПродажиОбороты.Мастер.Представление,

| ПродажиОбороты.Период КАК Период,

| ПродажиОбороты.Клиент,

| ПродажиОбороты.Клиент.Представление,

| ПродажиОбороты.ВыручкаОборот КАК Выручка

|ИЗ

| РегистрНакопления.Продажи.Обороты(&ДатаНачала, &ДатаОкончания, День,) КАК ПродажиОбороты

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

| Период

|

 

 

 

ИТОГИ СУММА(Выручка) ПО | ОБЩИЕ,

| Мастер, | Период";

Теперь, чтобы наглядно продемонстрировать смысл наших дальнейших действий, запустите 1С:Предприятие в режиме отладки и посмотрите на результат работы отчета «Выручка мастеров» за период c01.03.2004no30.04.2004:

 

В части описания запроса обратите внимание, что у источника данных кроме задания начала и окончания периода расчета итогов задана периодичность выбираемых данных - «День»:

|из

| РегистрНакопления.Продажи.Обороты(&ДатаНачала, &ДатаОкончания, День,)

| КАК ПродажиОбороты    ,

Именно благодаря этому у нас появляется возможность описать среди выбранных полей поле «Период».

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

|ИТОГИ СУММА(Выручка) ПО I ОБЩИЕ, | Мастер, | Период";

Помимо общих итогов, в нашем запросе будут рассчитаны промежуточные итоги по полям «Мастер» и «Период».

 

 

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

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

Запрос.Текст = "ВЫБРАТЬ

|ПродажиОбороты.Мастер КАК Мастер, |ПродажиОбороты.Мастер.Представление, |ПродажиОбороты.ПериодКАКПериод, |ПродажиОбороты.Клиент, |ПродажиОбороты.Клиент.Представление, |ПродажиОбороты.ВыручкаОборот КАК Выручка

 

 

 

1ИЗ

I РегистрНакопления.Продажи.Обороты(&ДатаНачала, &ДатаОкончания, День,)

I КАК ПродажиОбороты

I

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

I Период

I

!ИТОГИ СУММА(Выручка) ПО

I ОБЩИЕ,

I Мастер,

I Период ПЕРИОДАМЩДень, &ДатаНачала, &ДатаОкончания)";

Такая запись говорит о том, что итоги должны быть, рассчитаны периодами равными дню, в интервале дат, задаваемом параметрами «ДатаНачала» и «ДатаОкончания».

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

ВыборкаМастер = ВыборкаОбщийИтог

.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);

Пока ВыборкаМастер.Следующий() Цикл ОбластьМастер.Параметры.Заполнить(ВыборкаМастер); ТабДок.Вывести(ОбластьМастер, ВыборкаМастер.Уровень());

ВыборкаПериод = ВыборкаМастер

.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам, "Пернод","Все");

Пока ВыборкаПериод.Следующий() Цикл ОбластьПериод.Параметры.Заполнить(ВыборкаПериод); ТабДок.Вьщесп(ОбластьПериодВыборкаПериод.Уровень());

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

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

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

Запустим 1С:Предприятие в режиме отладки и выполним отчет «ВыручкаМастеров» за период с 20.03.2004 по 20.04.2004.

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

Очевидно, что такой внешний вид отчета абсолютно «нечитабелен», поэтому мы снова вернемся к модулю отчета и внесем небольшие уточнения в алгоритм вывода областей табличного документа:

Пока ВыборкаМастер.Следующий() Цикл ОбластьМаетер.Параметры.ЗаполнитыЗыборкаМастер); ТабДок.Вывести(ОбластьМастер, ВыборкаМастер.Уровень());

ВыборкаПериод = ВыборкаМастер

.Bыбрать(ОбходРезультата3anpoca.ПоГруппировкам, "Период", "Bce");

Пока ВыборкаПериод.Следующий() Цикл ОбластьПериод.Параметры.Заполнить(ВыборкаПериод); ТабДок.Вывести(ОбластьПериод, ВыборкаПериод.Уровень(),, Ложь);

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

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

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

Запустим 1С:Предприятие в режиме отладки и снова выполним отчет «ВыручкаМастеров» за период с 20.03.2004 по 20.04.2004.

 

На этот раз результат выглядит гораздо лучше:

 

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

 

Отчет ПереченьУслуг

О

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

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

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

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

• «СпрНоменклатура.Родитель»,

• «СпрНоменклатура.Ссылка»,

• «ЦеныСрезПоследних.Цена»:

 

 

 

 

Перейдем на закладку «Связи» и сбросим флаг «Все» у таблицы регистра и установим его у таблицы справочника.

 

На закладке «Условия» зададим условие выбора элементов справочника «Номенклатура» - выбираемые элементы должны соответствовать виду номенклатуры переданному в параметре запроса «ВидНоменклатуры»:

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

 

Запрос.УстановитьПараметрС'ВидНоменклатуры",

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

Запрос.УстановитьПараметр("ДатаОтчета".ДатаОтчета);

 

На закладке «ОбъединенияЛЛсевдонимы» укажем, что поле «Родитель» будет иметь псевдоним «ГруппаУслуг», а поле «Ссылка» -«Услуга»:

 

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

 

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

На закладке «Выходная форма» отметим, что тип параметра «ДатаОтчета» будет Дата, а параметр «ВидНоменклатуры» в форме редактироваться не будет. Нажмем «ОК».

Теперь рассмотрим текст запроса, сформированный конструктором:

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

"ВЫБРАТЬ

| СпрНоменклатура.Родитеяь КАК ГруппаУслуг,

| СпрНоменклатура.Родитель.Представление,

I СпрНоменклатура.Ссылка КАК Услуга,

I СпрНоменклатура.Представление,

I ЦеныСрезПоследних.Цена

|ИЗ

I Справочник.Номенклатура КАК СпрНоменклатура

I ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.Цены.СрезПоследних(&ДатаОтчета,)

| КАК ЦеныСрезПоследних

| ПО ЦеныСрезПоследних.Номенклатура = СпрНоменклатура.Ссылка

|ГДЕ

I СпрНоменклатура.ВидНоменклатуры = &ВидНоменклатуры

|

|ИТОГИ ПО

| ГруппаУслугИЕРАРХИЯ";

Практически все конструкции, использованные в этом запросе, нам уже известны, за исключением ключевого слова ИЕРАРХИЯ, использованного в части описания итогов. Это ключевое слово позволяет рассчитывать итоги по иерархии справочника, однако поскольку в нашем случае какие либо итоги в отчете не нужны, мы использовали эту возможность для создания группировок по иерархии справочника «Номенклатура».

Теперь запустим 1С:Предприятие в режиме отладки и, прежде всего, откроем периодический регистр «Цены».

Добавим в него еще одно значение для услуги «Диагностика»

новая цена услуги на 01.04.2002 (это позволит нам протестировать

отчет):    i

Еще раз выполним отчет, но теперь уже на другую дату

01.04.2004:    FJ    д у

 

 

Теперь выполним отчет «Перечень услуг» по состоянию на 31.03.2004:

 

 

 

Как видите, показана новая цена услуги «Диагностика» - 350 руб.

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

Наш отчет правильно отражает цену услуги «Диагностика» на 31.04-200py6.

 

Отчет РейтингКлиентов

О

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

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

Диаграмма

Д

иаграмма является элементом управления, предназначенным для размещения в таблицах и формах системы 1С:Предприятие диаграмм и графиков различного вида.

Логически диаграмма является совокупностью точек, серий и значений серий в точке:

Значение серии в точке

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

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

Диаграмма, как объект встроенного языка, имеет три области, которые позволяют управлять оформлением диаграммы - это область построения, область заголовка и область легенды:

Область заголовка

Область построения

 

 

 

 

 

Точка

 

Серия

 

Область легенды

двумя

Диаграмма может быть вставлена в форму либо в табличный Документ. Заполнение диаграммы данными возможно способами.

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

 

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

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

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

В следующем примере мы будем использовать диаграмму, расположенную в форме и заполнять ее данными «вручную», используя метод УстановитьЗначение().

Создание отчета РейтингКлиентов

С

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

Затем разместим под ним диаграмму с именем «Диаграмма». Изменим размеры областей диаграммы, и зададим текст области заголовка - «Рейтинг клиентов»:

 

В модуле формы создадим процедуру «Сформировать» с заготовкой для текста запроса:

 

 

Процедура Сформировать() Запрос = Новый Запрос; Запрос.Текст =

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

Установим курсор в предпоследней строке, перед точкой с запятой и вызовем конструктор запроса (Текст | Конструктор запроса...). Выберем виртуальную таблицу регистра накопления «Продажи.Обороты» и из нее одно поле «ПродажиОбороты.Клиент.Представление».

 

Затем добавим новое поле (иконка «Добавить» в командной панели над списком полей) и при помощи построителя выражений определим его как разность между выручкой и стоимостью:

На закладке «Порядок» укажем, что строки результата нужно упорядочивать по убыванию значения поля «Доход». Нажмем «ОК» и посмотрим, какой текст сформировал конструктор запроса:

 

 

Процедура Сформировать() Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ

| ПродажиОбороты.Клиент.Представление КАК Клиент, | ПродажиОбороты.ВыручкаОборот - ПродажиОбороты.СтоимостьОборот | КАК Доход |ИЗ | РегистрНакопления.Продажи.Обороты КАК ПродажиОбороты

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

| ДоходУБЫВ"; КонецПроцедуры

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

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

ПродажиОбороты.ВыручкаОборот - ПродажиОбороты.СтоимостьОборот КАК Доход

 

 

На закладке «Объединения/Псевдонимы» укажем, что поле «ПродажиОбороты.Клиент.Представление» будет иметь псевдоним «Клиент», а вычисляемое поле - псевдоним «Доход»:

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

Добавим в процедуру следующий текст (добавленный текст выделен жирным шрифтом):

 

 

Процедура Сформировать() Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ

| ПродажиОбороты.Клиент.Представление КАК Клиент, | ПродажиОбороты.ВыручкаОборот — ПродажиОбороты.СтоимостьОборот | КАК Доход |ИЗ

| РегистрНакопления.Продажи.Обороты КАК ПродажиОбороты

 

 

!УПОРЯДОЧИТЬ ПО I ДоходУБЫВ";

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

Диаграмма = ЭлементыФормы.Диаграмма; //запретить обновление и автотранспонирование диаграммы Диаграмма.Обновление = Ложь; Диаграмма.АвтоТранспонирование = Ложь;

//создать единственную точку диаграммы ТочкаДиаграммы = Диаграмма.УстановитьТочку("Доход");

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

Пока ВыборкаРезультатаЗапроса.СледующнйО Цикл ТекущаяСерияДиаграммы = Диаграмма

.УстановитьСерию(ВыборкаРезультатаЗапроса.Клиент);

Диаграмма.УстановитьЗначение(ТочкаДиаграммы,ТекущаяСерияДиаграммы,

ВыборкаРезультатаЗапроса.Доход);

КонецЦикла;

//разрешить обновление и автотранспонирование диаграммы Диаграмма.Обновление = Истина; Диаграмма.АвтоТранспонирование = Истина;

Сначала, с помощью метода Выполнить() мы получаем результат запроса. Затем методом Выбрать() получаем выборку записей из результата запроса в переменной «ВыборкаРезультатаЗапроса».

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

После этого добавляем в диаграмму единственную точку.

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

После заполнения диаграммы данными мы включаем свойство «Обновление», чтобы новое состояние диаграммы было отображено, и

 

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

<#" Узнай больше!

Следует сделать несколько замечаний no оптимизации заполнения диаграммы данными.

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

Во-вторых, перед началом заполнения диаграммы данными

следует также отключать автотранспонирование диаграммы

(свойство    диаграммы    «АвтоТранспонирование»).

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

Теперь создадим обработчик события формы «ПриОткрытии», и добавим в него установку значения поля выбора и типа диаграммы, и вызов нашей процедуры «Сформировать»:

Процедура ПриОткрытии() // Заполним список поля выбора

ПолеВыбора = ТипДиаграммы. Гистограмма;

ЭлементыФормы.Диаграмма.ТипДиаграммы = ПолеВыбора;

Сформировать(); КонецПроцедуры

 

В теле модуля формы опишем заполнение списка выбора для поля выбора:

Запустим 1С:Предприятие в режиме отладки и откроем отчет «РейтингКлиентов». Обратите внимание, что при наведении курсора на столбец гистограммы появляется подсказка:

 

СписокВыбора = ЭлементыФормы.ПолеВыбора.СписокВыбора;

СписокВыбора.Добавить(ТипДиаграммы.График, "График"); СписокВыбора.Добавить(ТипДиаграммы.Гистограмма, "Гистограмма"); СписокВыбора.Добавить(ТипДиаграммы.ГистограммаОбъемная, "Гистограмма 3D"); СписокВыбора.Добавитъ(ТипДиаграммы.ГистограммаГоризонтальная,

"Гистограмма горизонтальная"); СписокВыбора.Добавить(ТипДиаграммы.ГистограммаГоризонтальнаяОбъемная,

"Гистограмма горизонтальная 3D");

СписокВыбора.Добавить(ТипДиаграммы.Круговая, "Круговая"); СписокВыбора.Добавить(ТипДиаграммы.КруговаяОбъемная,"Круговая объемная"); СписокВыбора.Добавить(ТипДиаграммы.Изометрическая," Изометрическая"); СгшсокВыбора.Добавить(ТипДиаграммы.ИзометрическаяНепрерывная,

"Изометрическая непрерывная"); СписокВыбора.ДобавитьСГипДиаграммы.ИзометрическаяЛента,

"Изометрическая лента");

СписокВыбора.Добавить(ТипДиаграммы.ИзометрическаяПирамида, "Изометрическая пирамида");

 

 

Теперь изменим тип диаграммы на «Круговая объемная>:

 

 

 

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

ПроцедураПолеВыбораПриИзмененииЭлемент)

ЭлементыФормы.Диаграмма.ТипДиаграммы = ПолеВыбора;

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

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

 

заполнения диаграммы данными, используя свойство диаграммы -«ИсточникДанных».

Вернемся в модуль формы отчета «РейтингКлиентов» и все строки, которыми мы добавляли в диаграмму данные:

 

«вручную» (используя

обрабатывать транспонирование диаграммы свойство СерииВСтроках).

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

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

Диаграмма = ЭлементыФормы.Диаграмма; //запретить автотранспонирование диаграммы Диаграмма.АвтоТранспонирование = Ложь;

//создать единственную точку диаграммы ТочкаДиаграммы = Диаграмма.УетановитьТочку("Доход");

//перебрать выборку результата запроса и создать серии и значения Пока ВыборкаРезультатаЗапроса.Следующий() Цикл ТекущаяСерияДиаграммы = Диаграмма

.УстановитьСерикКВыборкаРезультатаЗапроса.Клиент); Диаграмма.УстановитьЗначение(ТочкаДиаграммы, ТекущаяСерияДиаграммы,

ВыборкаРезультатаЗапроса.Доход); КонецЦикла;

//разрешить автотранспонирование диаграммы Диаграмма.АвтоТранспонирование = Истина;

заменим одной строкой:

ЭлементыФормы.Диаграмма.ИсточникДанных = Запрос,Выполнить().Выгрузить();

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

Запустите 1С:Предприятие в режиме отладки и проверьте работу отчета. Обратите внимание на то, что некоторые типы диаграмм выглядят «некрасиво» (график) или не отображаются совсем (изометрическая непрерывная, изометрическая лента). Это связано с тем, что при использовании источника данных нет возможности использовать свойство диаграммы «АвтоТранспонирование» и нужно

 

н п

Универсальный отчет

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

Построитель отчета

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

работы

интерактивно, непосредственно пользователем.

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

 

 

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

Автоматически параметры настройки формируются вызовом метода ЗаполнитьНастройки() следующим образом:

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

порядка или вывода в отчет (свойство «ДоступныеПоля»),

становятся все поля из списка выборки и все их подчиненные

поля,

• в список полей, выбранных для вывода в отчет (свойство

«ВыбранныеПоля»), добавляются все поля из списка выборки,

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

становятся все поля из предложения ИТОГИ ПО и все их

подчиненные поля,

 

• в список измерений по строкам (свойство

«ИзмеренияСтроки») добавляются все поля из предложения

ИТОГИПО,

• в доступные отборы (свойство «Отбор») добавляются

параметры виртуальных таблиц.

Вторым способом формирования параметров настроек построителя отчета является выделение их в тексте запроса. Для этого используются фигурные скобки «{}». Фигурными скобками могут быть выделены параметры построителя отчета, а также некоторые синтаксические конструкции:

• ВЫБРАТЬ ... - описывает поля, которые пользователь сможет

выбирать для вывода,

• ГДЕ ... - описывает поля, на которые пользователь может

накладывать ограничения,

• УПОРЯДОЧИТЬПО ... - описывает поля для обозначения

порядка,

•    ИТОГИ ПО ... - описывает поля, по которым будут

выводиться итоговые значения.

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

 

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

Создание универсального отчета

М

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

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

В модуле отчета создадим текст запроса для построителя отчета. Для этого вставим в модуль следующие строки:

ПостроительОтчета.Текст =

;

Установим курсор перед символом точки с запятой и вызовем конструктор запросов (Текст | Конструктор запроса...).

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

 

Ha закладке «Итоги» укажем получение общих итогов и выберем все ресурсы регистра:

 

 

 

Нажмем «OK». B модуле отчета появится текст сформированного запроса:

ПостроительОтчета.Текст =

"ВЫБРАТЬ

| ПродажиОбороты.Номенклатура,

| ПродажиОбороты.Номенклатура.Представление,

| ПродажиОбороты.Клиент,

| ПродажиОбороты.Клиент.Представление,

| ПродажиОбороты.Мастер,

| ПродажиОбороты.Мастер.Представление,

| ПродажиОбороты.КоличествоОборот КАК КоличествоОборот,

| ПродажиОбороты.ВыручкаОборот КАК ВыручкаОборот,

| ПродажиОбороты.СтоимостьОборот КАК СтоимостьОборот

|ИЗ

| РегистрНакопления.Продажи.Обороты КАК ПродажиОбороты

|

|ИТОГИ СУММАСКоличествоОборот), СУММА(ВыручкаОборот),

|    СУММА(СтоимостьОборот)

| ПООБЩИЕ";

Добавим в текст запроса указания для построителя отчетов:

ПостроительОтчета.Текст =

"ВЫБРАТЬ

| ПродажиОбороты.Номенклатура,

| ПродажиОбороты.Номенклатура.Представление,

| ПродажиОбороты.Клиент,

| ПродажиОбороты.Клиент.Представление,

| ПродажиОбороты.Мастер,

| ПродажиОбороты.Мастер.Представление,

| ПродажиОбороты.КоличествоОборот КАК КоличествоОборот,

| ПродажиОбороты.ВыручкаОборот КАК ВыручкаОборот,

| ПродажиОбороты.СтоимостьОборот КАК СтоимостьОборот

|ИЗ

| РегистрНакопления.Продажи.Обороты КАК ПродажиОбороты

|{ИТОГИ ПО Номенклатура, Клиент, Мастер}

|ИТОГИ СУММАСКоличествоОборот), СУММА(ВыручкаОборот),

|    СУММА(СтоимостьОборот)

| ПООБЩИЕ";

Теперь создадим форму отчета и расположим на ней поле

табличного документа (Форма | Вставить элемент управления I

Поле табличного документа)    с    именем

«ПолеТабличногоДокумента»:

Расположим в форме поле табличного документа

 

Затем установим курсор в верхнюю левую ячейку поля табличного

документа    и    выполним

Таблица | Встроенные таблицы | Вставить сводную таблицу.

После этого создадим обработчик события формы отчета «При открытии», и добавим в него следующий текст:

Процедура ПриОткрытии() СводнаяТаблица = ЭлементыФормы.ПолеТабличногоДокумеита

?ВстроенныеТаблицы.СводнаяТаблица1,' СводнаяТаблица.ИсточникДанных = ПостроительОтчета;

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

 

Этим текстом мы устанавливаем сводной таблице в качестве источника данных построитель отчета.

Запустим 1С:Предприятие в режиме отладки и откроем отчет «Универсальный». На экране появится форма отчета, и окно выбора полей сводной таблицы:

Теперь в окне выбора полей сводной таблицы раскроем группу «Номенклатура» и добавим значение «(Без иерархии)» в строки, а измерение «Клиент» добавим в колонки. Отчет изменит свой вид:

 

 

Поместим значение ресурса «ВыручкаОборот» в данные, измерение «Номенклатура» в строки, а измерение «Мастер» в колонки. Отчет примет вид:

 

 

Таким образом, используя построитель отчета, мы предоставили пользователю возможность самостоятельно формировать отчет по регистру «ОказанныеУслуги» в том виде, который ему нужен.

 

 

Отчет Универсальный2

 

«ТабличноеПолеПоля» (соответственно «КоманднаяПанельПорядок» и «ТабличноеПолеПорядок»):

 

 

 

Н

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

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

Создадим новый объект конфигурации Отчет с именем «Универсальный2».

На закладке «Данные» создадим реквизит отчета с именем «ПостроительОтчета» и типом ПостроительОтчета. На закладке «Формы» с помощью конструктора создадим основную форму отчета и приступим к ее редактированию.

Расположим в форме две надписи с именами «Поля» и «Порядок» и заголовками «Поля:» и «Порядок:» соответственно:

 

 

Теперь для табличного поля «ТабличноеПолеПоля»

источник    данных

ОтчетОбъект.ПостроительОтчета.ВыбранныеПоля:

 

зададим как

 

 

 

 

 

 

 

 

Под каждым текстовым полем расположим командную панель и табличное поле с именами «КоманднаяПанельПоля» и

 

После этого для командной панели «КоманднаяПанельПоля» установим флаг «Автозаполнение» и в качестве источника действий укажем ТабличноеПолеПоля:

 

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

Табличному полю «ТабличноеПолеПорядок» укажем источник

данных ОтчетОбъект.ПостроительОтчета.Порядок, и у командной

панели    «КоманднаяПанельПорядок»    поднимем    флаг

«Автозаполнение» и укажем в качестве источника действий ТабличноеПолеПорядок:

 

 

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

Кроме этого, для того, чтобы пользователь мог настраивать значения этих полей, мы расположили в форме две командные панели, связанные с этими табличными полями. Используя свойства командных панелей «Автозаполнение» и «ИсточникДействий» мы добились автоматического формирования команд в командных панелях, исходя из типа данных, содержащихся в каждом из табличных полей.

*" Узнай больше!

О связи элементов управления и данных, можно прочитать в разделе «Данные и элементы управления» на странице 502

Теперь в нижней части формы разместим еще одну надпись с именем «Оформление» и заголовком «Оформление:», а под ним поле выбора с именем «ПолеВыбораОформление»:

 

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

 

| РегистрНакопления.Продажи КАК Продажи

|

|{УПОРЯДОЧИТЬ ПО Номенклатура.*, Клиент.*, Мастер.*}

|

|ИТОГИ СУММА(Количество),

|    Сумма(Выручка),

|    Сумма(Стоимость)

| ПО ОБЩИЕ";

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

Конструкция ВЫБРАТЬ позволяет предоставить пользователю возможность выбирать в качестве полей запроса как сами исходные поля запроса, так и все поля «через точку» от данных полей.

Конструкция УПОРЯДОЧИТЬ ПО предоставляет пользователю возможность упорядочивать строки результата запроса.

Теперь, для того, чтобы привести состав полей в «исходное» состояние, добавим команду очистки выбранных полей построителя отчета, и затем в обработчик «КнопкаСформироватьНажатие» вставим команды выполнения построителя отчета:

 

ПроцедураКнопкаСформироватьНажатие(Элемент) КонецПроцедуры

ПостроительОтчета.Текст =

"ВЫБРАТЬ

| Продажи.Номенклатура КАК Номенклатура,

| Продажн.Клиент КАК Клиеит,

| Продажи.Мастер КАК Мастер,

| Продажи.Количество КАК Количества,

| Продажи.Выручка КАК Выручка,

| Продажи.Стоимость КАК Стоимость

|{ВЫБРАТЬ

| Номенклатура.*,

| Клиент.*,

| Мастер.*,

| Количество.*,

| Выручка.*,

| Стоимость.*}

|ИЗ

 

ПроцедураКнопкаСформироватьНажатие(Элемент) ПостроительОтчета.МакетОформления =

ПолучитьМакетОформления(ПолеВыбораОформление);

ПостронтельОтчета.Выполнить(); ПостроительОтчета.Вывести();

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

ПостроительОтчета.Текст =

"ВЫБРАТЬ

| Продажи.Номенклатура КАК Номенклатура,

| Продажи.Клиент КАК Клиент,

| Продажи.Мастер КАК Мастер,

| Продажи.Количество КАК Количество,

| Продажи.Выручка КАК Выручка,

| Продажи.Стоимость КАК Стоимость

|{ВЫБРАТЬ

| Номенклатура.*,

| Клиент.*,

| Мастер.*,

| Количество.*,

| Выручка.*,

 

 

 

I Стоимость.*}

1ИЗ

I РегистрНакопления.Продажи КАК Продажи

I

!{УПОРЯДОЧИТЬ ПО Номенклатура.*, Клиент.*, Мастер.*}

I

1ИТОГИ СУММА(Количество),

I    Сумма(Выручка),

I    Сумма(Стоимость)

I ПО ОБЩИЕ";

ПостроительОтчета.ВыбранныеПоля.Очистить():

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

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

Теперь, для завершения нашего универсального отчета следует заполнить список выбора поля выбора «ПолеВыбораОформление» и установить начальное значение поля:

 

| Продажи.Мастер КАК Мастер,

| Продажи.Количество КАК Количество,

| Продажи.Выручка КАК Выручка,

| Продажи.Стоимость КАК Стоимость

!{ВЫБРАТЬ

| Номенклатура.*,

| Клиент.*,

| Мастер.*,

I Количество.*,

I Выручка.*,

| Стоимость.*}

| ИЗ

I РегистрНакопления.Продажи КАК Продажи

I

|{УПОРЯДОЧИТЬ ПО Номенклатура.*, Клиент.*, Мастер.*}

I

ИТОГИ СУММА(Количество),

I    Сумма(Выручка),

I    Сумма(Стоимость)

I ПООБЩИЕ";

ПостроительОтчета.ВыбранныеПоля.Очистить();

СписокВыбора = ЭлементыФормы.ПолеВыбораОформление.СписокВыбора;

СписокВыбора.Добавить(СтандартноеОформление.БезОформления,

"БезОформления");

СписокВыбора.Добавить(СтандартноеОформление.Апельсин, "Апельсин"); СпнсокВыбора.Добавить(СтандартноеОформление.Асфальт, "Асфальт"); СписокВыбора.Добавить(СтандартноеОформление.Бирюза, "Бирюза"); СписокВыбора.Добавить(СтандаргноеОформление.Текстиль, "Текстиль");

ПолеВыбораОформление = СтаидартноеОформление.БезОформлевия;

 

 

 

ПроцедураКношсаСформироватьНажатие(Элемент) ПостроительОтчета.МакетОформления =

ПолучитьМакетОформления(ПолеВыбораОформление);

Построительотчета.ОформитьМакет();

ПостроительОтчета.Вышшшть(); ПостроительОтчета.Вывести(); КонецПроцедуры

ПостроитедьОтчета.Текст =

"ВЫБРАТЬ

I Продажи.Номенклатура КАК Номенклатура,

I Продажи.Клиент КАК Клиент,   

Запустим 1С:Предприятие в режиме отладки и откроем отчет «Универсальный2».

Выберем поля: «Мастер», «Номенклатура.ВидНоменклатуры», «Номенклатура» и «Выручка». Зададим следующий порядок сортировки:

• «Мастер»    по возрастанию,

• «Номенклатура.ВидНоменклатуры» по убыванию,

• «Номенклатура» по возрастанию.

 

 

 

Выберем оформление «Апельсин» и нажмем «Сформировать» Результат будет выглядеть следующим образом:

 

Теперь изменим условия формирования отчета. Выберем поля «Клиент», «Номенклатура» и «Выручка», порядок сортировки будет по возрастанию значения поля «Клиент», а вариант оформления -«Асфальт»:

 

Использование построителя отчета в конструкторе выходной формы

в

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

формы.

Отчет УниверсальныйЗ

П

осмотрим, как будет выглядеть отчет «Универсальный2», если, при создании его в конструкторе выходной формы, указать использование построителя отчета.

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

На закладке «Итоги» отметим получение общих итогов и перейдем на закладку «Отчет»:

 

 

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

 

 

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

 

представления (например, для табличного документа - размещение группировок, реквизитов, итогов, наличие группировок и т.д.).

В нашем случае согласимся с параметрами, которые конструктор предложил по умолчанию, единственное, что мы изменим - вариант стандартного оформления установим «Асфальт».

Перейдем на закладку «Выходная форма» и откроем закладку: «Форма настройки построителя отчета»:

Запустим 1С:Предприятие в режиме отладки, откроем отчет «УниверсальныйЗ», нажмем кнопку «Настройка...» и установим параметры выбранных полей и порядка такими же, как в последнем примере с отчетом «Универсальный2»:

• выбранные    поля:    «Клиент»,    «Номенклатура»

«ВыручкаОборот»,

• порядок: «Клиент» по возрастанию:

 

 

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

В нашем случае мы снова согласимся с тем, что конструктор предлагает по умолчанию, и нажмем «ОК».

Конструктор сформирует форму отчета и форму настроек отчета.

 

 

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

Отчет ВыручкаМастеров2

T

еперь, мы создадим отчет, аналогичный    отчету

«ВыручкаМастеров», который будет выводить результат в сводную диаграмму.

Откроем конфигуратор и создадим новый объект

 

 

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

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

 

Теперь зададим условие отбора таким, что значение поля «Номенклатура.ВидНоменклатуры» должно быть равно «Материал» (для ввода условия отбора можно использовать клавишу «Insert»). И в заключение, после того как диаграмма будет заново сформирована, раскроем группу серий «ВыручкаОборот»:

 

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

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



  Copyright © 2007 Udex.Ru

Hosted by uCoz