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



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

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

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

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

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


136



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


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

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

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


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

Д

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

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

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

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

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


 


138



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


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


 


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

:
Р

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

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


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

О

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

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

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


 



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

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


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


 


140



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


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


 


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


       
 
 
   


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

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

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


142



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


           
   
 
 
     
 



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

И

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

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

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



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


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


 


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


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


 


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

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


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


 


146


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

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

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

КонецЕсли;

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


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


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


 


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

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

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

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

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

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

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

КонецЦикла;

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

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

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

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


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

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


       
 
 
   


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

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


148



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


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


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



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

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

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


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



 


 



 


 


150



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


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

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

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


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

П

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

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

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

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

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

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


 


152



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


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


 


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

К

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

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

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

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

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

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

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

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


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

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

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

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

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

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

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

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

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

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

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


 


154



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


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


 


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

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

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

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

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

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


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

Н

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

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

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


 


156


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

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

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

КонедЕсли;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Цикл


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


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


 


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