<<

стр. 3
(всего 11)

СОДЕРЖАНИЕ

>>

(добавленный текст выделен жирным шрифтом):

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

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



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

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


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




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



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

Д о сих пор мы с вами учитывали только количественное
Эта глава будет посвящена тому, как один и тот же документ может
движение материалов в OOO «На все руки мастер». Для этих
«поставлять» информацию в различные регистры конфигурации и для
целей мы создали регистр накопления «ОстаткиМатериалов».
чего может понадобиться такая возможность.
Однако, как вы, наверное, догадываетесь, одного только
В ходе изучения этой главы мы создадим еще один регистр количественного учета совершенно недостаточно для нужд нашего
накопления нашей конфигурации и изменим процедуру проведения 000.
документов так, чтобы они записывали необходимые данные как в
Очевидно, что необходимо также знать, какие денежные средства
один, так и в другой регистр и подготовим базу для изучения были затрачены на приобретение тех или иных материалов, и каковы
следующей главы. материальные запасы OOO «На все руки мастер» в денежном
выражении.
После того, как мы начали автоматизировать наше предприятие,
руководство 000 «На все руки мастер» высказало пожелание, чтобы
весь суммовой учет материалов велся бы теперь по средней стоимости.
To есть, при закупке материалов они должны учитываться в ценах
приобретения, а при расходе - по средней стоимости, которая
рассчитывается исходя из общей суммы закупок данного материала и
общего количества этого материала, находящегося в OOO.
Поскольку подобная информация имеет совершенно другую
структуру, нежели количественный учет, для хранения данных об
общей стоимости тех или иных материалов мы будем использовать
еще один регистр накопления «СтоимостьМатериалов».
Таким образом, документы «ПриходнаяНакладная» и
«ОказаниеУслуги» должны будут создавать движения не только в
регистре «ОстаткиМатериалов», но, одновременно, и в регистре
«СтоимостьМатериалов», отражая изменения суммового учета.




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



Изменение процедуры проведения
Создание регистра СтоимостьМатериалов

Р документа ПриходнаяНакладная
егистр «СтоимостьМатериалов» совсем не сложен, поэтому мы


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

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




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

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

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

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




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



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

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




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

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




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

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




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

Проведем документ Оказание услуги №1 и посмотрим на движения
Движение.Материал = ТекСтрокаПереченьНоменклатуры.Номенклатура;
этого документа по регистру «СтоимостьМатериалов»:
Движение.Склад = Склад;
Движение.Количество = ТекСтрокаПереченъНоменклатуры.Количество;
//КонецЦикла;
//Для Каждого ТекСтрокаПереченьНоменклатуры Из ПереченьНоменклатуры Цикл
// регистр СтоимостьМатериалов Расход Движение =
Движения.СтоимостьМатериалов.Добавить();
Движение.ВидДвижения = ВидДвиженияНакопления.Расход;
Движение.Период = Дата;
Движение.Материал = ТекСтрокаПереченьНоменклатуры.Номенклатура;
Движение.Стоимость = ТекСтрокаПереченьНоменклатуры.Стоимость *
ТекСтрокаПереченьНоменклатуры.Количество;
КонецЦикла;
// записываем движения регистров Т е п е р ь с о з д а д и м и п р о в е д е м е щ е д в а д о к у м е н та
Движения.ОстаткиМатериалов.Записать();
«ОказаниеУслуги». Эти документы понадобятся нам в дальнейшем,
Движения.СтоимостьМатериалов.Записать();
поэтому будьте внимательны и обратите внимание на то, что эти
//} }_КОНСТРУКТОР_ДВИЖЕНИЙ_РЕГИСТРОВ
документы созданы другими датами:
Проверим, как теперь работает проведение документа
«ОказаниеУслуги».
Запустим 1С:Предприятие в режиме отладки и укажем стоимость
выбранных материалов:




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



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


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




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




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



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

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

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




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


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


К огда мы создавали регистры «ОстаткиМатериалов» конкретного склада. Если же в этой ситуации появляется желание
отразить учет материалов еще и в разрезе поставщика, то здесь уже
«СтоимостьМатериалов», мы специально не останавливались на
нужно исходить из конкретной схемы учета, принятой на
двух видах регистров накопления, которые существуют в
предприятии.
системе 1С:Предприятие. Сейчас пришло время сказать об этом пару
слов. Скорее всего, при поступлении материалов поставщик будет
указан, а вот при расходе материалов, с большой долей вероятности
Регистры накопления могут быть регистрами остатков и
поставщик указываться не будет, так как в большинстве случаев это
регистрами оборотов.
совершенно лишняя информация. Значит, поставщика следует
Существующие в нашей учебной конфигурации регистры
добавить как реквизит регистра накопления.
«ОстаткиМатериалов» и «СтоимостьМатериалов» являются
Если же при расходе материалов поставщик будет указываться
регистрами остатков. Если вы вспомните момент, когда мы создавали
наверняка, тогда имеет смысл добавить поставщика в измерения
отчет «Материалы», то в конструкторе отчета мы видели, что для
регистра.
таких регистров система создает три виртуальные таблицы: таблица
остатков, оборотов и совокупная таблица остатков и оборотов. Иными словами, по каждому из измерений регистра накопления
остатков изменение ресурсов обязательно должно осуществляться в
Оборотный регистр накопления очень похож на, знакомый уже
обе стороны: приход и расход.
нам, регистр остатков, для которого понятие «остаток» не имеет
смысла. Оборотный регистр накапливает только обороты, остатки ему Для реквизитов регистра этот принцип неважен, по реквизитам
регистра ресурсы могут только приходоваться или только
безразличны. Поэтому единственной виртуальной таблицей, которую
расходоваться.
будет создавать система для такого регистра, будет таблица оборотов.
В остальном оборотный регистр ни чем не отличается от регистра Нарушение этого принципа построения регистров накопления
будет вести к непроизводительному использованию ресурсов системы
остатков.
и, как следствие, замедлению работы и падению производительности.
Следует сказать об одной особенности конструирования регистров
Теперь, когда мы знаем «практически все» о регистрах накопления,
накопления, напрямую связанной с возможностью получения
откроем конфигуратор и создадим новый объект конфигурации
остатков.
регистр накопления. Назовем его «Продажи» и определим вид
При создании оборотного регистра накопления нет особой
регистра - «Обороты».
сложности в определении того, какие именно параметры должны
На закладке «Данные» создадим измерения регистра:
являться измерениями регистра - мы можем назначить в качестве его
измерений любые нужные нам параметры. • «Номенклатура», тип СправочникСсылка.Номенклатура,
Совсем иная ситуация в случае регистра накопления • «Клиент», тип СправочникСсылка.Кпиенты,
поддерживающего накопление остатков. Для него выбор измерений • «Мастер», тип СправочникСсылка.Сотрудники.
должен выполняться исходя из того, что движения регистра могут
быть осуществлены «в две стороны»: приход и расход. Таким образоМ,
в качестве измерений нужно выбирать те параметры, по которым
движения точно будут осуществляться как в одну, так и в другуЮ
сторону.


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


У регистра будет три ресурса:
Изменение процедуры проведения
• «Количество», тип Число, длина 15, точность 3,
документа ОказаниеУслуги

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

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

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



157

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


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


Все добавленные конструкции вам уже хорошо известны, обратите
Процедура ОбработкаПроведения(Отказ, Режим)
//{{_КОНСТРУКТОРЛВИЖЕНИЙ_РЕГИСТРОВ // внимание лишь на то, что у оборотного регистра отсутствует свойство
Данный фрагмент построен конструктором. // При
«ВидДвижения», поскольку отражение вида движения (приход или
повторном использовании конструктора, // внесенные
расход) имеет смысл лишь при учете остатков. В случае регистра
вручную изменения будут утеряны!!!
оборотов нас интересует только значение, на которое должно быть
Для Каждого ТекСтрокаПереченьНоменклатуры Из ПереченьНоменклатуры Цикл Если
ТекСтрокаПереченьНоменклатуры.Номенклатура.ВидНоменклатуры <> записано в ресурс регистра.
Перечислеиия.ВидыНоменклатуры.МатериалТогда
Запустим 1С:Предприятие в режиме отладки и перепроведем все
Продолжить;
документы «Оказание услуги». Движения этих документов по
КонецЕсли;
регистру «Продажи» должны иметь следующий вид:
// регистр ОстаткиМатериалов Расход
Движение = Движения.ОстаткиМатериалов.Добавить();
Движение.ВидДвижения = ВидДвиженияНакопления.Расход;
Движение.Период = Дата; Движения документа Оказание услуги №1
Движение.Материал = ТекСтрокаПереченьНоменклатуры.Номенклатура;
Движение.Склад = Склад;
Движение.Количество = ТекСтрокаПереченьНоменклатуры.Количество;
//КонецЦикла;
//Для Каждого ТекСтрокаПереченьНоменклатуры Из ПереченьНоменклатуры Цикл
// регистр СтоимостьМатериалов Расход Движение =
Движения.СтоимостьМатериалов.Добавшъ(); Движение.ВидДвижения =
ВидДвиженияНакопления.Расход; Движение.Период = Дата;
Движение.Материал = ТекСтрокаПереченьНоменклатуры.Номенклатура;
Движение.Стоимостъ = ТекСтрокаПереченьНоменклатуры.Стоимость *
ТекСтрокаПереченьНоменклатуры.Количество;
КонецЦикла;
Для Каждого ТекСтрокаПереченьНоменклатуры Из ПереченьНоменклатуры Цикл
// регистр Продажи
Движение = Движения.Продажи.Добавить();
Движение.Период = Дата;
Движение.Номенклатура = ТекСтрокаПеречеиьНоменклатуры.Номенклатура;



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



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


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




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




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


работа с запросами
Глава 5. Создание отчетов

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



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


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


Объединение запросов определяет, как будут объединены
формироваться и из одной реальной таблицы (например, виртуальная
результаты выполнения нескольких запросов.
таблица «Цены.СрезПоследних» формируется на основе таблицы
Упорядочивание результатов определяет условия упорядочивания
регистра сведений «Цены»). Однако общим для всех виртуальных
строк результата запроса.
таблиц является то, что им можно задать ряд параметров, которые
будут определять, какие данные будут включены в эти виртуальные АВТОУПОРЯДОЧИВАНИЕ позволяет включить режим
таблицы. Набор таких параметров может быть различным для разных автоматического упорядочивания строк результата запроса.
виртуальных таблиц, и определяется данными, хранящимися в Описание итогов определяет, какие итоги необходимо
исходных таблицах базы данных. рассчитывать в запросе и каким образом группировать результат.
Реальные таблицы подразделяются на объектные (ссылочные) и не Применение различных синтаксических конструкций языка
объектные (не ссылочные). запросов подробно описано в книге «1С:Предприятие 8.0 Описание
встроенного языка», поэтому мы перейдем прямо к созданию отчетов,
В объектных (ссылочных) таблицах представлена информация
и по пути будем комментировать создаваемый текст запросов.
ссылочных типов данных (справочники, документы, планы видов
характеристик и т.д.). А в не объектных (не ссылочных) - всех
остальных типов данных (константы, регистры и т.д.).
Отличительной особенностью объектных (ссылочных) таблиц
является то, что они содержат поле «Ссылка», содержащее ссылку на
текущую запись. Кроме этого для таких таблиц возможно получение
пользовательского представления объекта, эти таблицы могут быть
иерархическими и поля таких таблиц могут содержать вложенные
таблицы (табличные части).

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

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

• описание запроса,
• объединение запросов,
• упорядочивание результатов,
• АВТОУПОРЯДОЧИВАНИЕ
• описание итогов.
Обязательной частью запроса является только первая - описание
запроса. Все остальные присутствуют по необходимости.
Описание запроса определяет источники данных, поля выборкИ,
группировки и т.д.




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


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


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




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


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

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

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

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


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


Затем мы очищаем табличный документ и выводим в него те
Результат = Запрос.Выполнить();
области, которые не содержат данных, получаемых из результата
ОбластъЗаголовок = Макет.ПолучитьОбласть("Заголовок"); ОбластьПодвал = запроса:
Макет.ПолучитьОбласть("Подвал"); ОбластьШапкаТаблицы =
Макет.ПолучитьОбласть("ШапкаТаблицы"); ОбластьПодвалТаблицы =
Макет.ПолучитьОбласть("ПодвалТаблицы"); ОбластьДетальныхЗаписей =
Макет.ПолучитьОбласть("Детали"); ТабДок.Очистить();
ТабДок.Вывести(ОбластьЗаголовок);
ТабДок.Очистить(); ТабДок.Вывести(ОбластьШапкаТаблицы);
ТабДок.Вывести(ОбластьЗаголовок); ТабДок.НачатьАвтогруппировкуСтрок();
ТабДок.Вывести(ОбластьШапкаТаблицы);
ТабДок.НачатьАвтогрутшировкуСтрок();

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

/Л}КОНСТРУКТОР_ВЬКОДНЫХ_ФОРМ
КонецПроцедуры
Результат = Запрос.Выполнить();

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




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


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


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


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




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




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

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




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

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




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


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

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

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

На закладке «Отчет» сбросим флаг «Использовать построитель ЗапросУстановитьПараметрС'ВидНоменклатуры",
Перечисления.ВидыНоменклатуры.Услуга);
отчета». Запрос.УстановитьПараметр("ДатаНачала",ДатаНачала);
Теперь перейдем на закладку «Выходная форма». Укажем, что Запрос.УстановитьПараметрС'ДатаОкончания", ДатаОкончания);
параметры «ДатаОкончания» и «ДатаНачала» будут редактироваться в
форме в полях ввода с типом «Дата». Для параметра
Теперь рассмотрим текст запроса, сформированный
«ВидНоменклатуры» мы наоборот снимем признак редактирования в
конструктором:
форме:


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


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


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




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


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

|ГДЕ
| СпрНоменклатура.ЭтоГруппа = Ложь И
| СпрНоменклатура.ВидНоменклатуры = &ВидНоменклатуры
|



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


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


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


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




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


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

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


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


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

|УПОРЯДОЧИТЬ ПО
| Период
|




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


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




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


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



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

Запрос.Текст =
"ВЫБРАТЬ
|ПродажиОбороты.Мастер КАК Мастер,
|ПродажиОбороты.Мастер.Представление,
|ПродажиОбороты.ПериодКАКПериод,
|ПродажиОбороты.Клиент,
|ПродажиОбороты.Клиент.Представление,
|ПродажиОбороты.ВыручкаОборот КАК Выручка



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


Смысл внесенных нами уточнений заключается в том, что теперь
1ИЗ
при формировании выборки по группировке «Период» будут
I РегистрНакопления.Продажи.Обороты(&ДатаНачала, &ДатаОкончания, День,)
выбираться все имеющиеся значения группировок.
I КАК ПродажиОбороты
Запустим 1С:Предприятие в режиме отладки и выполним отчет
I
!УПОРЯДОЧИТЬ ПО «ВыручкаМастеров» за период с 20.03.2004 по 20.04.2004.
I Период
В целях экономии неинформативного пространства книги, мы не
I
будем приводить результат работы отчета, но на словах объясним, что
!ИТОГИ СУММА(Выручка) ПО
результат отчета будет содержать по 32 строки дат для каждого
I ОБЩИЕ,
I Мастер, сотрудника.
I Период ПЕРИОДАМЩДень, &ДатаНачала, &ДатаОкончания)";
Очевидно, что такой внешний вид отчета абсолютно
«нечитабелен», поэтому мы снова вернемся к модулю отчета и внесем
небольшие уточнения в алгоритм вывода областей табличного
Такая запись говорит о том, что итоги должны быть, рассчитаны
документа:
периодами равными дню, в интервале дат, задаваемом параметрами
«ДатаНачала» и «ДатаОкончания».
И для того, чтобы все эти итоги попали в итоговый табличный
Пока ВыборкаМастер.Следующий() Цикл
документ, нам нужно будет уточнить порядок вывода итогов в
ОбластьМаетер.Параметры.ЗаполнитыЗыборкаМастер);
выборке результата запроса: ТабДок.Вывести(ОбластьМастер, ВыборкаМастер.Уровень());

ВыборкаПериод = ВыборкаМастер
.Bыбрать(ОбходРезультата3anpoca.ПоГруппировкам,
ВыборкаМастер = ВыборкаОбщийИтог
"Период", "Bce");
.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
Пока ВыборкаПериод.Следующий() Цикл
Пока ВыборкаМастер.Следующий() Цикл ОбластьПериод.Параметры.Заполнить(ВыборкаПериод);
ОбластьМастер.Параметры.Заполнить(ВыборкаМастер);
ТабДок.Вывести(ОбластьПериод, ВыборкаПериод.Уровень(),, Ложь);
ТабДок.Вывести(ОбластьМастер, ВыборкаМастер.Уровень());
ВыборкаДетали = ВыборкаПериод.Выбрать();
ВыборкаПериод = ВыборкаМастер Пока ВыборкаДетали.Следующий() Цикл
.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам, ОбластьДетальныхЗаписей.Параметры.Заполнить(ВыборкаДетали);
"Пернод","Все"); ТабДок.Вывести(ОбластьДетальныхЗаписей, ВыборкаДетали.Уровень(),,Ложь);
КонецЦикла; КонецЦикла; КонецЦикла;
Пока ВыборкаПериод.Следующий() Цикл
ОбластьПериод.Параметры.Заполнить(ВыборкаПериод);
ТабДок.Вьщесп(ОбластьПериодВыборкаПериод.Уровень());
Смысл внесенных нами изменений заключается в том, что при
ВыборкаДетали = ВыборкаПериод.Выбрать();
выводе областей детальных записей и периода, мы сворачиваем
Пока ВыборкаДетали.Следующий() Цикл
группировки, которые по умолчанию выводятся развернутыми.
ОбластьДетальныхЗаписей.Параметры.Заполнить(ВыборкаДетали);
Запустим 1С:Предприятие в режиме отладки и снова выполним
ТабДок.Вьтести(ОбластьДетальныхЗаписей,ВыборкаДетали.Уровень());
отчет «ВыручкаМастеров» за период с 20.03.2004 по 20.04.2004.
КонецЦикла; КонецЦикла; КонецЦикла;




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


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

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




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




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

Откроем модуль формы и в процедуре «ПереченьУслуг»
На закладке «Условия» зададим условие выбора элементов
определим значение параметра запроса:
справочника «Номенклатура» - выбираемые элементы должны
соответствовать виду номенклатуры переданному в параметре запроса
«ВидНоменклатуры»:
Запрос.УстановитьПараметрС'ВидНоменклатуры",
Перечисления.ВидыНоменклатуры.Услуга)
Запрос.УстановитьПараметр("ДатаОтчета".ДатаОтчета);


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

На закладке «Отчет» сбросим флаг «Использовать построитель
отчета». Практически все конструкции, использованные в этом запросе, нам
уже известны, за исключением ключевого слова ИЕРАРХИЯ,
На закладке «Выходная форма» отметим, что тип параметра
использованного в части описания итогов. Это ключевое слово
«ДатаОтчета» будет Дата, а параметр «ВидНоменклатуры» в форме
позволяет рассчитывать итоги по иерархии справочника, однако
редактироваться не будет. Нажмем «ОК».
поскольку в нашем случае какие либо итоги в отчете не нужны, мы
использовали эту возможность для создания группировок по иерархии
справочника «Номенклатура».
Теперь запустим 1С:Предприятие в режиме отладки и, прежде
всего, откроем периодический регистр «Цены».


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

Добавим в него еще одно значение для услуги «Диагностика» Еще раз выполним отчет, но теперь уже на другую дату
FJ ду
01.04.2004:
новая цена услуги на 01.04.2002 (это позволит нам протестировать
отчет): i




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




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




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




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

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

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

<<

стр. 3
(всего 11)

СОДЕРЖАНИЕ

>>