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]


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