Данную тему я поднимал на другом форуме, но т.к. являюсь её автором и нашел выход из сложившейся ситуации, то позволю себе разместить здесь
ОПИСАНИЕ ПРОБЛЕМЫ
УТ 2.3.2.6 для Украины, но и в российской версии так же присутствует проблемный запрос.
Платформа 8.1.12.101, MS SQL Server 2005, Windows Server 2003 R2 Enterprise x64 Edition SP2
Компьютер: Intel® Xeon® CPU E5430 @ 2.66GHz, 7.99GB ОЗУ
Рекомендации по регламентным операциям для MS SQL Server выполнены:
• Обновление статистик
• Очистка процедурного КЭШа
• Дефрагментация индексов
• Реиндексация таблиц базы данных
В параметрах учетной политики стоит флаг "Списывать партии при проведении документов".
Снятие его решает проблему медленного проведения документа, но не решает проблемы медленного восстановления последовательности по партиям.
Регистры накопления рассчитаны на 31.12.2008
Проводится документ перемещения товаров от 01.10.2007 . Количество строк 546.
Замер производительности показал, что проведение в клиент-серверном варианте
в 2,67!!! раз выполняется дольше, чем в файловом.
Файловый вариант:
ОбщийМодуль.ОбщегоНазначения СтрокаДвижения.НаборЗаписей.Записать(); - 31,542450 сек
ОбщийМодуль.УправлениеЗапасамиПартионныйУчет Возврат Запрос.Выполнить().Выгрузить(ОбходРезультатаЗапроса.ПоГруппировкам) - 30,270411 сек
Клиент - серверный вариант:
ОбщийМодуль.ОбщегоНазначения СтрокаДвижения.НаборЗаписей.Записать(); - 5,217208 сек ОбщийМодуль.УправлениеЗапасамиПартионныйУчет Возврат Запрос.Выполнить().Выгрузить(ОбходРезультатаЗапроса.ПоГруппировкам); - 160,466609 сек
Исследование проведения документа в парсере SQL показали что бульшую часть времени уходит на выполнение запроса, сформированного в 1С. Формируется этото запрос в процедуре ЗаполнитьЗапросПартийНаСкладахУпр общего модуля УправлениеЗапасамиПартионныйУчет.
там есть участок:
|ИЗ
| РегистрСведений.СписанныеТовары КАК СписанныеТовары
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрНакопления.ПартииТоваровНаСкладах.Остатки(
| &Дат,
| Номенклатура В
| (ВЫБРАТЬ
| РегистрСведений.СписанныеТовары.Номенклатура
| ИЗ
| РегистрСведений.СписанныеТовары
| ГДЕ
| РегистрСведений.СписанныеТовары.Регистратор = &Ссылка)"
+ ?(ВестиПартионныйУчетПоСкладам, "
| И (Склад В
| (ВЫБРАТЬ
| РегистрСведений.СписанныеТовары.Склад
| ИЗ
| РегистрСведений.СписанныеТовары
| ГДЕ
| РегистрСведений.СписанныеТовары.Регистратор = &Ссылка)
| ИЛИ Склад = &ПустойСклад)", "") + ") КАК ПартииТоваровНаСкладах
Возврат Запрос.Выполнить().Выгрузить(ОбходРезультатаЗапроса.ПоГруппировкам)
выполняется меньше чем за 10 секунд против 160 в типовом запросе.
"
| Номенклатура В
| (ВЫБРАТЬ
| РегистрСведений.СписанныеТовары.Номенклатура
| ИЗ
| РегистрСведений.СписанныеТовары
| ГДЕ
| РегистрСведений.СписанныеТовары.Регистратор = &Ссылка)"
Вот код измененной процедуры:
Процедура ЗаполнитьЗапросПартийНаСкладахУпр(Запрос, ВестиПартионныйУчетПоСкладам,
СтратегияСтатусПартии, СпособОценкиМПЗ)
Запрос.Текст ="
|ВЫБРАТЬ
| СписанныеТовары.НомерСтрокиДокумента КАК НомерСтрокиДокумента,
| ПартииТоваровНаСкладах.Номенклатура,
| ПартииТоваровНаСкладах.ДокументОприходования КАК ДокументОприходования,
| ПартииТоваровНаСкладах.ДокументОприходования.Дата КАК ДокументОприходованияДата,
| ПартииТоваровНаСкладах.Склад,
| ПартииТоваровНаСкладах.ХарактеристикаНоменклатуры,
| ПартииТоваровНаСкладах.СерияНоменклатуры,
| ПартииТоваровНаСкладах.Качество,
| ПартииТоваровНаСкладах.Заказ,
| ПартииТоваровНаСкладах.КоличествоОстаток КАК Количество,
| ПартииТоваровНаСкладах.СтоимостьОстаток КАК Стоимость,
| ПартииТоваровНаСкладах.СтатусПартии,
| ВЫБОР
| КОГДА СписанныеТовары.СерияНоменклатуры = ПартииТоваровНаСкладах.СерияНоменклатуры
| ТОГДА 0
| ИНАЧЕ 1
| КОНЕЦ КАК ЧислоСерияНоменклатуры,
| ВЫБОР
| КОГДА СписанныеТовары.ДокументПартии = НЕОПРЕДЕЛЕНО
| ТОГДА 0
| ИНАЧЕ ВЫБОР
| КОГДА СписанныеТовары.ДокументПартии = ПартииТоваровНаСкладах.ДокументОприходования
| ТОГДА 0
| ИНАЧЕ 1
| КОНЕЦ
| КОНЕЦ КАК ЧислоДокументОприходования,
| ВЫБОР
| КОГДА СписанныеТовары.ЗаказПартии = НЕОПРЕДЕЛЕНО
| ТОГДА 0
| ИНАЧЕ ВЫБОР
| КОГДА ПартииТоваровНаСкладах.Заказ = &ПустойЗаказ
| ТОГДА 1
| ИНАЧЕ 0
| КОНЕЦ
| КОНЕЦ КАК ЧислоЗаказ,
| ВЫБОР
| КОГДА ПартииТоваровНаСкладах.СтатусПартии = &НаКомиссию
| ТОГДА 1
| ИНАЧЕ 0
| КОНЕЦ КАК ЧислоСтатусПартии
|ИЗ
| РегистрСведений.СписанныеТовары КАК СписанныеТовары
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрНакопления.ПартииТоваровНаСкладах.Остатки(&Дат, ) КАК ПартииТоваровНаСкладах
| ПО СписанныеТовары.Номенклатура = ПартииТоваровНаСкладах.Номенклатура
| И СписанныеТовары.ХарактеристикаНоменклатуры = ПартииТоваровНаСкладах.ХарактеристикаНоменклатуры
| И (ВЫБОР
| КОГДА ПартииТоваровНаСкладах.Качество = &ПустоеКачество
| ТОГДА ИСТИНА
| ИНАЧЕ ВЫБОР
| КОГДА СписанныеТовары.Качество = &ПустоеКачество
| ТОГДА ПартииТоваровНаСкладах.Качество = &КачествоНовый
| ИНАЧЕ ПартииТоваровНаСкладах.Качество = СписанныеТовары.Качество
| КОНЕЦ
| КОНЕЦ)
| И (ПартииТоваровНаСкладах.Склад = СписанныеТовары.Склад
| ИЛИ ПартииТоваровНаСкладах.Склад = &ПустойСклад)
| И (ВЫБОР
| КОГДА СписанныеТовары.ДопустимыйСтатус1 <> &ПустойСтатус
| ИЛИ СписанныеТовары.ДопустимыйСтатус2 <> &ПустойСтатус
| ИЛИ СписанныеТовары.ДопустимыйСтатус3 <> &ПустойСтатус
| ИЛИ СписанныеТовары.ДопустимыйСтатус4 <> &ПустойСтатус
| ТОГДА ПартииТоваровНаСкладах.СтатусПартии = &ПустойСтатус
| ИЛИ ПартииТоваровНаСкладах.СтатусПартии = &СтатусПартииПоОрдеру
| ИЛИ ПартииТоваровНаСкладах.СтатусПартии = СписанныеТовары.ДопустимыйСтатус1
| ИЛИ ПартииТоваровНаСкладах.СтатусПартии = СписанныеТовары.ДопустимыйСтатус2
| ИЛИ ПартииТоваровНаСкладах.СтатусПартии = СписанныеТовары.ДопустимыйСтатус3
| ИЛИ ПартииТоваровНаСкладах.СтатусПартии = СписанныеТовары.ДопустимыйСтатус4
| ИНАЧЕ ИСТИНА
| КОНЕЦ)
| И (ВЫБОР
| КОГДА СписанныеТовары.СписыватьТолькоПоЗаказу = ИСТИНА
| ТОГДА ВЫБОР
| КОГДА ПартииТоваровНаСкладах.Заказ <> СписанныеТовары.ЗаказПартии
| ТОГДА ВЫБОР
| КОГДА (НЕ СписанныеТовары.ЗаказПартии = НЕОПРЕДЕЛЕНО)
| ТОГДА ЛОЖЬ
| ИНАЧЕ ПартииТоваровНаСкладах.Заказ = &ПустойЗаказ
| КОНЕЦ
| ИНАЧЕ ИСТИНА
| КОНЕЦ
| ИНАЧЕ ВЫБОР
| КОГДА ПартииТоваровНаСкладах.Заказ <> СписанныеТовары.ЗаказПартии
| ТОГДА ПартииТоваровНаСкладах.Заказ = &ПустойЗаказ
| ИНАЧЕ ИСТИНА
| КОНЕЦ
| КОНЕЦ)
| И (СписанныеТовары.СерияНоменклатуры = ПартииТоваровНаСкладах.СерияНоменклатуры
| ИЛИ ПартииТоваровНаСкладах.СерияНоменклатуры = &ПустаяСерияНоменклатуры
| ИЛИ СписанныеТовары.КодОперацииПартииТоваров = &КодРезервирование),
| (ВЫБРАТЬ РАЗЛИЧНЫЕ
| СписанныеТовары.Номенклатура КАК Номенклатура
| ИЗ
| РегистрСведений.СписанныеТовары КАК СписанныеТовары
| ГДЕ
| СписанныеТовары.Регистратор = &Ссылка) КАК СписокТоваров,
| (ВЫБРАТЬ РАЗЛИЧНЫЕ
| СписанныеТовары.Склад КАК Склад
| ИЗ
| РегистрСведений.СписанныеТовары КАК СписанныеТовары
| ГДЕ
| СписанныеТовары.Регистратор = &Ссылка) КАК СписокСкладов
|ГДЕ
| СписанныеТовары.Регистратор = &ОсновнойДокумент
| И ПартииТоваровНаСкладах.Номенклатура В (СписокТоваров.Номенклатура)"
+?(ВестиПартионныйУчетПоСкладам, "
| И (ПартииТоваровНаСкладах.Склад В (СписокСкладов.Склад)
| ИЛИ ПартииТоваровНаСкладах.Склад = &ПустойСклад)","")+"
|
|УПОРЯДОЧИТЬ ПО
| ЧислоСерияНоменклатуры,
| ЧислоДокументОприходования,
| ЧислоЗаказ,
| ЧислоСтатусПартии" +
?(СтратегияСтатусПартии = Перечисления.СтретегииСписанияПартийТоваровПоСтатусам.СначалаПринятыеПотомСобств
енные, " Убыв", "") + ",
| ДокументОприходованияДата" + ?(СпособОценкиМПЗ = "ЛИФО", " Убыв","") + ",
| ДокументОприходования" + ?(СпособОценкиМПЗ = "ЛИФО", " Убыв","") + "
|ИТОГИ ПО
| НомерСтрокиДокумента
|";
КонецПроцедуры // ЗаполнитьЗапросПартийНаСкладахУпр()
У меня возникла таже самая проблема. Очень медленно получают остатки запросы по регистрам партий. Я пришел к такому же заключению, что и Вы, но при этом у меня возникает сомнение в необходимости этих условий по списку товаров и складов. Если я не ошибаюсь внутреннее соединение регистра "Списанные товары" и "Партии товаров на складах" решает вопрос и условия по товарам и складам.
Хотелось бы узнать, как у Вас сейчас происходит получение остатков по партиям (текст запроса) и правильные ли остатки получает этот запрос?
Сейчас у меня используется тот же принцип, что и описывается выше. Проблем с остатками и партиями не наблюдается. Если честно, то на счет Ваших саомнений не думал. Хотел повозможности оставить типовую логику, но оптимизировав её.
Я тоже оставил типовую логику. Просто из запроса убрал условия виртуальной таблицы "Остатки" по товарам и складам, при этом не добавлял в конце условие (как написано у Вас в запросе.
Запрос.Текст =
"ВЫБРАТЬ
| СписанныеТовары.НомерСтрокиДокумента КАК НомерСтрокиДокумента,
| ПартииТоваровНаСкладах.Номенклатура,
| ПартииТоваровНаСкладах.ДокументОприходования КАК ДокументОприходования,
| ПартииТоваровНаСкладах.ДокументОприходования.Дата КАК ДокументОприходованияДата,
| ПартииТоваровНаСкладах.Склад,
| ПартииТоваровНаСкладах.ХарактеристикаНоменклатуры,
| ПартииТоваровНаСкладах.СерияНоменклатуры,
| ПартииТоваровНаСкладах.Качество,
| ПартииТоваровНаСкладах.Заказ,
| ПартииТоваровНаСкладах.КоличествоОстаток КАК Количество,
| ПартииТоваровНаСкладах.СтоимостьОстаток КАК Стоимость,
| ПартииТоваровНаСкладах.СтатусПартии,
| ВЫБОР
| КОГДА СписанныеТовары.СерияНоменклатуры = ПартииТоваровНаСкладах.СерияНоменклатуры
| ТОГДА 0
| ИНАЧЕ 1
| КОНЕЦ КАК ЧислоСерияНоменклатуры,
| ВЫБОР
| КОГДА СписанныеТовары.ДокументПартии = НЕОПРЕДЕЛЕНО
| ТОГДА 0
| ИНАЧЕ ВЫБОР
| КОГДА СписанныеТовары.ДокументПартии = ПартииТоваровНаСкладах.ДокументОприходования
| ТОГДА 0
| ИНАЧЕ 1
| КОНЕЦ
| КОНЕЦ КАК ЧислоДокументОприходования,
| ВЫБОР
| КОГДА СписанныеТовары.ЗаказПартии = НЕОПРЕДЕЛЕНО
| ТОГДА 0
| ИНАЧЕ ВЫБОР
| КОГДА ПартииТоваровНаСкладах.Заказ = &ПустойЗаказ
| ТОГДА 1
| ИНАЧЕ 0
| КОНЕЦ
| КОНЕЦ КАК ЧислоЗаказ,
| ВЫБОР
| КОГДА ПартииТоваровНаСкладах.СтатусПартии = &НаКомиссию
| ТОГДА 1
| ИНАЧЕ 0
| КОНЕЦ КАК ЧислоСтатусПартии
|ИЗ
| РегистрСведений.СписанныеТовары КАК СписанныеТовары
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрНакопления.ПартииТоваровНаСкладах.Остатки(
| &Дат, ) КАК ПартииТоваровНаСкладах
| ПО СписанныеТовары.Номенклатура = ПартииТоваровНаСкладах.Номенклатура
| И СписанныеТовары.ХарактеристикаНоменклатуры = ПартииТоваровНаСкладах.ХарактеристикаНоменклатуры
| И (ВЫБОР
| КОГДА ПартииТоваровНаСкладах.Качество = &ПустоеКачество
| ТОГДА ИСТИНА
| ИНАЧЕ ВЫБОР
| КОГДА СписанныеТовары.Качество = &ПустоеКачество
| ТОГДА ПартииТоваровНаСкладах.Качество = &КачествоНовый
| ИНАЧЕ ПартииТоваровНаСкладах.Качество = СписанныеТовары.Качество
| КОНЕЦ
| КОНЕЦ)
| " + ?(ВестиПартионныйУчетПоСкладам, "И (ПартииТоваровНаСкладах.Склад = СписанныеТовары.Склад ИЛИ
| ПартииТоваровНаСкладах.Склад = &ПустойСклад)", "") + "
| И (ВЫБОР
| КОГДА СписанныеТовары.ДопустимыйСтатус1 <> &ПустойСтатус
| ИЛИ СписанныеТовары.ДопустимыйСтатус2 <> &ПустойСтатус
| ИЛИ СписанныеТовары.ДопустимыйСтатус3 <> &ПустойСтатус
| ИЛИ СписанныеТовары.ДопустимыйСтатус4 <> &ПустойСтатус
| ТОГДА ПартииТоваровНаСкладах.СтатусПартии = &ПустойСтатус
| ИЛИ ПартииТоваровНаСкладах.СтатусПартии = &СтатусПартииПоОрдеру
|
ИЛИ ПартииТоваровНаСкладах.СтатусПартии = СписанныеТовары.ДопустимыйСтатус1
| ИЛИ ПартииТоваровНаСкладах.СтатусПартии = СписанныеТовары.ДопустимыйСтатус2
| ИЛИ ПартииТоваровНаСкладах.СтатусПартии = СписанныеТовары.ДопустимыйСтатус3
| ИЛИ ПартииТоваровНаСкладах.СтатусПартии = СписанныеТовары.ДопустимыйСтатус4
| ИНАЧЕ ИСТИНА
| КОНЕЦ)
|
| И (ВЫБОР
| КОГДА СписанныеТовары.СписыватьТолькоПоЗаказу = ИСТИНА
| ТОГДА ВЫБОР
| КОГДА ПартииТоваровНаСкладах.Заказ <> СписанныеТовары.ЗаказПартии
| ТОГДА ВЫБОР
| КОГДА (НЕ СписанныеТовары.ЗаказПартии = НЕОПРЕДЕЛЕНО)
| ТОГДА ЛОЖЬ
| ИНАЧЕ ПартииТоваровНаСкладах.Заказ = &ПустойЗаказ
| КОНЕЦ
| ИНАЧЕ ИСТИНА
| КОНЕЦ
| ИНАЧЕ ВЫБОР
| КОГДА ПартииТоваровНаСкладах.Заказ <> СписанныеТовары.ЗаказПартии
| ТОГДА ПартииТоваровНаСкладах.Заказ = &ПустойЗаказ
| ИНАЧЕ ИСТИНА
| КОНЕЦ
| КОНЕЦ)
| И (СписанныеТовары.СерияНоменклатуры = ПартииТоваровНаСкладах.СерияНоменклатуры
| ИЛИ ПартииТоваровНаСкладах.СерияНоменклатуры = &ПустаяСерияНоменклатуры)
|ГДЕ
| СписанныеТовары.Регистратор = &ОсновнойДокумент
|
|УПОРЯДОЧИТЬ ПО
| ЧислоСерияНоменклатуры,
| ЧислоДокументОприходования,
| ЧислоЗаказ,
| ЧислоСтатусПартии" + ?(СтратегияСтатусПартии = Перечисления.СтретегииСписанияПартийТоваровПоСтатусам.СначалаПринятыеПотомСобств
енные, " Убыв", "") + ",
| ДокументОприходованияДата" + ?(СпособОценкиМПЗ = "ЛИФО", " Убыв","") + ",
| ДокументОприходования" + ?(СпособОценкиМПЗ = "ЛИФО", " Убыв","") + "
|ИТОГИ ПО
| НомерСтрокиДокумента";
Уже год прошел, а в типовых конфах этот запрос еще не изменили
Текст еще как-то оптимизировался?
Уже три прошло...
Спасибо, пригодился! Кстате, теперь нужно еще НДС и МоментВремени добавить в результат запроса.
В УПП для Украины, по крайней мере в 1.3.17 (текущий релиз), этот запрос сделан через временные таблицы. То ли в части типовых ошибку все же исправили, то ли в УПП ее и не было.
Выглядит это так:
Запрос.Текст = "
|ВЫБРАТЬ РАЗЛИЧНЫЕ
| РегистрСведений.СписанныеТовары.Номенклатура КАК Номенклатура
|ПОМЕСТИТЬ
| СписанныеТоварыНоменклатура
|ИЗ
| РегистрСведений.СписанныеТовары
|ГДЕ
| РегистрСведений.СписанныеТовары.Регистратор = &Ссылка
|
|;
|
|ВЫБРАТЬ РАЗЛИЧНЫЕ
| РегистрСведений.СписанныеТовары.Склад КАК Склад
|ПОМЕСТИТЬ
| СписанныеТоварыСклады
|ИЗ
| РегистрСведений.СписанныеТовары
|ГДЕ
| РегистрСведений.СписанныеТовары.Регистратор = &Ссылка
|
|;
|
|ВЫБРАТЬ
| СписанныеТовары.НомерСтрокиДокумента КАК НомерСтрокиДокумента,
| ПартииТоваровНаСкладах.Номенклатура,
| ПартииТоваровНаСкладах.ДокументОприходования КАК ДокументОприходования,
| "+ПараметрыЗапроса_ДатаОприходования.ДокОприходованияДата_Выбор+"
| ПартииТоваровНаСкладах.Склад,
| ПартииТоваровНаСкладах.ХарактеристикаНоменклатуры,
| ПартииТоваровНаСкладах.СерияНоменклатуры,
| ПартииТоваровНаСкладах.Качество,
| ПартииТоваровНаСкладах.Заказ,
| ПартииТоваровНаСкладах.КоличествоОстаток КАК Количество,
| ПартииТоваровНаСкладах.СтоимостьОстаток КАК Стоимость,
| ПартииТоваровНаСкладах.СтатусПартии,
| ВЫБОР
| КОГДА СписанныеТовары.СерияНоменклатуры = ПартииТоваровНаСкладах.СерияНоменклатуры
| ТОГДА 0
| ИНАЧЕ 1
| КОНЕЦ КАК ЧислоСерияНоменклатуры,
| ВЫБОР
| КОГДА СписанныеТовары.ДокументПартии = НЕОПРЕДЕЛЕНО
| ТОГДА 0
| ИНАЧЕ ВЫБОР
| КОГДА СписанныеТовары.ДокументПартии = ПартииТоваровНаСкладах.ДокументОприходования
| ТОГДА 0
| ИНАЧЕ 1
| КОНЕЦ
| КОНЕЦ КАК ЧислоДокументОприходования,
| ВЫБОР
| КОГДА СписанныеТовары.ЗаказПартии = НЕОПРЕДЕЛЕНО
| ТОГДА 0
| ИНАЧЕ ВЫБОР
| КОГДА ПартииТоваровНаСкладах.Заказ = &ПустойЗаказ
| ТОГДА 1
| ИНАЧЕ 0
| КОНЕЦ
| КОНЕЦ КАК ЧислоЗаказ,
| ВЫБОР
| КОГДА ПартииТоваровНаСкладах.СтатусПартии = &НаКомиссию
| ТОГДА 1
| ИНАЧЕ 0
| КОНЕЦ КАК ЧислоСтатусПартии
|ИЗ
| РегистрСведений.СписанныеТовары КАК СписанныеТовары
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрНакопления.ПартииТоваровНаСкладах.Остатки(
| &Дат, Организация = &Организация И
| Номенклатура В
| (ВЫБРАТЬ
| СписанныеТоварыНоменклатура.Номенклатура
| ИЗ
| СписанныеТоварыНоменклатура)" + ?(ВестиПартионныйУчетПоСкладам, "
| И (Склад В
| (ВЫБРАТЬ
| СписанныеТоварыСклады.Склад
| ИЗ
| СписанныеТоварыСклады) ИЛИ Склад = &ПустойСклад)", "") + ") КАК ПартииТоваровНаСкладах
| ПО СписанныеТовары.Номенклатура = ПартииТоваровНаСкладах.Номенклатура
| И СписанныеТовары.ХарактеристикаНоменклатуры = ПартииТоваровНаСкладах.ХарактеристикаНоменклатуры
| И (ВЫБОР
| КОГДА ПартииТоваровНаСкладах.Качество = &ПустоеКачество
| ТОГДА ИСТИНА
| ИНАЧЕ ВЫБОР
| КОГДА СписанныеТовары.Качество = &ПустоеКачество
| ТОГДА ПартииТоваровНаСкладах.Качество = &КачествоНовый
| ИНАЧЕ ПартииТоваровНаСкладах.Качество = СписанныеТовары.Качество
| КОНЕЦ
| КОНЕЦ)
| " + ?(ВестиПартионныйУчетПоСкладам, "И (ПартииТоваровНаСкладах.Склад = СписанныеТовары.Склад ИЛИ ПартииТоваровНаСкладах.Склад = &ПустойСклад)", "") + "
| И (ВЫБОР
| КОГДА СписанныеТовары.ДопустимыйСтатус1 <> &ПустойСтатус
| ИЛИ СписанныеТовары.ДопустимыйСтатус2 <> &ПустойСтатус
| ИЛИ СписанныеТовары.ДопустимыйСтатус3 <> &ПустойСтатус
| ИЛИ СписанныеТовары.ДопустимыйСтатус4 <> &ПустойСтатус
| ТОГДА ПартииТоваровНаСкладах.СтатусПартии = &ПустойСтатус
| ИЛИ ПартииТоваровНаСкладах.СтатусПартии = &СтатусПартииПоОрдеру
| ИЛИ ПартииТоваровНаСкладах.СтатусПартии = СписанныеТовары.ДопустимыйСтатус1
| ИЛИ ПартииТоваровНаСкладах.СтатусПартии = СписанныеТовары.ДопустимыйСтатус2
| ИЛИ ПартииТоваровНаСкладах.СтатусПартии = СписанныеТовары.ДопустимыйСтатус3
| ИЛИ ПартииТоваровНаСкладах.СтатусПартии = СписанныеТовары.ДопустимыйСтатус4
| ИНАЧЕ ИСТИНА
| КОНЕЦ)
|
| И (ВЫБОР
| КОГДА СписанныеТовары.СписыватьТолькоПоЗаказу = ИСТИНА
| ТОГДА ВЫБОР
| КОГДА ПартииТоваровНаСкладах.Заказ <> СписанныеТовары.ЗаказПартии
| ТОГДА ВЫБОР
| КОГДА (НЕ СписанныеТовары.ЗаказПартии = НЕОПРЕДЕЛЕНО)
| ТОГДА ЛОЖЬ
| ИНАЧЕ ПартииТоваровНаСкладах.Заказ = &ПустойЗаказ
| КОНЕЦ
| ИНАЧЕ ИСТИНА
| КОНЕЦ
| ИНАЧЕ ВЫБОР
| КОГДА ПартииТоваровНаСкладах.Заказ <> СписанныеТовары.ЗаказПартии
| ТОГДА ПартииТоваровНаСкладах.Заказ = &ПустойЗаказ
| ИНАЧЕ ИСТИНА
| КОНЕЦ
| КОНЕЦ)
|ГДЕ
| СписанныеТовары.Регистратор = &ОсновнойДокумент
|
|УПОРЯДОЧИТЬ ПО
| ЧислоСерияНоменклатуры,
| ЧислоДокументОприходования,
| ЧислоЗаказ,
| ЧислоСтатусПартии" + ?(СтратегияСтатусПартии = Перечисления.СтретегииСписанияПартийТоваровПоСтатусам.СначалаПринятыеПотомСобств
енные, " Убыв", "") + ",
| "+ПараметрыЗапроса_ДатаОприходования.ДокОприходованияДата_Сортировка+"
| ДокументОприходования" + ?(СпособОценкиМПЗ = "ЛИФО", " Убыв","") + ",
| ПартииТоваровНаСкладах.Склад
|ИТОГИ ПО
| НомерСтрокиДокумента";
http://pro1c.org.ua/redirect.php?http://programmist1s.ru/ekspert-optimizatsiya-zaprosov-v-1s/
Отборы в виртуальной таблице с помощью конструкции ГДЕ
Накладывать фильтры на реквизиты виртуальной таблицы необходимо только через параметры ВТ. Не в коем случае для отбора в виртуальной таблице нельзя использовать конструкцию ГДЕ, это грубейшая ошибка с точки зрения оптимизации. В случае с отбором с помощью ГДЕ по факту система получит ВСЕ записи и только потом отберет нужные записи.
ПРАВИЛЬНО:
ВЫБРАТЬ
ВзаиморасчетыСДепонентамиОрганизацийОстатки.СуммаОстаток
ИЗ
РегистрНакопления.ВзаиморасчетыСДепонентамиОрганизаций.Остатки(
,
Организация = &Организация
И Физлицо = &Физлицо) КАК ВзаиморасчетыСДепонентамиОрганизацийОстатки
ВЫБРАТЬ
ВзаиморасчетыСДепонентамиОрганизацийОстатки.СуммаОстаток
ИЗ
РегистрНакопления.ВзаиморасчетыСДепонентамиОрганизаций.Остатки(, ) КАК ВзаиморасчетыСДепонентамиОрганизацийОстатки
ГДЕ
ВзаиморасчетыСДепонентамиОрганизацийОстатки.Организация = &Организация
И ВзаиморасчетыСДепонентамиОрганизацийОстатки.Физлицо = &Физлицо
! | Правила, пункт 12 |
А где там критикуемая конструкция?
Проблема того же разряда, тоже в УТП Украина (1.2.42.2) .
Столкнулся с проблемой медленного проведения документа списания товаров, в бух учете почему то ведется партионный учет, зачем и почему уже другая история .... (сам не знаю, но ОЧЕНЬ НАДО БУХАМ!!! )))))) )
Суть проблемы в том что на серверном варианте УправлениеЗапасамиПартионныйУчет.ТорговаяНаценкаАТТ(ДокументСсылка, Склады, Номенклатура, НалоговоеНазначение)
отрабатывает критично долго.
В стандарте используется запрос:
Код
Мною оптимизирован данные запрос в вид:
Код
Запрос не приводил в аналогичный вид стандарту потому как лень, в моем конкретном случае данного решения вполне хватает...
Скорость отработки запроса уменьшилась на 30-40 %, при замерах производительности с учетом правок запроса управленческого изложенного выше
удалось добиться ускорения проведения документа в 4 раза, данное значение получено в сравнении производительности до и после, почему именно в 4 раза вышло сложно сказать,
замеры проводились на рабочей базе и в зависимости от текущих нагрузок могут отличаться ...
Так же было замечено что если в параметры запроса массивы передать без дублей это также влияет в положительную cторону, в обработке проведения документа СписаниеТоваров
в процедуре ДвиженияПоРегистрамРегл() было переделано так:
Код
Выявил ЦУПом что этот запрос занимет половину времени проведения документа размер базы больше 100 Гб.
1) Обратил внимание что измерения регистра партии товаров на складах по которым иде соединение не проиндексированы, Поставил индексирование
2) Порядок следования соединений не соответствует порядку следования измерений в регистре. Изменил порядок следований соединений в запросе.
Результат этот запрос пропал из ТОП запросов ЦУПа.
ОФ ТоП Добивайтесь что если вместе с серверм 1ц стоит антивирус "ОДМИН" его правильно настроил. Добавил все что относится к "КЖФ" в исключения.
Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7
https://pro1c.org.ua