8.х проведение документа

Тема в разделе "Конфигурирование на платформе "1С:Предприятие 8"", создана пользователем auricomwxl, 13 фев 2010.

  1. TopicStarter Overlay
    auricomwxl
    Offline

    auricomwxl

    Регистрация:
    4 янв 2010
    Сообщения:
    21
    Симпатии:
    0
    Баллы:
    1
    Привет всем!
    Нужно упростить код. :unsure:
    Короче данные должны попасть в регистр ОстаткиМатериалов, с использованием запросов и все.
    Остальное все лишнее убрать..


    Код:
    Процедура ОбработкаПроведения(Отказ, Режим)
    
    МенеджерВременныхТаблиц = Новый МенеджерВременныхТаблиц;
    Запрос = Новый Запрос;
    Если Режим = РежимПроведенияДокумента.Оперативный Тогда
    
    Запрос.МенеджерВременныхТаблиц = МенеджерВременныхТаблиц;
    Запрос.Текст =     
    "ВЫБРАТЬ РАЗЛИЧНЫЕ
    |    ОказаниеУслугиПереченьНоменклатуры.Номенклатура КАК Номенклатура,
    |    ОказаниеУслугиПереченьНоменклатуры.Количество,
    |    ОказаниеУслугиПереченьНоменклатуры.Номенклатура.ВидНоменклатуры КАК ВидНоменклатуры,
    |    ОказаниеУслугиПереченьНоменклатуры.Сумма,
    |    ОстаткиМатериаловОстатки.КоличествоОстаток,
    |    СтоимостьМатериаловОстатки.СтоимостьОстаток,
    |    ОстаткиМатериаловОстаткиНаСкладе.КоличествоОстаток КАК КоличествоНаСкладе
    |ПОМЕСТИТЬ НоменклатураДокумента
    |ИЗ
    |    Документ.ОказаниеУслуги.ПереченьНоменклатуры КАК ОказаниеУслугиПереченьНоменклатуры
    |        ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.СтоимостьМатериалов.Остатки(&МоментВремени, Материал В (&СписокНоменклатурыДокумента)) КАК СтоимостьМатериаловОстатки
    |        ПО ОказаниеУслугиПереченьНоменклатуры.Номенклатура = СтоимостьМатериаловОстатки.Материал
    |        ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ОстаткиМатериалов.Остатки(&МоментВремени, Материал В (&СписокНоменклатурыДокумента)) КАК ОстаткиМатериаловОстатки
    |        ПО ОказаниеУслугиПереченьНоменклатуры.Номенклатура = ОстаткиМатериаловОстатки.Материал
    |        ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ОстаткиМатериалов.Остатки(
    |                &МоментВремени,
    |                Материал В (&СписокНоменклатурыДокумента)
    |                    И Склад = &СкладВДокументе) КАК ОстаткиМатериаловОстаткиНаСкладе
    |        ПО ОказаниеУслугиПереченьНоменклатуры.Номенклатура = ОстаткиМатериаловОстаткиНаСкладе.Материал
    |ГДЕ
    |    ОказаниеУслугиПереченьНоменклатуры.Ссылка = &Ссылка";
    Запрос.УстановитьПараметр("Ссылка", Ссылка);
    Запрос.Выполнить();
    
    
    Иначе
    
    Запрос.МенеджерВременныхТаблиц = МенеджерВременныхТаблиц;    
    Запрос.Текст  ="ВЫБРАТЬ РАЗЛИЧНЫЕ
    |    ОказаниеУслугиПереченьНоменклатуры.Номенклатура КАК Номенклатура,
    |    ОказаниеУслугиПереченьНоменклатуры.Количество,
    |    ОказаниеУслугиПереченьНоменклатуры.Номенклатура.ВидНоменклатуры КАК ВидНоменклатуры,
    |    ОказаниеУслугиПереченьНоменклатуры.Сумма,
    |    ОстаткиМатериаловОстатки.КоличествоОстаток,
    |    СтоимостьМатериаловОстатки.СтоимостьОстаток
    |ПОМЕСТИТЬ НоменклатураДокумента
    |ИЗ
    |    Документ.ОказаниеУслуги.ПереченьНоменклатуры КАК ОказаниеУслугиПереченьНоменклатуры
    |        ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.СтоимостьМатериалов.Остатки(&МоментВремени, Материал В (&СписокНоменклатурыДокумента)) КАК СтоимостьМатериаловОстатки
    |        ПО ОказаниеУслугиПереченьНоменклатуры.Номенклатура = СтоимостьМатериаловОстатки.Материал
    |        ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ОстаткиМатериалов.Остатки(&МоментВремени, Материал В (&СписокНоменклатурыДокумента)) КАК ОстаткиМатериаловОстатки
    |        ПО ОказаниеУслугиПереченьНоменклатуры.Номенклатура = ОстаткиМатериаловОстатки.Материал                           
    |ГДЕ
    |    ОказаниеУслугиПереченьНоменклатуры.Ссылка = &Ссылка";
    КонецЕсли;
    
    Запрос.УстановитьПараметр("МоментВремени", МоментВремени());
    Запрос.УстановитьПараметр("СписокНоменклатурыДокумента",ПереченьНоменклатуры.ВыгрузитьКолонку("Номенклатура"));
    Запрос.УстановитьПараметр("Ссылка", Ссылка);
    Запрос.Выполнить();
    
    
    
    // Этот запрос будет использовать данные из созданной временной таблицы.
    Запрос = Новый Запрос;
    
    // Устанавливаем менеджер, в контексте которого создается временная таблица.
    Запрос.МенеджерВременныхТаблиц = МенеджерВременныхТаблиц;
    Запрос.Текст = "ВЫБРАТЬ * ИЗ НоменклатураДокумента";
    РезультатЗапроса = Запрос.Выполнить().Выбрать();
    
    Пока РезультатЗапроса.Следующий() Цикл
    
    // Проверить остаток при оперативном проведении.
    Если Режим = РежимПроведенияДокумента.Оперативный Тогда
    Если РезультатЗапроса.ВидНоменклатуры = Перечисления.ВидыНоменклатуры.Материал Тогда
    Остаток =  ?(РезультатЗапроса.КоличествоОстатокНаСкладе = Null, 0,
    РезультатЗапроса.КоличествоОстатокНаСкладе);
    Если Остаток < РезультатЗапроса.Количество Тогда
    Сообщить("Материала " 
    + СокрЛП(РезультатЗапроса.Номенклатура) 
    + " имеется только " + Остаток);
    Отказ = Истина;
    Возврат;
    КонецЕсли;
    КонецЕсли;
    КонецЕсли;
    
    // Сформировать движения.
    Если РезультатЗапроса.ВидНоменклатуры = Перечисления.ВидыНоменклатуры.Материал Тогда
    
    // Регистр ОстаткиМатериалов Расход.
    Движение = Движения.ОстаткиМатериалов.Добавить();
    Движение.ВидДвижения = ВидДвиженияНакопления.Расход;
    Движение.Период = Дата;
    Движение.Материал = РезультатЗапроса.Номенклатура;
    Движение.Склад = Склад;
    Движение.Количество = РезультатЗапроса.Количество;
    
    // Регистр СтоимостьМатериалов Расход.
    Движение = Движения.СтоимостьМатериалов.Добавить();
    Движение.ВидДвижения = ВидДвиженияНакопления.Расход;
    Движение.Период = Дата;
    Движение.Материал = РезультатЗапроса.Номенклатура;
    
    // Расчитать стоимость материала.
    СтоимостьМатериала =  ?(РезультатЗапроса.КоличествоОстаток = Null, 0, РезультатЗапроса.СтоимостьОстаток / 
    РезультатЗапроса.КоличествоОстаток);
    
    Движение.Стоимость = СтоимостьМатериала * РезультатЗапроса.Количество;
    КонецЕсли;
    
    // Регистр Продажи.
    Движение = Движения.Продажи.Добавить();
    Движение.Период = Дата;
    Движение.Номенклатура = РезультатЗапроса.Номенклатура;
    Движение.Клиент = Клиент;
    Движение.Мастер = Мастер;
    Движение.Количество = РезультатЗапроса.Количество;
    Движение.Выручка = РезультатЗапроса.Сумма;
    Если РезультатЗапроса.ВидНоменклатуры  = 
    Перечисления.ВидыНоменклатуры.Материал Тогда
    Движение.Стоимость = СтоимостьМатериала * РезультатЗапроса.Количество;
    Иначе
    Движение.Стоимость = 0;
    КонецЕсли;
    
    КонецЦикла;
    
    // Записать движения регистров.
    Движения.ОстаткиМатериалов.Записать();
    Движения.СтоимостьМатериалов.Записать();
    Движения.Продажи.Записать(); 
    
    КонецПроцедуры
    
    
    
    
    

Поделиться этой страницей