Ускоряем списание партий УПП 1.2 / 1.3 / УТ 10.3

Публикация № 191732

Администрирование - Производительность и оптимизация (HighLoad)

115
Не секрет, что многие пользователи, использующие партионный учет (а таких очень много, даже среди огромных холдингов, несмотря на пропаганду РАУЗ) при больших нагрузках сталкиваются с резким замедлением списания партий.  

Чего только не придумывалось, чтобы как то решить эту проблему – это и отсроченное списание партий ночью и сверхчастое обновление статистики SQL, но почему-то среди общих рекомендаций не встречается оптимизация именно типового кода УПП.

 

В типовой УПП механизм списания партий реализован очень давно. Его основная логика не менялась как минимум с релиза 1.2.16 по 1.3.26, т.е 4 года. Скорее всего за эти годы не раз сменялись внутренние стандарты разработки прикладных решений в самой 1с. На текущий момент не рекомендуется использовать в запросе соединение с подзапросом, но так как код был достаточно старый, то такое соединение использовалось до релиза 1.3.26. Ситуация наконец была исправлена в релизе  1.3.27, но как показала личная практика это решение не принесло значимой пользы при больших нагрузках.

 

Задолго до релиза 1.3.27 я столкнулся с тем, что на предприятии имеющем розничное подразделение с несколькими сотнями документов «Отчет о розничных продажах» в день со средним количеством строк порядка 100 уже невозможно было провести весь объем документов даже за окно доступное ночью (работа базы была почти круглосуточная, но ночью нагрузка значительно меньше). В среднем документ «Отчет о розничных продажах» проводился по 3-5 минут, если кто-то вдруг решил перепровести документ днем, то время проведения могло доходить до 30 минут, что конечно сильно тормозило других пользователей. Т.е. ситуация стала абсолютно невыносимой. Доступа к серверу SQL в той организации я не имел, поэтому у меня был один выход – попробовать оптимизировать типовой код.

 

Для поиска узкого места выгрузил копию базы в файловую (на тот момент она еще выгружалась, достаточно было очистить регистр сведений «Версии объектов»). Отладчиком был найден типовой код на котором висело по минуте – это были банальные строки Запрос.Выполнить().Выгрузить(ОбходРезультатаЗапроса.ПоГруппировкам) в процедурах ПолучитьДеревоПартийНаСкладахУпр, ПолучитьДеревоПартийНаСкладахБух, ПолучитьДеревоПартийНаСкладахНал общего модуля УправлениеЗапасамиПартионныйУчет.

 

Посмотрев текст запроса и грубо упростив его получаем:

 

ВЫБРАТЬ

            ПартииТоваровНаСкладах.Номенклатура

ИЗ

            РегистрСведений.СписанныеТовары КАК СписанныеТовары

                                   ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрНакопления.ПартииТоваровНаСкладах.Остатки(

                                   &Дата,

                                   Номенклатура В

                                       (ВЫБРАТЬ

                                           РегистрСведений.СписанныеТовары.Номенклатура

                                       ИЗ

                                           РегистрСведений.СписанныеТовары

                                       ГДЕ

                                           РегистрСведений.СписанныеТовары.Регистратор = &Ссылка)) КАК ПартииТоваровНаСкладах

                        ПО СписанныеТовары.Номенклатура = ПартииТоваровНаСкладах.Номенклатура

ГДЕ

            СписанныеТовары.Регистратор = &Ссылка

 

 

Что мне здесь не понравилось:

1) Из регистра сведений «Списанные товары» информация выбирается не один раз, а несколько

2) Получается что сначала идет соединение, а только потом отбор условием ГДЕ СписанныеТовары.Регистратор = &Ссылка.

 

Обе эти проблемы решаются элементарно – перед

Возврат Запрос.Выполнить().Выгрузить(ОбходРезультатаЗапроса.ПоГруппировкам);

В трех вышеуказнных функция вставляем код

   Запрос.Текст =
   
"ВЫБРАТЬ
    |    *
    |ПОМЕСТИТЬ СписанныеТовары
    |ИЗ
    |    РегистрСведений.СписанныеТовары
    |ГДЕ
    |    Регистратор В (&ОсновнойДокумент, &Ссылка)
    |ИНДЕКСИРОВАТЬ ПО Номенклатура;
    |
    |"
+ СтрЗаменить(Запрос.Текст, "РегистрСведений.СписанныеТовары", "СписанныеТовары");

Этот сверхпростой код принес колоссальный эффект – документы которые проводились по 3-5 мин стали проводиться по 20-40 секунд. Пробовал добавлять различные индексы кроме Номенклатуры и играться с условиями – где-то это давало дополнительный прирост местами даже в 2 раза.

 

Этот код ускоряет весь механизм списания партий. На других документах списывающих партии время проведения так же значительно снизилось.

 

Так же я пробовал эту модификацию на текущем месте работы – здесь не было особых проблем с проведением документов списывающих партии, тем не менее, код дал ускорение при восстановлении партионной последовательности при закрытии месяца. Особенно это было заметно в случае когда сервер 1с длительное время работал без перезагрузки. При переходе на релиз 1.3.27 раз уж был изменен типовой код в этом месте решил отказаться от своей доработки, но на следующий же день получил несколько звонков от сбыта, что реализации стали проводиться заметно дольше. Сейчас уже более полугода работаем на более мощном сервере, но повторять эксперимент уже нет желания.

 

Позже на просторах интернета был найден и другой способ – сверхчастое обновление статистики только по нужным регистрам.

 

Дополнено 25.06.2013 - Теперь исправление запроса корректно и для ордерной схемы. Код раскрашен разукрашкой - //catalog.mista.ru/public/19856/

115

Специальные предложения

Вознаграждение за ответ
Показать полностью
Комментарии
Избранное Подписка Сортировка: Древо
1. Антон Ширяев 472 21.06.13 17:06 Сейчас в теме
Если вам так же небезразлична скорость работы типовых конфигураций, просьба поддержать мой вопрос к Борису Нуралиеву №293 - http://forum.infostart.ru/forum24/topic88121/message931662/#message931662

Конечно вряд ли он будет отвечать на технические вопросы, но может быть хотя бы полученные вопросы будут переданы разработчикам для ознакомления.
2. Aletar 21.06.13 22:10 Сейчас в теме
Ага, знакомая тема, я у нас также сделал. С год назад я здесь на форуме задавал вопрос про эту оптимизацию - почему такую очевидную оптимизацию кода не сделают сами в 1С, кто-то сказал, что скорее всего этот запрос ещё с тех времен, когда не поддерживались пакетные запросы. Конечно ситуация все равно удручает. Вопрос к Нуралиеву поддержу.
3. kapustinag 22.06.13 19:59 Сейчас в теме
Нашли это место и исправили точно так же в нашей УПП (нашел не я) примерно год назад, получили тоже очень серьезное ускорение. Кроме ускорения, есть и еще эффект - так как медленное проведение блокировало некоторые действия других пользователей, то еще и количество и время блокировок снизились.
Я после этого написал в техподдержку (по-моему, на адрес v8@1c.ru), изложил в письме этот способ ускорения партионных запросов, но никакого нормального ответа не получил. И изменений в типовом коде тоже никаких не последовало.

Кстати, там есть еще один момент - если используется ордерная схема, то партии списываются не обязательно документом-регистратором. Они могут списываться расходными ордерами, связанными с данным документом. Это тоже можно учесть в запросе, особых проблем нет.
4. Антон Ширяев 472 23.06.13 10:39 Сейчас в теме
(3) kapustinag,
Как раз примерно год назад в мае 2012 на мисте в одной из тем про взаимоблокировке я предложил это попробовать.

Я не претендуя на то, что я был первооткрывателем, но тем не менее сам подобного готового решения до моего поста на мисте встречал.

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

Да, для ордерной схемы немного по-другому, я не использую ордерную схему для случая списания партий, поэтому не заострил на этом внимания.
В посте (6) исправленный вариант.
adhocprog; +1 Ответить
5. Re:аниматор 424 24.06.13 05:13 Сейчас в теме
Добавил этот код в УТ 10.3. Действительно быстрота проведения документов очевидная, НО только для документов РТУ (с текущего склада).
По ордерной схеме (Расходный ордер на товары) партии после такой доработки НЕ списываются! пришлось откатить изменения, но идея интересная

P.S. для полноты статьи не плохо бы отразить для ордерной схемы.
6. Антон Ширяев 472 24.06.13 10:45 Сейчас в теме
(5) Re:аниматор,
Проверил для ордерной схемы в УПП, думаю в УТ 10 то же самое - нужно из РС "Списанный товары" отбирать не только &ОсновнойДокумент, но и &Ссылка.

Запрос выглядит так:
Запрос.Текст =
"ВЫБРАТЬ
| *
|ПОМЕСТИТЬ СписанныеТовары
|ИЗ
| РегистрСведений.СписанныеТовары
|ГДЕ
| Регистратор В (&ОсновнойДокумент, &Ссылка)
|ИНДЕКСИРОВАТЬ ПО Номенклатура;
|
|" + СтрЗаменить(Запрос.Текст, "РегистрСведений.СписанныеТовары", "СписанныеТовары");

Прошу проверить тех кто использует ордерную схему. Если все в порядке, включу в статью + добавлю что работает не только в УПП, но и в УТ.
adhocprog; Re:аниматор; +2 Ответить
9. Re:аниматор 424 24.06.13 12:51 Сейчас в теме
(6) Работает, Спасибо!
P.S. делал на УТ 10.3
adhocprog; Антон Ширяев; +2 Ответить
13. fsv_kanash 1 25.06.13 23:41 Сейчас в теме
(9) Не нашел в УТ 10.3 процедур ПолучитьДеревоПартийНаСкладахБух, ПолучитьДеревоПартийНаСкладахНал
Процедуру ПолучитьДеревоПартийНаСкладахУпр нашел, код перед
Возврат Запрос.Выполнить().Выгрузить(ОбходРезультатаЗапроса.ПоГруппировкам);
добавил. После проведения РТУ -по регистру ПартииТоваровНаСкладах (упр) пропали все движения,после удаления кода и перепровделения документа, движения так и не появились ))(
14. Антон Ширяев 472 26.06.13 09:23 Сейчас в теме
(13) fsv_kanash,
Не нашел в УТ 10.3 процедур ПолучитьДеревоПартийНаСкладахБух, ПолучитьДеревоПартийНаСкладахНал
Процедуру ПолучитьДеревоПартийНаСкладахУпр нашел

Да, для УТ 10.3 требуется вносить дополнение только в процедуру ПолучитьДеревоПартийНаСкладахУпр. Статья писалась в первую очередь про УПП, про УТ добавлял позже и не учел этот момент.

После проведения РТУ -по регистру ПартииТоваровНаСкладах (упр) пропали все движения,после удаления кода и перепровделения документа, движения так и не появились ))(

Добавляемый код крайне мал и абсолютно прозрачен, чтобы суметь что-то изменить при его добавлении на совсем небольшое время. К тому же независимо аналогичную модификацию делали другие люди, поэтому ищите проблему в другом месте. Если движения пропадают не полностью, а только по регистру ПартииТоваровНаСкладах, то вероятнее всего используется отложенное списание партий.
16. Re:аниматор 424 26.06.13 15:46 Сейчас в теме
(14) в УТ нет отложенного списания партий. Хотя в своей конфе УТ я это сделал по принципу УПП, но после перехода на MS SQL 2008 64 бит эта потребность отпала и отключил.
7. Vladimir_Konyrev 223 24.06.13 11:54 Сейчас в теме
Добрый день.

Так все же, поможет ли описанный вами способ ускорить работу в последних релизах УПП (1.3.40)? Есть смысл вносить изменения в свою конфу?
8. Антон Ширяев 472 24.06.13 12:15 Сейчас в теме
(7) Vladimir_Konyrev,
Если у вас есть явные проблемы с проведением документов, списывающих партии, например, реализаций, то выигрыш будет виден невооруженным глазом.

Попробуйте на копии своей базы восстановить партионную последовательность с доработкой и без.

Если сервер достаточно мощный и статистика регулярно обновляется, то проблема зачастую и не проявляется.

От доработки хуже тоже не станет. Очень бы хотелось чтоб типовые УПП 1.3 и УТ 10 были доработаны самой фирмой 1С. Прошу поддержать вопрос Нуралиеву.
10. Vladimir_Konyrev 223 24.06.13 13:03 Сейчас в теме
(8)
В момент проведения самой РТиУ проблем больших нет, есть проблема долгого восстановления последовательности.

Вопрос не поддержу, не ввиду того, что считаю его не важным, а ввиду того, что БГ на него отвечать не будет ввиду того, что он Стратег, а не исполнитель.
11. tiniji 154 25.06.13 10:56 Сейчас в теме
1С знает об этой проблеме с 2008-2009 года. Судите сами, как они исправляют ошибки.

Кстати есть куча других ошибок, которые видимо так и останутся в УТ 10.3 навсегда )))
12. ZLENKO 25.06.13 17:58 Сейчас в теме
Зачем исправлять старые ошибки когда есть куча новых :-)
15. ZLENKO 26.06.13 10:27 Сейчас в теме
Уберите еще отборы виртуальной таблицы ПартииТоваровНаСкладах.Остатки (ограничение будет идти по соединению таблиц) в виде: Номенклатура В (ВЫБРАТЬ РегистрСведений.СписанныеТовары.Номенклатура ИЗ РегистрСведений.СписанныеТовары ГДЕ РегистрСведений.СписанныеТовары.Регистратор = &Ссылка)
получите еще хороший бонус по ускорению! (по крайней мере на MS SQL Server) :-)

P.S.: За такое на экзамене на специалиста ставили 2 балла, но факты вещь упрямая - без отборов намного быстрее!

А вот индексирование временной таблицы даст прирост только на докуметах с несколькими сотнями строк, а при небольшом количестве строк только замедляет создание временной таблицы.
AndrewAks; user824106; adhocprog; +3 Ответить
17. Amara 27.06.13 14:42 Сейчас в теме
У нас такая же ситуация, но все руки не доходили в виду загруженности большими проектами. Спасибо! Воспользуюсь вашим вариантом.
18. internetname 27.06.13 18:14 Сейчас в теме
19. candy_sk 28.06.13 22:06 Сейчас в теме
а чем этот отчет отличается от стандартного в УПП ?
20. Антон Ширяев 472 29.06.13 12:57 Сейчас в теме
(19) candy_sk,
а чем этот отчет отличается от стандартного в УПП ?

По каким признакам было принято решение, что это ОТЧЕТ?

Это доработка типового кода УПП 1.2 / УПП 1.3 / УТ 10.3, которая решает проблему долгого проведения документов, которые списывают партии - Реализация, Перемещение, Отчет о розничных продажах и др.
21. powerpc 218 01.07.13 10:39 Сейчас в теме
Протестировал на тестовой базе :

// без исправления:

// файловая:

// Время выполения: t=376 сек.(6,26666667 мин.)
// Время выполения: t=351 сек.(5,85000000 мин.)

// когда нет работающих пользователей
// Время выполения: t=240 сек.(4,00000000 мин.)

// SQL

// Время выполения: t=509 сек.(8,48333333 мин.)

// когда нет работающих пользователей
// Время выполения: t=464 сек.(7,73333333 мин.)


***********************************************************

// с исправлением:

// файловая

// Время выполения: t=345 сек.(5,75000000 мин.)
// Время выполения: t=265 сек.(4,41666667 мин.)

// SQL

// когда нет работающих пользователей
// Время выполения: t=618 сек.(10,30000000 мин.)
23. Антон Ширяев 472 01.07.13 11:00 Сейчас в теме
(21) powerpc,

Если бы не было реального прироста в моем конкретном случае, этой публикации здесь бы не было.
Ситуации бывают разные в вашем случае пока виден обратный эффект.

Вы не уточнили сколько раз проводились измерения. На каком документе проходило тестирование. Сколько в среднем строк в исследуемом типе документов. В некоторых случаях строка "ИНДЕКСИРОВАТЬ ПО Номенклатура" может дать замедление.

Если есть возможность, повторите эксперимент 3-5 раз, обращая внимание та то, большой ли разбег результатов, т.к. существует вероятность, что замедление после исправления обусловлено другими факторами.
adhocprog; +1 Ответить
25. powerpc 218 01.07.13 11:54 Сейчас в теме
(23)

>> Если бы не было реального прироста в моем конкретном случае, этой публикации здесь бы не было.
Согласен. Поэтом и себе хочу взять на вооружение.

>> Ситуации бывают разные в вашем случае пока виден обратный эффект.
Если бы эффект был обратный обратному, то и моего поста возможно здесь не было, либо был бы, с благодарностью или плюсом.

>>> Вы не уточнили сколько раз проводились измерения.
5 без исправления, 3 раза с исправлениями. С исправлениями в монопольном режиме, когда не было никого кроме меня в базе.

>>> На каком документе проходило тестирование. Сколько в среднем строк в исследуемом типе документов.
Документ: «Перемещение товаров». 2600 документов. Кол-во строк в документах от 1 до сотни.
27. Антон Ширяев 472 01.07.13 12:27 Сейчас в теме
(25) powerpc,
5 без исправления, 3 раза с исправлениями. С исправлениями в монопольном режиме, когда не было никого кроме меня в базе.


Ваше тестирование было по сути по одному разу для каждых различных условий. При возможности повторите по нескольку раз для одних и тех же условий.

Документ: «Перемещение товаров». 2600 документов. Кол-во строк в документах от 1 до сотни.

Попробуйте провести один и тот же документ со 100 строками раз 10 подряд. Будет ли время проведения стабильно? В моем случае время первого проведения было больше времени последующих в большинстве случаев.
Соответственно попробовать провести тот же документ в той же базе раз 10 после доработки. Так же повторить тест с без использования индекса по номенклатуре.
29. powerpc 218 01.07.13 12:37 Сейчас в теме
(27) хорошо, попробую, спасибо.

Хотя не думаю, что ускорение хорошо получать за два и несколько последовательных проведений одного и того же документа. А то придётся вывешивать рядом с кнопкой "ОК" ещё и "ОК-ОК" (Double-OK) :) Думаю последовательное проведение проходит быстрее из за кэширования последних запросов в оперативной памяти. Прирост виден и на моих первых двух тестах без исправления - 25 секунд (почти полминуты).

Ещё очень странно то, что по логике Вашего исправления действительно должен произойти значительный прирост, а его нет. Может версия SQL Server 2008 R2 уже оптимизирует как-то такие "неправильные" запросы ?
30. Антон Ширяев 472 01.07.13 12:51 Сейчас в теме
(29) powerpc,
Насколько я знаю проблема резкого замедления производительности заключается в неверном построении плана запроса оптимизатором запросов. В вашем случае оптимизатор отрабатывает хорошо, а в моем случае сначала было терпимо, но с некоторого критического момента произошло очень резкое падение производительности. В вашем случае при проведении документа за четверть секунды проблем в этом месте нет. Такой скорости проведения документов можно только позавидовать :)
31. powerpc 218 01.07.13 13:48 Сейчас в теме
(30) мы тоже сначала сервер купили. Теперь на хорошем геймерском компе проводим ))))))))
33. ZLENKO 01.07.13 16:17 Сейчас в теме
(31) powerpc, на геймерском компе с оверклокерской памятью наверняка быстрее будет, чем на серверной оперативке :-)
51. Антон Ширяев 472 03.07.13 09:24 Сейчас в теме
(31) powerpc,
Геймерский комп конечно хорошо, но в подавляющем большинстве случаев в крупных компаниях работают на серверах без разгона процессора и памяти, а они для серверов обычно имеют более низкие штатные частоты, особенно для не сверхдорогих серверов. Да еще и дисковая подсистема зачастую собрана в RAID5 ради экономии.
И зачастую новый сервер сейчас купить никак нет возможности, но что-то сделать для того чтоб хоть как то работало прямо сейчас нужно.
То что я описал в статье как раз помогло мне выбраться из такой ситуации.
54. powerpc 218 03.07.13 09:31 Сейчас в теме
(51) я и не спорю, наверно в УПП это хорошо работает, тут пишут, что там сразу в три регистра бух, нал, упр движения формируются, может в этом фишка исправленного запроса проявляется. Геймерский комп как раз более доступен, чем даже недорогой сервер с RAID (я полным бэкапам больше доверяю, сорри). Просто я проверяю возможность вашим способом ускорить проведение партий и на УТ 10.3.
22. powerpc 218 01.07.13 10:41 Сейчас в теме
не вижу особого прироста скорости, а в SQL даже падение, причем ощутимое. Ещё и в ущерб от ковыряния ключевого места в проведении...

Правил только -
Общий модуль: УправлениеЗапасамиПартионныйУчет
: Функция ПолучитьДеревоПартийНаСкладахУпр (МоментКон, СтруктураПараметров)

в УТ 10.3 в упор не вижу таких же процедур с окончаниями "Нал" и "Бух".
Привожу весь текст измененной функции :

Функция ПолучитьДеревоПартийНаСкладахУпр (МоментКон, СтруктураПараметров)

Запрос = Новый Запрос;

ОсновнойДокумент = Неопределено;
СтруктураПараметров.Свойство("ОсновнойДокумент",ОсновнойДокумент);

Регистратор = СтруктураПараметров.Регистратор;
СпособОценкиМПЗ = СтруктураПараметров.СпособОценкиМПЗУпр;
СтратегияСтатусПартии = СтруктураПараметров.СтратегияСтатусПартииУпр;
ВестиПартионныйУчетПоСкладам = СтруктураПараметров.ВестиПартионныйУчетПоСкладамУпр;

// Для повышения быстродействия остатки партий получаются различными способами
Если СтруктураПараметров.Свойство("ЗакрытиеЗаказовПокупателей") Тогда
ЗаполнитьЗапросПартийНаСкладахДляЗакрытияЗаказовПокупателей(Запрос);

ИначеЕсли ОсновнойДокумент <> Неопределено И НЕ СтруктураПараметров.СписыватьПартииРасходнымОрдером
И ТипЗнч(ОсновнойДокумент) = Тип("ДокументСсылка.РеализацияТоваровУслуг")тогда
// Списание расходным ордером товара реализованного и принятого на ответственное хранение (отложенная отгрузка)
ЗаполнитьЗапросПартийНаСкладахДляОтложеннойОтгрузкиУпр(Запрос, ВестиПартионныйУчетПоСкладам);

ИначеЕсли ОсновнойДокумент <> Неопределено тогда
// Списание партий по ордерной схеме:
// - Списание партий по расходному ордеру
// - Перемещение партий по приходному ордеру
// - Перемещение партий поступлением товаров и услуг в НТТ
// Движения реализации выполняет расходный ордер, движения перемещения выполняет приходный ордер
ЗаполнитьЗапросПартийНаСкладахДляСписанияПоОрдернойСхемеУпр(Запрос, ВестиПартионныйУчетПоСкладам, СтратегияСтатусПартии, СпособОценкиМПЗ);

Иначе
// Общий случай списания
ЗаполнитьЗапросПартийНаСкладахУпр(Запрос, ВестиПартионныйУчетПоСкладам, СтратегияСтатусПартии, СпособОценкиМПЗ);
Если НЕ СтруктураПараметров.ИспользоватьУказаниеСерийНоменклатурыПриРезервировании тогда
Запрос.Текст = СтрЗаменить(Запрос.Текст,"ИЛИ ПартииТоваровНаСкладах.СерияНоменклатуры = &ПустаяСерияНоменклатуры",
"ИЛИ ПартииТоваровНаСкладах.СерияНоменклатуры = &ПустаяСерияНоменклатуры
|ИЛИ СписанныеТовары.КодОперацииПартииТоваров = &КодРезервирование");
Запрос.УстановитьПараметр("КодРезервирование" , СтруктураПараметров.КодыОпераций.РезервированиеПодЗаказ)
КонецЕсли;

КонецЕсли;

Запрос.УстановитьПараметр("ПустаяСерияНоменклатуры", Справочники.СерииНоменклатуры.ПустаяСсылка());
Запрос.УстановитьПараметр("ПустойЗаказ", Документы.ЗаказПокупателя.ПустаяСсылка());
Запрос.УстановитьПараметр("ПустойСтатус", Перечисления.СтатусыПартийТоваров.ПустаяСсылка());
Запрос.УстановитьПараметр("СтатусПартииПоОрдеру", Перечисления.СтатусыПартийТоваров.ПоОрдеру);
Запрос.УстановитьПараметр("ПустоеКачество", Справочники.Качество.ПустаяСсылка());
Запрос.УстановитьПараметр("КачествоНовый", Справочники.Качество.Новый);
Запрос.УстановитьПараметр("ПустойСклад", Справочники.Склады.ПустаяСсылка());

Запрос.УстановитьПараметр("Ссылка", Регистратор);

Если ОсновнойДокумент <> Неопределено Тогда
Запрос.УстановитьПараметр("ОсновнойДокумент", ОсновнойДокумент);
Иначе
Запрос.УстановитьПараметр("ОсновнойДокумент", Регистратор);
КонецЕсли;

Запрос.УстановитьПараметр("Дат", МоментКон);

Запрос.УстановитьПараметр("НаКомиссию", Перечисления.СтатусыПартийТоваров.НаКомиссию);


// ок старт

Запрос.Текст =
"ВЫБРАТЬ
| *
|ПОМЕСТИТЬ СписанныеТовары
|ИЗ
| РегистрСведений.СписанныеТовары
|ГДЕ
| Регистратор В (&ОсновнойДокумент, &Ссылка)
|ИНДЕКСИРОВАТЬ ПО Номенклатура;
|
|" + СтрЗаменить(Запрос.Текст, "РегистрСведений.СписанныеТовары", "СписанныеТовары");

// Сообщить(Запрос.Текст);

// ок финиш


Возврат Запрос.Выполнить().Выгрузить(ОбходРезультатаЗапроса.ПоГруппировкам);

КонецФункции//ПолучитьДеревоПартийНаСкладахУпр
24. Антон Ширяев 472 01.07.13 11:06 Сейчас в теме
(22) powerpc,
Правил только -
Общий модуль: УправлениеЗапасамиПартионныйУчет
: Функция ПолучитьДеревоПартийНаСкладахУпр (МоментКон, СтруктураПараметров)

в УТ 10.3 в упор не вижу таких же процедур с окончаниями "Нал" и "Бух".


Как я уже писал выше, я работая только с УПП, поэтому и статья в первую очередь была про УПП.
В УТ 10.3 есть только ПолучитьДеревоПартийНаСкладахУпр, поэтому исправляем только ее.

Если у вас эта процедура и так выполняется в пределах 10 секунд, то и особого прироста скорее всего ждать не стоит, т.к. некоторое время уходит на создание временной таблицы и ее индексирование.
26. powerpc 218 01.07.13 12:09 Сейчас в теме
(24)

>> Если у вас эта процедура и так выполняется в пределах 10 секунд, то и особого прироста скорее всего ждать не стоит, т.к. некоторое время уходит на создание временной таблицы и ее индексирование.

// Время выполения: t=618 сек.(10,30000000 мин.)

10 минут vs 7 минут

P.S. Тема очень интересная, т.к. имеющееся железо уже разогнали, осталась логика приложения ))))
28. Антон Ширяев 472 01.07.13 12:36 Сейчас в теме
(26) powerpc,
Перечитал ваши посты еще раз.
Получается что 2600 документов проводятся 7-10 минут. Это значит один документ в среднем проводится четверть секунды. Думаю для такого варианта оптимизации никакой не требуется.

Мне оптимизация требовалась когда 1 документ проводился по 3-5-7 минут, а у вас 2600 документов за это время проводится.
32. ZLENKO 01.07.13 16:13 Сейчас в теме
(22) powerpc, Я писал выше о том что для получения ускорения нужно убрать отборы виртуальной таблицы остатков партий, которые имеют вид запросов. Гарантированно получите ускорение :-)
34. powerpc 218 02.07.13 10:02 Сейчас в теме
(32) ZLENKO.PRO, не понял, вот этот кусок кода (выделено красным) из типового запроса, убрать, да ?



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

И (ВЫБОР
КОГДА СписанныеТовары.СписыватьТолькоПоЗаказу = ИСТИНА
ТОГДА ВЫБОР
КОГДА ПартииТоваровНаСкладах.Заказ <> СписанныеТовары.ЗаказПартии
ТОГДА ВЫБОР
КОГДА (НЕ СписанныеТовары.ЗаказПартии = НЕОПРЕДЕЛЕНО)
ТОГДА ЛОЖЬ
ИНАЧЕ ПартииТоваровНаСкладах.Заказ = &ПустойЗаказ
КОНЕЦ
ИНАЧЕ ИСТИНА
КОНЕЦ
ИНАЧЕ ВЫБОР
КОГДА ПартииТоваровНаСкладах.Заказ <> СписанныеТовары.ЗаказПартии
ТОГДА ПартииТоваровНаСкладах.Заказ = &ПустойЗаказ
ИНАЧЕ ИСТИНА
КОНЕЦ
КОНЕЦ)
И (СписанныеТовары.СерияНоменклатуры = ПартииТоваровНаСкладах.СерияНоменклатуры
ИЛИ ПартииТоваровНаСкладах.СерияНоменклатуры = &ПустаяСерияНоменклатуры
ИЛИ СписанныеТовары.КодОперацииПартииТоваров = &КодРезервирование)
ГДЕ
СписанныеТовары.Регистратор = &ОсновнойДокумент

УПОРЯДОЧИТЬ ПО
ЧислоСерияНоменклатуры,
ЧислоДокументОприходования,
ЧислоЗаказ,
ЧислоСтатусПартии,
ДокументОприходованияДата,
ДокументОприходования
ИТОГИ ПО
НомерСтрокиДокумента
35. ZLENKO 02.07.13 12:37 Сейчас в теме
(34) powerpc, этот и по складам тоже:

Номенклатура В
(ВЫБРАТЬ
РегистрСведений.СписанныеТовары.Номенклатура
ИЗ
РегистрСведений.СписанныеТовары
ГДЕ
РегистрСведений.СписанныеТовары.Регистратор = &Ссылка)
И (Склад В
(ВЫБРАТЬ
РегистрСведений.СписанныеТовары.Склад
ИЗ
РегистрСведений.СписанныеТовары
ГДЕ
РегистрСведений.СписанныеТовары.Регистратор = &Ссылка) ИЛИ Склад = &ПустойСклад)
37. powerpc 218 02.07.13 14:33 Сейчас в теме
(35) ZLENKO.PRO, здорово. А косяков не будет при списании партий, из других складов или из другой номенклатуры не спишутся ? Вы проверяли ?
39. ZLENKO 02.07.13 15:36 Сейчас в теме
(37) powerpc, а какие косяки могут быть ? Номенклатура и склады обрубаются через "ВНУТРЕННЕЕ СОЕДИНЕНИЕ".
Пользуюсь уже несколько лет на нескольких больших базах.
36. ZLENKO 02.07.13 12:42 Сейчас в теме
(34) powerpc, я пробовал еще предварительно получать отдельным запросом списки номенклатуры и складов и потом указывать их параметром вот так: Номенклатура В (&СписокНоменклатура) И Склад В (&СписокСклад), но существенной разницы с тем что их вообще не указывать не заметил. Ограничение по номенклатуре и складу выполняется по соединению.
38. powerpc 218 02.07.13 15:28 Сейчас в теме
(36) ZLENKO.PRO, во, убрал как вы посоветовали:

// Время выполнения: t=1 991 сек.(33,18333333 мин.)

обратное ускорение пошло.... всю номенклатуру шерстит по ходу... и все склады иже с ними.
40. ZLENKO 02.07.13 15:37 Сейчас в теме
(38) powerpc, У вас база на какой СУБД ?
41. powerpc 218 02.07.13 15:50 Сейчас в теме
(40) ZLENKO.PRO, в т.ч. и на файловой, дальше пробовать не буду, результат отруба отбора очевиден ....
42. ZLENKO 02.07.13 16:01 Сейчас в теме
(41) powerpc, на файловой вполне вероятно что будет хуже. Просто на файловой у меня и проблемы такой не было :-) А вот на базах по 50-80 Гб на MS SQL однозначно сильно помогает.
43. ZLENKO 02.07.13 16:05 Сейчас в теме
Для файловой оптимальнее, наверное, будет сначала получить записи из списанных товаров и из них сформировать параметры отбора Номенклатура В (&СписокНоменклатура) И Склад В (&СписокСклад) для второго основного запроса. Результат первого запроса добавить через менеджер временных таблиц во второй.
44. ZLENKO 02.07.13 16:09 Сейчас в теме
Кстати автор предлагает получать все поля:

Запрос.Текст =
"ВЫБРАТЬ
| *
|ПОМЕСТИТЬ СписанныеТовары
|ИЗ
| РегистрСведений.СписанныеТовары

а полей там немало, а реально нужно получить только небольшую часть.
Лучше перечислить что именно нужно получить...
45. powerpc 218 02.07.13 17:27 Сейчас в теме
(44) ZLENKO.PRO, неа, не отыскать грааль. Запрос 1с-чный оптимален, имхо. Думаю ЦУП-ом прошлись по ключевому запросу
46. ZLENKO 02.07.13 17:46 Сейчас в теме
(45) powerpc, спорить не буду - разница при выборке скорее всего будет незначительна при реальных объемах выборки в несколько десятков или сотен строк. На тысячах строк вполне вероятно уже будет ощущаться зависимость от объема выбираемых данных. А вот при помещении всего этого во временную таблицу - ежу понятно что разница будет большая создавать таблицу из 5 полей или из 50 полей(именно столько в регистре Списанные Товары)!
53. Антон Ширяев 472 03.07.13 09:29 Сейчас в теме
(44) ZLENKO.PRO,
Кстати автор предлагает получать все поля:

а полей там немало, а реально нужно получить только небольшую часть.
Лучше перечислить что именно нужно получить...


Лучше всегда понятие относительное. В моем случае задача была минимально исправить конфигурацию для беспроблемного ее обновления и при этом получить увеличение производительности.
Доработка как раз сделана таким образом, что скорее всего будет работать даже после доработки этого места 1С. Это подтвердилось когда вышел релиз 1.3.27 УПП, где 1С вынесла вложенный запрос получения остатков партий в подзапрос. Возможно вы получали прирост от убирания отборов именно пока это был вложенный запрос.
57. ZLENKO 03.07.13 10:05 Сейчас в теме
(53) как раз от выноса в подзапрос мало что меняется. Не буду навязывать свою точку зрения по данному вопросу. Запрос, который я считаю оптимальным приведен в (49). Хотя пожалуй стоит убрать вложенность запроса в основном запросе - смысла в ней нет. А вообще конечно надо пробовать в каждой конкретной ситуации разные варианты. Например у меня отбор по номенклатуре и складу через параметры немного лучше работал на документах до 100 строк, а на документах более 100 строк уже быстрее работал отбор по номенклатуре и складу через временные таблицы (как сделано в (49)), причем чем больше документ тем это значительнее проявлялось. На документах в несколько строк при актуальной статистике и рассчитанных на нужный момент итогах разницы по сравнению с типовым запросом может и не быть :-)
47. ZLENKO 02.07.13 17:55 Сейчас в теме
А по поводу неоптимальной работы запроса по партиям разработчики из 1С давно признали проблему, но рекомендуют лечить ее более частым обновлением статистики MS SQL Server. Просто из-за этих вложенных запросов в отборе виртуальной таблицы планировщик запросов MS SQL Server с ума сходит :-) Но даже при актуальной статистике у меня примерно двукратный прирост скорости при убирании этих отборов. А ведь при перепроведении по партиям статистика быстро устаревает из-за изменения в регистре... Так что думайте сами, решайте сами...
На файловой скорее всего просто убрать нельзя - надо менять на параметры в отборе, а под MS SQL специально недавно проверял надо просто убрать отборы. Движок MS SQL эффективено работает с соединениями таблиц и отбор номенклатуры и складов происходит через них.
48. ZLENKO 02.07.13 18:00 Сейчас в теме
Я на самом деле много возился с этим запросом в базе УПП пару лет назад - пробовал и так и эдак с целью ускорения проведения по партиям в целом. Однако я тогда уперся в медленную запись регистров партий :-( а в УПП их 3 регистра (упр, бух, нал)...
49. ZLENKO 02.07.13 18:11 Сейчас в теме
Если есть доступ почитайте http://partners.v8.1c.ru/forum/thread.jsp?id=907239

Запрос.Текст = "ВЫБРАТЬ
| СписанныеТовары.Номенклатура
|ПОМЕСТИТЬ ПереченьНоменклатуры
|ИЗ
| РегистрСведений.СписанныеТовары КАК СписанныеТовары
|ГДЕ
| СписанныеТовары.Регистратор = &Ссылка
|
|;
|
|////////////////////////////////////////////////////////////­////////////////////
|ВЫБРАТЬ
| СписанныеТовары.Склад
|ПОМЕСТИТЬ ПереченьСкладов
|ИЗ
| РегистрСведений.СписанныеТовары КАК СписанныеТовары
|ГДЕ
| СписанныеТовары.Регистратор = &Ссылка
|
|ОБЪЕДИНИТЬ
|
|ВЫБРАТЬ
| &ПустойСклад
|
|;
|
|////////////////////////////////////////////////////////////­////////////////////
|ВЫБРАТЬ
| ПартииТоваровНаСкладахОстатки.Номенклатура КАК Номенклатура,
| ПартииТоваровНаСкладахОстатки.Склад КАК Склад,
| ПартииТоваровНаСкладахОстатки.ХарактеристикаНоменклатуры КАК ХарактеристикаНоменклатуры,
| ПартииТоваровНаСкладахОстатки.СерияНоменклатуры,
| ПартииТоваровНаСкладахОстатки.ДокументОприходования,
| ПартииТоваровНаСкладахОстатки.СтатусПартии,
| ПартииТоваровНаСкладахОстатки.Заказ,
| ПартииТоваровНаСкладахОстатки.Качество КАК Качество,
| ПартииТоваровНаСкладахОстатки.КоличествоОстаток,
| ПартииТоваровНаСкладахОстатки.СтоимостьОстаток,
| ПартииТоваровНаСкладахОстатки.НДСОстаток
|ПОМЕСТИТЬ ПартииТоваровНаСкладах
|ИЗ
| РегистрНакопления.ПартииТоваровНаСкладах.Остатки(
| &Дат,
| Номенклатура В
| (ВЫБРАТЬ РАЗЛИЧНЫЕ
| ПереченьНоменклатуры.Номенклатура
| ИЗ
| ПереченьНоменклатуры)
| И Склад В
| (ВЫБРАТЬ РАЗЛИЧНЫЕ
| ПереченьСкладов.Склад
| ИЗ
| ПереченьСкладов)) КАК ПартииТоваровНаСкладахОстатки
|
|;
|
|////////////////////////////////////////////////////////////­////////////////////
|ВЫБРАТЬ
| ЗапросПопартиям.НомерСтрокиДокумента КАК НомерСтрокиДокумента,
| ЗапросПопартиям.Номенклатура,
| ЗапросПопартиям.ДокументОприходования КАК ДокументОприходования,
| ЗапросПопартиям.ДокументОприходованияДата,
| ЗапросПопартиям.ДокументОприходованияМоментВремени,
| ЗапросПопартиям.Склад,
| ЗапросПопартиям.ХарактеристикаНоменклатуры,
| ЗапросПопартиям.СерияНоменклатуры,
| ЗапросПопартиям.Качество,
| ЗапросПопартиям.Заказ,
| ЗапросПопартиям.Количество,
| ЗапросПопартиям.Стоимость,
| ЗапросПопартиям.НДС,
| ЗапросПопартиям.СтатусПартии,
| ЗапросПопартиям.ЧислоСерияНоменклатуры,
| ЗапросПопартиям.ЧислоДокументОприходования,
| ЗапросПопартиям.ЧислоЗаказ,
| ЗапросПопартиям.ЧислоСтатусПартии
|ИЗ
| (ВЫБРАТЬ
| СписанныеТовары.НомерСтрокиДокумента КАК НомерСтрокиДокумента,
| ПартииТоваровНаСкладах.Номенклатура КАК Номенклатура,
| ПартииТоваровНаСкладах.ДокументОприходования КАК ДокументОприходования,
| ПартииТоваровНаСкладах.ДокументОприходования.Дата КАК ДокументОприходованияДата,
| ПартииТоваровНаСкладах.ДокументОприходования.МоментВремени КАК ДокументОприходованияМоментВремени,
| ПартииТоваровНаСкладах.Склад КАК Склад,
| ПартииТоваровНаСкладах.ХарактеристикаНоменклатуры КАК ХарактеристикаНоменклатуры,
| ПартииТоваровНаСкладах.СерияНоменклатуры КАК СерияНоменклатуры,
| ПартииТоваровНаСкладах.Качество КАК Качество,
| ПартииТоваровНаСкладах.Заказ КАК Заказ,
| ПартииТоваровНаСкладах.КоличествоОстаток КАК Количество,
| ПартииТоваровНаСкладах.СтоимостьОстаток КАК Стоимость,
| ПартииТоваровНаСкладах.НДСОстаток КАК НДС,
| ПартииТоваровНаСкладах.СтатусПартии КАК СтатусПартии,
| ВЫБОР
| КОГДА СписанныеТовары.СерияНоменклатуры = ПартииТоваровНаСкладах.СерияНоменклатуры
| ТОГДА 0
| ИНАЧЕ 1
| КОНЕЦ КАК ЧислоСерияНоменклатуры,
| ВЫБОР
| КОГДА СписанныеТовары.ДокументПартии = НЕОПРЕДЕЛЕНО
| ТОГДА 0
| ИНАЧЕ ВЫБОР
| КОГДА СписанныеТовары.ДокументПартии = ПартииТоваровНаСкладах.ДокументОприходования
| ТОГДА 0
| ИНАЧЕ 1
| КОНЕЦ
| КОНЕЦ КАК ЧислоДокументОприходования,
| ВЫБОР
| КОГДА СписанныеТовары.ЗаказПартии = НЕОПРЕДЕЛЕНО
| ТОГДА 0
| ИНАЧЕ ВЫБОР
| КОГДА ПартииТоваровНаСкладах.Заказ = &ПустойЗаказ
| ТОГДА 1
| ИНАЧЕ 0
| КОНЕЦ
| КОНЕЦ КАК ЧислоЗаказ,
| ВЫБОР
| КОГДА ПартииТоваровНаСкладах.СтатусПартии = &НаКомиссию
| ТОГДА 1
| ИНАЧЕ 0
| КОНЕЦ КАК ЧислоСтатусПартии
| ИЗ
| РегистрСведений.СписанныеТовары КАК СписанныеТовары
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ ПартииТоваровНаСкладах КАК ПартииТоваровНаСкладах
| ПО СписанныеТовары.Номенклатура = ПартииТоваровНаСкладах.Номенклатура
| И СписанныеТовары.ХарактеристикаНоменклатуры = ПартииТоваровНаСкладах.ХарактеристикаНоменклатуры
| И (ВЫБОР
| КОГДА ПартииТоваровНаСкладах.Качество = &ПустоеКачество
| ТОГДА ИСТИНА
| ИНАЧЕ ВЫБОР
| КОГДА СписанныеТовары.Качество = &ПустоеКачество
| ТОГДА ПартииТоваровНаСкладах.Качество = &КачествоНовый
| ИНАЧЕ ПартииТоваровНаСкладах.Качество = СписанныеТовары.Качество
| КОНЕЦ
| КОНЕЦ)
| И (ПартииТоваровНаСкладах.Склад = СписанныеТовары.Склад
| ИЛИ ПартииТоваровНаСкладах.Склад = &ПустойСклад)
| И (ВЫБОР
| КОГДА СписанныеТовары.ДопустимыйСтатус1 <> &ПустойСтатус
| ИЛИ СписанныеТовары.ДопустимыйСтатус2 <> &ПустойСтатус
| ИЛИ СписанныеТовары.ДопустимыйСтатус3 <> &ПустойСтатус
| ИЛИ СписанныеТовары.ДопустимыйСтатус4 <> &ПустойСтатус
| ТОГДА ПартииТоваровНаСкладах.СтатусПартии = &ПустойСтатус
| ИЛИ ПартииТоваровНаСкладах.СтатусПартии = &СтатусПартииПоОрдеру
| ИЛИ ПартииТоваровНаСкладах.СтатусПартии = СписанныеТовары.ДопустимыйСтатус1
| ИЛИ ПартииТоваровНаСкладах.СтатусПартии = СписанныеТовары.ДопустимыйСтатус2
| ИЛИ ПартииТоваровНаСкладах.СтатусПартии = СписанныеТовары.ДопустимыйСтатус3
| ИЛИ ПартииТоваровНаСкладах.СтатусПартии = СписанныеТовары.ДопустимыйСтатус4
| ИНАЧЕ ИСТИНА
| КОНЕЦ)
| И (ВЫБОР
| КОГДА СписанныеТовары.СписыватьТолькоПоЗаказу = ИСТИНА
| ТОГДА ВЫБОР
| КОГДА ПартииТоваровНаСкладах.Заказ <> СписанныеТовары.ЗаказПартии
| ТОГДА ВЫБОР
| КОГДА (НЕ СписанныеТовары.ЗаказПартии = НЕОПРЕДЕЛЕНО)
| ТОГДА ЛОЖЬ
| ИНАЧЕ ПартииТоваровНаСкладах.Заказ = &ПустойЗаказ
| КОНЕЦ
| ИНАЧЕ ИСТИНА
| КОНЕЦ
| ИНАЧЕ ВЫБОР
| КОГДА ПартииТоваровНаСкладах.Заказ <> СписанныеТовары.ЗаказПартии
| ТОГДА ПартииТоваровНаСкладах.Заказ = &ПустойЗаказ
| ИНАЧЕ ИСТИНА
| КОНЕЦ
| КОНЕЦ)
| И (СписанныеТовары.СерияНоменклатуры = ПартииТоваровНаСкладах.СерияНоменклатуры
| ИЛИ ПартииТоваровНаСкладах.СерияНоменклатуры = &ПустаяСерияНоменклатуры)
| ГДЕ
| СписанныеТовары.Регистратор = &ОсновнойДокумент
| ) КАК ЗапросПопартиям
|
|УПОРЯДОЧИТЬ ПО
| ЗапросПопартиям.ЧислоСерияНоменклатуры,
| ЗапросПопартиям.ЧислоДокументОприходования,
| ЗапросПопартиям.ЧислоЗаказ,
| ЗапросПопартиям.ЧислоСтатусПартии,
| ЗапросПопартиям.ДокументОприходованияДата,
| ЗапросПопартиям.ДокументОприходованияМоментВремени,
| ДокументОприходования
|ИТОГИ ПО
| НомерСтрокиДокумента";
50. arteast 100 03.07.13 05:34 Сейчас в теме
На http://partners.v8.1c.ru/forum/thread.jsp?id=907239 тебе ответ уже написали. Как всегда "аргументированный"
52. powerpc 218 03.07.13 09:24 Сейчас в теме
(50) arteast, а сюда можно этот ответ скопировать, а то у меня доступа нет к сожалению к партнерскому форуму.
56. ZLENKO 03.07.13 10:02 Сейчас в теме
(52) powerpc, это мой ответ "Индексирование во временных таблицах делать не стоит - выигрыша по скорости не получите из-за небольшого объема выборки, а замедление при создании временных таблиц из-за индексирования будет весьма ощутимым (проверено на практике)." Дело в том что автор запроса предлагал делать индексирование во временных таблицах. В тексте запроса который я привел выше индексирование я убрал при копипасте оттуда.
adhocprog; powerpc; +2 Ответить
67. arteast 100 08.07.13 02:02 Сейчас в теме
(56) ZLENKO.PRO, пробовал без индексирование, время проведения документов увеличилось. Как проведение документа в 10 строк, так и дока в 3к строк.
В ближайшее время переведу клиента на 8.2 - проверим, в платформе ли дело) Пока заказчик доволен и месяц тестирования ничего не "вылезло".

Именно потому, твой ответ "Лучше так не делать, я пробовал у меня не получилось" (по смыслу именно так) для меня абсолютно не аргументирован)
70. ZLENKO 08.07.13 16:27 Сейчас в теме
(67) Аргументы требуются для доказательства чего либо. В данном случае никаких доказательств не требуется :-)
Вы видимо плохо понимаете суть и смысл индексирования. Проверьте лучше в регистре ПартииТоваровНаСкладах у вас измерения Склад и Номенклатура индексированные ? И весьма желательно чтобы порядок измерений был именно такой "Склад, Номенклатура" и потом остальные измерения. Тогда есть вероятность использования части составного индекса по регистру. Индексировать временную таблицу в данном случае бессмысленно. ИМХО
55. ZLENKO 03.07.13 09:59 Сейчас в теме
(50) arteast, если посмотриш внимательнее, то увидиш что это я написал ответ, а не мне :-)
58. Re:аниматор 424 03.07.13 17:54 Сейчас в теме
УТ 10.3
Произвел манипуляции с запросом, вроде документы стали быстрее проводится (хотя и без этого кода не тормозило), думал ускорится обработка "Проведение по партиям" и сегодня!
запустил обработку "Проведение по партиям" скорость упала в раза 4.5:-(, то что раньше делалось часа 2, делается порядка 8.5 часов

Удалил этот код, сработало за 2 часа. Оптимизация для УТ 10.3 под сомнением ....
59. powerpc 218 04.07.13 10:10 Сейчас в теме
(58) Re:аниматор, точно. Скорее во время экспериментов с запросом злобный админ сменил на сервере SATA на SSD вот и взлетело у автора.
60. Re:аниматор 424 04.07.13 10:21 Сейчас в теме
(59) Раньше был сервер 32 бита, стала падать программа и висеть проведение доков окала минуты две, перевели на MS SQL 2008 64 бита, скорость проведения увеличилась в раз 20. БД 130 гигов. окала 200 пользователей. Вот это я понимаю оптимизация. По началу вставил код, вроде казалось что по быстрее, хотя народ и не жаловался и ранее после перевода на 64 бита. Но вчера запустив обработку ... лег спать под утро, не выспался не фига сидел ждал окончание... злой сегодня =)
63. ZLENKO 04.07.13 16:58 Сейчас в теме
(60) Re:аниматор, а у вас статистика апдейтится на MS SQL ?
sp_updatestats выполняете как часто на базе ?
61. Антон Ширяев 472 04.07.13 10:51 Сейчас в теме
(58) Re:аниматор, (59) powerpc,

Я никого не принуждаю использовать эту доработку, хотя использую сам. Если у вас и так быстро работает не трогайте это место.

Теперь я понимаю почему 1С не трогает тут ничего. Ситуация неоднозначная. Эффективность когда и так все работает быстро может быть обратной.

Но тем кто столкнется с реальной проблемой думаю будет полезно знать куда можно посмотреть.
Fominro; GreyFog; adhocprog; +3 Ответить
62. Re:аниматор 424 04.07.13 11:32 Сейчас в теме
(61) Это понятно, каждый выбирает свой путь, без претензий. Может данный код и полезен для проведения одного документа интерактивно, но групповым методом тут трындец полный =) Тормоза идут снежным комом, т.е. 5 дней проводятся час, следующие 5 дней, 1.5 часа, далее 5 дней 2 часа и т.д.

Сидел материлллл .... себя конечно, что не проверил в тестовой БД перед тем как делать в рабочей

Лично я не рекомендую этот код внедрять для УТ 10.3. т.к. восстановление партий за месяц важнее чем проведение одного интерактивно документа. В моем случае
64. ZLENKO 04.07.13 17:03 Сейчас в теме
(62) Re:аниматор, судя по симптомам у вас быстро устаревает статистика - настройте задание.
У меня например каждые 15 минут выполняется:

USE [workbase]
GO
EXEC SP_UPDATESTATS;
GO
DBCC FREEPROCCACHE;
GO

Все счастливы :-)
adhocprog; Re:аниматор; +2 Ответить
65. Re:аниматор 424 05.07.13 06:41 Сейчас в теме
(64) Спасибо, проверю каждые 15 минут! У нас каждую ночь идет обслуживание БД, обновление статистики и т.д. делается часов 8 обслуживание

Статистика обновляется каждую ночь 1 раз, проверил логи в обслуживание 2 часа тратится на выполнение этого задания, не будет ли завалом при каждые 15 минут?
66. arteast 100 08.07.13 01:57 Сейчас в теме
Что самое забавное, без этого изменения перепроводка документа ОРП занимала 5-40 минут в зависимости от объёма строк (розничная торговля косметикой и бытхимом) ЧТо касается восстановления партий за месяц - суток не хватало. Сейчас же за сутки партии восстанавливаются за 8-10 месяцев. При чём возрастания времени как у (62) не наблюдается.
Для меня - это однозначно показатель)
Конфа УТ 10.3, платформа 8.1, сервак на SSD с секционированием данных по годам (каждый год на отдельном SSD)
68. Re:аниматор 424 08.07.13 05:30 Сейчас в теме
(66) MS SQL 32 или 64 бит? Версия?
69. arteast 100 08.07.13 05:53 Сейчас в теме
(68) Re:аниматор, 64 -bit это винда. Насчёт дистрибутива скуля не в курсе.
После перестроения индексов минут 3-10 минут, но уже на след день опять более получаса проводится ОРП(
До внедрения этого кода.
85. djserega 252 22.07.14 00:04 Сейчас в теме
(61) Не будет ли проблем с одновременным проведением разных документов разными пользователями с одинаковыми товарами? Странно почему до сих пор 1С не переделало этот запрос... Наверное собака всё-таки где-то зарыта?!
71. adhocprog 1173 18.07.13 16:28 Сейчас в теме
72. Shrek2015 18.07.13 22:17 Сейчас в теме
73. Fominro 14.08.13 15:30 Сейчас в теме
И от меня спасибо за статью, помогло.
74. jefjef 6 20.09.13 15:52 Сейчас в теме
У нас серьезная проблема с проведением по партиям, в списанных товарах около 300 тыс. записей за 5 лет работы, за последний год уже около 70 тыс.

Проведение по партиям бух с марта по сентябрь занимает больше 2 часов, железо свежее, скуль 2008 и 64 гига оперативы, все 64 бита, рэйд в порядке, сервер охлаждается принудительно, в этом направлении вопросов нет.

Стандарное УПП.

35% времени обработки занимает выполнение запроса в ПолучитьДеревоПартийНаСкладахБух

Занялся проблемой оптимизации кода, наткнулся на эту тему.

После рекомендованного в этой теме создания временной таблицы СписанныеТовары - выполнение запроса стало занимать 45% времени обработки. Это навело на мысль что создание временной таблицы и дальнейшее ее юзанье в запросе не есть гуд.

Проверил эту мыслю - выкинул из запроса временные таблицы СписанныеТовары и стандартную уппшную ПартииТоваровНаСкладах, а также убрал нафиг из параметров ПартииТоваровНаСкладахБухгалтерскийУчет.Остатки( запросики по условию на номенклатуру и склад из списанных товаров, в них нет понту - все равно со списанными товарами идет внутреннее соединение.

В результате этих манипуляций получаю один запрос ВЫБРАТЬ на две таблицы с внутренним соединением между собой.

После запуска проведения по партиям запрос отнимает всего 20% времени выполнения и на первое место по нагрузке выходит ДвиженияРегистра.Записать(Истина); Проведение проводится за час и главбух танцует от радости.

Со временем записи движений уже спорить сложно, что есть то есть. Быстрее не будет.

Так вот какой я для себя сделал вывод: чем запрос проще, тем он быстрее. Чем меньше в нем конструкций ВЫБРАТЬ, тем меньше манипуляций делает SOL сервер. Не надо решать за SQL как и в какой последовательности ему работать, нужно просто запросить что нужно.

Думаю оптимизации запросов в виде временных таблиц могут быть полезны для файлового режима, ткнуть платформу носом что сначала сделай то, а потом это - может иметь смысл. Но файловый режим и упп вещи слабо совместимые.
taasha25; ZLENKO; +2 Ответить
75. Gilev.Vyacheslav 1840 24.09.13 04:31 Сейчас в теме
(74) jefjef, готовы Вам помочь переписать код на более эффективное использование ваших аппаратных ресурсов, вот пример нашего опыта http://www.gilev.ru/teremok/
76. jefjef 6 24.09.13 10:35 Сейчас в теме
(75) Gilev.Vyacheslav, спасибо за предложение, в примере Вашего опыта не написано ничего, кроме благодарности за троекратное ускорение проведения по партиям, а троекратного ускорения я добился и без посторонней помощи, причем делюсь здесь своим опытом бесплатно, а не за 80 тыс. руб.
31337; jan27; Dead_Gamer; +3 Ответить
79. Gilev.Vyacheslav 1840 07.11.13 00:51 Сейчас в теме
(75) Gilev.Vyacheslav, ускорим МИНИМИУМ в 3 раза (а может и больше), после того как вы ускорить больше не сможете
за бесплатные советы ни кто ответственности не несет, а мы подписываем договор и гарантируем результат
если эта статья не обеспечит желаемого результата, обращайтесь
80. AlexO 128 07.11.13 16:37 Сейчас в теме
(79) Gilev.Vyacheslav,
Статья обеспечивает наглядный результат, так как тут исправлен явный косяк 1С в типовой УПП, коих море разливанное. Автор оптимизировал то, что было на поверхности и само просилось исправиться - сделал запрос через ВТ, что для слабых серверов - самое то.
И получил отличный результат.
Для мощных машие это, может, и не актуально - но там затыки в других местах.
В том числе, наверняка и в подобных этому.
77. vis_tmp 30 05.10.13 20:37 Сейчас в теме
У меня на УТ 10.3 подтвердилсь - ускорение есть и существенное.
Спасибо автору!
78. vis_tmp 30 05.10.13 20:38 Сейчас в теме
+(77)База файловая, за 2,5 года, объёмом в 15 Гб
81. belovo3000 41 29.11.13 08:49 Сейчас в теме
Огромный респект! Без этого когда обработка проведения по партиям занимала около 9 часов сейчас все провелось за 2 часа.
+1
82. lesenoklenok 23 03.03.14 16:00 Сейчас в теме
Спасибо за пост! Если бы 1с сразу все делали оптимизированным, то не было бы столько критикующих за то что 1С тормозит. Некоторые запросы и куски кода можно было бы оптимизировать самому, но тогда начинаются проблемы с тем что в дальнейшем нужно конфигурацию обновить. И если текущий программист , который вносил изменения, сразу поймет, что этот кусок кода не стоит заменять на типовой, то другой пришедший программист на его место может не понять зачем эти изменения и при обновлении долго и мучительно думать стоит ли его заменить на типовой код или оставить. Вот по этому желательно чтобы 1С со своей стороны тоже оптимизировала старый код.
83. olbu 29.04.14 14:24 Сейчас в теме
Попробовал на тестовой (Файловый вариант) внести эти доработки, скорость даже визуально заметна... Попробовал добавить в рабочую SQL: все же время проведения уменьшилось...
84. hanio 50 08.05.14 08:16 Сейчас в теме
Именно частым обновлением статистики точечных регистров мы и спасались но все до поры до времени, сейчас буду пробовать ваш метод применить, спасибо за информацию.
86. Anzati 18.08.14 13:58 Сейчас в теме
может, кто подскажет по данному запросу, проблема такова:
в консоли запросов этот запрос выполняется за 50 мс, при проведении РТиУ же строчка

Возврат Запрос.Выполнить().Выгрузить(ОбходРезультатаЗапроса.ПоГруппировкам);

занимает порядка 40 секунд. Документ на 3 строчки. УТ 10.3, клиент-серверный вариант.
Не могу понять, откуда такая разница во времени выполнения.
87. ZLENKO 18.08.14 15:07 Сейчас в теме
(86) Anzati, "Не могу понять, откуда такая разница во времени выполнения. "

А если просто Возврат Запрос.Выполнить().Выгрузить(); ?
88. Anzati 18.08.14 17:18 Сейчас в теме
(87) ZLENKO.PRO, пробовал, разницы нет
89. Fominro 27.10.14 16:35 Сейчас в теме
Спасибо, способ помог. Действительно с 15 минут время проведения документа сократилось до одной минуты.
90. Silenser 512 29.10.14 16:50 Сейчас в теме
Пришлось на этой неделе озадачиться, т.к. проведение возвратов блокировало пользователей. Индексы были фрагментированы до 30%.
Тоже пришел к выводу, что нужно оптимизировать запросы получения деревьев партий по УУ и БУ. Но я сделал в алгоритме отдельную веточку под наши параметры учета, чтобы не сильно корежить типовой алгоритм, заодно поменял систему поиска партий в функции ПолучитьСтрокуОстатковПартий, т.к. используемый метод НайтиСтроки - крайне медленный, переделал на поиск по индексированной строке (содержащей значения нескольких колонок) методом Найти. Получилось ускорить получение дерева УУ - на 43%, дерева БУ - на 3% (по сути в пределах погрешности, ну и нужно учитывать, что на создание временной таблицы нужно время), затраты на поиск строк улучшил на 81%. Отдал на тестирование в отдел сопровождения.
Если ошибок в учете не найдут, опишу, что менял.
91. Wrols 78 26.11.14 11:29 Сейчас в теме
Антон, спасибо за публикацию!

Вы пишите: "На текущий момент не рекомендуется использовать в запросе соединение с подзапросом".
Поясните, пожалуйста, какая именно конструкция не рекомендуется
92. insurgut 196 07.05.15 12:31 Сейчас в теме
Ут 10.3, ордерная система, при проведении приходного ордера с видом операции Перемещение - выполнение запроса зависает.

Интересно, что запрос:
ВЫБРАТЬ
    *
ПОМЕСТИТЬ СписанныеТовары
ИЗ
    РегистрСведений.СписанныеТовары
ГДЕ
    Регистратор В (&ОсновнойДокумент, &Ссылка)
Показать


в случае, когда ОсновнойДокумент <> Ссылка выполняется крайне долго.

Сделал так:
ВЫБРАТЬ
	*
ПОМЕСТИТЬ СписанныеТовары
ИЗ
	(ВЫБРАТЬ
		*
	ИЗ
		РегистрСведений.СписанныеТовары КАК СписанныеТовары
	ГДЕ
		СписанныеТовары.Регистратор = &ОсновнойДокумент
	
	ОБЪЕДИНИТЬ ВСЕ
	
	ВЫБРАТЬ
		*
	ИЗ
		РегистрСведений.СписанныеТовары КАК СписанныеТовары
	ГДЕ
		СписанныеТовары.Регистратор = &Ссылка) КАК ВложенныйЗапрос

ИНДЕКСИРОВАТЬ ПО
	Номенклатура
Показать

Конкретно этот кусок выполняется 36 тысячных секунды против 36 секунды для конкретного документа.

Что я делаю не так? Возможно, что стоит чуть изменить код для при использовании ордерной системы, или приведенный мною код будет корректно работать и для случая, когда ОсновнойДокумент = Ссылка?
93. insurgut 196 07.05.15 13:18 Сейчас в теме
Очешуеть у меня после этого перепроведение партий полетело со скоростью космического корабля =)

Все актуально для файловой базы, на сервере пока не тестировал.
94. insurgut 196 07.05.15 13:58 Сейчас в теме
А с возвратами кто-нибудь заморачивался? Крайне долго проводятся, гораздо дольше отчетов о розничных продажах.

Затык процедуре ПодготовитьТаблицуЗаписейОснования модуля УправлениеЗапасамиПартионныйУчет тут:

ЗапросПоВозвратам = Новый Запрос;

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

ЗапросПоВозвратам.УстановитьПараметр("ДокументПартии",ДокументПартии);

СтруктураРеквизитовДокумента = Новый Структура("Дата");
ПолучитьРеквизитыОбъекта(ДокументПартии, СтруктураРеквизитовДокумента);
МоментНач = Новый МоментВремени(СтруктураРеквизитовДокумента.Дата,ДокументПартии);
МоментКон = Новый МоментВремени(СтруктураШапкиДокумента.Период,СтруктураШапкиДокумента.Регистратор);

ЗапросПоВозвратам.УстановитьПараметр("МоментНач",МоментНач);
ЗапросПоВозвратам.УстановитьПараметр("МоментКон",МоментКон);
ЗапросПоВозвратам.УстановитьПараметр("ВозвратТекущегоМесяца", Перечисления.КодыОперацийПартииТоваров.ВозвратОтПокупателяТекущийМесяц);

// Изменим текст запроса, если учет отличается от управленческого
Если СтрУчет <> "Управленческий" тогда
ЗапросПоВозвратам.Текст = СтрЗаменить(ЗапросПоВозвратам.Текст,".ПартииТоваровНаСкладах",".ПартииТоваровНаСкладах"+СтрУчет+"Учет");
КонецЕсли;

РезультатЗапроса = ЗапросПоВозвратам.Выполнить();
Показать
95. ZLENKO 382 07.05.15 16:42 Сейчас в теме
(94) insurgut,

Я думаю проблемное место в "ПО СписанныеТовары.Регистратор = ПартииТоваровНаСкладах.Регистратор"
Можно попробовать отобрать сначала в временную таблицу "ГДЕ ВозвратТоваровОтПокупателя.Товары.ДокументПартии = &ДокументПартии", а потом с ней соединять.
96. insurgut 196 07.05.15 17:48 Сейчас в теме
(95) ZLENKO, что-то вроде такого?

ВЫБРАТЬ
	ВозвратТоваровОтПокупателя.Ссылка,
	ВозвратТоваровОтПокупателя.МоментВремени
ПОМЕСТИТЬ Возвраты
ИЗ
	Документ.ВозвратТоваровОтПокупателя КАК ВозвратТоваровОтПокупателя
ГДЕ
	ВозвратТоваровОтПокупателя.Товары.ДокументПартии = &ДокументПартии
	И ВозвратТоваровОтПокупателя.МоментВремени > &МоментНач
	И ВозвратТоваровОтПокупателя.МоментВремени < &МоментКон
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	ПартииТоваровНаСкладах.Номенклатура КАК Номенклатура,
	ПартииТоваровНаСкладах.ХарактеристикаНоменклатуры КАК ХарактеристикаНоменклатуры,
	ПартииТоваровНаСкладах.СерияНоменклатуры КАК СерияНоменклатуры,
	ПартииТоваровНаСкладах.ДокументОприходования КАК ДокументОприходования,
	ВЫБОР
		КОГДА ПартииТоваровНаСкладах.КодОперации = &ВозвратТекущегоМесяца
			ТОГДА -ПартииТоваровНаСкладах.Количество
		ИНАЧЕ ПартииТоваровНаСкладах.Количество
	КОНЕЦ КАК Количество,
	ВЫБОР
		КОГДА ПартииТоваровНаСкладах.КодОперации = &ВозвратТекущегоМесяца
			ТОГДА -ПартииТоваровНаСкладах.Стоимость
		ИНАЧЕ ПартииТоваровНаСкладах.Стоимость
	КОНЕЦ КАК Стоимость,
	ПартииТоваровНаСкладах.НомерСтрокиСписанныхТоваров
ИЗ
	Возвраты КАК ВозвратыПокупателей
		ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ПартииТоваровНаСкладах КАК ПартииТоваровНаСкладах
			ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СписанныеТовары КАК СписанныеТовары
			ПО (СписанныеТовары.Регистратор = ПартииТоваровНаСкладах.Регистратор)
				И (СписанныеТовары.ДокументПартии = &ДокументПартии)
				И (СписанныеТовары.НомерСтроки = ПартииТоваровНаСкладах.НомерСтрокиСписанныхТоваров)
		ПО (ПартииТоваровНаСкладах.Регистратор = ВозвратыПокупателей.Ссылка)
Показать
97. ZLENKO 382 07.05.15 18:00 Сейчас в теме
(96) insurgut, "что-то вроде такого?"

Ага. Я думаю там оптимизатор запроса спотыкается на составном типе при соединении.
98. insurgut 196 07.05.15 18:05 Сейчас в теме
(97) ZLENKO, нет, все-таки узкое место именно внутреннее соединение... Как бы отобрать записи регистров во временную таблицу только для регистраторов, которые мы получаем тут:
ВЫБРАТЬ
ВозвратТоваровОтПокупателя.Ссылка,
ВозвратТоваровОтПокупателя.МоментВремени
ПОМЕСТИТЬ Возвраты
ИЗ
Документ.ВозвратТоваровОтПокупателя КАК ВозвратТоваровОтПокупателя
ГДЕ
ВозвратТоваровОтПокупателя.Товары.ДокументПартии = &ДокументПартии
И ВозвратТоваровОтПокупателя.МоментВремени > &МоментНач
И ВозвратТоваровОтПокупателя.МоментВремени < &МоментКон
99. insurgut 196 07.05.15 18:12 Сейчас в теме
Итак, получил в итоге запрос, который выполняется 1,6 секунды против стандартного запроса, который выполняется 4,8 секунды:
ВЫБРАТЬ
	ВозвратТоваровОтПокупателя.Ссылка,
	ВозвратТоваровОтПокупателя.МоментВремени
ПОМЕСТИТЬ ВозвратТоваровОтПокупателя
ИЗ
	Документ.ВозвратТоваровОтПокупателя КАК ВозвратТоваровОтПокупателя
ГДЕ
	ВозвратТоваровОтПокупателя.Товары.ДокументПартии = &ДокументПартии
	И ВозвратТоваровОтПокупателя.МоментВремени > &МоментНач
	И ВозвратТоваровОтПокупателя.МоментВремени < &МоментКон
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	СписанныеТовары.Регистратор,
	СписанныеТовары.НомерСтроки
ПОМЕСТИТЬ СписанныеТовары
ИЗ
	РегистрСведений.СписанныеТовары КАК СписанныеТовары
ГДЕ
	СписанныеТовары.ДокументПартии = &ДокументПартии
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	ПартииТоваровНаСкладах.Номенклатура КАК Номенклатура,
	ПартииТоваровНаСкладах.ХарактеристикаНоменклатуры КАК ХарактеристикаНоменклатуры,
	ПартииТоваровНаСкладах.СерияНоменклатуры КАК СерияНоменклатуры,
	ПартииТоваровНаСкладах.ДокументОприходования КАК ДокументОприходования,
	ВЫБОР
		КОГДА ПартииТоваровНаСкладах.КодОперации = &ВозвратТекущегоМесяца
			ТОГДА -ПартииТоваровНаСкладах.Количество
		ИНАЧЕ ПартииТоваровНаСкладах.Количество
	КОНЕЦ КАК Количество,
	ВЫБОР
		КОГДА ПартииТоваровНаСкладах.КодОперации = &ВозвратТекущегоМесяца
			ТОГДА -ПартииТоваровНаСкладах.Стоимость
		ИНАЧЕ ПартииТоваровНаСкладах.Стоимость
	КОНЕЦ КАК Стоимость,
	ПартииТоваровНаСкладах.НомерСтрокиСписанныхТоваров
ИЗ
	ВозвратТоваровОтПокупателя КАК ВозвратТоваровОтПокупателя
		ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ПартииТоваровНаСкладах КАК ПартииТоваровНаСкладах
			ВНУТРЕННЕЕ СОЕДИНЕНИЕ СписанныеТовары КАК СписанныеТовары
			ПО (СписанныеТовары.Регистратор = ПартииТоваровНаСкладах.Регистратор)
				И (СписанныеТовары.НомерСтроки = ПартииТоваровНаСкладах.НомерСтрокиСписанныхТоваров)
		ПО (ПартииТоваровНаСкладах.Регистратор = ВозвратТоваровОтПокупателя.Ссылка)
Показать
Оставьте свое сообщение

См. также

Весёлые картинки о работе Performance Monitor на Windows Server 2016 Std по мотивам расследования потери производительности на базе 1С 17

Статья Системный администратор Нет файла v8 Windows Бесплатно (free) Производительность и оптимизация (HighLoad)

Данная публикация посвящена одной особенности Performance Monitor на Windows Server 2016 Std. Как понимать графики Performance Monitor на Windows Server 2016 Std при расследовании проблем в работе 1С.

22.10.2019    2805    EugeneSemyonov    10       

Перенос документов, остатков и справочников КА 1.1 => КА 2 / УТ 11. Обновлено до КА 2.4.10.х и УТ 11.4.10.х! Промо

Более 130 компаний выполнили переход на КА 2 или УТ 11 с помощью нашей разработки! Позволяет перенести не только остатки и справочники (как типовая обработка), но и документы за нужный период времени. Предоставляем техподдержку, оперативно исправляем замечания, выпускаем обновления при выходе новых релизов программ 1С. Вы можете проверить разработку до покупки: сделаем бесплатный тестовый перенос из вашей базы КА 1.1 и предоставим доступ к базе-результату через веб-клиент!

29700 руб.

Мониторинг высоконагруженной системы 38

Статья Системный администратор Программист Нет файла v8 Бесплатно (free) Производительность и оптимизация (HighLoad) Администрирование данных 1С

Высоконагруженной системе (более 8000 клиентских сессий) мониторинг необходим. Про опыт использования инструментов для мониторинга – самописной системы информирования, написанной на C#, и конфигурации «Центр контроля качества» в связке с системой отображения данных Grafana, на конференции Infostart Event 2018 Education рассказал Олег Репников.

13.09.2019    4811    Repich    4       

Новый раздел на Инфостарте - Electronic Software Distribution Промо

Инфостарт напоминает: на нашем сайте можно купить не только ПО, связанное с 1С. В нашем арсенале – ESD-лицензии на ПО от ведущих вендоров: Microsoft, Kaspersky, ESET, Dr.Web, Аскон и другие.

  • Низкие цены, без скрытых платежей и наценок
  • Оперативная отгрузка
  • Возможность оплаты с личного счета (кешбек, обмен стартмани на рубли и т.п.)
  • Покупки идут в накопления для получения скидочных карт лояльности Silver (5%) и Gold (10%)

Использование Zabbix для сбора информации о серверных вызовах и управляемых блокировках с сервера 1С Предприятия, работающего на платформе GNU/Linux 75

Статья Системный администратор Программист Нет файла v8 Linux Бесплатно (free) Администрирование данных 1С Zabbix

Описанные в данном опусе механизмы ни в коей мере не противопоставляются тому, что реализует КИП от 1С или какие-либо другие инструменты (решения)! Это всего лишь еще один взгляд на "проблему", который может быть полезен в некоторых ситуациях.

10.09.2019    9373    Sloth    11       

Перенос данных КА 1.1 / УПП 1.3 => БП 3.0 (перенос остатков, документов и справочников из "1С:Комплексная автоматизация 1.1" / УПП 1.3 в "1С:Бухгалтерия 3.0"). Обновлен до версий КА 1.1.115.х, УПП 1.3.127.х! Промо

Разработка позволяет перенести остатки по всем счетам бух.учета в программу "1С:Бухгалтерия предприятия 8", ред. 3.0 на выбранную дату начала ведения учета. Также переносятся документы за период и вся необходимая справочная информация. Правила оперативно обновляю при выходе новых релизов. Рассылка обновлений правил бесплатно в течение 12 месяцев. Есть видеодемонстрация проведения переноса данных. Конфигурации при использовании обмена остаются полностью типовыми. Перенос данных возможен в Бухгалтерию 3.0 версии ПРОФ, КОРП или базовую.

24700 руб.

Анализ производительности APDEX 65

Отчеты и формы Системный администратор Программист Внешний отчет (ert,erf) v8 1cv8.cf Бесплатно (free) Производительность и оптимизация (HighLoad)

Отчет для просмотра и анализа замеров производительности в конфигурациях на базе БСП.

31.08.2019    4504    93    YPermitin    7       

Неочевидные проблемы производительности: важность системного подхода при анализе 50

Статья Программист Нет файла v8 Россия MS SQL Бесплатно (free) Производительность и оптимизация (HighLoad)

Часто программисты и 1С-ники сталкиваются с совершенно необъяснимыми на первый взгляд проблемами. Но это потому, что их внимание направлено только на один сегмент системы, а не на всю систему полностью. О том, почему нужно стараться смотреть на ситуацию комплексно, рассказал специалист по производительности компании SOFTPOINT Александр Денисов.

19.07.2019    5201    Филин    12       

Перенос данных БП 3.0 => УТ 11 / КА 2 / ERP 2 (ЕРП) (перенос остатков, документов и справочной информации из "1С:Бухгалтерия предприятия 8", ред.3.0). Обновлено до БП 3.0.73.х, УТ 11.4.10.х, КА 2.4.10.х., ERP 2.4.10.х! Промо

Переносятся документы за выбранный период, справочная информация и остатки по счетам бух. учета в программу УТ 11 / КА 2 / ЕРП 2 (ERP). Переносятся все возможные виды операций ввода остатков на нужную дату. Есть отбор по периоду переноса документов и фильтр по организации, доступен выбор даты ввода остатков. Если нужно переносить что-то дополнительно, то обычно бесплатно добавляем это в перенос . Смотрите видеодемонстрацию со звуком - советами по переносу и рекомендациями настройки программ.

29700 руб.

Ловля блокировок на связке "Microsoft SQL server - 1С" 38

Статья Системный администратор Программист Нет файла v8 v8::blocking MS SQL Бесплатно (free) Производительность и оптимизация (HighLoad)

Материал относится к базам данных на связке «1С - MS SQL Server». Один из способов отлова блокировок в бд 1С . Переход к управляемым блокировкам через режим "Автоматический и управляемый".

16.07.2019    4769    fhqhelp    0       

Анти-оптимизация: как мы ускорили запрос в 4 раза, сделав его неоптимальным 58

Статья Программист Нет файла v8 Бесплатно (free) Производительность и оптимизация (HighLoad) Практика программирования Решение задач на 1С:Специалист Разработка

В этой статье приведен пример неочевидной "оптимизации" запроса, которая противоречит всем правилам, описанным в книгах для подготовки к сертификации "1С:Эксперт по технологическим вопросам", а также преподаваемым на курсах подготовки экспертов.

02.07.2019    6958    igordynets    119       

Очный семинар по регулярному менеджменту Александра Фридмана "Вы или Хаос", 12 декабря 2019 г. , Санкт-Петербург Промо

Семинар по регулярному менеджменту от Александра Фридмана для собственников, первых лиц и топов. Технология управленческого планирования, комплексного управления временем и другими ресурсами, выполнением поручений, делами, информацией, контактами (встречи-звонки-почта).

от 11000 до 29000 рублей

Ускорение чтения правил обмена в УПП 1.3 в 20 раз! 70

Статья Программист Нет файла v8 1cv8.cf Бесплатно (free) Производительность и оптимизация (HighLoad)

Способ оптимизации чтения правил обмена конвертации данных. Может понадобиться при большом размере правил и высокой периодичности обмена.

27.06.2019    5870    YPermitin    16       

Программы для исполнения 54-ФЗ Промо

С 01.02.2017 контрольно-кассовая техника должна отправлять электронные версии чеков оператору фискальных данных - правила установлены в 54-ФЗ ст.2 п.2. Инфостарт предлагает подборку программ, связанных с применением 54-ФЗ, ККТ и электронных чеков.

Хотите снизить нагрузку на процессор сервера в 2 раза? 21

Статья Системный администратор Программист Нет файла v8 Windows Бесплатно (free) Производительность и оптимизация (HighLoad)

В статье рассмотрено влияние частого запуска регламентных заданий на процессор сервера 1С.

27.06.2019    5070    Дмитрий74Чел    6       

Непридуманные истории по оптимизации. История 1 82

Статья Системный администратор Программист Нет файла v8 1cv8.cf Россия Бесплатно (free) Производительность и оптимизация (HighLoad)

Первая статья из планируемого цикла об оптимизации приложений на базе 1С. Без теории. Одна практика.

13.06.2019    8484    Repich    117       

Подборка программ для взаимодействия с ЕГАИС Промо

ЕГАИС (Единая государственная автоматизированная информационная система) - автоматизированная система, предназначенная для государственного контроля за объёмом производства и оборота этилового спирта, алкогольной и спиртосодержащей продукции. Инфостарт рекомендует подборку проверенных решений для взаимодействия с системой.

Оптимизация: неэффективные запросы 7

Статья Программист Нет файла v8 1cv8.cf Бесплатно (free) Производительность и оптимизация (HighLoad) Практика программирования Разработка

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

13.06.2019    3386    slayer-ekb    10       

За 5 шагов добавляем мониторинг счетчиков производительности серверов MS SQL и 1С 91

Статья Системный администратор Программист Нет файла v8 Бесплатно (free) Статистика базы данных Производительность и оптимизация (HighLoad)

Мы расскажем и покажем, как добавить данные счетчиков производительности серверов 1С и MS SQL в нашу базу мониторинга за 15 минут. Приведем список наиболее важных из них, опишем основные особенности.

28.05.2019    9818    ivanov660    5       

Многофункциональная выгрузка из 1С: Управление торговлей (УТ11, УТ10) в Бухгалтерию предприятия (БП2, БП3) Промо

Хотите точно знать, что вы выгружаете? Хотите сворачивать товары по НДС или фильтровать товары по доп. реквизиту? Вы волшебник, которому необходимо превращать одних контрагентов в других? Хотите при выгрузке превратить группу товаров в один? Или просто нужен удобный OLE обмен между 1C Управление торговлей (ред. 11 или 10) и 1С Бухгалтерия предприятия (ред. 2 или 3). Тогда эта обработка для вас!

9500 руб.

Не думать о секундах свысока... 56

Статья Программист Нет файла v8 1cv8.cf Бесплатно (free) Производительность и оптимизация (HighLoad)

Несколько примеров оптимизации типовой конфигурации УТ11. Описанные приемы подходят для многих других конфигураций.

21.05.2019    5253    vasilev2015    21       

Альтернативная стратегия управления блокировками 45

Статья Программист Архив с данными v8 v8::blocking 1cv8.cf Россия MS SQL Бесплатно (free) Производительность и оптимизация (HighLoad)

Данная публикация освещает одну из альтернативных стратегий блокирования данных на уровне MS SQL Server, которая недоступна средствами 1С, но может быть весьма полезной. Разбирается практический пример.

20.05.2019    4643    zhichkin    15       

Перенос документов и справочников ERP 2 / КА 2 / УТ 11 => БП 3.0 Промо

Перенос позволяет настроить собственный обмен данными между указанными программами, альтернативный предлагаемому фирмой 1С. Предоставляем техподдержку по всем вопросам данного обмена. Можем подключиться к вам удаленно для разбора ситуаций. Оперативно обновляем при выходе новых релизов 1С. Бесплатные обновления в течение полугода.

19700 руб.

Как работают управляемые блокировки 122

Статья Программист Нет файла v8 Бесплатно (free) Производительность и оптимизация (HighLoad)

Все типовые конфигурации содержат ошибки, потому как управляемые блокировки в 1С слишком уж "управляемые", при понижении уровня изоляции про некоторые "нюансы" просто забыли. Для создания и эксплуатации качественной системы, которая способна поддерживать транзакционную целостность данных при параллельной работе, информацию в этой статье желательно знать, хотя, конечно, ничего особо нового я не открыл.

29.04.2019    14937    comol    198       

Странное потребление места на диске С 33

Статья Программист Нет файла v8 Бесплатно (free) Производительность и оптимизация (HighLoad)

Решение проблемы постоянного роста папки %AppData%/Local/Temp.

26.04.2019    11380    kuzyara    12       

Перенос данных УПП 1.3 => ERP 2 (ЕРП) / УТ 11 / КА 2.х (обработка переноса документов, остатков и справочников из "1С:Управление производственным предприятием, ред. 1.3" в ERP / УТ 11 / КА 2). Обновлен до УПП 1.3.127.х, КА 2.4.10.х и ERP 2.4.10.х! Промо

Обработка позволяет переносить из УПП 1.3 в ERP 2 документы за выбранный период и остатки. Типовая обработка от фирмы 1С документы не переносит. Также исправлены ошибки типовой обработки. При выходе новых релизов обновление высылается бесплатно в течение года. Разработка будет полезна фирмам-франчайзи, которые периодически выполняют такой перенос данных для заказчиков. Вы можете один раз приобрести обработку переноса, и потом бесплатно получать обновления при выходе новых релизов конфигураций 1С.

29700 руб.

Включение встроенного в платформу механизма "Копии базы данных" и использование "Дата Акселератора". Новый стандартный механизм использования баз OLAP в 1С 51

Статья Системный администратор Программист Нет файла v8 Россия Бесплатно (free) Производительность и оптимизация (HighLoad)

С версии 1С 8.3.14 в платформе появился новый функционал «Копии базы данных». В данной публикации я хочу рассказать, как включить использование данного механизма в платформе 1с и как его использовать для получения отчетов с копии базы данных, которая может быть вынесена на внешний сервер относительно текущей базы данных, а также как использовать систему «Дата акселератор», в которой база данных целиком размещена в оперативной памяти рабочего сервера кластера серверов «1С:Предприятия».

25.04.2019    9430    Elf1k    27       

5 простых шагов и 15 минут на разворачивание инструмента мониторинга проблем производительности базы 1С 203

Статья Системный администратор Программист Нет файла v8 Windows Бесплатно (free) Производительность и оптимизация (HighLoad)

В этой статье мы разберем механизм использования конфигурации "Анализ технологического журнала" на практике, и всего через 15 минут работы вы получите функциональный, удобный инструмент мониторинга проблем производительности базы 1С.

18.04.2019    20105    ivanov660    68       

Базовый курс для начинающих 1С-программистов. Пятый поток. Онлайн-курс с 12 февраля по 15 апреля 2020 г. Промо

Данный онлайн-курс является начальной ступенью по изучению базовых принципов программирования в системе “1С:Предприятие” и предназначен для обучения 1С-программированию “с нуля”.

4500/9500 рублей

Как разбить базу на файлы и не сойти с ума 108

Статья Системный администратор Программист Нет файла v8 Бесплатно (free) Производительность и оптимизация (HighLoad)

Разбиение базы данных 1C на файлы и последующее сопровождение. Нюансы, грабли и прочее.

06.04.2019    10367    YPermitin    29       

Как одно изменение конфигурации PostgreSQL улучшило производительность медленных запросов в 50 раз 125

Статья Системный администратор Программист Нет файла v8 1cv8.cf Россия Бесплатно (free) Производительность и оптимизация (HighLoad)

В связи с санкциями и другими событиями сейчас все более и более актуальна тема перевода ПО компаний на отечественное и свободное программное обеспечение. Одной из самых востребанных СУБД на рынке на данный момент является PostgreSQL - надежная, высокопроизводительная и хорошо масштабируемая СУБД, которая является прямым конкуретном таким крупным компаниям с их топовыми продуктами, как Oracle, IBM и Microsoft. Однако каждый, кто переходит на PostgreSQL, сталкивается с трудностями, прежде всего с настройкой и производительностью. Не обошли проблемы с производительностью "слоника" и меня. Предлагаю вашему вниманию перевод статьи "How a single PostgreSQL config change improved slow query performance by 50x" автора Pavan Patibandla, которая мне помогла улучшить производительность PostgreSQL.

18.03.2019    11138    w.r.    23       

С 2020 года сервис «Продление поддержки конфигурации 1С:УПП» подорожает вдвое Промо

Успейте продлить поддержку УПП до повышения цен! Фирма «1С» предупредила об изменении цен на сервис «Продление поддержки конфигурации "1С:Управление производственным предприятием"». С 1 января 2020 года сервис подорожает в два раза.

Простое программное решение проблем с блокировками SQL 17

Статья Системный администратор Программист Нет файла v8 v8::blocking 1cv8.cf Россия Бесплатно (free) Производительность и оптимизация (HighLoad)

Описание одного из способов программного решения проблемы блокировок при проведении документов в клиент-серверной 1С.

06.03.2019    6731    dmitrydemenew    38