pozitr0n/1C-Project-Automation-of-the-Company

Optimization of the document "ОказаниеУслуги"

Closed this issue · 3 comments

Goals of this issue

  • More speed working
  • Auto-definition of the material price
  • Separating of the algorithm into 2 parts: operative and non-operative type

Begin from the queries

//{{КОНСТРУКТОР_ЗАПРОСА_С_ОБРАБОТКОЙ_РЕЗУЛЬТАТА
    Запрос = Новый Запрос;
    Запрос.Текст = 
        "ВЫБРАТЬ
        |   ОказаниеУслугиПереченьНоменклатуры.Номенклатура,
        |   ОказаниеУслугиПереченьНоменклатуры.Номенклатура.ВидНоменклатуры КАК ВидНоменклатуры,
        |   СУММА(ОказаниеУслугиПереченьНоменклатуры.Количество) КАК КоличествоВДокументе,
        |   СУММА(ОказаниеУслугиПереченьНоменклатуры.Сумма) КАК СуммаВДокументе,
        |   МАКСИМУМ(ОказаниеУслугиПереченьНоменклатуры.Стоимость) КАК Стоимость
        |ИЗ
        |   Документ.ОказаниеУслуги.ПереченьНоменклатуры КАК ОказаниеУслугиПереченьНоменклатуры
        |ГДЕ
        |   ОказаниеУслугиПереченьНоменклатуры.Ссылка = &Ссылка
        |
        |СГРУППИРОВАТЬ ПО
        |   ОказаниеУслугиПереченьНоменклатуры.Номенклатура,
        |   ОказаниеУслугиПереченьНоменклатуры.Номенклатура.ВидНоменклатуры";

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

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

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

    Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
        // Вставить обработку выборки ВыборкаДетальныеЗаписи
    КонецЦикла;

    //}}КОНСТРУКТОР_ЗАПРОСА_С_ОБРАБОТКОЙ_РЕЗУЛЬТАТА

Final procedure of the module of the object

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

    Движения.ОстаткиМатериалов.Записывать = Истина;
    Движения.СтоимостьМатериалов.Записывать = Истина;
    Движения.Продажи.Записывать = Истина;

            //{{КОНСТРУКТОР_ЗАПРОСА_С_ОБРАБОТКОЙ_РЕЗУЛЬТАТА
    // Данный фрагмент построен конструктором.
    // При повторном использовании конструктора, внесенные вручную изменения будут утеряны!!!

    Запрос = Новый Запрос;
    Запрос.Текст = 
        "ВЫБРАТЬ
        |   ОказаниеУслугиПереченьНоменклатуры.Номенклатура,
        |   ОказаниеУслугиПереченьНоменклатуры.Номенклатура.ВидНоменклатуры КАК ВидНоменклатуры,
        |   СУММА(ОказаниеУслугиПереченьНоменклатуры.Количество) КАК КоличествоВДокументе,
        |   СУММА(ОказаниеУслугиПереченьНоменклатуры.Сумма) КАК СуммаВДокументе,
        |   МАКСИМУМ(ОказаниеУслугиПереченьНоменклатуры.Стоимость) КАК Стоимость
        |ИЗ
        |   Документ.ОказаниеУслуги.ПереченьНоменклатуры КАК ОказаниеУслугиПереченьНоменклатуры
        |ГДЕ
        |   ОказаниеУслугиПереченьНоменклатуры.Ссылка = &Ссылка
        |
        |СГРУППИРОВАТЬ ПО
        |   ОказаниеУслугиПереченьНоменклатуры.Номенклатура,
        |   ОказаниеУслугиПереченьНоменклатуры.Номенклатура.ВидНоменклатуры";

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

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

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

    Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
        Если ВыборкаДетальныеЗаписи.ВидНоменклатуры = 
                Перечисления.ВидыНоменклатуры.Материал Тогда 

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

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

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

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

                  Движение.Стоимость = ВыборкаДетальныеЗаписи.КоличествоВДокументе 
                          * ВыборкаДетальныеЗаписи.Стоимость;
        КонецЕсли;
         //Регистр продажи
                  Движение = Движения.Продажи.Добавить();
                  Движение.Период = Дата;
                  Движение.Номенклатура = ВыборкаДетальныеЗаписи.Номенклатура;
                  Движение.Клиент = Клиент;
                  Движение.Мастер = Мастер;
                  Движение.Количество = ВыборкаДетальныеЗаписи.КоличествоВДокументе;
                  Движение.Выручка = ВыборкаДетальныеЗаписи.СуммаВДокументе;
                  Движение.Стоимость = ВыборкаДетальныеЗаписи.Стоимость * ВыборкаДетальныеЗаписи.КоличествоВДокументе;          
    КонецЦикла;

    //}}КОНСТРУКТОР_ЗАПРОСА_С_ОБРАБОТКОЙ_РЕЗУЛЬТАТА
КонецПроцедуры

Speed of the queries is more quick.