1С-Предприятие 8.0. Практическое пособие разработчика

       

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


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

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

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

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

Процедура ОбработкаПроведения(Отказ, Режим)

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

// Данный фрагмент построен конструктором.

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



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

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

       Продолжить;

   КонецЕсли;

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

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

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

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

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

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

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

КонецЦикла;

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




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

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

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

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


[141]

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

Процедура ОбработкаПроведения(Отказ, Режим)

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

// Данный фрагмент построен конструктором.

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

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

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

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

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

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

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

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

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

КонецЦикла;

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

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

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

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

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

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

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




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

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

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


[145]

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

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

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

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

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




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

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

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

Процедура ОбработкаПроведения(Отказ, Режим)

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

// Данный фрагмент построен конструктором.

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

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

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

       Продолжить;

   КонецЕсли;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

КонецЦикла;

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




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

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

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

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

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

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



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

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



[136]



КонецЦикла;

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

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

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

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

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

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

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

Процедура ОбработкаПроведения(Отказ, Режим)

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

// Данный фрагмент построен конструктором.

// При повторном использовании конструктора, [142] внесенные вручную изменения будут утеряны!!!

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

КонецЦикла;

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

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

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

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

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

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

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

[143]





[144]



Процедура ОбработкаПроведения(Отказ, Режим)

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

// Данный фрагмент построен конструктором.

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

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

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

       Продолжить;

   КонецЕсли;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

КонецЦикла;

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

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

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

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

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

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

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



[148]

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



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



[149]



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





[150]



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

КонецЦикла;

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

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

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

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

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

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

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

Процедура ОбработкаПроведения(Отказ, Режим)

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

// Данный фрагмент построен конструктором.

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

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

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

       Продолжить;

   КонецЕсли;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

КонецЦикла;

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

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

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

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



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

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

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

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

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

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

КонецЦикла;

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

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

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

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

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

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

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

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

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



[159]

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



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



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


Содержание раздела