При перепроведении заказа за прошлый день выполняется функция "ПолучитьДеревоПартийНаСкладахУпр" из общего модуля "УправлениеЗАпасамиПартионныйУчет". Дело в том, что эта функция выполняется 11-12 секунд.
Вот сама стандартная функция
Функция ПолучитьДеревоПартийНаСкладахУпр (МоментКон, СтруктураПараметров)
// Для повышения быстродействия остатки партий получаются различными способами Если СтруктураПараметров.Свойство("ЗакрытиеЗаказовПокупателей") Тогда ЗаполнитьЗапросПартийНаСкладахДляЗакрытияЗаказовПокупателей(Запрос);
ИначеЕсли ОсновнойДокумент <> Неопределено И НЕ СтруктураПараметров.СписыватьПартииРасходнымОрдером И ТипЗнч(ОсновнойДокумент) = Тип("ДокументСсылка.РеализацияТоваровУслуг")тогда // Списание расходным ордером товара реализованного и принятого на ответственное хранение (отложенная отгрузка) ЗаполнитьЗапросПартийНаСкладахДляОтложеннойОтгрузкиУпр(Запрос, ВестиПартионныйУчетПоСкладам);
ИначеЕсли ОсновнойДокумент <> Неопределено тогда // Списание партий по ордерной схеме: // - Списание партий по расходному ордеру // - Перемещение партий по приходному ордеру // - Перемещение партий поступлением товаров и услуг в НТТ // Движения реализации выполняет расходный ордер, движения перемещения выполняет приходный ордер ЗаполнитьЗапросПартийНаСкладахДляСписанияПоОрдернойСхемеУпр(Запрос, ВестиПартионныйУчетПоСкладам, СтратегияСтатусПартии, СпособОценкиМПЗ);
Иначе // Общий случай списания ЗаполнитьЗапросПартийНаСкладахУпр(Запрос, ВестиПартионныйУчетПоСкладам, СтратегияСтатусПартии, СпособОценкиМПЗ); Если НЕ СтруктураПараметров.ИспользоватьУказаниеСерийНоменклатурыПриРезервировании тогда Запрос.Текст = СтрЗаменить(Запрос.Текст,"ИЛИ ПартииТоваровНаСкладах.СерияНоменклатуры = &ПустаяСерияНоменклатуры", "ИЛИ ПартииТоваровНаСкладах.СерияНоменклатуры = &ПустаяСерияНоменклатуры |ИЛИ СписанныеТовары.КодОперацииПартииТоваров = &КодРезервирование"); Запрос.УстановитьПараметр("КодРезервирование" , СтруктураПараметров.КодыОпераций.РезервированиеПодЗаказ) КонецЕсли;
Если ОсновнойДокумент <> Неопределено Тогда Запрос.УстановитьПараметр("ОсновнойДокумент", ОсновнойДокумент); Иначе Запрос.УстановитьПараметр("ОсновнойДокумент", Регистратор); КонецЕсли;
Возврат Запрос.Выполнить().Выгрузить(ОбходРезультатаЗапроса.ПоГруппировкам); // Вот этот участок выполняется 12 секунд *********************
КонецФункции//ПолучитьДеревоПартийНаСкладахУпр
Активных пользователей 31, база на SQL. В день создается около 300 заказов и реализаций. Каждый день они перепроводят некоторые заказы за прошлый и позапрошлый день. В чем может быть причина? Как ее решить, ваше мнение. Может итоги какие по партиям непосчитаны или просто ожидание блокировки?
Вот запрос, который выполняется:
ВЫБРАТЬ СписанныеТовары.НомерСтрокиДокумента КАК НомерСтрокиДокумента, ПартииТоваровНаСкладах.Номенклатура, ПартииТоваровНаСкладах.ДокументОприходования КАК ДокументОприходования, ПартииТоваровНаСкладах.ДокументОприходования.Дата КАК ДокументОприходованияДата, ПартииТоваровНаСкладах.ДокументОприходования.МоментВремени КАК ДокументОприходованияМоментВремени, ПартииТоваровНаСкладах.Склад, ПартииТоваровНаСкладах.ХарактеристикаНоменклатуры, ПартииТоваровНаСкладах.СерияНоменклатуры, ПартииТоваровНаСкладах.Качество, ПартииТоваровНаСкладах.Заказ, ПартииТоваровНаСкладах.КоличествоОстаток КАК Количество, ПартииТоваровНаСкладах.СтоимостьОстаток КАК Стоимость, ПартииТоваровНаСкладах.НДСОстаток КАК НДС, ПартииТоваровНаСкладах.СтатусПартии, ВЫБОР КОГДА СписанныеТовары.СерияНоменклатуры = ПартииТоваровНаСкладах.СерияНоменклатуры ТОГДА 0 ИНАЧЕ 1 КОНЕЦ КАК ЧислоСерияНоменклатуры, ВЫБОР КОГДА СписанныеТовары.ДокументПартии = НЕОПРЕДЕЛЕНО ТОГДА 0 ИНАЧЕ ВЫБОР КОГДА СписанныеТовары.ДокументПартии = ПартииТоваровНаСкладах.ДокументОприходования ТОГДА 0 ИНАЧЕ 1 КОНЕЦ КОНЕЦ КАК ЧислоДокументОприходования, ВЫБОР КОГДА СписанныеТовары.ЗаказПартии = НЕОПРЕДЕЛЕНО ТОГДА 0 ИНАЧЕ ВЫБОР КОГДА ПартииТоваровНаСкладах.Заказ = &ПустойЗаказ ТОГДА 1 ИНАЧЕ 0 КОНЕЦ КОНЕЦ КАК ЧислоЗаказ, ВЫБОР КОГДА ПартииТоваровНаСкладах.СтатусПартии = &НаКомиссию ТОГДА 1 ИНАЧЕ 0 КОНЕЦ КАК ЧислоСтатусПартии ИЗ РегистрСведений.СписанныеТовары КАК СписанныеТовары ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрНакопления.ПартииТоваровНаСкладах.Остатки( &Дат, Номенклатура В (ВЫБРАТЬ РегистрСведений.СписанныеТовары.Номенклатура ИЗ РегистрСведений.СписанныеТовары ГДЕ РегистрСведений.СписанныеТовары.Регистратор = &Ссылка) И (Склад В (ВЫБРАТЬ РегистрСведений.СписанныеТовары.Склад ИЗ РегистрСведений.СписанныеТовары ГДЕ РегистрСведений.СписанныеТовары.Регистратор = &Ссылка) ИЛИ Склад = &ПустойСклад)) КАК ПартииТоваровНаСкладах ПО СписанныеТовары.Номенклатура = ПартииТоваровНаСкладах.Номенклатура И СписанныеТовары.ХарактеристикаНоменклатуры = ПартииТоваровНаСкладах.ХарактеристикаНоменклатуры И (ВЫБОР КОГДА ПартииТоваровНаСкладах.Качество = &ПустоеКачество ТОГДА ИСТИНА ИНАЧЕ ВЫБОР КОГДА СписанныеТовары.Качество = &ПустоеКачество ТОГДА ПартииТоваровНаСкладах.Качество = &КачествоНовый ИНАЧЕ ПартииТоваровНаСкладах.Качество = СписанныеТовары.Качество КОНЕЦ КОНЕЦ) И (ПартииТоваровНаСкладах.Склад = СписанныеТовары.Склад ИЛИ ПартииТоваровНаСкладах.Склад = &ПустойСклад) И (ВЫБОР КОГДА СписанныеТовары.ДопустимыйСтатус1 <> &ПустойСтатус ИЛИ СписанныеТовары.ДопустимыйСтатус2 <> &ПустойСтатус ИЛИ СписанныеТовары.ДопустимыйСтатус3 <> &ПустойСтатус ИЛИ СписанныеТовары.ДопустимыйСтатус4 <> &ПустойСтатус ТОГДА ПартииТоваровНаСкладах.СтатусПартии = &ПустойСтатус ИЛИ ПартииТоваровНаСкладах.СтатусПартии = &СтатусПартииПоОрдеру ИЛИ ПартииТоваровНаСкладах.СтатусПартии = СписанныеТовары.ДопустимыйСтатус1 ИЛИ ПартииТоваровНаСкладах.СтатусПартии = СписанныеТовары.ДопустимыйСтатус2 ИЛИ ПартииТоваровНаСкладах.СтатусПартии = СписанныеТовары.ДопустимыйСтатус3 ИЛИ ПартииТоваровНаСкладах.СтатусПартии = СписанныеТовары.ДопустимыйСтатус4 ИНАЧЕ ИСТИНА КОНЕЦ)
И (ВЫБОР КОГДА СписанныеТовары.СписыватьТолькоПоЗаказу = ИСТИНА ТОГДА ВЫБОР КОГДА ПартииТоваровНаСкладах.Заказ <> СписанныеТовары.ЗаказПартии ТОГДА ВЫБОР КОГДА (НЕ СписанныеТовары.ЗаказПартии = НЕОПРЕДЕЛЕНО) ТОГДА ЛОЖЬ ИНАЧЕ ПартииТоваровНаСкладах.Заказ = &ПустойЗаказ КОНЕЦ ИНАЧЕ ИСТИНА КОНЕЦ ИНАЧЕ ВЫБОР КОГДА ПартииТоваровНаСкладах.Заказ <> СписанныеТовары.ЗаказПартии ТОГДА ПартииТоваровНаСкладах.Заказ = &ПустойЗаказ ИНАЧЕ ИСТИНА КОНЕЦ КОНЕЦ) И (СписанныеТовары.СерияНоменклатуры = ПартииТоваровНаСкладах.СерияНоменклатуры ИЛИ ПартииТоваровНаСкладах.СерияНоменклатуры = &ПустаяСерияНоменклатуры ИЛИ СписанныеТовары.КодОперацииПартииТоваров = &КодРезервирование) ГДЕ СписанныеТовары.Регистратор = &ОсновнойДокумент
УПОРЯДОЧИТЬ ПО ЧислоСерияНоменклатуры, ЧислоДокументОприходования, ЧислоЗаказ, ЧислоСтатусПартии, ДокументОприходованияДата, ДокументОприходованияМоментВремени, ДокументОприходования ИТОГИ ПО НомерСтрокиДокумента
Группа: Основатель
Сообщений: 13981
Из: Киев
Спасибо сказали: 4549 раз
Рейтинг: 3678.1
Цитата(vbi @ 18.07.12, 12:04)
Может итоги какие по партиям непосчитаны
Может, попробуйте на копии пересчитать.
Цитата(vbi @ 18.07.12, 12:04)
или просто ожидание блокировки?
Это тоже проверить легко: разверните копию на SQL и находясь в базе самому выполните ту же операцию. Или же в настройках базы поставьте ожидание блокировок несколько секунд. И если система так и будет висеть 10 секунд без сообщения "ожидание блокировки" - значит не оно.
Спасибо Вофка, попробую. Кстате, выполняю тот же запрос в запроснике с теми же параметрами - выполняется 2 секунды (Ну только вместо момента времени ставлю просто дату документа)
Была копия на SQL. Попробовал там - та же ситуация. Пользователь только я один, а реализация проводится 10 - 12 с. Так что это не ожидание блокировок.
Там нет вложеного запроса в отборе регистра партий. Отбор оттуда вообще перенесен. Был у меня один такой случай недавно, когда выборка просто данных регистра с условием "ГДЕ" выполнялась быстрее чем та же задача, но реализована через обороты с отбором в самом регистре.
1С Предприятие 8.3, 1С Предприятие 8.2, 1С Предприятие 8.1, 1С Предприятие 8.0, 1С Предприятие 7.7, Литература 1С, Общие вопросы по администрированию 1С, Методическая поддержка 1С - всё в одном месте: на Украинском 1С форуме!