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

 



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

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

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

142

143

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

 




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

И

в заключение этой главы мы внесем изменения в процедуру обработки проведения документа «ОказаниеУслуги». На данном этапе мы будем исходить из пожелания, высказанного руководством 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С:Предприятие в режиме отладки и откроем формы списка регистров накопления «Продажи» и «ОстаткиМатериалов». Обратите внимание, что формы практически одинаковы, за исключением состава измерений и ресурсов.

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

Н

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

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

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

156

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

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

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

КонедЕсли;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Цикл

157

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

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

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

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

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

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

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

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

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

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

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

КонецЦикла;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

КонецЦикла;

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

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

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

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

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

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

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

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

158

159

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

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

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

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

 




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

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

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

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

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

160

161

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

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

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

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

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

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

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

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

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

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

д

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

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

И

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

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

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

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

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

162

163

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

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

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

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

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

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

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

А

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

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

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

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

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

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

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

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

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

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

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

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

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

164

165

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

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

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

П

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

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

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

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

•  «Дата»,

•  «Номер»,

•  «Склад»,

•  «Мастер»,

•  «Клиент»:

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

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

Из за большого объема этот материал размещен на нескольких страницах:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29