Вход | Регистрация
 
1С:Предприятие :: 1С:Предприятие 8 общая

Вопрос по оптимизации кода и запроса

Вопрос по оптимизации кода и запроса
Я
   asder117
 
30.07.20 - 22:38
Коллеги доброго времени суток. пытаюсь получить цену номенклатуры с учетом доп расходов. имею на борту УПП последний релиз. Следующий код долго отрабатывает. Думаю долго отрабатывает второй запрос. Кто что может посоветовать? Спасибо
[Code]
Функция ПолучитьСебестоимостьПоПоследнемуПриходу(Номенклатура, Количество)
////Получим последний приход
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ ПЕРВЫЕ 1
               |    ЗакупкиОбороты.Номенклатура КАК Номенклатура,
               |    МАКСИМУМ(ЗакупкиОбороты.Регистратор) КАК Регистратор,
               |    ЗакупкиОбороты.КоличествоОборот КАК Количество,
               |    ЗакупкиОбороты.СтоимостьОборот КАК Стоимость
               |ИЗ
               |    РегистрНакопления.Закупки.Обороты(, , Регистратор, Номенклатура = &Номенклатура) КАК ЗакупкиОбороты
               |ГДЕ
               |    ЗакупкиОбороты.КоличествоОборот > 0
               |    И НЕ ЗакупкиОбороты.Регистратор.Образец
               |
               |СГРУППИРОВАТЬ ПО
               |    ЗакупкиОбороты.Номенклатура,
               |    ЗакупкиОбороты.КоличествоОборот,
               |    ЗакупкиОбороты.СтоимостьОборот
               |
               |УПОРЯДОЧИТЬ ПО
               |    Номенклатура,
               |    Регистратор УБЫВ
               |АВТОУПОРЯДОЧИВАНИЕ";

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

КонецФункции // ПолучитьСебестоимостьПоПоследнемуПриходу()
[/Code]
   H A D G E H O G s
 
1 - 30.07.20 - 22:53
|    И НЕ ЗакупкиОбороты.Регистратор.Образец 

Точно во всех регистраторах есть реквизит Образец ?
   H A D G E H O G s
 
2 - 30.07.20 - 22:54
2 запрос раздербань по ВременнымТаблицам
   asder117
 
3 - 30.07.20 - 23:00
(1) Да есть. Его специально заводили. (2) Попробую конечно, до этого с временными таблицами пробовал и тоже долго было
   H A D G E H O G s
 
4 - 30.07.20 - 23:05
(3) Это намек на то, что .Образец возможно нужно оформить через ВЫРАЗИТЬ()
   asder117
 
5 - 30.07.20 - 23:19
(4) Я это понимаю и знаю..
   asder117
 
6 - 30.07.20 - 23:21
(2) разде6рбнил на вт
ЗапросДоп.Текст = "ВЫБРАТЬ
                      |    ПоступлениеТоваровУслугТовары.Номенклатура,
                      |    ПоступлениеТоваровУслугТовары.Количество
                      |ПОМЕСТИТЬ ВТДопРасходы
                      |ИЗ
                      |    Документ.ПоступлениеТоваровУслуг.Товары КАК ПоступлениеТоваровУслугТовары
                      |        ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.ПоступлениеДопРасходов.Товары КАК ПоступлениеДопРасходовТовары
                      |        ПО ПоступлениеТоваровУслугТовары.Номенклатура = ПоступлениеДопРасходовТовары.Номенклатура
                      |            И ПоступлениеТоваровУслугТовары.Ссылка = ПоступлениеДопРасходовТовары.ДокументПартии
                      |ГДЕ
                      |    ПоступлениеТоваровУслугТовары.Ссылка = &ДокументОснование
                      |    И ПоступлениеТоваровУслугТовары.Номенклатура = &ТаблицаНоменклатуры
                      |
                      |СГРУППИРОВАТЬ ПО
                      |    ПоступлениеТоваровУслугТовары.Номенклатура,
                      |    ПоступлениеТоваровУслугТовары.Количество
                      |;
                      |
                      ////////////////////////////////////////////////////////////////////////////////

                      |ВЫБРАТЬ
                      |    ХозрасчетныйДвиженияССубконто.Сумма / ЕСТЬNULL(ВТДопРасходы.Количество, 1) КАК Цена,
                      |    ВТДопРасходы.Номенклатура
                      |ИЗ
                      |    ВТДопРасходы КАК ВТДопРасходы
                      |        ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрБухгалтерии.Хозрасчетный.ДвиженияССубконто КАК ХозрасчетныйДвиженияССубконто
                      |        ПО ВТДопРасходы.Номенклатура = ХозрасчетныйДвиженияССубконто.СубконтоДт1
                      |
                      |СГРУППИРОВАТЬ ПО
                      |    ХозрасчетныйДвиженияССубконто.Сумма / ЕСТЬNULL(ВТДопРасходы.Количество, 1),
                      |    ВТДопРасходы.Номенклатура";
Работает долго...Доки тоже разбить чтоли?.первый запрос секунду делает
   Ёпрст
 
7 - 30.07.20 - 23:22
сгруппировать по цена..зачет, и естьнулл там не нужен
   Ёпрст
 
8 - 30.07.20 - 23:24
код конечно огонь, особенно 

 ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрБухгалтерии.Хозрасчетный.ДвиженияССубконто КАК ХозрасчетныйДвиженияССубконто
                      |        ПО ВТДопРасходы.Номенклатура = ХозрасчетныйДвиженияССубконто.СубконтоДт1

...
   asder117
 
9 - 30.07.20 - 23:25
(7) естьнулл для проверки, чтобы не было деления на 0; Ну в принципе убрать можно
   Ёпрст
 
10 - 30.07.20 - 23:25
ну и шедевр, это получать
 ХозрасчетныйДвиженияССубконто.Сумма / ЕСТЬNULL(ВТДопРасходы.Количество, 1) КАК Цена, и еще группировать по этому.
   Ёпрст
 
11 - 30.07.20 - 23:26
(9) Если количество нулевое, твой есть нулл не поможет, будет деление на ноль. А null там по-определению не будет, никогда
   asder117
 
12 - 30.07.20 - 23:26
(8) Да понял я...Изначально нее мой код был обработка на инфостате..я из нее свое делаю
   Ёпрст
 
13 - 30.07.20 - 23:27
А так, ты хоть понимаешь, что пишешь вот этм кодом, в (8) ?
   asder117
 
14 - 30.07.20 - 23:27
(11) Убрал
   H A D G E H O G s
 
15 - 30.07.20 - 23:27
(6) На 3 ВТ, для каждой ТЧ.
А потом эти 3 ВТ соединяй
   asder117
 
16 - 30.07.20 - 23:28
(13) В движениях найти движения по данной номенклатуре..
   Ёпрст
 
17 - 30.07.20 - 23:28
Ты берешь...ВСЕ движения регистра бухгалтерии с этой номенклатурой и ВСЁ это добро иннером присоединяешь, оно тебе точно надо ?
   H A D G E H O G s
 
18 - 30.07.20 - 23:29
(17) Исходно у него было
|    И ХозрасчетныйДвиженияССубконто.Регистратор = ПоступлениеДопРасходовТовары.Ссылка
где-то потерял
   asder117
 
19 - 30.07.20 - 23:30
(17) РегистрБухгалтерии.Хозрасчетный.ДвиженияССубконто(&ДатаНач,&ДатаКон, СчетДт В ИЕРАРХИИ (&Счет)) И это потерял блин
   Ёпрст
 
20 - 30.07.20 - 23:32
(19) ну и зачем они тебе  нужны за целый месяц ?
   Ёпрст
 
21 - 30.07.20 - 23:33
Ты типа таким образом "усредненную" себестоимость получить хочешь ?
   Ёпрст
 
22 - 30.07.20 - 23:34
Только це же бред (не Пит).. Сумма от одних проводок от разных доков, а количество ты всегда пихаешь с одного документа
   Ёпрст
 
23 - 30.07.20 - 23:34
Чего этим кодом добиваешься - загадка :)
   asder117
 
24 - 30.07.20 - 23:35
(20) УПП рауз. расчет себестоимости идет в конце месяца
(22) Именно по последнему приходу
   asder117
 
25 - 30.07.20 - 23:41
(21) Себестоимсоть продукции по ценам последнего прихода с учетом доп расходов
   Ёпрст
 
26 - 30.07.20 - 23:41
(21) ну так и бери движения последнего прихода, а не за период.
   Ёпрст
 
27 - 30.07.20 - 23:44
и движения дока допрасходов
   asder117
 
28 - 30.07.20 - 23:45
(26) документ поступление доп расходов не увеличивает цену номенклатуры и если сделать запрос по ценам срез последних цена будет ниже чем должна быть. (26) Сумм нет (27) Так я и пытаюсь это получить))
   Ёпрст
 
29 - 30.07.20 - 23:47
(28) какая в жпо цена ?.. оперируй суммой всегда.
   Ёпрст
 
30 - 30.07.20 - 23:49
у тя есть приход и доп расход, который или уменьшает себестоимость или увеличивает её, дык тебе чтоб получить её нужно взять сумму прихода сложить с суммойдопрасходов и потом всё это добро поделить на количество из прихода.. узнаешь свою "цену себестоимости"..
а не все проводки за месяц с этой номенклатурой
 
 Рекламное место пустует
   Ёпрст
 
31 - 30.07.20 - 23:53
+ непонятно, зачем это с регистра бухгалтерии тащить, есть же учетЗатрат, хотя, хз, как вы там 41 ведёте, до номенклатуры , или свёрнуто по сумме..хз
   asder117
 
32 - 30.07.20 - 23:53
(30) т.е. получается запрос из 2-х доков и все..одно плохо автоматически не распределяется а точное количество и сумму из проводок только видно правильно
   asder117
 
33 - 30.07.20 - 23:53
(31) Они у меня на 10
   asder117
 
34 - 30.07.20 - 23:54
(31) Учет затрат тоже от начала до конца месяца брать надо
   Ёпрст
 
35 - 30.07.20 - 23:55
(34) зачем ?
   asder117
 
36 - 30.07.20 - 23:55
(35) Стоимости не будет
   Ёпрст
 
37 - 30.07.20 - 23:56
ты ж с последнего хочешь брать, так и бери с последнего.
Если за месяц, то тогда нужно брать всю сумму за месяц и делить на всё количество за месяц, будешь иметь усредненную за месяц.
   Ёпрст
 
38 - 30.07.20 - 23:56
(36) куда она денентся то? )
   Ёпрст
 
39 - 30.07.20 - 23:59
Ты определись, че надо - или усреденную за месяц, или с последнего прихода + доп расходы по этому приходу.
   asder117
 
40 - 31.07.20 - 00:00
(39) с последнего прихода + доп расходы по этому приходу.
   Ёпрст
 
41 - 31.07.20 - 00:04
(40) ну, тогда и бери движения с последнего прихода и движения с доп расхода, складывай суммы и дели на количество из этого прихода, получишь "цену себестоимости" усё.
   Ёпрст
 
42 - 31.07.20 - 00:05
в запросах будет условие не на период, а на регистратор и номенклатуру
   asder117
 
43 - 31.07.20 - 00:06
(41) Делаю (42) понял
   RomanYS
 
44 - 31.07.20 - 00:13
(0) Запрос в цикле да ещё к таблице ДвиженияССубконто?
Переписать на один запрос. Лучше ДвиженияССубконто заменить на РН (РАУЗ или партий), или хотя бы таблицу оборотов РБ с обязательным заданием параметра Субконто
   asder117
 
45 - 31.07.20 - 00:16
(44) Там нет цикла вроде. Регистр РАУЗ я тоже о нем подумал
   Ёпрст
 
46 - 31.07.20 - 00:26
(45) как это нет ?
сама функция ПолучитьСебестоимостьПоПоследнемуПриходу не в цикле разве ?
;)
   RomanYS
 
47 - 31.07.20 - 00:38
(45) А сорян, "первые 1" не заметил. Про ДвиженияССубконто всё в силе, самая тормозная из всех таблиц.
   asder117
 
48 - 31.07.20 - 00:44
(47) Переделываю
   unregistered
 
49 - 31.07.20 - 01:12
РегистрБухгалтерии.Хозрасчетный.ДвиженияССубконто - одна из самых громоздких и тяжелых таблиц.
Если обязательно нужны данные из регистра бухгалтерии и критично время работы запроса, то правильнее самому написать запрос с внутренним соединением двух таблиц - Хозрасчетный и Хозрасчетный.Субконто (с отбором по полю Вид - вид субконто и ВидДвижения - Дебет), соединяя их по Период, Регистратор и НомерСтроки.
   xXeNoNx
 
50 - 31.07.20 - 06:59
(5) это нас чтоль проверяешь? Если знаешь почему сам не оптимизировал
   xXeNoNx
 
51 - 31.07.20 - 07:05
РегистрБухгалтерии.Хозрасчетный.ДвиженияССубконто
В иерархии, да еще и соединенная через соединение
   Simod
 
52 - 31.07.20 - 10:14
(1) В УПП в РН "Закупки" есть поле "Документ закупки", в котором для доп.расходов находится документ поступления. Для получения цены последней поставки со всеми доп.раходами, думаю, этого достаточно.
   karabas11
 
53 - 31.07.20 - 10:30
Когда вижу ДвиженияССубконто хочется плакать... Сначала убивать, потом плакать...
   asder117
 
54 - 31.07.20 - 15:18
(53) Блин брал запрос из обработки с инфостат сейчас сижу и в душе выговариваю
   RomanYS
 
55 - 31.07.20 - 15:24
(53)(54) У этой таблицы есть один большой плюс, её структура совпадает с набором регистра бухгалтерии и работает код
Движения.Хозрасчетный.Загрузить(РезультатЗапроса.Выгрузить());

Других плюсов нет. Ну и использовать её для каких-то аналитических целей - это ппц.
   asder117
 
56 - 31.07.20 - 15:26
(52) т.е. туда садиться уже с доп.расходом?
   asder117
 
57 - 31.07.20 - 15:57
(52) Что самое интересное заметил. документ доп расходов делает записи в РС Цены номенклатуры но в каком-то случае увеличивает цену, а в каком-то нет..


Список тем форума
Рекламное место пустует  Рекламное место пустует
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.