Переключение на Главную Страницу Страницы: [1]  ОтправитьПечать
Очень популярная тема (более 25 ответов) Ускорить проведение документа (число прочтений - 15715 )
Looking
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 33
Зарегистрирован: 11. Апреля 2007
Ускорить проведение документа
25. Июня 2010 :: 12:35
Печать  
Мне необходимо в БД ПУБ SQL ускорить проведение документа "Реализация продукции". Основной тормоз в процедуре
глСписаниеМПЗРасчетРегистров()

Структура регистров
Регистр "Места хранения"
"Измерения":
ВидМПЗ
МПЗ
МестоХранения
Владелец
Качество
"Ресурсы":
Количество
"Реквизиты": -

Регистр "Партии"
"Измерения":
ВидМПЗ
МПЗ
Партия
МестоХранения
Владелец
Качество
СрокЭксплуатации
Заявка
"Ресурсы":
Количество
Сумма
СуммаНУ
СуммаПР
КоличествоОС
"Реквизиты":
КодОперации
ПрямыеРасходыНУ

Как вариант ускорения нашёл предложение в регистрах по измерению МПЗ установить "Отбор движений" и, т.к. оно не первое в регистрах, "Отбор итогов".
Такое решение имеет негативные моменты? БД большая - 20 Гб. Ведь почему-то же по умолчанию в типовом решении эти флаги отключены.

Как более кардинальный способ - переписать процедуру глСписаниеМПЗРасчетРегистров() на прямые запросы. НО к сожалению я этим навыком не владею и сам написать не могу, а сроки очень сжатые и боюсь досконально разобраться в вопросе не успею. КТо-нибудь из форумчан может помочь в этом вопросе? Сколько такая помощь может стоить?
  
Наверх
 
IP записан
 
leshik
1c++ donor
Отсутствует



Сообщений: 820
Местоположение: Пятигорск
Зарегистрирован: 22. Апреля 2007
Пол: Мужской
Re: Ускорить проведение документа
Ответ #1 - 25. Июня 2010 :: 13:02
Печать  
Прошу в ICQ 201216890 - обсудим.
  
Наверх
IP записан
 
leshik
1c++ donor
Отсутствует



Сообщений: 820
Местоположение: Пятигорск
Зарегистрирован: 22. Апреля 2007
Пол: Мужской
Re: Ускорить проведение документа
Ответ #2 - 25. Июня 2010 :: 13:03
Печать  
Федор в связи с тем что это не конкретно вопрос по Прямым запросам а поиск помощи прошу перенести курилку.
  
Наверх
IP записан
 
Anatol
Senior Member
****
Отсутствует


тыц, пыц, тыц!!!

Сообщений: 412
Зарегистрирован: 24. Апреля 2009
Re: Ускорить проведение документа
Ответ #3 - 25. Июня 2010 :: 18:33
Печать  
посмотри еще эту тему
http://www.1cpp.ru/forum/YaBB.pl?num=1276610073
  
Наверх
wwwICQ  
IP записан
 
leshik
1c++ donor
Отсутствует



Сообщений: 820
Местоположение: Пятигорск
Зарегистрирован: 22. Апреля 2007
Пол: Мужской
Re: Ускорить проведение документа
Ответ #4 - 07. Июля 2010 :: 08:56
Печать  
Пожалуй подниму немного тему Улыбка
По итогам обращения автора был проведен комплексный анализ выявивший узкие места.
По итогам проведенных работ автор получил требуемый результат - перепровел за приемлемое время документы.
В то же время сделано было совсем не то о чем говорилось в заглавном посте.
Я просил автора написать отзыв о проведенных работах чтобы тех кто столкнется в будущем с вопросом оптимизации понимал что проблему решать надо комплексно, но автор топика до сих пор не удосужился этого сделать к сожалению.
Отзыв был единственной моей просьбой по итогам работ.
Если кому-то интересно что было и как разрешилось - пишите в ветку я тогда сам напишу. Ну а если это не интересно никому, то пусть данный пост останется маленьким напоминанием об отзывчивости людей просящих помощь.
  
Наверх
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Ускорить проведение документа
Ответ #5 - 07. Июля 2010 :: 09:18
Печать  
Пишите. Мне интересно.
  
Наверх
 
IP записан
 
JohnyDeath
1c++ power user
1c++ donor
Отсутствует



Сообщений: 3050
Местоположение: Волгоград
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Ускорить проведение документа
Ответ #6 - 07. Июля 2010 :: 09:22
Печать  
Тоже с удовольствием почитаю.
  
Наверх
 
IP записан
 
leshik
1c++ donor
Отсутствует



Сообщений: 820
Местоположение: Пятигорск
Зарегистрирован: 22. Апреля 2007
Пол: Мужской
Re: Ускорить проведение документа
Ответ #7 - 07. Июля 2010 :: 10:38
Печать  
У автора топика установлен SQL 2000 SP3.
После предварительного общения стало ясно что проблема заключается именно в перепроведении документов за период. Анализ замеров производительности показал что:
1) При проведении документа НЕ НА ТА действительно самым узким местом является расчет регистров при списании МПЗ.
2) При проведении документа НА ТА узким местом оказался модуль взаиморасчетов который проверял на наличие Налога с продаж в документе реализации. Так в цикле использовался вызов функции глНп... (не помню точно) ну и прочие моменты.
Был проведен анализ состояния фрагментации индексов и созданы планы обслуживания (job-ы).
По данным выводам было принято решение об оптимизации участка взаиморасчетов что и было сделано изменением кода.
После данных манипуляций стало ясно, что оптимизация путем перевода на прямые запросы принесет прирост порядка 20-30% при этом основная проблема замедления проведения на SQL 2000 решена не будет. В связи с высокой нагруженностью базы и сроками на реализацию оптимизации в пределах 8 часов было принято решение о выставлении приоритета на внедрение ReconnectNative при перепроведении документов. Была реализована обработка по перепроведению документов со сдвигом ТА в случае непроведения документа на следующий, изменен глобальный модуль для отсутствия курсоров.
Таким образом эффект достигнутый именно комплексом мероприятий по анализу и устранению узких мест привел к требуемому результату - перепроведению базы за время которое для этого отведено. Перевод на прямые запросы расчетов при проведении на ТА дадут в среднем от 20 до 30 % как выше и говорилось, но затраты на внедрение данного решения не соответствуют эффективности полученного результата на текущий момент.
  
Наверх
IP записан
 
MaxPiter
Full Member
***
Отсутствует


I Love 1C++

Сообщений: 187
Местоположение: Санкт-Петербург
Зарегистрирован: 20. Ноября 2008
Пол: Мужской
Re: Ускорить проведение документа
Ответ #8 - 08. Июля 2010 :: 07:37
Печать  
Ух как ответил здорово Улыбка
а можно вот эту фразу развернуть
Был проведен анализ состояния фрагментации индексов и созданы планы обслуживания (job-ы).
Что делают job-ы при проведении? а то я их только при бекапе использую  Круглые глаза
p.s.
SQL2005
  
Наверх
www  
IP записан
 
val
Full Member
***
Отсутствует


Дорогу осиливает идущий

Сообщений: 137
Зарегистрирован: 07. Июля 2006
Re: Ускорить проведение документа
Ответ #9 - 08. Июля 2010 :: 10:09
Печать  
(8) В переводе на русский в (7) сказано:
1. Поменяли код расчета взаиморасчетов. Полезно, но не совсем то.
2. Поставили в джобах дефрагментацию индексов. Это всегда полезно. Но опять не совсем то.
3. Использовали ReconnectNative. Вот теперь самое то. Улыбка
  
Наверх
 
IP записан
 
leshik
1c++ donor
Отсутствует



Сообщений: 820
Местоположение: Пятигорск
Зарегистрирован: 22. Апреля 2007
Пол: Мужской
Re: Ускорить проведение документа
Ответ #10 - 08. Июля 2010 :: 12:33
Печать  
val писал(а) 08. Июля 2010 :: 10:09:
(8) В переводе на русский в (7) сказано:
1. Поменяли код расчета взаиморасчетов. Полезно, но не совсем то.
2. Поставили в джобах дефрагментацию индексов. Это всегда полезно. Но опять не совсем то.
3. Использовали ReconnectNative. Вот теперь самое то. Улыбка

В корне не согласен. В целом
п.1 принес порядка 15-20% прироста во времени проведения 1 документа
п.2 отжал еще около 10% прироста
п.3 всего-лишь навсего не дал это потерять.
  
Наверх
IP записан
 
pvase
God Member
*****
Отсутствует



Сообщений: 923
Местоположение: Киев
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Ускорить проведение документа
Ответ #11 - 08. Июля 2010 :: 18:06
Печать  
Не знаю какой это ПУБ, но в Украинском точно сделано тормознуто, там регистры расчитвыются не один раз а построчно (когда то переделывал), можно начать искать в этом направлении.
2 - Посмотреть на таблицу остатков по регистрам, возможно остатки не закрываются и висят где то пересортицы, закрыть ненужные значения.
3 -  Быстрая обработка движений - добавляет в табицу движений регистра (RA) 2 поля "DATE_TIME_IDDOC" и "IDDOCDEF". Не думаю что при расчеие остатков эти поля необходимы
4 - Отбор движений - добавляет индекс к таблице движений по измерению
5 - Отбор итогов добавляет индекс в таблицу итогов по измерению

По поводу индексов - они составные, поэтому если условия в запросе будут с пропусками измерений, тогда помощи от такого индекса не следует ждать.

Ну и как вы сами понимаете индекс занимает место и замедляет запись, т.е. добавление индекса приведет к замедлению закписи в таблицы (что почти незаметно, но если в документе 100 строк и таки документов 1000 в день то разница уже будет заметна).
  
Наверх
IP записан
 
Neo
Senior Member
****
Отсутствует


I Love YaBB 2!

Сообщений: 327
Зарегистрирован: 12. Ноября 2007
Re: Ускорить проведение документа
Ответ #12 - 14. Января 2011 :: 12:02
Печать  
Ниже запрос из модуля проведения документа. 2 вопроса.
Как его еще можно оптимизировать?
Правильно ли считаются остатки на позицию документа?  Улыбка

---------------------------------------------------------------------

Recordset.УстановитьТекстовыйПараметр("ТекДок",ТекущийДокумент());
     щийДокумент(),0));
     
Если ИтогиАктуальны()=1 Тогда
     ДатаРасч="";
Иначе
     ДатаРасч=":ТекПоз~";
КонецЕсли;
     
Соед="
|INNER JOIN $ДокументСтроки.РасходнаяНакладная as Д ON Д.IDDOC=:ТекДок AND Товар=$Д.Товар
|";
     
ТекстЗапроса="
|SELECT
|$Док.Товар as [Товар $Справочник.Товары],
|Sum($Док.Количество) as [Кол],
|Sum(Рег.КоличествоОстаток) as [Ост]
|FROM
|$ДокументСтроки.РасходнаяНакладная as Док
|LEFT JOIN      
личество)) as Рег ON $Док.Товар=Рег.Товар
|WHERE
|Док.IDDOC=:ТекДок
|GROUP BY
|$Док.Товар
|";
  
Наверх
 
IP записан
 
berezdetsky
1c++ power user
Отсутствует


barba non facit sisadminum

Сообщений: 1986
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Ускорить проведение документа
Ответ #13 - 14. Января 2011 :: 17:13
Печать  
Neo писал(а) 14. Января 2011 :: 12:02:
Как его еще можно оптимизировать?
Правильно ли считаются остатки на позицию документа?  Улыбка

Либо можно оптимизировать, либо остатки считаются неправильно, в зависимости от того, уникальны ли $Док.Товар в пределах документа. Круглые глаза
  

пароль как коньяк, чем больше звездочек, тем лучше
Наверх
IP записан
 
Neo
Senior Member
****
Отсутствует


I Love YaBB 2!

Сообщений: 327
Зарегистрирован: 12. Ноября 2007
Re: Ускорить проведение документа
Ответ #14 - 14. Января 2011 :: 20:54
Печать  
Уникальны. Писал запрос с учетом этого  Улыбка
« Последняя редакция: 15. Января 2011 :: 06:43 - Neo »  
Наверх
 
IP записан
 
berezdetsky
1c++ power user
Отсутствует


barba non facit sisadminum

Сообщений: 1986
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Ускорить проведение документа
Ответ #15 - 15. Января 2011 :: 11:38
Печать  
Тогда агрегацию можно убрать.
  

пароль как коньяк, чем больше звездочек, тем лучше
Наверх
IP записан
 
Neo
Senior Member
****
Отсутствует


I Love YaBB 2!

Сообщений: 327
Зарегистрирован: 12. Ноября 2007
Re: Ускорить проведение документа
Ответ #16 - 15. Января 2011 :: 14:59
Печать  
А левый джоин с регистром не даст разве дублирующих записей, если убрать агрегацию? Но на всякий случай проверю, как на работе появлюсь  Подмигивание
  
Наверх
 
IP записан
 
Злой Бобр
Junior Member
**
Отсутствует



Сообщений: 56
Местоположение: Украина, Кривой Рог
Зарегистрирован: 07. Марта 2009
Пол: Мужской
Re: Ускорить проведение документа
Ответ #17 - 17. Января 2011 :: 16:26
Печать  
Собственно в ПУБ действительно дурновато написан модуль проведения. Руки б за такое повыдергивать горе писателям. Но что есть то есть.
Если по уму то я переписываю (иногда полностью) модуль проведения для того что б можно было налету перепроводить базу. Делаю так:
Код
Выбрать все
Процедура ОбработкаПроведения()
    Если Константа.НашеПроведение=0 Тогда
	  // стандартное проведение
    Иначе
	  // наше перепроведение
    КонецЕсли;
КонецПроцедуры 


В своем проведении практически все на прямых запросах, в т.ч. есть куски записи напрямую в таблицы базы. Все выверено и протестировано, поэтому неговорите что это не есть гут - сам знаю, но мне нужна скорость поэтому так и делаю.
На время перепроведения создаю таблицы с остатками по узким местам расчетов, т.е. например есть узкое место со списанием партий - остатки по партиям рассчитал всего один раз и записал в таблицу, дальше уже из нее беру данные (ускорение получается весьма значительное). Естественно перепровожу только тот период где уже нельзя создать документов, что б неушло все насмарку.
Самое важное следить за курсорами, особенно бывает кто-то другой что-то как напишет и оставит курсор, потом меня дергают.
В общем дело это интересное, но необходимо терпение и наличие определенного опыта. В итоге можно добиться весьма значительных результатов. Так что главное не падать духом.  Улыбка
  

Если у вас есть деньги тогда мы идем к вам!!!
Наверх
ICQ  
IP записан
 
Dmitry The Wing
God Member
*****
Отсутствует


1C++ rocks!

Сообщений: 839
Местоположение: Где-то в Сибири
Зарегистрирован: 18. Августа 2009
Пол: Мужской
Re: Ускорить проведение документа
Ответ #18 - 18. Января 2011 :: 01:57
Печать  
Злой Бобр писал(а) 17. Января 2011 :: 16:26:
Собственно в ПУБ действительно дурновато написан модуль проведения.
А можно конкретнее? А то уже не первый год работаю с ПУБ и особых проблем с типовым вариантом не замечал...

Злой Бобр писал(а) 17. Января 2011 :: 16:26:
Делаю так:
Код
Выбрать все
Процедура ОбработкаПроведения()
    Если Константа.НашеПроведение=0 Тогда
	  // стандартное проведение
    Иначе
	  // наше перепроведение
    КонецЕсли;
КонецПроцедуры 

А разве кто-то уже отменил параметр в процедуре ОбработкаПроведения и флаг-функцию ГрупповаяОбработка()?
  
Наверх
 
IP записан
 
Satans Claws
God Member
*****
Отсутствует


1C++ rocks!

Сообщений: 721
Зарегистрирован: 29. Ноября 2010
Re: Ускорить проведение документа
Ответ #19 - 21. Января 2011 :: 11:48
Печать  
Флаг-функция ГрупповаяОбработка() видит только перепроведение, вызванное через Операции -> Проведение документов...

А оно не всегда бывает удобным.
Плюс, программно перепроведение вызывается из тучи мест - и всюду дописывать передачу параметра, чтоб вызывать перепроведение в нужном режиме?


А вот обращение напрямую к константе - вопрос спорный и зависит от поставленной задачи.
Не стоит забывать, что обращение к константе всегда вызывает запрос в таблицу _1SConst, которая частенько бывает раздута за счет периодических значений.
Т.е. иногда имеет смысл создать глобальную переменную и при начале работы записывать туда значение константы.

Dmitry The Wing писал(а) 18. Января 2011 :: 01:57:
Злой Бобр писал(а) 17. Января 2011 :: 16:26:
Собственно в ПУБ действительно дурновато написан модуль проведения.
А можно конкретнее? А то уже не первый год работаю с ПУБ и особых проблем с типовым вариантом не замечал...

Да там каждый второй модуль проведения такой, что хоть вешайся.
Отчасти, это обусловлено тем, что первичный учет построен на регистрах; а по сформированным движениям пишутся проводки. Но только отчасти.
  
Наверх
 
IP записан
 
Satans Claws
God Member
*****
Отсутствует


1C++ rocks!

Сообщений: 721
Зарегистрирован: 29. Ноября 2010
Re: Ускорить проведение документа
Ответ #20 - 21. Января 2011 :: 11:56
Печать  
Злой Бобр писал(а) 17. Января 2011 :: 16:26:
В своем проведении практически все на прямых запросах, в т.ч. есть куски записи напрямую в таблицы базы. Все выверено и протестировано, поэтому неговорите что это не есть гут - сам знаю, но мне нужна скорость поэтому так и делаю.


Прямой Insert/Update таблиц 1Ски требуется крайне редко.
Обычно достаточно сбора данных прямым запросом.
Стандартный метод ДвижениеПриходВыполнить() делает махинации со скулем вполне нормально.
Много скорости на этом не выиграть.
Разве что, у тебя документы по 100+ тысяч строк, и движения ты пишешь одним офигенным прямым запросом.
  
Наверх
 
IP записан
 
Злой Бобр
Junior Member
**
Отсутствует



Сообщений: 56
Местоположение: Украина, Кривой Рог
Зарегистрирован: 07. Марта 2009
Пол: Мужской
Re: Ускорить проведение документа
Ответ #21 - 21. Января 2011 :: 13:47
Печать  
Согласен. Запись в таблицы документов идет. Специально немерял, но есть такое предположение что напрямую отрабатывать должно быстрей чем 1С методами. Хотя может и неправ, спорить небуду.
  

Если у вас есть деньги тогда мы идем к вам!!!
Наверх
ICQ  
IP записан
 
Dmitry The Wing
God Member
*****
Отсутствует


1C++ rocks!

Сообщений: 839
Местоположение: Где-то в Сибири
Зарегистрирован: 18. Августа 2009
Пол: Мужской
Re: Ускорить проведение документа
Ответ #22 - 24. Января 2011 :: 01:53
Печать  
Satans Claws писал(а) 21. Января 2011 :: 11:48:
Флаг-функция ГрупповаяОбработка() видит только перепроведение, вызванное через Операции -> Проведение документов...

А оно не всегда бывает удобным.
Плюс, программно перепроведение вызывается из тучи мест - и всюду дописывать передачу параметра, чтоб вызывать перепроведение в нужном режиме?
Ключевое слово "программно", т.е. описано руками прогера, а значит, - процесс написания кода им контроллировался, включая передачу параметра... А если он сразу не подумал, то это не является причиной не использовать сей метод...

Satans Claws писал(а) 21. Января 2011 :: 11:48:
Dmitry The Wing писал(а) 18. Января 2011 :: 01:57:
Злой Бобр писал(а) 17. Января 2011 :: 16:26:
Собственно в ПУБ действительно дурновато написан модуль проведения.
А можно конкретнее? А то уже не первый год работаю с ПУБ и особых проблем с типовым вариантом не замечал...

Да там каждый второй модуль проведения такой, что хоть вешайся.
Отчасти, это обусловлено тем, что первичный учет построен на регистрах; а по сформированным движениям пишутся проводки. Но только отчасти.

Все обработки проведения в ПУБ, что приходилось дорабатывать (а это все используемые документы, т.к. практически во всех регистрах изменен набор измерений), делают и делали до меня пересчет регистров только раз, как и все записи... разве что проводки, но они обычно делаются вызовом одной глобальной процедуры в конце проведения.
Потому и прошу пример, т.к. для меня ваши утверждения являются большим сюрпризом ... может дело в предыдущих наработках других прогеров? Такие перлы изменять приходилось, но не в типовой, а в той ПУБ, которая уже более 5 лет перестала быть типовой...
  
Наверх
 
IP записан
 
Satans Claws
God Member
*****
Отсутствует


1C++ rocks!

Сообщений: 721
Зарегистрирован: 29. Ноября 2010
Re: Ускорить проведение документа
Ответ #23 - 24. Января 2011 :: 05:46
Печать  
Да начиная с незабываемого
Код
Выбрать все
ЧтоСписывать = "000000100"; 

Улыбка

Ну и на примере документа Поступление из переработки:
например, такая строка:
Код
Выбрать все
СпособСписания = глСпособСписания(ВидМПЗ.Идентификатор(), ДатаДок);
Если (СпособСписания = 9) Тогда
	СтатусВозврата(0);
КонецЕсли; 



Это делается в цикле по строкам.
При этом, чуть выше (в этом же цикле) стоит куча проверок (заполненность реквизитов ТЧ документа) - и эта куча проверок завершается вполне логичным
Код
Выбрать все
Если ЕстьОшибкиЗаполнения = 1 Тогда
	Продолжить;
КонецЕсли; 

- чтоб просто показать ошибки по строкам, не гоняя тяжелые алгоритмы. (Хотя, на вскидку, мне помнится даже вариант с проверкой СтатусВозврата() = 0, вместо ЕстьОшибкиЗаполнения)

Хотя их вариант "ЕстьОшибкиЗаполнения" УЖЕ спорное решение. Мое мнение: уж лучше сделать лишний (отдельный) проход по строкам документа, в котором проверять заполненность (ну, может подготавливать какие дополнительные данные - какую-то ТЗ набить...).
Ибо такая простая вещь, как "автовод новой строки" в руках неопытного пользователя оборачивается документами с пустой последней строкой - и в стандартном ПУБе это означает, что мы по полной прогнали проведение, чтоб потом сказать "Ахтунг! строка незаполнена!!!!!".
И то, что по дефолту автоввод новой строки в ПУБе, может быть, и не включен - не отменяет порочности подхода.
  
Наверх
 
IP записан
 
Dmitry The Wing
God Member
*****
Отсутствует


1C++ rocks!

Сообщений: 839
Местоположение: Где-то в Сибири
Зарегистрирован: 18. Августа 2009
Пол: Мужской
Re: Ускорить проведение документа
Ответ #24 - 24. Января 2011 :: 06:19
Печать  
Satans Claws писал(а) 24. Января 2011 :: 05:46:
Да начиная с незабываемого
Код
Выбрать все
ЧтоСписывать = "000000100"; 

Улыбка

Это то как раз ускоряет расчет регистров... Точнее то, как это потом используется.

Satans Claws писал(а) 24. Января 2011 :: 05:46:
Ну и на примере документа Поступление из переработки:

Посмотрел. Документ, действительно, интересный ... но у меня не используется ... видимо, потому и не напоролся ...

А проверка строк везде делается в момент проведения. Лучше варианта как бы и придумать сложно, потому как при успешном проведении это экономит уйму времени, а считать исключения правилом - глупо, ибо это означает ошибку в организации производства, а не в локике проги...

От себя добавлял подобные проверки в обработке записи, когда точно известно, что строки не могут быть неправильными, и ошибка объясняется только невнимательностью оператора... Но проверку остатков туда никак не засунешь...
  
Наверх
 
IP записан
 
Satans Claws
God Member
*****
Отсутствует


1C++ rocks!

Сообщений: 721
Зарегистрирован: 29. Ноября 2010
Re: Ускорить проведение документа
Ответ #25 - 24. Января 2011 :: 06:45
Печать  
Dmitry The Wing писал(а) 24. Января 2011 :: 06:19:
Satans Claws писал(а) 24. Января 2011 :: 05:46:
Да начиная с незабываемого
Код
Выбрать все
ЧтоСписывать = "000000100"; 

Улыбка

Это то как раз ускоряет расчет регистров... Точнее то, как это потом используется.

Ну, здесь косяк не в быстродействии, а в качестве кода.
Ибо каждый раз, когда я это вижу я, а) начинаю считать номера позиций; б) начинаю смотреть в глобале, а за что же отвечает каждая позиция.
Можно придумать несколько других схем передачи этого хитрого параметра, чтоб его можно было точно так же собирать в документе и парсить в глобале (например, банально через СписокЗначений.Установить("<ИмяРегистра>", 1)).

Цитата:
А проверка строк везде делается в момент проведения. Лучше варианта как бы и придумать сложно, потому как при успешном проведении это экономит уйму времени, а считать исключения правилом - глупо, ибо это означает ошибку в организации производства, а не в локике проги...

От себя добавлял подобные проверки в обработке записи, когда точно известно, что строки не могут быть неправильными, и ошибка объясняется только невнимательностью оператора... Но проверку остатков туда никак не засунешь...

Ну, по хорошему, да - проверка заполнения реквизитов делается при записи.
А при проведении делается проверка остатков + подготовка таблицы партий для ФИФО (ЛИФО).
Но в ПУБе это все нах#рачено в модуль проведения.

А, вот еще вспомнил - далеко не всегда проводки создаются в единственном месте (как завершение ОбработкиПроведения()).
Например, глРасчетыПриПоступлении() сама формирует проводки
  
Наверх
 
IP записан
 
Dmitry The Wing
God Member
*****
Отсутствует


1C++ rocks!

Сообщений: 839
Местоположение: Где-то в Сибири
Зарегистрирован: 18. Августа 2009
Пол: Мужской
Re: Ускорить проведение документа
Ответ #26 - 24. Января 2011 :: 07:58
Печать  
Satans Claws писал(а) 24. Января 2011 :: 06:45:
А, вот еще вспомнил - далеко не всегда проводки создаются в единственном месте (как завершение ОбработкиПроведения()).
Например, глРасчетыПриПоступлении() сама формирует проводки

Которая сама выполняется в завершении обработки проведения Подмигивание
  
Наверх
 
IP записан
 
Neo
Senior Member
****
Отсутствует


I Love YaBB 2!

Сообщений: 327
Зарегистрирован: 12. Ноября 2007
Re: Ускорить проведение документа
Ответ #27 - 08. Февраля 2011 :: 10:29
Печать  
Написал получение остатков в модуле проведения расходной накладной прямым запросом. Если проведение идет задним числом, получается в разы быстрее. Но если проведение идет текущим временем (на ТА), то прямой запрос стабильно медленнее. Замеряю с помощью функции _GetPerformanceCounter(), при штатном расчете остатков (ОстаткиПолучить()) документ на 8 строк проводится где-то за 140-150 мс, при прямом запросе - за 160-180мс.

Вот текст прямого запроса. Там мне надо получить остатки, стоимость и резервы на складе, плюс общий остаток, путь и резервы по каждой позиции. Как еще можно оптимизировать?

-------------------------------------------------------------------------------

ИТЗ=СоздатьОбъект("ИндексированнаяТаблица");
     
     Recordset.УстановитьТекстовыйПараметр("ТекДок",ТекущийДокумент());
     щийДокумент(),0));
     Recordset.УстановитьТекстовыйПараметр("перУслуга",перУслуга);
Recordset.УстановитьТекстовыйПараметр("Склад",Склад);
     
     Если ИтогиАктуальны()=1 Тогда
           ДатаРасч="";
     Иначе
           ДатаРасч=":ТекПоз~";
     КонецЕсли;
     
     Соед="
     |INNER JOIN $ДокументСтроки.РасходнаяНакладная as Д ON Д.IDDOC=:ТекДок AND Товар=$Д.Товар
     |";
     
     ДопСоединения="";
     ДопПоля="";
     
     Если ДокументОснование.Вид()="Счет" Тогда
           Recordset.УстановитьТекстовыйПараметр("ДокОсн",ДокументОснование);
           Recordset.УстановитьТекстовыйПараметр("ДокОснСклад",ДокументОснование.Склад);
           ДопСоединения=ДопСоединения+"
           |LEFT JOIN
           |$РегистрОстатки.РезервыТоваров("+ДатаРасч+","+Соед+",Товар=$Д.Товар AND Склад=:ДокОснСклад AND Счет=:ДокОсн~,(Товар),(Количество)) as РегРез ON $Док.Товар=РегРез.Товар";
           ДопПоля=ДопПоля+",
           |РегРез.КоличествоОстаток AS РезКол";
     КонецЕсли;
     
     //Общие остатки
     ДопСоединения=ДопСоединения+"
     |LEFT JOIN
     личество)) as Рег1 ON $Док.Товар=Рег1.Товар";
     ДопПоля=ДопПоля+",
     |Рег1.КоличествоОстаток AS ОбщКол";

     //Общий путь
     ДопСоединения=ДопСоединения+"
     |LEFT JOIN
     оличество)) as РегП ON $Док.Товар=РегП.Товар";
     ДопПоля=ДопПоля+",
     |РегП.КоличествоОстаток AS ОбщПуть";

     //Общие резервы
     ДопСоединения=ДопСоединения+"
     |LEFT JOIN
     личество)) as РегРез1 ON $Док.Товар=РегРез1.Товар";
     ДопПоля=ДопПоля+",
     |РегРез1.КоличествоОстаток AS ОбщРезКол";
     
***

     ТекстЗапроса="
     |SELECT
     |$Док.Товар as [Товар $Справочник.Товары],
     |$Док.Количество as [Кол],
     |Рег.КоличествоОстаток as [Ост],
     |РегПарт.КоличествоОстаток AS СебестКол,
     |РегПарт.СуммаУпрОстаток AS СебестУпр,
     |РегПарт.СуммаРубОстаток AS СебестРуб"
     +ДопПоля+"
     |FROM
     |$ДокументСтроки.РасходнаяНакладная as Док
     |LEFT JOIN
     |$Справочник.Товары as СпрТов ON $Док.Товар=СпрТов.ID
     |LEFT JOIN
     |$РегистрОстатки.ОстаткиТоваров("+ДатаРасч+","+Соед+",Товар=$Д.Товар AND Склад=:Склад,(Товар),(Количество)) as Рег ON $Док.Товар=Рег.Товар
     |LEFT JOIN
     ичество,СуммаУпр,СуммаРуб)) as РегПарт ON $Док.Товар=РегПарт.Товар"
     +ДопСоединения+"
     |WHERE
     |Док.IDDOC=:ТекДок AND $СпрТов.ВидТовара<>:перУслуга
     |";
     
     RecordSet.ВыполнитьИнструкцию(ТекстЗапроса, ИТЗ);
     
     Если КонстРазрОтрицОст=Перечисление.Булево.Нет Тогда
           ИТЗ.ВыбратьСтроки();
           Пока ИТЗ.ПолучитьСтроку()=1 Цикл
                 Если ИТЗ.Кол>ИТЗ.Ост Тогда
                       Сообщить("На складе нет товара "+ИТЗ.Товар+". Не смог провести!");
                       СтатусВозврата(0);
                       Возврат;
                 КонецЕсли;
           КонецЦикла;
     КонецЕсли;
     
     ИТЗ.ДобавитьИндекс("ИндТовар","Товар",0);

     ВыбратьСтроки();
     Пока ПолучитьСтроку()=1 Цикл
           Если ИТЗ.НайтиСтроку("ИндТовар",Товар,0,1)>0 Тогда
                 
           КонецЕсли;
     КонецЦикла;
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Ускорить проведение документа
Ответ #28 - 08. Февраля 2011 :: 10:57
Печать  
Как-то получать остатки для каждой строки вообще не комильфо.
Проще 1 запрос к остаткам по списку номенклатуры из табличной части и привет.
И без кучи соединений.
  
Наверх
 
IP записан
 
Neo
Senior Member
****
Отсутствует


I Love YaBB 2!

Сообщений: 327
Зарегистрирован: 12. Ноября 2007
Re: Ускорить проведение документа
Ответ #29 - 08. Февраля 2011 :: 11:21
Печать  
Имеешь в виду, что лучше не получать табличную часть запросом и потом джойнить регистры, а сразу запрос к регистру по списку товаров табличной части? Так будет быстрее?
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Ускорить проведение документа
Ответ #30 - 08. Февраля 2011 :: 11:25
Печать  
Тип того.

  
Наверх
 
IP записан
 
Neo
Senior Member
****
Отсутствует


I Love YaBB 2!

Сообщений: 327
Зарегистрирован: 12. Ноября 2007
Re: Ускорить проведение документа
Ответ #31 - 08. Февраля 2011 :: 11:32
Печать  
Просто в учебнике по 1СРР именно такая методика приведена (да и 1СV8 тоже вроде), вот и взял ее за основу. Интересно услышать, кто еще как у себя реализовывал на практике, и насколько но получается быстрее или медленнее в итоге...
  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Ускорить проведение документа
Ответ #32 - 08. Февраля 2011 :: 11:54
Печать  
Neo писал(а) 08. Февраля 2011 :: 11:32:
Просто в учебнике по 1СРР именно такая методика приведена (да и 1СV8 тоже вроде), вот и взял ее за основу. Интересно услышать, кто еще как у себя реализовывал на практике, и насколько но получается быстрее или медленнее в итоге...

конечно списком быстрее будет и чем больше строк в табличной части  тем
больше будет разница
скорость выполнения запроса на 100 товаров и на один будет одинаковой
а запросов будет один вместо ста.
Ну и еще если повторяюся одинаковые товары
то табличнуб часть надо свернуть чтобы правильно рассчитывались минусы по остаткам
  
Наверх
 
IP записан
 
trad
1c++ power user
1c++ donor
1c++ moderator
Отсутствует



Сообщений: 3051
Местоположение: Киров
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: Ускорить проведение документа
Ответ #33 - 08. Февраля 2011 :: 11:56
Печать  
и еще полезно включить:
RecordSet.ОбратныйРасчетОтТА(1)
  

1&&2&&3
Наверх
 
IP записан
 
Neo
Senior Member
****
Отсутствует


I Love YaBB 2!

Сообщений: 327
Зарегистрирован: 12. Ноября 2007
Re: Ускорить проведение документа
Ответ #34 - 08. Февраля 2011 :: 12:11
Печать  
Цитата:
скорость выполнения запроса на 100 товаров и на один будет одинаковой
а запросов будет один вместо ста.


Ладно, поэкспериментирую на досуге. Хотя мне все равно не ясно, в чем принципиальная разница. Имхо, SQL Server достаточно умен, чтобы правильно разобраться в таких ситуациях. Например, есть у нас табличка из 10 записей, и мы делаем левый джоин к другой большой таблице. Либо мы сразу делаем запрос к 2-й таблице с условием вхождения в список по первой табличке. По-моему, для скуля большой разницы не будет. Хотя может и ошибаюсь...
  
Наверх
 
IP записан
 
Neo
Senior Member
****
Отсутствует


I Love YaBB 2!

Сообщений: 327
Зарегистрирован: 12. Ноября 2007
Re: Ускорить проведение документа
Ответ #35 - 08. Февраля 2011 :: 12:15
Печать  
Цитата:
и еще полезно включить:
RecordSet.ОбратныйРасчетОтТА(1)


При получении остатков на ТА наверное это не актуально. В моем случае расходная проводится в 99% процентов случаев после ТА.
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Ускорить проведение документа
Ответ #36 - 08. Февраля 2011 :: 12:16
Печать  
Neo писал(а) 08. Февраля 2011 :: 12:11:
Цитата:
скорость выполнения запроса на 100 товаров и на один будет одинаковой
а запросов будет один вместо ста.


Ладно, поэкспериментирую на досуге. Хотя мне все равно не ясно, в чем принципиальная разница. Имхо, SQL Server достаточно умен, чтобы правильно разобраться в таких ситуациях. Например, есть у нас табличка из 10 записей, и мы делаем левый джоин к другой большой таблице. Либо мы сразу делаем запрос к 2-й таблице с условием вхождения в список по первой табличке. По-моему, для скуля большой разницы не будет. Хотя может и ошибаюсь...


смотри план выполнения запроса.
Он всё покажет.
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Ускорить проведение документа
Ответ #37 - 08. Февраля 2011 :: 12:18
Печать  
+ у тебя лишнее условие в виртуальной табличке на товар.. ибо ты унутри ВТ и так присоединяешь строки документа по иннеру + on товар в ВТ = товар в тч дока.
  
Наверх
 
IP записан
 
trad
1c++ power user
1c++ donor
1c++ moderator
Отсутствует



Сообщений: 3051
Местоположение: Киров
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: Ускорить проведение документа
Ответ #38 - 08. Февраля 2011 :: 12:23
Печать  
Neo писал(а) 08. Февраля 2011 :: 12:15:
Цитата:
и еще полезно включить:
RecordSet.ОбратныйРасчетОтТА(1)


При получении остатков на ТА наверное это не актуально. В моем случае расходная проводится в 99% процентов случаев после ТА.

Это актуально как раз при получении остатков на ТА.
Уж поверь мне. Не веришь - проверь: посмотри отладку запроса, в частности как разворачивается ВТ "РегистрОстатки" при вкл. и при выкл. режиме обратного рассчета.

сори. соврал.
этот режим имеет смысл для позиций близких к ТА, но не после ТА
  

1&&2&&3
Наверх
 
IP записан
 
Neo
Senior Member
****
Отсутствует


I Love YaBB 2!

Сообщений: 327
Зарегистрирован: 12. Ноября 2007
Re: Ускорить проведение документа
Ответ #39 - 09. Февраля 2011 :: 08:33
Печать  
Как лучше объединять данные из нескольких регистров: джоинами или юнионами?
  
Наверх
 
IP записан
 
Dmitry The Wing
God Member
*****
Отсутствует


1C++ rocks!

Сообщений: 839
Местоположение: Где-то в Сибири
Зарегистрирован: 18. Августа 2009
Пол: Мужской
Re: Ускорить проведение документа
Ответ #40 - 09. Февраля 2011 :: 08:45
Печать  
Neo писал(а) 09. Февраля 2011 :: 08:33:
Как лучше объединять данные из нескольких регистров: джоинами или юнионами?

Все зависит от задачи и исходных данных. Джойнами можно случайно надублировать строки!
Также никто не запрещал подзапросы.
  
Наверх
 
IP записан
 
Neo
Senior Member
****
Отсутствует


I Love YaBB 2!

Сообщений: 327
Зарегистрирован: 12. Ноября 2007
Re: Ускорить проведение документа
Ответ #41 - 09. Февраля 2011 :: 08:51
Печать  
Задача все та же, получение остатков в модуле проведения. Роль играют даже доли секунды, хочется по максимум ускорить.

Например, получаю я остатки из регистра ОстаткиТоваров по списку товаров из ТЧ. Но надо еще получить стоимость. Что будет лучше: приджойнить по полю товар или опять же сделать запрос по списку товаров из ТЧ и объединить юнионом?
  
Наверх
 
IP записан
 
Злой Бобр
Junior Member
**
Отсутствует



Сообщений: 56
Местоположение: Украина, Кривой Рог
Зарегистрирован: 07. Марта 2009
Пол: Мужской
Re: Ускорить проведение документа
Ответ #42 - 09. Февраля 2011 :: 09:10
Печать  
Neo писал(а) 09. Февраля 2011 :: 08:33:
Как лучше объединять данные из нескольких регистров: джоинами или юнионами?

На самом деле смотря что за запрос. Иногда джойнить быстрее, а иногда джойны просто вешают систему поэтому лучше юнион делать. Поэтому ответ в самом вопросе - джоинами или юнионами.
  

Если у вас есть деньги тогда мы идем к вам!!!
Наверх
ICQ  
IP записан
 
Злой Бобр
Junior Member
**
Отсутствует



Сообщений: 56
Местоположение: Украина, Кривой Рог
Зарегистрирован: 07. Марта 2009
Пол: Мужской
Re: Ускорить проведение документа
Ответ #43 - 09. Февраля 2011 :: 09:12
Печать  
Neo писал(а) 09. Февраля 2011 :: 08:51:
Например, получаю я остатки из регистра ОстаткиТоваров по списку товаров из ТЧ. Но надо еще получить стоимость. Что будет лучше: приджойнить по полю товар или опять же сделать запрос по списку товаров из ТЧ и объединить юнионом?

Что-то мне подсказывает что быстрее джойн отработает. Сделай так и так и замерь скорость.
  

Если у вас есть деньги тогда мы идем к вам!!!
Наверх
ICQ  
IP записан
 
Neo
Senior Member
****
Отсутствует


I Love YaBB 2!

Сообщений: 327
Зарегистрирован: 12. Ноября 2007
Re: Ускорить проведение документа
Ответ #44 - 09. Февраля 2011 :: 10:49
Печать  
Попробовал переделать запрос из (27) на запрос с фильтром по списку из ТЧ. Получилось еще медленее. Причем с юнионом медленее гораздо, чем с джоином. Ниже привожу оба варианта запроса.
  
Наверх
 
IP записан
 
Neo
Senior Member
****
Отсутствует


I Love YaBB 2!

Сообщений: 327
Зарегистрирован: 12. Ноября 2007
Re: Ускорить проведение документа
Ответ #45 - 09. Февраля 2011 :: 10:51
Печать  
Вариант с джоинами:


ИТЗ=СоздатьОбъект("ИндексированнаяТаблица");
           щийДокумент(),0));
     Recordset.УстановитьТекстовыйПараметр("перУслуга",перУслуга);
     Recordset.УстановитьТекстовыйПараметр("Склад",Склад);
     Recordset.УложитьСписокОбъектов(СписокТоваров,"#СписокТоваров","Товары");
     
     Если ИтогиАктуальны()=1 Тогда
           ДатаРасч="";
     Иначе
           ДатаРасч=":ТекПоз~";
     КонецЕсли;
     
     ФильтрПоТовару="Товар IN (SELECT Val FROM #СписокТоваров)";
     
     ДопСоединения="";
     ДопПоля="";
     
     Если ДокументОснование.Вид()="Счет" Тогда
           Recordset.УстановитьТекстовыйПараметр("ДокОсн",ДокументОснование);
           Recordset.УстановитьТекстовыйПараметр("ДокОснСклад",ДокументОснование.Склад);
           ДопСоединения=ДопСоединения+"
           |LEFT JOIN
           |$РегистрОстатки.РезервыТоваров("+ДатаРасч+",,"+ФильтрПоТовару+" AND Склад=:ДокОснСклад AND Счет=:ДокОсн~,(Товар),(Количество)) as РегРез ON Рег.Товар=РегРез.Товар";
           ДопПоля=ДопПоля+",
           |РегРез.КоличествоОстаток AS РезКол";
     КонецЕсли;
     
     Если фАктуальность=1 Тогда
           //Общие остатки
           ДопСоединения=ДопСоединения+"
           |LEFT JOIN
           ство)) as Рег1 ON Рег.Товар=Рег1.Товар";
           ДопПоля=ДопПоля+",
           |Рег1.КоличествоОстаток AS ОбщКол";
           //Общий путь
           ДопСоединения=ДопСоединения+"
           |LEFT JOIN
           ество)) as РегП ON Рег.Товар=РегП.Товар";
           ДопПоля=ДопПоля+",
           |РегП.КоличествоОстаток AS ОбщПуть";
           //Общие резервы
           ДопСоединения=ДопСоединения+"
           |LEFT JOIN
           ство)) as РегРез1 ON Рег.Товар=РегРез1.Товар";
           ДопПоля=ДопПоля+",
           |РегРез1.КоличествоОстаток AS ОбщРезКол";
     КонецЕсли;
     
*** *** ***

     ТекстЗапроса="
     |SELECT
     |Рег.Товар as [Товар $Справочник.Товары],
     |Рег.КоличествоОстаток as [Ост],
     |РегПарт.КоличествоОстаток AS СебестКол,
     |РегПарт.СуммаУпрОстаток AS СебестУпр,
     |РегПарт.СуммаРубОстаток AS СебестРуб"
     +ДопПоля+"
     |FROM
     |$РегистрОстатки.ОстаткиТоваров("+ДатаРасч+",,"+ФильтрПоТовару+" AND Склад=:Склад,(Товар),(Количество)) as Рег
     |LEFT JOIN
     тво,СуммаУпр,СуммаРуб)) as РегПарт ON Рег.Товар=РегПарт.Товар
     |LEFT JOIN
     |$Справочник.Товары as СпрТов ON Рег.Товар=СпрТов.ID"
     +ДопСоединения+"
     |WHERE
     |$СпрТов.ВидТовара<>:перУслуга
     |";
     
     RecordSet.ВыполнитьИнструкцию(ТекстЗапроса, ИТЗ);
  
Наверх
 
IP записан
 
Neo
Senior Member
****
Отсутствует


I Love YaBB 2!

Сообщений: 327
Зарегистрирован: 12. Ноября 2007
Re: Ускорить проведение документа
Ответ #46 - 09. Февраля 2011 :: 10:53
Печать  
Вариант с юнионами:

ИТЗ=СоздатьОбъект("ИндексированнаяТаблица");
           щийДокумент(),0));
     Recordset.УстановитьТекстовыйПараметр("перУслуга",перУслуга);
Recordset.УстановитьТекстовыйПараметр("Склад",Склад);
     Recordset.УложитьСписокОбъектов(СписокТоваров,"#СписокТоваров","Товары");
     
     Если ИтогиАктуальны()=1 Тогда
           ДатаРасч="";
     Иначе
           ДатаРасч=":ТекПоз~";
     КонецЕсли;
     
     ФильтрПоТовару="Товар IN (SELECT Val FROM #СписокТоваров)";
     
     ДопСоединения="";
     ДопПоля="";
     
     Если ДокументОснование.Вид()="Счет" Тогда
           Recordset.УстановитьТекстовыйПараметр("ДокОсн",ДокументОснование);
           Recordset.УстановитьТекстовыйПараметр("ДокОснСклад",ДокументОснование.Склад);
           ДопСоединения=ДопСоединения+"
           |UNION ALL
           |SELECT
           |РегРез.Товар as [Товар],
           |0 as [Ост],
           |0 AS СебестКол,
           |0 AS СебестУпр,
           |0 AS СебестРуб,
           |0 AS ОбщКол,
           |0 ОбщПуть,
           |0 AS ОбщРезКол,
           |РегРез.КоличествоОстаток AS РезКол
           |FROM
           |$РегистрОстатки.РезервыТоваров("+ДатаРасч+",,"+ФильтрПоТовару+" AND Склад=:ДокОснСклад AND Счет=:ДокОсн~,(Товар),(Количество)) as РегРез";
           ДопПоля=ДопПоля+",
           |Sum(ВложЗапрос.РезКол) AS РезКол";
     КонецЕсли;
     
     ТекстЗапроса="
     |SELECT
     |ВложЗапрос.Товар as [Товар $Справочник.Товары],
     |Sum(ВложЗапрос.Ост) as [Ост],
     |Sum(ВложЗапрос.СебестКол) AS СебестКол,
     |Sum(ВложЗапрос.СебестУпр) AS СебестУпр,
     |Sum(ВложЗапрос.СебестРуб) AS СебестРуб,
     |Sum(ВложЗапрос.ОбщКол) AS ОбщКол,
     |Sum(ВложЗапрос.ОбщПуть) AS ОбщПуть,
     |Sum(ВложЗапрос.ОбщРезКол) AS ОбщРезКол"
     +ДопПоля+"
     |FROM
     |
     |(SELECT
     |Рег.Товар as [Товар],
     |Рег.КоличествоОстаток as [Ост],
     |0 AS СебестКол,
     |0 AS СебестУпр,
     |0 AS СебестРуб,
     |0 as ОбщКол,
     |0 as ОбщПуть,
     |0 as ОбщРезКол,
     |0 as РезКол
     |FROM
     |$РегистрОстатки.ОстаткиТоваров("+ДатаРасч+",,"+ФильтрПоТовару+" AND Склад=:Склад,(Товар),(Количество)) as Рег
     |UNION ALL
     |SELECT
     |РегПарт.Товар as [Товар],
     |0 as [Ост],
     |РегПарт.КоличествоОстаток AS СебестКол,
     |РегПарт.СуммаУпрОстаток AS СебестУпр,
     |РегПарт.СуммаРубОстаток AS СебестРуб,
     |0 as ОбщКол,
     |0 as ОбщПуть,
     |0 as ОбщРезКол,
     |0 as РезКол
     |FROM
     тво,СуммаУпр,СуммаРуб)) as РегПарт
     |UNION ALL
     |SELECT
     |Рег1.Товар as [Товар],
     |0 as [Ост],
     |0 AS СебестКол,
     |0 AS СебестУпр,
     |0 AS СебестРуб,
     |Рег1.КоличествоОстаток AS ОбщКол,
     |0 as ОбщПуть,
     |0 as ОбщРезКол,
     |0 as РезКол
     |FROM
     ство)) as Рег1
     |UNION ALL
     |SELECT
     |РегП.Товар as [Товар],
     |0 as [Ост],
     |0 AS СебестКол,
     |0 AS СебестУпр,
     |0 AS СебестРуб,
     |0 AS ОбщКол,
     |РегП.КоличествоОстаток AS ОбщПуть,
     |0 as ОбщРезКол,
     |0 as РезКол
     |FROM
     ество)) as РегП
     |UNION ALL
     |SELECT
     |РегРез1.Товар as [Товар],
     |0 as [Ост],
     |0 AS СебестКол,
     |0 AS СебестУпр,
     |0 AS СебестРуб,
     |0 AS ОбщКол,
     |0 ОбщПуть,
     |РегРез1.КоличествоОстаток AS ОбщРезКол,
     |0 as РезКол
     |FROM
     ство)) as РегРез1"
     +ДопСоединения+"
     |) as ВложЗапрос
     |GROUP BY
     |ВложЗапрос.Товар
     |";
     
     RecordSet.ВыполнитьИнструкцию(ТекстЗапроса, ИТЗ);
  
Наверх
 
IP записан
 
Satans Claws
God Member
*****
Отсутствует


1C++ rocks!

Сообщений: 721
Зарегистрирован: 29. Ноября 2010
Re: Ускорить проведение документа
Ответ #47 - 09. Февраля 2011 :: 12:03
Печать  
По Джойнам:

1) убери ФильтрПоТоварам из каждого запроса по регистрам, которые цепляешь через Left Join.
Скуль сам разберется, как ему оптимизировать эти (ведомые) выборки, глядя на результат ведущей выборки.

2) Попробуй вместо
ФильтрПоТовару="Товар IN (SELECT Val FROM #СписокТоваров)";
сделать так:
ФильтрПоТовару="Товар IN (SELECT $ДокТЧ.Товар From $ДокументСтроки.Реализация ДокТЧ (Nolock) Where IDDoc = :идТекДок)";
где идТекДок - это, есно, ссылка на проводимый документ (ну и вид дока скорректируй, при необходимости)



Юнионы же мне принципиально нравятся меньше, ибо если какого-то товара на рег.ОстаткиТоваров нет вообще - то с джойном у оптимизатора есть шансы это узреть и скорректировать фильтр для ведомых таблиц джойнов.
  
Наверх
 
IP записан
 
Neo
Senior Member
****
Отсутствует


I Love YaBB 2!

Сообщений: 327
Зарегистрирован: 12. Ноября 2007
Re: Ускорить проведение документа
Ответ #48 - 09. Февраля 2011 :: 12:47
Печать  
И то, и другое негативным образом повлияло на скорость. В особенности, когда убрал условие на товар из ВТ, раза в 1,5-2 замедлилось...
  
Наверх
 
IP записан
 
Neo
Senior Member
****
Отсутствует


I Love YaBB 2!

Сообщений: 327
Зарегистрирован: 12. Ноября 2007
Re: Ускорить проведение документа
Ответ #49 - 09. Февраля 2011 :: 12:53
Печать  
Вообще, по моим наблюдениям, когда встречаются по сути дублирующие условия внутри ВТ и вовне (например, при JOIN ON), то это не снижает скорость. А если убрать условие из ВТ, то замедление наблюдается...
  
Наверх
 
IP записан
 
Satans Claws
God Member
*****
Отсутствует


1C++ rocks!

Сообщений: 721
Зарегистрирован: 29. Ноября 2010
Re: Ускорить проведение документа
Ответ #50 - 09. Февраля 2011 :: 12:57
Печать  
Ок
Оставляем условие "Товар IN (SELECT Val FROM #СписокТоваров)", но делаем его таким образом;

"select
$ДокТЧ.Товар Val
Into [#СписокТоваров]
from
$ДокументСтроки.Реализация ДокТЧ (nolock)
Left Join $Справочник.Товары Товары (nolock) on Товары.ID = $ДокТЧ.Товар
Where
ДокТЧ.ID = :идЭтотДок
And Товары.ВидТовара != :ВидУслуга
"

а в конце не забываем сделать
"Drop Table [#СписокТоваров]".
(а в идеале - вместо имени таблицы "СписокТоваров" используем, например, GUID)

Соттветственно, никаких УложитьСписокОбъектов() не нужно.
  
Наверх
 
IP записан
 
Neo
Senior Member
****
Отсутствует


I Love YaBB 2!

Сообщений: 327
Зарегистрирован: 12. Ноября 2007
Re: Ускорить проведение документа
Ответ #51 - 10. Февраля 2011 :: 10:29
Печать  
Ну, чем в (45) стало побыстрее, но все равно медленнее гораздо, чем штатное получение остатков с помощью ОстаткиПолучить()...
  
Наверх
 
IP записан
 
Neo
Senior Member
****
Отсутствует


I Love YaBB 2!

Сообщений: 327
Зарегистрирован: 12. Ноября 2007
Re: Ускорить проведение документа
Ответ #52 - 10. Февраля 2011 :: 10:38
Печать  
Вообщем из всех вариантов, которые я перепробовал, получается, что по скорости:

- Самый быстрый - это штатное получение остатков с помощью ОстаткиПолучить().
- далее идет вариант из (27).
- вариант с джоинами с учетом (50).
- вариант с джоинами.
- вариант с юнионами.

Первый вариант процентов на 30 выше второго и значительно выше остальных.
  
Наверх
 
IP записан
 
Anatol
Senior Member
****
Отсутствует


тыц, пыц, тыц!!!

Сообщений: 412
Зарегистрирован: 24. Апреля 2009
Re: Ускорить проведение документа
Ответ #53 - 11. Февраля 2011 :: 09:56
Печать  
Neo писал(а) 10. Февраля 2011 :: 10:38:
Вообщем из всех вариантов, которые я перепробовал, получается, что по скорости:

- Самый быстрый - это штатное получение остатков с помощью ОстаткиПолучить().
- далее идет вариант из (27).
- вариант с джоинами с учетом (50).
- вариант с джоинами.
- вариант с юнионами.

Первый вариант процентов на 30 выше второго и значительно выше остальных.


1 а ты считаешь время вместе с расчетом регистра?
2 что ты вообше хочешь получить? причем здесь партии, товары в пути и прочее...
3 не проще поститать все отдельно, а потом слить в одну таблицу или следать на подзапросах?
  
Наверх
wwwICQ  
IP записан
 
Neo
Senior Member
****
Отсутствует


I Love YaBB 2!

Сообщений: 327
Зарегистрирован: 12. Ноября 2007
Re: Ускорить проведение документа
Ответ #54 - 11. Февраля 2011 :: 10:15
Печать  
Цитата:
1 а ты считаешь время вместе с расчетом регистра?
2 что ты вообше хочешь получить? причем здесь партии, товары в пути и прочее...


Считаю я очень просто. Беру модуль проведения, замеряю, за сколько он в среднем проводится. Комментирую все штатные расчеты остатков. Вместо них вставляю те запросы, что выше приводил. Еще раз замеряю и сравниваю, что быстрее.
  
Наверх
 
IP записан
 
Satans Claws
God Member
*****
Отсутствует


1C++ rocks!

Сообщений: 721
Зарегистрирован: 29. Ноября 2010
Re: Ускорить проведение документа
Ответ #55 - 11. Февраля 2011 :: 11:47
Печать  
А можешь целиком кинуть модуль проведения документа? (лучше в видет аттача текстового файла)?
  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: [1] 
ОтправитьПечать