Имя: Пароль:
1C
1С v8
оптимизация поиска по структуре
0 hohol
 
27.02.13
17:40
Есть место в УПП в документе РСВ ВыборкаПоЗатратамНаВыпуск.НайтиСледующий(СтруктураПоиска)  на это тратится 85% времени проведения документа. Кто как забарывал тормоза по поиску в структуре?
1 hohol
 
27.02.13
17:44
отчего  зависит скорость, понятно что от количества строк в структуре. Может еще от чего? Ну и смысл там перебираются затраты и ищутся в таблице продукции. Почему они это одним запросом в скуле не сделали? скуль наверное побыстрей найдет и сопоставит.
2 SherifSP
 
27.02.13
17:45
(1) А что такое скуль?)
3 hohol
 
27.02.13
17:45
(2) заведи отдельную ветку, это долгий разговор.
4 SherifSP
 
27.02.13
17:47
(3) Так по ходу разговора ветка будит апатся))
5 GANR
 
27.02.13
17:49
Я как-то вместо Выборка задействовал ТаблицаЗначений и добавил ТаблицаЗначений.Индексы - ускорилось.
6 hhhh
 
27.02.13
17:49
(3) поиск ведь не в структуре, а в выборке. Ты выбирай выражения.
7 hohol
 
27.02.13
17:50
(6) спасибо что поправил, действительно поиск в выборке по структуре. Это я скозноязычил.
8 GANR
 
27.02.13
17:52
(7) попробуй (5)

ТаблицаЗначений.Индексы (ValueTable.Indexes)
ТаблицаЗначений (ValueTable)
Индексы (Indexes)
Использование:

Только чтение.
Описание:

Тип: ИндексыКоллекции.
Содержит коллекцию индексов таблицы значений.

Доступность:

Сервер, толстый клиент, внешнее соединение.
9 hohol
 
27.02.13
17:52
(5) Вариант наверное. А насколько ускорилось?
10 GANR
 
27.02.13
17:53
(9) В несколько раз точно.
11 hohol
 
27.02.13
17:53
А кто нибудь переписывал два запроса по затратам и по продукции в один? Вот думаю решится на данный подвиг или ну его нах.
12 GANR
 
27.02.13
17:54
(9) От количества записей в результате запроса зависит.
13 hohol
 
27.02.13
17:54
(10) поняно. Пошел переписывать на таблицу значений.
14 GANR
 
27.02.13
17:55
(13) Погодь. Если есть возможность (11) - так она лучше (5).
15 GANR
 
27.02.13
17:56
(11) Для временных таблиц в запросе, кстати, индексы тоже можно сделать, а потом при соединении использовать.
16 hohol
 
27.02.13
17:58
(14) да сначала меньшей кровью обойдусь наверное. Раньше вообще 30 минут закрывался. Так бухи, нам надо разделить конечную продукцию на модули! -Может не надо? -Надо!  Нам надо наделать полуфабрикатов. - может не надо? - надо! Вот и пц приплыли выпуск 3 часа закрывается, если хотя бы станет час, то уже нормально.
17 hohol
 
27.02.13
18:53
в общем переписал, запустил по небольшой организации вроде быстрее, причем на много. Вот весь код, кому надо

       ВыборкаПоЗатратамНаВыпуск = РезультатЗапросаПоЗатратамНаВыпуск.Выгрузить();
       ВыборкаПоЗатратамНаВыпуск.Индексы.Добавить("Подразделение,НоменклатурнаяГруппа,СтатьяЗатрат,Затрата,СчетУчета");
       СтрокиЗЗатратНаВыпуск     = ВыборкаПоЗатратамНаВыпуск.НайтиСтроки(СтруктураПоиска);
       
   
       Для Каждого СтрокаТчПродукция Из  СтрокиЗЗатратНаВыпуск Цикл
           
           Если СтрокаТчПродукция.ЗатратаВстречногоВыпуска
              И Не СтрокаТчПродукция.ВстречныйВыпуск Тогда
               Продолжить;
           ИначеЕсли Не СтрокаТчПродукция.ЗатратаВстречногоВыпуска
                   И СтрокаТчПродукция.ВстречныйВыпуск Тогда
               Продолжить;
           ИначеЕсли СтрокаТчПродукция.ЗатратаВстречногоВыпуска
                   И Не РасчетЗатратВстречногоВыпуска Тогда
               Продолжить;
           КонецЕсли;
           
           // Пропускаем записи по которым нет выпуска продукции.
           Если Не СтрокаТчПродукция.ЕстьВыпускПродукции Тогда
               Продолжить;
           КонецЕсли;
           
           ВсегоЗатратыНаВыпуск = ВсегоЗатратыНаВыпуск + СтрокаТчПродукция.Стоимость;
           Если СтруктураШапкиДокумента.ОтражатьВНалоговомУчете Тогда
               ВсегоЗатратыНаВыпускПостояннаяРазница = ВсегоЗатратыНаВыпускПостояннаяРазница + СтрокаТчПродукция.ПостояннаяРазница;
               ВсегоЗатратыНаВыпускВременнаяРазница = ВсегоЗатратыНаВыпускВременнаяРазница + СтрокаТчПродукция.ВременнаяРазница;
           КонецЕсли;
           
           СуммаЗатрат = 0;
           СуммаЗатратПостояннаяРазница = 0;
           СуммаЗатратВременнаяРазница = 0;
           КоличествоИзНЗП = 0;
           СуммаИзНЗП = 0;
           ПостояннаяРазницаИзНЗП = 0;
           ВременнаяРазницаИзНЗП = 0;
           
           // Если производится списание затрат на продукцию, исключаемую из базы распределения,
           // стоимость такой продукции не корректируем.
           Если СтрокаТчПродукция.ЕстьИсключаемаяНоменклатура
              И (РасчетКосвенныхЗатрат ИЛИ РасчетЗатратВстречногоВыпуска) Тогда
             
               КоличествоНЗП = КоличествоНЗП - СтрокаТчПродукция.Количество;
               СуммаНЗП = СуммаНЗП - СтрокаТчПродукция.Стоимость;
               ОбщаяСуммаНЗП = ОбщаяСуммаНЗП - СтрокаТчПродукция.Стоимость;
               Если СтруктураШапкиДокумента.ОтражатьВНалоговомУчете Тогда
                   ВременнаяРазницаНЗП = ВременнаяРазницаНЗП - СтрокаТчПродукция.ВременнаяРазница;
                   ПостояннаяРазницаНЗП = ПостояннаяРазницаНЗП - СтрокаТчПродукция.ПостояннаяРазница;
                   
                   ОбщаяСуммаНЗП = ОбщаяСуммаНЗП - СтрокаТчПродукция.ВременнаяРазница
                       - СтрокаТчПродукция.ПостояннаяРазница;
               КонецЕсли;
               
               Продолжить;
               
           КонецЕсли;
           
           Если СтрокаТчПродукция.КодОперации = Перечисления.КодыОперацийЗатратыНаВыпускПродукции.ОприходованиеНЗП
              И Не РасчетЗатратВстречногоВыпуска
           Тогда
           
               КоличествоНЗП = КоличествоНЗП - СтрокаТчПродукция.Количество;
               СуммаНЗП = СуммаНЗП - СтрокаТчПродукция.Стоимость;
               ОбщаяСуммаНЗП = ОбщаяСуммаНЗП - СтрокаТчПродукция.Стоимость;
               Если СтруктураШапкиДокумента.ОтражатьВНалоговомУчете Тогда
                   ВременнаяРазницаНЗП = ВременнаяРазницаНЗП - СтрокаТчПродукция.ВременнаяРазница;
                   ПостояннаяРазницаНЗП = ПостояннаяРазницаНЗП - СтрокаТчПродукция.ПостояннаяРазница;
                   
                   ОбщаяСуммаНЗП = ОбщаяСуммаНЗП - СтрокаТчПродукция.ВременнаяРазница
                       - СтрокаТчПродукция.ПостояннаяРазница;
               КонецЕсли;
                   
           КонецЕсли;
           
           Если ВыборкаПоЗатратам.ВидЗатрат = Перечисления.ВидыЗатрат.Материальные Тогда
               РассчитатьСуммыСписанияИКорректировкиМатериальныхЗатрат(
                   СтруктураШапкиДокумента,
                   СтрокаТчПродукция,
                   КодыОперацийФиксСтоимость,
                   КоличествоНЗП,
                   СуммаНЗП,
                   ПостояннаяРазницаНЗП,
                   ВременнаяРазницаНЗП,
                   ОбщаяСуммаНЗП,
                   КоличествоЗатратНаВыпуск,
                   РасчетКосвенныхЗатрат,
                   РасчетЗатратВстречногоВыпуска,
                   СуммаЗатрат,
                   СуммаЗатратПостояннаяРазница,
                   СуммаЗатратВременнаяРазница,
                   КоличествоИзНЗП,
                   СуммаИзНЗП,
                   ПостояннаяРазницаИзНЗП,
                   ВременнаяРазницаИзНЗП
                   );
               
           // Расчет сумм списания для нематериальных затрат.        
           ИначеЕсли Не РасчетКосвенныхЗатрат Тогда
               РассчитатьСуммыСписанияНематериальныхЗатрат(
                   СтруктураШапкиДокумента,
                   СтрокаТчПродукция,
                   СуммаНЗП,
                   ПостояннаяРазницаНЗП,
                   ВременнаяРазницаНЗП,
                   ОбщаяСуммаНЗП,
                   СуммаЗатратНаВыпуск,
                   РасчетЗатратВстречногоВыпуска,
                   СуммаЗатрат,
                   СуммаЗатратПостояннаяРазница,
                   СуммаЗатратВременнаяРазница,
                   СуммаИзНЗП,
                   ПостояннаяРазницаИзНЗП,
                   ВременнаяРазницаИзНЗП
               );
           КонецЕсли;
           
           Если Не РасчетЗатратВстречногоВыпуска И СтрокаТчПродукция.ЗатратаВстречногоВыпуска Тогда
               СуммаЗатрат = 0;
           КонецЕсли;
           
           СписатьКоличествоИзНЗП = СписатьКоличествоИзНЗП + КоличествоИзНЗП;    
           СписатьСуммаИзНЗП = СписатьСуммаИзНЗП + СуммаИзНЗП;
           СписатьПостояннаяРазницаИзНЗП = СписатьПостояннаяРазницаИзНЗП + ПостояннаяРазницаИзНЗП;
           СписатьВременнаяРазницаИзНЗП = СписатьВременнаяРазницаИзНЗП + ВременнаяРазницаИзНЗП;
           
           ХарактерЗатрат = Перечисления.ХарактерЗатрат.ПроизводственныеРасходы;
           
           // Формирование движений по регистру "Затраты на выпуск".
           СформироватьДвиженияПоРегиструЗатратыНаВыпускПродукцииПрямыеЗатраты(
               СтруктураШапкиДокумента,
               ВыборкаПоЗатратам,
               СтрокаТчПродукция,
               Ложь, // РаспределениеЗатратПоБазе,
               РасчетКосвенныхЗатрат, // КосвенныеЗатраты,
               РасчетЗатратВстречногоВыпуска, // ЗатратыВстречногоВыпуска,
               0, // Количество
               СуммаЗатрат,
               СуммаЗатратПостояннаяРазница,
               СуммаЗатратВременнаяРазница,
               НаборЗаписейЗатратыНаВыпуск
           );
           
           // Формирование движений по регистру бухгалтерии.    
           Если Не СтруктураШапкиДокумента.ОтражатьВУправленческомУчете
              И ВыборкаПоЗатратам.СтатусМатериальныхЗатрат <> Перечисления.СтатусыМатериальныхЗатратНаПроизводство.ПринятыеВПереработку
              И (СтрокаТчПродукция.НоменклатурнаяГруппа <> СтрокаТчПродукция.НоменклатурнаяГруппаНЗП
                   ИЛИ СтрокаТчПродукция.Подразделение <> СтрокаТчПродукция.ПодразделениеНЗП
                   И ЗначениеЗаполнено(СтрокаТчПродукция.ПодразделениеНЗП)) Тогда
                   
               СформироватьДвиженияПоРегиструБухгалтерииРаспределениеЗатрат(
                   СтруктураШапкиДокумента,
                   СтруктураШапкиДокумента.ВидОтраженияВУчете,
                   ВыборкаПоЗатратам,
                   СтрокаТчПродукция,
                   ВыборкаПоЗатратам.СтатьяЗатрат,
                   Перечисления.ХарактерЗатрат.ПроизводственныеРасходы,
                   СуммаИзНЗП,
                   ПостояннаяРазницаИзНЗП,
                   ВременнаяРазницаИзНЗП,
                   РегистрБухгалтерииНаборЗаписей
                   );
               
           КонецЕсли;
                       
       КонецЦикла;
18 hohol
 
27.02.13
18:55
вставлять в 6752 строку модуля расчета себестоимости для партионного учета
19 GANR
 
27.02.13
18:59
(17) Индексы дают себя знать когда данных много и при этом поиск происходит в разы чаще модификации.
20 hohol
 
27.02.13
19:00
тока я еще не все проверил. Надо будет сейчас на мега организации запустить. есть замер ДО, ПОСЛЕ Потом выложу.
21 GANR
 
27.02.13
19:01
ждем
22 hohol
 
28.02.13
16:10
Значит так замеры
ОбщийМодуль.ПроцедурыРасчетаСебестоимостиВыпуска.Модуль    Пока ВыборкаПоЗатратамНаВыпуск.НайтиСледующий(СтруктураПоиска) Цикл        
23 270,604008секунд, занимает    89,97%

после


ОбщийМодуль.ПроцедурыРасчетаСебестоимостиВыпуска.Модуль        СтрокиЗЗатратНаВыпуск=ВыборкаПоЗатратамНаВыпуск.НайтиСтроки(СтруктураПоиска);
работает 1 899,765115секунд, занимает 34,37%
23 hohol
 
28.02.13
16:11
однако...
только в (17) все неправильно там я сделал, надо по другому.
24 hohol
 
28.02.13
16:12
вот вся процедура

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

       //Если УстановленНовыйОтбор Тогда    
       //    ПостроительЗапроса.Выполнить();
       //КонецЕсли;    
       //РезультатЗапросаПоЗатратамНаВыпуск = ПостроительЗапроса.Результат;
                   
       // Выберем выпуск продукции с направлениями списания.
       СтруктураПоиска = ПолучитьСтруктуруПоискаСтрокЗатратНаВыпуск(
           СтруктураШапкиДокумента,
           ВыборкаПоЗатратам
           );
           
       СписатьКоличествоИзНЗП = 0;    
       СписатьСуммаИзНЗП = 0;
       СписатьПостояннаяРазницаИзНЗП = 0;
       СписатьВременнаяРазницаИзНЗП = 0;
       
       ВсегоЗатратыНаВыпуск = 0;
       ВсегоЗатратыНаВыпускПостояннаяРазница = 0;
       ВсегоЗатратыНаВыпускВременнаяРазница = 0;
       
       //ВыборкаПоЗатратамНаВыпуск = РезультатЗапросаПоЗатратамНаВыпуск.Выгрузить();
       //ВыборкаПоЗатратамНаВыпуск.Индексы.Добавить("Подразделение,НоменклатурнаяГруппа,СтатьяЗатрат,Затрата,СчетУчета");
       СтрокиЗЗатратНаВыпуск     = ВыборкаПоЗатратамНаВыпуск.НайтиСтроки(СтруктураПоиска);
       
   
       Для Каждого СтрокаТчПродукция Из  СтрокиЗЗатратНаВыпуск Цикл
           
           Если СтрокаТчПродукция.ЗатратаВстречногоВыпуска
              И Не СтрокаТчПродукция.ВстречныйВыпуск Тогда
               Продолжить;
           ИначеЕсли Не СтрокаТчПродукция.ЗатратаВстречногоВыпуска
                   И СтрокаТчПродукция.ВстречныйВыпуск Тогда
               Продолжить;
           ИначеЕсли СтрокаТчПродукция.ЗатратаВстречногоВыпуска
                   И Не РасчетЗатратВстречногоВыпуска Тогда
               Продолжить;
           КонецЕсли;
           
           // Пропускаем записи по которым нет выпуска продукции.
           Если Не СтрокаТчПродукция.ЕстьВыпускПродукции Тогда
               Продолжить;
           КонецЕсли;
           
           ВсегоЗатратыНаВыпуск = ВсегоЗатратыНаВыпуск + СтрокаТчПродукция.Стоимость;
           Если СтруктураШапкиДокумента.ОтражатьВНалоговомУчете Тогда
               ВсегоЗатратыНаВыпускПостояннаяРазница = ВсегоЗатратыНаВыпускПостояннаяРазница + СтрокаТчПродукция.ПостояннаяРазница;
               ВсегоЗатратыНаВыпускВременнаяРазница = ВсегоЗатратыНаВыпускВременнаяРазница + СтрокаТчПродукция.ВременнаяРазница;
           КонецЕсли;
           
           СуммаЗатрат = 0;
           СуммаЗатратПостояннаяРазница = 0;
           СуммаЗатратВременнаяРазница = 0;
           КоличествоИзНЗП = 0;
           СуммаИзНЗП = 0;
           ПостояннаяРазницаИзНЗП = 0;
           ВременнаяРазницаИзНЗП = 0;
           
           // Если производится списание затрат на продукцию, исключаемую из базы распределения,
           // стоимость такой продукции не корректируем.
           Если СтрокаТчПродукция.ЕстьИсключаемаяНоменклатура
              И (РасчетКосвенныхЗатрат ИЛИ РасчетЗатратВстречногоВыпуска) Тогда
             
               КоличествоНЗП = КоличествоНЗП - СтрокаТчПродукция.Количество;
               СуммаНЗП = СуммаНЗП - СтрокаТчПродукция.Стоимость;
               ОбщаяСуммаНЗП = ОбщаяСуммаНЗП - СтрокаТчПродукция.Стоимость;
               Если СтруктураШапкиДокумента.ОтражатьВНалоговомУчете Тогда
                   ВременнаяРазницаНЗП = ВременнаяРазницаНЗП - СтрокаТчПродукция.ВременнаяРазница;
                   ПостояннаяРазницаНЗП = ПостояннаяРазницаНЗП - СтрокаТчПродукция.ПостояннаяРазница;
                   
                   ОбщаяСуммаНЗП = ОбщаяСуммаНЗП - СтрокаТчПродукция.ВременнаяРазница
                       - СтрокаТчПродукция.ПостояннаяРазница;
               КонецЕсли;
               
               Продолжить;
               
           КонецЕсли;
           
           Если СтрокаТчПродукция.КодОперации = Перечисления.КодыОперацийЗатратыНаВыпускПродукции.ОприходованиеНЗП
              И Не РасчетЗатратВстречногоВыпуска
           Тогда
           
               КоличествоНЗП = КоличествоНЗП - СтрокаТчПродукция.Количество;
               СуммаНЗП = СуммаНЗП - СтрокаТчПродукция.Стоимость;
               ОбщаяСуммаНЗП = ОбщаяСуммаНЗП - СтрокаТчПродукция.Стоимость;
               Если СтруктураШапкиДокумента.ОтражатьВНалоговомУчете Тогда
                   ВременнаяРазницаНЗП = ВременнаяРазницаНЗП - СтрокаТчПродукция.ВременнаяРазница;
                   ПостояннаяРазницаНЗП = ПостояннаяРазницаНЗП - СтрокаТчПродукция.ПостояннаяРазница;
                   
                   ОбщаяСуммаНЗП = ОбщаяСуммаНЗП - СтрокаТчПродукция.ВременнаяРазница
                       - СтрокаТчПродукция.ПостояннаяРазница;
               КонецЕсли;
                   
           КонецЕсли;
           
           Если ВыборкаПоЗатратам.ВидЗатрат = Перечисления.ВидыЗатрат.Материальные Тогда
               РассчитатьСуммыСписанияИКорректировкиМатериальныхЗатрат(
                   СтруктураШапкиДокумента,
                   СтрокаТчПродукция,
                   КодыОперацийФиксСтоимость,
                   КоличествоНЗП,
                   СуммаНЗП,
                   ПостояннаяРазницаНЗП,
                   ВременнаяРазницаНЗП,
                   ОбщаяСуммаНЗП,
                   КоличествоЗатратНаВыпуск,
                   РасчетКосвенныхЗатрат,
                   РасчетЗатратВстречногоВыпуска,
                   СуммаЗатрат,
                   СуммаЗатратПостояннаяРазница,
                   СуммаЗатратВременнаяРазница,
                   КоличествоИзНЗП,
                   СуммаИзНЗП,
                   ПостояннаяРазницаИзНЗП,
                   ВременнаяРазницаИзНЗП
                   );
               
           // Расчет сумм списания для нематериальных затрат.        
           ИначеЕсли Не РасчетКосвенныхЗатрат Тогда
               РассчитатьСуммыСписанияНематериальныхЗатрат(
                   СтруктураШапкиДокумента,
                   СтрокаТчПродукция,
                   СуммаНЗП,
                   ПостояннаяРазницаНЗП,
                   ВременнаяРазницаНЗП,
                   ОбщаяСуммаНЗП,
                   СуммаЗатратНаВыпуск,
                   РасчетЗатратВстречногоВыпуска,
                   СуммаЗатрат,
                   СуммаЗатратПостояннаяРазница,
                   СуммаЗатратВременнаяРазница,
                   СуммаИзНЗП,
                   ПостояннаяРазницаИзНЗП,
                   ВременнаяРазницаИзНЗП
               );
           КонецЕсли;
           
           Если Не РасчетЗатратВстречногоВыпуска И СтрокаТчПродукция.ЗатратаВстречногоВыпуска Тогда
               СуммаЗатрат = 0;
           КонецЕсли;
           
           СписатьКоличествоИзНЗП = СписатьКоличествоИзНЗП + КоличествоИзНЗП;    
           СписатьСуммаИзНЗП = СписатьСуммаИзНЗП + СуммаИзНЗП;
           СписатьПостояннаяРазницаИзНЗП = СписатьПостояннаяРазницаИзНЗП + ПостояннаяРазницаИзНЗП;
           СписатьВременнаяРазницаИзНЗП = СписатьВременнаяРазницаИзНЗП + ВременнаяРазницаИзНЗП;
           
           ХарактерЗатрат = Перечисления.ХарактерЗатрат.ПроизводственныеРасходы;
           
           // Формирование движений по регистру "Затраты на выпуск".
           СформироватьДвиженияПоРегиструЗатратыНаВыпускПродукцииПрямыеЗатраты(
               СтруктураШапкиДокумента,
               ВыборкаПоЗатратам,
               СтрокаТчПродукция,
               Ложь, // РаспределениеЗатратПоБазе,
               РасчетКосвенныхЗатрат, // КосвенныеЗатраты,
               РасчетЗатратВстречногоВыпуска, // ЗатратыВстречногоВыпуска,
               0, // Количество
               СуммаЗатрат,
               СуммаЗатратПостояннаяРазница,
               СуммаЗатратВременнаяРазница,
               НаборЗаписейЗатратыНаВыпуск
           );
           
           // Формирование движений по регистру бухгалтерии.    
           Если Не СтруктураШапкиДокумента.ОтражатьВУправленческомУчете
              И ВыборкаПоЗатратам.СтатусМатериальныхЗатрат <> Перечисления.СтатусыМатериальныхЗатратНаПроизводство.ПринятыеВПереработку
              И (СтрокаТчПродукция.НоменклатурнаяГруппа <> СтрокаТчПродукция.НоменклатурнаяГруппаНЗП
                   ИЛИ СтрокаТчПродукция.Подразделение <> СтрокаТчПродукция.ПодразделениеНЗП
                   И ЗначениеЗаполнено(СтрокаТчПродукция.ПодразделениеНЗП)) Тогда
                   
               СформироватьДвиженияПоРегиструБухгалтерииРаспределениеЗатрат(
                   СтруктураШапкиДокумента,
                   СтруктураШапкиДокумента.ВидОтраженияВУчете,
                   ВыборкаПоЗатратам,
                   СтрокаТчПродукция,
                   ВыборкаПоЗатратам.СтатьяЗатрат,
                   Перечисления.ХарактерЗатрат.ПроизводственныеРасходы,
                   СуммаИзНЗП,
                   ПостояннаяРазницаИзНЗП,
                   ВременнаяРазницаИзНЗП,
                   РегистрБухгалтерииНаборЗаписей
                   );
               
           КонецЕсли;
                       
       КонецЦикла;
       
       Если РасчетЗатратВстречногоВыпуска
          И СтруктураШапкиДокумента.ИтерационныйРасчетЗатратВстречногоВыпуска
          И ВыборкаПоЗатратам.ВстречныйВыпуск Тогда
         
           Если ВыборкаПоЗатратам.КоличествоРасход <> 0 Тогда
             
               СписатьКоличествоИзНЗП = 0;
               СписатьСуммаИзНЗП = СписатьСуммаИзНЗП - ВсегоЗатратыНаВыпуск;
               
               Если СтруктураШапкиДокумента.ОтражатьВНалоговомУчете Тогда
                   СписатьПостояннаяРазницаИзНЗП = СписатьПостояннаяРазницаИзНЗП - ВсегоЗатратыНаВыпускПостояннаяРазница;
                   СписатьВременнаяРазницаИзНЗП = СписатьВременнаяРазницаИзНЗП - ВсегоЗатратыНаВыпускВременнаяРазница;
               КонецЕсли;
               
           КонецЕсли;
       КонецЕсли;
       
       // Формирование движений по регистру "Незавершенное производство".
       СформироватьДвиженияПоРегиструНезавершенноеПроизводствоРаспределениеЗатрат(
           СтруктураШапкиДокумента,
           ВыборкаПоЗатратам,
           ВыборкаПоЗатратам.СтатьяЗатрат,
           Неопределено, // ХарактерЗатрат,
           ВыборкаПоЗатратам.Затрата,
           ВыборкаПоЗатратам.ХарактеристикаЗатраты,
           ВыборкаПоЗатратам.СерияЗатраты,
           НомерПередела,
           СписатьКоличествоИзНЗП,
           СписатьСуммаИзНЗП,
           СписатьПостояннаяРазницаИзНЗП,
           СписатьВременнаяРазницаИзНЗП,
           ВидДвиженияНакопления.Расход,
           НаборЗаписейНезавершенноеПроизводство
           );
       
   КонецЦикла;
   
КонецПроцедуры // РаспределитьЗатратыИзНезавершенногоПроизводстваНаВыпускПродукции()
25 hohol
 
28.02.13
16:12
А если наверное и два запроса в один переписать, так оно наверное еще лучше будет.
26 hohol
 
28.02.13
16:13
+(24) только я правильность проведения не проверял, ну проде все закрывает.
27 hohol
 
28.02.13
16:15
+(22) Итого получилось в 12 раз быстрее. Странно, они там в 1С вообще, что ли на упп 1.3 забили? 2.0 пишут.
28 hohol
 
28.02.13
16:20
В общем  Ганееву Руслану спасибо за идею, итого отвечу себе сам в 0, чтобы увеличить скорость поиска по структуре, надо ей не пользоваться. Прям бэк ту 7.7, выгрузили запрос в ТаблицуЗначений и там ковыряемся. Учитывая что семерошный язык раза в 2 быстрее, то время выполнения можно еще на два поделить. В общем восьмерка - красивая игрушка, до серьезных систем ей еще как до Киева раком, за красоту надо платить скоростью вот и пожалуйста.
29 H A D G E H O G s
 
28.02.13
16:21
(28) Возвращайтесь на 7.7.
Там сурово, нордично и быстро.
31 hohol
 
28.02.13
16:29
(29) На самом деле, тут у меня не такое уж и большое производство, ну выпускается до 1000изделий, состоящих ну может из 100 всяких материалов каждое. И оно уже тухнет. А если бы 1000000 изделий выпускалось? А если  каждое из 100 000 деталей? Думаю п-ц этому флагману сразу наступит, самый главный программист на заводе застрелится, остальных растерзают пользователи.
32 GANR
 
28.02.13
17:19
>Прям бэк ту 7.7 (28)

Чтобы не было таких бэков не должно быть ошибок на этапе проектирования конфигураций у фирмы 1С. Вот сделали-бы в 1 запрос изначально - все бы было хорошо. Увы, ошибки перманентны при таких разработках.
33 hohol
 
28.02.13
17:20
(32) полюбому какой то гад на форуме себе в один запрос сделал и не делится.
34 hohol
 
28.02.13
17:22
А H A D G E H O G s вместо того, чтобы сообщения тереть, лучше бы заголовок исправил, на оптимизаци поиска по ВЫБОРКЕ. И упп в заголовк добавить надо, я специально не добавлял, чтобы Шухер не приходил. Не хотелось ветке матерится просто на людей.
35 Reset
 
28.02.13
17:25
Нашел неоптимальность в чужой конфигурации и сделал вывод, что 8ка гамно :) Логика
36 ДенисЧ
 
28.02.13
17:41
(35) так она и есть это самое :-)
Вне зависимости от конфигурации
Выдавать глобальные идеи — это удовольствие; искать сволочные маленькие ошибки — вот настоящая работа. Фредерик Брукс-младший