При перепроведении заказа за прошлый день выполняется функция "ПолучитьДеревоПартийНаСкладахУпр" из общего модуля "УправлениеЗАпасамиПартионныйУчет". Дело в том, что эта функция выполняется 11-12 секунд.
Вот сама стандартная функция
Функция ПолучитьДеревоПартийНаСкладахУпр (МоментКон, СтруктураПараметров)
Запрос = Новый Запрос;
ОсновнойДокумент = Неопределено;
СтруктураПараметров.Свойство("ОсновнойДокумент",ОсновнойДокумент);
Регистратор = СтруктураПараметров.Регистратор;
СпособОценкиМПЗ = СтруктураПараметров.СпособОценкиМПЗУпр;
СтратегияСтатусПартии = СтруктураПараметров.СтратегияСтатусПартииУпр;
ВестиПартионныйУчетПоСкладам = СтруктураПараметров.ВестиПартионныйУчетПоСкладамУпр;
// Для повышения быстродействия остатки партий получаются различными способами
Если СтруктураПараметров.Свойство("ЗакрытиеЗаказовПокупателей") Тогда
ЗаполнитьЗапросПартийНаСкладахДляЗакрытияЗаказовПокупателей(Запрос);
ИначеЕсли ОсновнойДокумент <> Неопределено И НЕ СтруктураПараметров.СписыватьПартииРасходнымОрдером
И ТипЗнч(ОсновнойДокумент) = Тип("ДокументСсылка.РеализацияТоваровУслуг")тогда
// Списание расходным ордером товара реализованного и принятого на ответственное хранение (отложенная отгрузка)
ЗаполнитьЗапросПартийНаСкладахДляОтложеннойОтгрузкиУпр(Запрос, ВестиПартионныйУчетПоСкладам);
ИначеЕсли ОсновнойДокумент <> Неопределено тогда
// Списание партий по ордерной схеме:
// - Списание партий по расходному ордеру
// - Перемещение партий по приходному ордеру
// - Перемещение партий поступлением товаров и услуг в НТТ
// Движения реализации выполняет расходный ордер, движения перемещения выполняет приходный ордер
ЗаполнитьЗапросПартийНаСкладахДляСписанияПоОрдернойСхемеУпр(Запрос, ВестиПартионныйУчетПоСкладам, СтратегияСтатусПартии, СпособОценкиМПЗ);
Иначе
// Общий случай списания
ЗаполнитьЗапросПартийНаСкладахУпр(Запрос, ВестиПартионныйУчетПоСкладам, СтратегияСтатусПартии, СпособОценкиМПЗ);
Если НЕ СтруктураПараметров.ИспользоватьУказаниеСерийНоменклатурыПриРезервировании тогда
Запрос.Текст = СтрЗаменить(Запрос.Текст,"ИЛИ ПартииТоваровНаСкладах.СерияНоменклатуры = &ПустаяСерияНоменклатуры",
"ИЛИ ПартииТоваровНаСкладах.СерияНоменклатуры = &ПустаяСерияНоменклатуры
|ИЛИ СписанныеТовары.КодОперацииПартииТоваров = &КодРезервирование");
Запрос.УстановитьПараметр("КодРезервирование" , СтруктураПараметров.КодыОпераций.РезервированиеПодЗаказ)
КонецЕсли;
КонецЕсли;
Запрос.УстановитьПараметр("ПустаяСерияНоменклатуры", Справочники.СерииНоменклатуры.ПустаяСсылка());
Запрос.УстановитьПараметр("ПустойЗаказ", Документы.ЗаказПокупателя.ПустаяСсылка());
Запрос.УстановитьПараметр("ПустойСтатус", Перечисления.СтатусыПартийТоваров.ПустаяСсылка());
Запрос.УстановитьПараметр("СтатусПартииПоОрдеру", Перечисления.СтатусыПартийТоваров.ПоОрдеру);
Запрос.УстановитьПараметр("ПустоеКачество", Справочники.Качество.ПустаяСсылка());
Запрос.УстановитьПараметр("КачествоНовый", Справочники.Качество.Новый);
Запрос.УстановитьПараметр("ПустойСклад", Справочники.Склады.ПустаяСсылка());
Запрос.УстановитьПараметр("Ссылка", Регистратор);
Если ОсновнойДокумент <> Неопределено Тогда
Запрос.УстановитьПараметр("ОсновнойДокумент", ОсновнойДокумент);
Иначе
Запрос.УстановитьПараметр("ОсновнойДокумент", Регистратор);
КонецЕсли;
Запрос.УстановитьПараметр("Дат", МоментКон);
Запрос.УстановитьПараметр("НаКомиссию", Перечисления.СтатусыПартийТоваров.НаКомиссию);
Возврат Запрос.Выполнить().Выгрузить(ОбходРезультатаЗапроса.ПоГруппировкам); // Вот этот участок выполняется 12 секунд *********************
КонецФункции//ПолучитьДеревоПартийНаСкладахУпр
ВЫБРАТЬ
СписанныеТовары.НомерСтрокиДокумента КАК НомерСтрокиДокумента,
ПартииТоваровНаСкладах.Номенклатура,
ПартииТоваровНаСкладах.ДокументОприходования КАК ДокументОприходования,
ПартииТоваровНаСкладах.ДокументОприходования.Дата КАК ДокументОприходованияДата,
ПартииТоваровНаСкладах.ДокументОприходования.МоментВремени КАК ДокументОприходованияМоментВремени,
ПартииТоваровНаСкладах.Склад,
ПартииТоваровНаСкладах.ХарактеристикаНоменклатуры,
ПартииТоваровНаСкладах.СерияНоменклатуры,
ПартииТоваровНаСкладах.Качество,
ПартииТоваровНаСкладах.Заказ,
ПартииТоваровНаСкладах.КоличествоОстаток КАК Количество,
ПартииТоваровНаСкладах.СтоимостьОстаток КАК Стоимость,
ПартииТоваровНаСкладах.НДСОстаток КАК НДС,
ПартииТоваровНаСкладах.СтатусПартии,
ВЫБОР
КОГДА СписанныеТовары.СерияНоменклатуры = ПартииТоваровНаСкладах.СерияНоменклатуры
ТОГДА 0
ИНАЧЕ 1
КОНЕЦ КАК ЧислоСерияНоменклатуры,
ВЫБОР
КОГДА СписанныеТовары.ДокументПартии = НЕОПРЕДЕЛЕНО
ТОГДА 0
ИНАЧЕ ВЫБОР
КОГДА СписанныеТовары.ДокументПартии = ПартииТоваровНаСкладах.ДокументОприходования
ТОГДА 0
ИНАЧЕ 1
КОНЕЦ
КОНЕЦ КАК ЧислоДокументОприходования,
ВЫБОР
КОГДА СписанныеТовары.ЗаказПартии = НЕОПРЕДЕЛЕНО
ТОГДА 0
ИНАЧЕ ВЫБОР
КОГДА ПартииТоваровНаСкладах.Заказ = &ПустойЗаказ
ТОГДА 1
ИНАЧЕ 0
КОНЕЦ
КОНЕЦ КАК ЧислоЗаказ,
ВЫБОР
КОГДА ПартииТоваровНаСкладах.СтатусПартии = &НаКомиссию
ТОГДА 1
ИНАЧЕ 0
КОНЕЦ КАК ЧислоСтатусПартии
ИЗ
РегистрСведений.СписанныеТовары КАК СписанныеТовары
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрНакопления.ПартииТоваровНаСкладах.Остатки(
&Дат,
Номенклатура В
(ВЫБРАТЬ
РегистрСведений.СписанныеТовары.Номенклатура
ИЗ
РегистрСведений.СписанныеТовары
ГДЕ
РегистрСведений.СписанныеТовары.Регистратор = &Ссылка)
И (Склад В
(ВЫБРАТЬ
РегистрСведений.СписанныеТовары.Склад
ИЗ
РегистрСведений.СписанныеТовары
ГДЕ
РегистрСведений.СписанныеТовары.Регистратор = &Ссылка) ИЛИ Склад = &ПустойСклад)) КАК ПартииТоваровНаСкладах
ПО СписанныеТовары.Номенклатура = ПартииТоваровНаСкладах.Номенклатура
И СписанныеТовары.ХарактеристикаНоменклатуры = ПартииТоваровНаСкладах.ХарактеристикаНоменклатуры
И (ВЫБОР
КОГДА ПартииТоваровНаСкладах.Качество = &ПустоеКачество
ТОГДА ИСТИНА
ИНАЧЕ ВЫБОР
КОГДА СписанныеТовары.Качество = &ПустоеКачество
ТОГДА ПартииТоваровНаСкладах.Качество = &КачествоНовый
ИНАЧЕ ПартииТоваровНаСкладах.Качество = СписанныеТовары.Качество
КОНЕЦ
КОНЕЦ)
И (ПартииТоваровНаСкладах.Склад = СписанныеТовары.Склад ИЛИ ПартииТоваровНаСкладах.Склад = &ПустойСклад)
И (ВЫБОР
КОГДА СписанныеТовары.ДопустимыйСтатус1 <> &ПустойСтатус
ИЛИ СписанныеТовары.ДопустимыйСтатус2 <> &ПустойСтатус
ИЛИ СписанныеТовары.ДопустимыйСтатус3 <> &ПустойСтатус
ИЛИ СписанныеТовары.ДопустимыйСтатус4 <> &ПустойСтатус
ТОГДА ПартииТоваровНаСкладах.СтатусПартии = &ПустойСтатус
ИЛИ ПартииТоваровНаСкладах.СтатусПартии = &СтатусПартииПоОрдеру
ИЛИ ПартииТоваровНаСкладах.СтатусПартии = СписанныеТовары.ДопустимыйСтатус1
ИЛИ ПартииТоваровНаСкладах.СтатусПартии = СписанныеТовары.ДопустимыйСтатус2
ИЛИ ПартииТоваровНаСкладах.СтатусПартии = СписанныеТовары.ДопустимыйСтатус3
ИЛИ ПартииТоваровНаСкладах.СтатусПартии = СписанныеТовары.ДопустимыйСтатус4
ИНАЧЕ ИСТИНА
КОНЕЦ)
И (ВЫБОР
КОГДА СписанныеТовары.СписыватьТолькоПоЗаказу = ИСТИНА
ТОГДА ВЫБОР
КОГДА ПартииТоваровНаСкладах.Заказ <> СписанныеТовары.ЗаказПартии
ТОГДА ВЫБОР
КОГДА (НЕ СписанныеТовары.ЗаказПартии = НЕОПРЕДЕЛЕНО)
ТОГДА ЛОЖЬ
ИНАЧЕ ПартииТоваровНаСкладах.Заказ = &ПустойЗаказ
КОНЕЦ
ИНАЧЕ ИСТИНА
КОНЕЦ
ИНАЧЕ ВЫБОР
КОГДА ПартииТоваровНаСкладах.Заказ <> СписанныеТовары.ЗаказПартии
ТОГДА ПартииТоваровНаСкладах.Заказ = &ПустойЗаказ
ИНАЧЕ ИСТИНА
КОНЕЦ
КОНЕЦ)
И (СписанныеТовары.СерияНоменклатуры = ПартииТоваровНаСкладах.СерияНоменклатуры
ИЛИ ПартииТоваровНаСкладах.СерияНоменклатуры = &ПустаяСерияНоменклатуры
ИЛИ СписанныеТовары.КодОперацииПартииТоваров = &КодРезервирование)
ГДЕ
СписанныеТовары.Регистратор = &ОсновнойДокумент
УПОРЯДОЧИТЬ ПО
ЧислоСерияНоменклатуры,
ЧислоДокументОприходования,
ЧислоЗаказ,
ЧислоСтатусПартии,
ДокументОприходованияДата,
ДокументОприходованияМоментВремени,
ДокументОприходования
ИТОГИ ПО
НомерСтрокиДокумента
Вот в этой строчке:
Возврат Запрос.Выполнить().Выгрузить(ОбходРезультатаЗапроса.ПоГруппировкам); // Вот этот участок выполняется 12 секунд *********************
Спасибо Вофка, попробую. Кстате, выполняю тот же запрос в запроснике с теми же параметрами - выполняется 2 секунды (Ну только вместо момента времени ставлю просто дату документа)
Была копия на SQL. Попробовал там - та же ситуация. Пользователь только я один, а реализация проводится 10 - 12 с. Так что это не ожидание блокировок.
http://pro1c.org.ua/index.php?showtopic=316
! | Правила, п.13 |
А где там предложены временные таблицы? Я взял Вариант Batchir'а. Запрос вместо 12 с. исполняется 1 с.
P.S. На счет правил - каюсь). Что-то часто начал их нарушать последнее время. Наверно нужно время от времени перечитывать, вспоминать
Там нет вложеного запроса в отборе регистра партий. Отбор оттуда вообще перенесен.
Был у меня один такой случай недавно, когда выборка просто данных регистра с условием "ГДЕ" выполнялась быстрее чем та же задача, но реализована через обороты с отбором в самом регистре.
Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7
https://pro1c.org.ua