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

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

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

Точно во всех регистраторах есть реквизит Образец ?
2 H A D G E H O G s
 
30.07.20
22:54
2 запрос раздербань по ВременнымТаблицам
3 asder117
 
30.07.20
23:00
(1) Да есть. Его специально заводили. (2) Попробую конечно, до этого с временными таблицами пробовал и тоже долго было
4 H A D G E H O G s
 
30.07.20
23:05
(3) Это намек на то, что .Образец возможно нужно оформить через ВЫРАЗИТЬ()
5 asder117
 
30.07.20
23:19
(4) Я это понимаю и знаю..
6 asder117
 
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

...
9 asder117
 
30.07.20
23:25
(7) естьнулл для проверки, чтобы не было деления на 0; Ну в принципе убрать можно
10 Ёпрст
 
30.07.20
23:25
ну и шедевр, это получать
ХозрасчетныйДвиженияССубконто.Сумма / ЕСТЬNULL(ВТДопРасходы.Количество, 1) КАК Цена, и еще группировать по этому.
11 Ёпрст
 
30.07.20
23:26
(9) Если количество нулевое, твой есть нулл не поможет, будет деление на ноль. А null там по-определению не будет, никогда
12 asder117
 
30.07.20
23:26
(8) Да понял я...Изначально нее мой код был обработка на инфостате..я из нее свое делаю
13 Ёпрст
 
30.07.20
23:27
А так, ты хоть понимаешь, что пишешь вот этм кодом, в (8) ?
14 asder117
 
30.07.20
23:27
(11) Убрал
15 H A D G E H O G s
 
30.07.20
23:27
(6) На 3 ВТ, для каждой ТЧ.
А потом эти 3 ВТ соединяй
16 asder117
 
30.07.20
23:28
(13) В движениях найти движения по данной номенклатуре..
17 Ёпрст
 
30.07.20
23:28
Ты берешь...ВСЕ движения регистра бухгалтерии с этой номенклатурой и ВСЁ это добро иннером присоединяешь, оно тебе точно надо ?
18 H A D G E H O G s
 
30.07.20
23:29
(17) Исходно у него было
|    И ХозрасчетныйДвиженияССубконто.Регистратор = ПоступлениеДопРасходовТовары.Ссылка

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

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