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

       

Добавление движений по регистру бухгалтерии Управленческий в документ ОказаниеУслуги


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

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

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

Откроем в конфигураторе модуль объекта конфигурации Документ "ОказаниеУслуги" и найдем в нем процедуру обработки проведения. Она должна иметь следующий вид:

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

   Запрос = Новый Запрос;

   Запрос.УстановитьПараметр("СкладВДокументе",Склад);



   Если Режим = РежимПроведенияДокумента.Оперативный Тогда

       Запрос.Текст =

       "ВЫБРАТЬ

       |    ОказаниеУслугиПереченьНоменклатуры.Номенклатура,

       |    ОказаниеУслугиПереченьНоменклатуры.Количество,

       |    ОказаниеУслугиПереченьНоменклатуры.Номенклатура.ВидНоменклатуры КАК ВидНоменклатуры,

       |    ОказаниеУслугиПереченьНоменклатуры.Сумма, [307]

       |    ОстаткиМатериаловОстатки.КоличествоОстаток,

       |    СтоимостьМатериаловОстатки.СтоимостьОстаток,




       |    ОстаткиМатериаловОстаткиНаСкладе. КоличествоОстаток КАК КоличествоОстатокНаСкладе

       |ИЗ

       |    Документ.ОказаниеУслуги.ПереченьНоменклатуры КАК ОказаниеУслугиПереченьНоменклатуры

       |        ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.СтоимостьМатериалов.Остатки(&МоментВремени, Материал В (&СписокНоменклатурыДокумента)) КАК СтоимостьМатериаловОстатки

       |        ПО ОказаниеУслугиПереченьНоменклатуры.Номенклатура = СтоимостьМатериаловОстатки.Материал

       |        ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ОстаткиМатериалов.Остатки(

       |        &МоментВремени,

       |        Материал В

       |            (ВЫБРАТЬ РАЗЛИЧНЫЕ

       |                ОказаниеУслугиПереченьНоменклатуры.Номенклатура

       |            ИЗ

       |                Документ.ОказаниеУслуги.ПереченьНоменклатуры КАК ОказаниеУслугиПереченьНоменклатуры

       |            ГДЕ

       |                ОказаниеУслугиПереченьНоменклатуры.Ссылка = &Ссылка)) КАК ОстаткиМатериаловОстатки



       |        ПО ОказаниеУслугиПереченьНоменклатуры.Номенклатура = ОстаткиМатериаловОстатки.Материал

       |        ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ОстаткиМатериалов.Остатки(

       |        &МоментВремени,

       |        Материал В (&СписокНоменклатурыДокумента)

       |            И Склад = &СкладВДокументе) КАК ОстаткиМатериаловОстаткиНаСкладе

       |        ПО ОказаниеУслугиПереченьНоменклатуры.Номенклатура = ОстаткиМатериаловОстаткиНаСкладе.Материал

       |ГДЕ

       |    ОказаниеУслугиПереченьНоменклатуры.Ссылка = &Ссылка

       |

       |ДЛЯ ИЗМЕНЕНИЯ

       |    РегистрНакопления.ОстаткиМатериалов.Остатки,

       |    РегистрНакопления.СтоимостьМатериалов.Остатки";

   Иначе

       Запрос.Текст =

       "ВЫБРАТЬ

       |    ОказаниеУслугиПереченьНоменклатуры.Номенклатура,

       |    ОказаниеУслугиПереченьНоменклатуры.Количество,

       |    ОказаниеУслугиПереченьНоменклатуры.Номенклатура.ВидНоменклатуры КАК ВидНоменклатуры,

       |    ОказаниеУслугиПереченьНоменклатуры.Сумма,

       |    ОстаткиМатериаловОстатки.КоличествоОстаток,



       |    СтоимостьМатериаловОстатки.СтоимостьОстаток

       |ИЗ

       |    Документ.ОказаниеУслуги. ПереченьНоменклатуры КАК ОказаниеУслугиПереченьНоменклатуры

       |        ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.СтоимостьМатериалов.Остатки(&МоментВремени, Материал В (&СписокНоменклатурыДокумента)) КАК [308] СтоимостьМатериаловОстатки

       |        ПО ОказаниеУслугиПереченьНоменклатуры.Номенклатура = СтоимостьМатериаловОстатки.Материал

       |        ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ОстаткиМатериалов.Остатки(&МоментВремени, Материал В (&СписокНоменклатурыДокумента)) КАК ОстаткиМатериаловОстатки

       |        ПО ОказаниеУслугиПереченьНоменклатуры.Номенклатура = ОстаткиМатериаловОстатки.Материал

       |ГДЕ

       |    ОказаниеУслугиПереченьНоменклатуры.Ссылка = &Ссылка

       |

       |ДЛЯ ИЗМЕНЕНИЯ

       |    РегистрНакопления.СтоимостьМатериалов.Остатки,

       |    РегистрНакопления.ОстаткиМатериалов.Остатки";

   КонецЕсли;

   Запрос.УстановитьПараметр("МоментВремени", МоментВремени());

   Запрос.УстановитьПараметр("СписокНоменклатурыДокумента", ПереченьНоменклатуры.ВыгрузитьКолонку("Номенклатура"));

   Запрос.УстановитьПараметр("Ссылка",Ссылка);

   ВыборкаРезультатаЗапроса = Запрос.Выполнить().Выбрать();

   Пока ВыборкаРезультатаЗапроса.Следующий() Цикл



       // Проверить остаток при оперативном проведении

       Если Режим = РежимПроведенияДокумента.Оперативный Тогда

           Если ВыборкаРезультатаЗапроса.ВидНоменклатуры = Перечисления.ВидыНоменклатуры.Материал Тогда

               Остаток = ?(ВыборкаРезультатаЗапроса.КоличествоОстатокНаСкладе = Null, 0, ВыборкаРезультатаЗапроса.КоличествоОстатокНаСкладе);

               Если Остаток < ВыборкаРезультатаЗапроса.Количество Тогда

                   Сообщить("Материала " + СокрЛП(ВыборкаРезультатаЗапроса.Номенклатура) + " имеется только " + Остаток);

                   Отказ = Истина;

                   Возврат;

               КонецЕсли;

           КонецЕсли;

       КонецЕсли;

       //Сформировать движения

       Если ВыборкаРезультатаЗапроса.ВидНоменклатуры = Перечисления.ВидыНоменклатуры.Материал Тогда

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

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

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

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



           Движение.Материал = ВыборкаРезультатаЗапроса.Номенклатура;

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

           Движение.Количество = ВыборкаРезультатаЗапроса.Количество;

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

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

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

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

           Движение.Материал = ВыборкаРезультатаЗапроса.Номенклатура;

           //расчитать стоимость материала

           СтоимостьМатериала = ?(ВыборкаРезультатаЗапроса.КоличествоОстаток = Null, 0,

               ВыборкаРезультатаЗапроса.СтоимостьОстаток / ВыборкаРезультатаЗапроса.КоличествоОстаток);

           Движение.Стоимость = СтоимостьМатериала * ВыборкаРезультатаЗапроса.Количество;

       КонецЕсли;

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

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

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

       Движение.Номенклатура = ВыборкаРезультатаЗапроса.Номенклатура;

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

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

       Движение.Количество = ВыборкаРезультатаЗапроса.Количество;

       Движение.Выручка = ВыборкаРезультатаЗапроса.Сумма;



       Если ВыборкаРезультатаЗапроса.ВидНоменклатуры =    Перечисления.ВидыНоменклатуры.Материал Тогда

           Движение.Стоимость = СтоимостьМатериала * ВыборкаРезультатаЗапроса.Количество;

       Иначе

           Движение.Стоимость = 0;

       КонецЕсли;

   КонецЦикла;

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

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

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

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

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

Поскольку нас интересует только движение материалов, для внесения дополнений подойдет тело условия Если ..., в котором мы формировали движения по регистрам "ОстаткиМатериалов" и "СтоимостьМатериалов". [310]

Добавим движения по регистру бухгалтерии Управленческий:

...

       //Сформировать движения

       Если ВыборкаРезультатаЗапроса.ВидНоменклатуры = Перечисления.ВидыНоменклатуры.Материал Тогда

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

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

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

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

           Движение.Материал = ВыборкаРезультатаЗапроса.Номенклатура;

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

           Движение.Количество = ВыборкаРезультатаЗапроса.Количество;

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



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

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

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

           Движение.Материал = ВыборкаРезультатаЗапроса.Номенклатура;

           // расчитать стоимость материала

           СтоимостьМатериала = ?(ВыборкаРезультатаЗапроса.КоличествоОстаток = Null, 0,

               ВыборкаРезультатаЗапроса.СтоимостьОстаток / ВыборкаРезультатаЗапроса.КоличествоОстаток);

           Движение.Стоимость = СтоимостьМатериала * ВыборкаРезультатаЗапроса.Количество;

           //По регистру Управленческий

           //первая проводка:

           //Д 62(ДебиторскаяЗадолженность) - К 90 (Капитал)

           //розничная сумма

           Движение = Движения.Управленческий.Добавить();

           Движение.СчетДт = ПланыСчетов.Основной.ДебиторскаяЗадолженность;

           Движение.СчетКт = ПланыСчетов.Основной.Капитал;

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

           Движение.Сумма = ВыборкаРезультатаЗапроса.Сумма;

           Движение.СубконтоДт[ПланыВидовХарактеристик.ВидыСубконто.Клиенты] = Клиент;



           //вторая проводка:

           //Д90 (Капитал) - К 41 (Товары) - себестоимость

           Движение = Движения.Управленческий.Добавить();

           Движение.СчетДт = ПланыСчетов.Основной.Капитал;

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

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

           Движение.Сумма = СтоимостьМатериала * ВыборкаРезультатаЗапроса.Количество; [311]

           Движение.КоличествоКт = ВыборкаРезультатаЗапроса.Количество;

           Движение.СубконтоКт[ПланыВидовХарактеристик.ВидыСубконто.Материалы] = ВыборкаРезультатаЗапроса.Номенклатура;

       КонецЕсли;

...

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

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

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

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

   Движения.Управленческий.Записать();

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

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

Во второй проводке мы указываем стоимость материала, количество и субконто кредита, поскольку на счете "Товары" ведется количественный учет в разрезе материалов.

Запустим 1С:Предприятие в режиме отладки, перепроведем документ ОказаниеУслуги №1 и посмотрим, какие движения он сформировал по регистру бухгалтерии "Управленческий":



После этого перепроведем остальные документы Оказание услуги.


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