fixin (fixin) wrote,
fixin
fixin

Ускорил проведение документов в 150 раз



Удивляюсь - как криво все-таки нужно писать типовые конфы, чтобы можно было ускорить код проведения документа в 150 раз?
Дело в том что у клиента на каждой номенклатуре было очень много серийных номеров. А типовой код построения остатков для списания партий отбирал только по номенклатуре. Я добавил отбор по серийным номерам и залетало!


Заодно изменил тупые разрывы кода запроса, которым грешат типовые, из-за которых нельзя использовать конструктор запроса!




Было:



Процедура ЗаполнитьЗапросПартийНаСкладахУпр(Запрос, ВестиПартионныйУчетПоСкладам, СтратегияСтатусПартии, СпособОценкиМПЗ)

      Запрос.Текст =
      "ВЫБРАТЬ
      |      СписанныеТовары.НомерСтрокиДокумента КАК НомерСтрокиДокумента,
      |      ПартииТоваровНаСкладах.Номенклатура,
      |      ПартииТоваровНаСкладах.ДокументОприходования КАК ДокументОприходования,
      |      ПартииТоваровНаСкладах.ДокументОприходования.Дата КАК ДокументОприходованияДата,
      |      ПартииТоваровНаСкладах.Склад,
      |      ПартииТоваровНаСкладах.ХарактеристикаНоменклатуры,
      |      ПартииТоваровНаСкладах.СерияНоменклатуры,
      |      ПартииТоваровНаСкладах.Качество,
      |      ПартииТоваровНаСкладах.Заказ,
      |      ПартииТоваровНаСкладах.КоличествоОстаток КАК Количество,
      |      ПартииТоваровНаСкладах.СтоимостьОстаток КАК Стоимость,
      |      ПартииТоваровНаСкладах.СтатусПартии,
      |      ВЫБОР
      |            КОГДА СписанныеТовары.СерияНоменклатуры = ПартииТоваровНаСкладах.СерияНоменклатуры
      |                  ТОГДА 0
      |            ИНАЧЕ 1
      |      КОНЕЦ КАК ЧислоСерияНоменклатуры,
      |      ВЫБОР
      |            КОГДА СписанныеТовары.ДокументПартии = НЕОПРЕДЕЛЕНО
      |                  ТОГДА 0
      |            ИНАЧЕ ВЫБОР
      |                        КОГДА СписанныеТовары.ДокументПартии = ПартииТоваровНаСкладах.ДокументОприходования
      |                              ТОГДА 0
      |                        ИНАЧЕ 1
      |                  КОНЕЦ
      |      КОНЕЦ КАК ЧислоДокументОприходования,
      |      ВЫБОР
      |            КОГДА СписанныеТовары.ЗаказПартии = НЕОПРЕДЕЛЕНО
      |                  ТОГДА 0
      |            ИНАЧЕ ВЫБОР
      |                        КОГДА ПартииТоваровНаСкладах.Заказ = &ПустойЗаказ
      |                              ТОГДА 1
      |                        ИНАЧЕ 0
      |                  КОНЕЦ
      |      КОНЕЦ КАК ЧислоЗаказ,
      |      ВЫБОР
      |            КОГДА ПартииТоваровНаСкладах.СтатусПартии = &НаКомиссию
      |                  ТОГДА 1
      |            ИНАЧЕ 0
      |      КОНЕЦ КАК ЧислоСтатусПартии
      |ИЗ
      |      РегистрСведений.СписанныеТовары КАК СписанныеТовары
      |            ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрНакопления.ПартииТоваровНаСкладах.Остатки(
      |            &Дат,
      |            Номенклатура В
      |                (ВЫБРАТЬ
      |                    РегистрСведений.СписанныеТовары.Номенклатура
      |                ИЗ
      |                    РегистрСведений.СписанныеТовары
      |                ГДЕ
      |                    РегистрСведений.СписанныеТовары.Регистратор = &Ссылка)"
+ ?(ВестиПартионныйУчетПоСкладам, "
      |            И (Склад В
      |                (ВЫБРАТЬ
      |                    РегистрСведений.СписанныеТовары.Склад
      |                ИЗ
      |                    РегистрСведений.СписанныеТовары
      |                ГДЕ
      |                    РегистрСведений.СписанныеТовары.Регистратор = &Ссылка) ИЛИ Склад = &ПустойСклад)"
, "") + ") КАК ПартииТоваровНаСкладах
      |            ПО СписанныеТовары.Номенклатура = ПартииТоваровНаСкладах.Номенклатура
      |                  И СписанныеТовары.ХарактеристикаНоменклатуры = ПартииТоваровНаСкладах.ХарактеристикаНоменклатуры
      |                  И (ВЫБОР
      |                        КОГДА ПартииТоваровНаСкладах.Качество = &ПустоеКачество
      |                              ТОГДА ИСТИНА
      |                        ИНАЧЕ ВЫБОР
      |                                    КОГДА СписанныеТовары.Качество = &ПустоеКачество
      |                                          ТОГДА ПартииТоваровНаСкладах.Качество = &КачествоНовый
      |                                    ИНАЧЕ ПартииТоваровНаСкладах.Качество = СписанныеТовары.Качество
      |                              КОНЕЦ
      |                  КОНЕЦ)
      |                  "
+ ?(ВестиПартионныйУчетПоСкладам, "И (ПартииТоваровНаСкладах.Склад = СписанныеТовары.Склад ИЛИ ПартииТоваровНаСкладах.Склад = &ПустойСклад)", "") + "
      |                  И (ВЫБОР
      |                        КОГДА СписанныеТовары.ДопустимыйСтатус1 <> &ПустойСтатус
      |                                    ИЛИ СписанныеТовары.ДопустимыйСтатус2 <> &ПустойСтатус
      |                                    ИЛИ СписанныеТовары.ДопустимыйСтатус3 <> &ПустойСтатус
      |                                    ИЛИ СписанныеТовары.ДопустимыйСтатус4 <> &ПустойСтатус
      |                              ТОГДА ПартииТоваровНаСкладах.СтатусПартии = &ПустойСтатус
      |                                          ИЛИ ПартииТоваровНаСкладах.СтатусПартии = &СтатусПартииПоОрдеру
      |                                          ИЛИ ПартииТоваровНаСкладах.СтатусПартии = СписанныеТовары.ДопустимыйСтатус1
      |                                          ИЛИ ПартииТоваровНаСкладах.СтатусПартии = СписанныеТовары.ДопустимыйСтатус2
      |                                          ИЛИ ПартииТоваровНаСкладах.СтатусПартии = СписанныеТовары.ДопустимыйСтатус3
      |                                          ИЛИ ПартииТоваровНаСкладах.СтатусПартии = СписанныеТовары.ДопустимыйСтатус4
      |                        ИНАЧЕ ИСТИНА
      |                  КОНЕЦ)
      |     
      |            И (ВЫБОР
      |                  КОГДА СписанныеТовары.СписыватьТолькоПоЗаказу = ИСТИНА
      |                        ТОГДА ВЫБОР
      |                                    КОГДА ПартииТоваровНаСкладах.Заказ <> СписанныеТовары.ЗаказПартии
      |                                          ТОГДА ВЫБОР
      |                                                      КОГДА (НЕ СписанныеТовары.ЗаказПартии = НЕОПРЕДЕЛЕНО)
      |                                                            ТОГДА ЛОЖЬ
      |                                                      ИНАЧЕ ПартииТоваровНаСкладах.Заказ = &ПустойЗаказ
      |                                                КОНЕЦ
      |                                    ИНАЧЕ ИСТИНА
      |                              КОНЕЦ
      |                  ИНАЧЕ ВЫБОР
      |                              КОГДА ПартииТоваровНаСкладах.Заказ <> СписанныеТовары.ЗаказПартии
      |                                    ТОГДА ПартииТоваровНаСкладах.Заказ = &ПустойЗаказ
      |                              ИНАЧЕ ИСТИНА
      |                        КОНЕЦ
      |            КОНЕЦ)
      |            И (СписанныеТовары.СерияНоменклатуры = ПартииТоваровНаСкладах.СерияНоменклатуры
      |                  ИЛИ ПартииТоваровНаСкладах.СерияНоменклатуры = &ПустаяСерияНоменклатуры)
      |ГДЕ
      |      СписанныеТовары.Регистратор = &ОсновнойДокумент
      |
      |УПОРЯДОЧИТЬ ПО
      |      ЧислоСерияНоменклатуры,
      |      ЧислоДокументОприходования,
      |      ЧислоЗаказ,
      |      ЧислоСтатусПартии"
+ ?(СтратегияСтатусПартии = Перечисления.СтретегииСписанияПартийТоваровПоСтатусам.СначалаПринятыеПотомСобственные, " Убыв", "") + ",
      |      ДокументОприходованияДата"
+ ?(СпособОценкиМПЗ = "ЛИФО", " Убыв","") + ",
      |      ДокументОприходования"
+ ?(СпособОценкиМПЗ = "ЛИФО", " Убыв","") + "
      |ИТОГИ ПО
      |      НомерСтрокиДокумента"
;
     

КонецПроцедуры // ЗаполнитьЗапросПартийНаСкладахУпр()


 


 


Стало:


 



Процедура ЗаполнитьЗапросПартийНаСкладахУпр(Запрос, ВестиПартионныйУчетПоСкладам, СтратегияСтатусПартии, СпособОценкиМПЗ)

      Запрос.Текст =
     
"ВЫБРАТЬ
      |      СписанныеТовары.Номенклатура КАК Номенклатура
      |ПОМЕСТИТЬ ТНоменклатура
      |ИЗ
      |      РегистрСведений.СписанныеТовары КАК СписанныеТовары
      |ГДЕ
      |      СписанныеТовары.Регистратор = &Ссылка
      |;
      |
      |////////////////////////////////////////////////////////////////////////////////
      |ВЫБРАТЬ
      |      СписанныеТовары.СерияНоменклатуры КАК СерияНоменклатуры
      |ПОМЕСТИТЬ ТСерииНоменклатуры
      |ИЗ
      |      РегистрСведений.СписанныеТовары КАК СписанныеТовары
      |ГДЕ
      |      СписанныеТовары.Регистратор = &Ссылка
      |;
      |
      |////////////////////////////////////////////////////////////////////////////////
      |ВЫБРАТЬ
      |      СписанныеТовары.ХарактеристикаНоменклатуры КАК ХарактеристикаНоменклатуры
      |ПОМЕСТИТЬ ТХарактеристикиНоменклатуры
      |ИЗ
      |      РегистрСведений.СписанныеТовары КАК СписанныеТовары
      |ГДЕ
      |      СписанныеТовары.Регистратор = &Ссылка
      |;
      |
      |////////////////////////////////////////////////////////////////////////////////
      |ВЫБРАТЬ
      |      СписанныеТовары.НомерСтрокиДокумента КАК НомерСтрокиДокумента,
      |      ПартииТоваровНаСкладах.Номенклатура,
      |      ПартииТоваровНаСкладах.ДокументОприходования КАК ДокументОприходования,
      |      ПартииТоваровНаСкладах.ДокументОприходования.Дата КАК ДокументОприходованияДата,
      |      ПартииТоваровНаСкладах.Склад,
      |      ПартииТоваровНаСкладах.ХарактеристикаНоменклатуры,
      |      ПартииТоваровНаСкладах.СерияНоменклатуры,
      |      ПартииТоваровНаСкладах.Качество,
      |      ПартииТоваровНаСкладах.Заказ,
      |      ПартииТоваровНаСкладах.КоличествоОстаток КАК Количество,
      |      ПартииТоваровНаСкладах.СтоимостьОстаток КАК Стоимость,
      |      ПартииТоваровНаСкладах.СтатусПартии,
      |      ВЫБОР
      |            КОГДА СписанныеТовары.СерияНоменклатуры = ПартииТоваровНаСкладах.СерияНоменклатуры
      |                  ТОГДА 0
      |            ИНАЧЕ 1
      |      КОНЕЦ КАК ЧислоСерияНоменклатуры,
      |      ВЫБОР
      |            КОГДА СписанныеТовары.ДокументПартии = НЕОПРЕДЕЛЕНО
      |                  ТОГДА 0
      |            ИНАЧЕ ВЫБОР
      |                        КОГДА СписанныеТовары.ДокументПартии = ПартииТоваровНаСкладах.ДокументОприходования
      |                              ТОГДА 0
      |                        ИНАЧЕ 1
      |                  КОНЕЦ
      |      КОНЕЦ КАК ЧислоДокументОприходования,
      |      ВЫБОР
      |            КОГДА СписанныеТовары.ЗаказПартии = НЕОПРЕДЕЛЕНО
      |                  ТОГДА 0
      |            ИНАЧЕ ВЫБОР
      |                        КОГДА ПартииТоваровНаСкладах.Заказ = &ПустойЗаказ
      |                              ТОГДА 1
      |                        ИНАЧЕ 0
      |                  КОНЕЦ
      |      КОНЕЦ КАК ЧислоЗаказ,
      |      ВЫБОР
      |            КОГДА ПартииТоваровНаСкладах.СтатусПартии = &НаКомиссию
      |                  ТОГДА 1
      |            ИНАЧЕ 0
      |      КОНЕЦ КАК ЧислоСтатусПартии
      |ИЗ
      |      РегистрСведений.СписанныеТовары КАК СписанныеТовары
      |            ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрНакопления.ПартииТоваровНаСкладах.Остатки(
      |                        &Дат,
      |                        Номенклатура В
      |                                    (ВЫБРАТЬ
      |                                          ТНоменклатура.Номенклатура
      |                                    ИЗ
      |                                          ТНоменклатура)
      |                              И (СерияНоменклатуры = &ПустаяСерияНоменклатуры
      |                                    ИЛИ СерияНоменклатуры В
      |                                          (ВЫБРАТЬ
      |                                                ТСерииНоменклатуры.СерияНоменклатуры
      |                                          ИЗ
      |                                                ТСерииНоменклатуры))
      |                              И ХарактеристикаНоменклатуры В
      |                                    (ВЫБРАТЬ
      |                                          ТХарактеристикиНоменклатуры.ХарактеристикаНоменклатуры
      |                                    ИЗ
      |                                          ТХарактеристикиНоменклатуры
)
      |                              И &УсловиеСклад1) КАК ПартииТоваровНаСкладах
      |            ПО СписанныеТовары.Номенклатура = ПартииТоваровНаСкладах.Номенклатура
      |                  И СписанныеТовары.ХарактеристикаНоменклатуры = ПартииТоваровНаСкладах.ХарактеристикаНоменклатуры
      |                  И (ВЫБОР
      |                        КОГДА ПартииТоваровНаСкладах.Качество = &ПустоеКачество
      |                              ТОГДА ИСТИНА
      |                        ИНАЧЕ ВЫБОР
      |                                    КОГДА СписанныеТовары.Качество = &ПустоеКачество
      |                                          ТОГДА ПартииТоваровНаСкладах.Качество = &КачествоНовый
      |                                    ИНАЧЕ ПартииТоваровНаСкладах.Качество = СписанныеТовары.Качество
      |                              КОНЕЦ
      |                  КОНЕЦ)
      |                  И (&УсловиеСклад2)
      |                  И (ВЫБОР
      |                        КОГДА СписанныеТовары.ДопустимыйСтатус1 <> &ПустойСтатус
      |                                    ИЛИ СписанныеТовары.ДопустимыйСтатус2 <> &ПустойСтатус
      |                                    ИЛИ СписанныеТовары.ДопустимыйСтатус3 <> &ПустойСтатус
      |                                    ИЛИ СписанныеТовары.ДопустимыйСтатус4 <> &ПустойСтатус
      |                              ТОГДА ПартииТоваровНаСкладах.СтатусПартии = &ПустойСтатус
      |                                          ИЛИ ПартииТоваровНаСкладах.СтатусПартии = &СтатусПартииПоОрдеру
      |                                          ИЛИ ПартииТоваровНаСкладах.СтатусПартии = СписанныеТовары.ДопустимыйСтатус1
      |                                          ИЛИ ПартииТоваровНаСкладах.СтатусПартии = СписанныеТовары.ДопустимыйСтатус2
      |                                          ИЛИ ПартииТоваровНаСкладах.СтатусПартии = СписанныеТовары.ДопустимыйСтатус3
      |                                          ИЛИ ПартииТоваровНаСкладах.СтатусПартии = СписанныеТовары.ДопустимыйСтатус4
      |                        ИНАЧЕ ИСТИНА
      |                  КОНЕЦ)
      |                  И (ВЫБОР
      |                        КОГДА СписанныеТовары.СписыватьТолькоПоЗаказу = ИСТИНА
      |                              ТОГДА ВЫБОР
      |                                          КОГДА ПартииТоваровНаСкладах.Заказ <> СписанныеТовары.ЗаказПартии
      |                                                ТОГДА ВЫБОР
      |                                                            КОГДА (НЕ СписанныеТовары.ЗаказПартии = НЕОПРЕДЕЛЕНО)
      |                                                                  ТОГДА ЛОЖЬ
      |                                                            ИНАЧЕ ПартииТоваровНаСкладах.Заказ = &ПустойЗаказ
      |                                                      КОНЕЦ
      |                                          ИНАЧЕ ИСТИНА
      |                                    КОНЕЦ
      |                        ИНАЧЕ ВЫБОР
      |                                    КОГДА ПартииТоваровНаСкладах.Заказ <> СписанныеТовары.ЗаказПартии
      |                                          ТОГДА ПартииТоваровНаСкладах.Заказ = &ПустойЗаказ
      |                                    ИНАЧЕ ИСТИНА
      |                              КОНЕЦ
      |                  КОНЕЦ)
      |                  И (СписанныеТовары.СерияНоменклатуры = ПартииТоваровНаСкладах.СерияНоменклатуры
      |                        ИЛИ ПартииТоваровНаСкладах.СерияНоменклатуры = &ПустаяСерияНоменклатуры)
      |ГДЕ
      |      СписанныеТовары.Регистратор = &ОсновнойДокумент"
;
     
      Запрос.Текст = Запрос.Текст + "
      |
      |УПОРЯДОЧИТЬ ПО
      |      ЧислоСерияНоменклатуры,
      |      ЧислоДокументОприходования,
      |      ЧислоЗаказ,
      |      ЧислоСтатусПартии"
+ ?(СтратегияСтатусПартии = Перечисления.СтретегииСписанияПартийТоваровПоСтатусам.СначалаПринятыеПотомСобственные, " Убыв", "") +
",
      |      ДокументОприходованияДата"
+ ?(СпособОценкиМПЗ = "ЛИФО", " Убыв","") +
",
      |      ДокументОприходования"
+ ?(СпособОценкиМПЗ = "ЛИФО", " Убыв","") +
"
      |ИТОГИ ПО
      |      НомерСтрокиДокумента"
;
     
      Запрос.Текст = СтрЗаменить(Запрос.Текст, "&УсловиеСклад1",
      ?(ВестиПартионныйУчетПоСкладам,
"
      |            (Склад В
      |                (ВЫБРАТЬ
      |                    РегистрСведений.СписанныеТовары.Склад
      |                ИЗ
      |                    РегистрСведений.СписанныеТовары
      |                ГДЕ
      |                    РегистрСведений.СписанныеТовары.Регистратор = &Ссылка) ИЛИ Склад = &ПустойСклад)"
, "ИСТИНА"));
     
      Запрос.Текст = СтрЗаменить(Запрос.Текст, "&УсловиеСклад2",
      ?(ВестиПартионныйУчетПоСкладам, " (ПартииТоваровНаСкладах.Склад = СписанныеТовары.Склад ИЛИ ПартииТоваровНаСкладах.Склад = &ПустойСклад)", "ИСТИНА"));

КонецПроцедуры // ЗаполнитьЗапросПартийНаСкладахУпр()
Tags:
Subscribe

promo fixin december 31, 2037 16:57 1417
Buy for 30 tokens
UPD: Друзья, в августе 2019 года блог переехал на http://fixinchik.ru. Welcome! Добро пожаловать в журнал Осипова Сергея Александровича, известного также как Fixin и Гений 1С. Рекомендую ознакомиться с Часто Задаваемыми Вопросами обо мне. Что я хочу в подарок - список. Мой проект "…
  • Post a new comment

    Error

    default userpic

    Your reply will be screened

    Your IP address will be recorded 

    When you submit the form an invisible reCAPTCHA check will be performed.
    You must follow the Privacy Policy and Google Terms of use.
  • 6 comments