Добрый вечер.
В Управлении Торговлей 10.3 есть документ Отчет о розничных продажах. В Модуле документа находится обработчик "УправлениеЗапасамиПартионныйУчет.ДвижениеПартийТоваров()". При проведении документа, обработчик отрабатывается относительно долгое время (1 документ = 17 сек), (100 доков = 1700 сек и тд), при перепроведении документов возникает хаос...
можно ли как то оптимизировать данный процесс движения по партиям ? никто не сталкивался с такой проблемой ?
Данная ситуация стандартная в запросе который формирует таблицу партий есть неоптимальные вещи, которые требуют допилки. Сталкивался с таким в УТ 10.3, УПП - запрос один и тот же. После доработки запроса будет летать. Все регламентные операции типо индексирований тут бессильны. Часто при большом количестве пользователей вылетают ошибки транзацкций
(3)Под рукой УТ увы нет.
Что в этом обработчике? Запрос дольше всего выполняется?
Возможно можно запрос оптимизировать.
Но для этого надо видеть текст запроса.
(4)текст типовой, происходит движения по регистрам партии
вот текст:
// Процедура-вход для всех документов. Проводит переданный документ по учету партий товаров
//
// Параметры
// ОбрабатываемыйДокумент - проводимый документ
//
Процедура ДвижениеПартийТоваров(ОбрабатываемыйДокумент, ТаблицаСписания = Неопределено,
КоличествоСтрокВДокументе = 0, Упр = Истина,
Бух = Истина, Нал = Истина,
Останавливаться = Ложь, ПроведениеОстановлено = Ложь,
ДокументМоментВремени = Неопределено, СписаниеВыполняетсяОбработкой = Ложь,
СтруктураНаборовЗаписей = Неопределено) Экспорт
// Если не переданы строки документа, выбираем из базы.
Если ТаблицаСписания = Неопределено Тогда
// Таблица строк документов списания
ТаблицаСписания = ПолучитьТаблицуСтрокДокументов(ОбрабатываемыйДокумент, Упр, Бух, Нал);
КонецЕсли;
КоличествоСтрокВДокументе = ТаблицаСписания.Количество();
СтруктураПараметров = Новый Структура;
СтруктураДата = Новый Структура("Дата");
ПолучитьРеквизитыОбъекта(ОбрабатываемыйДокумент, СтруктураДата);
Если ДокументМоментВремени = Неопределено Тогда
ДокументМоментВремени = Новый МоментВремени(СтруктураДата.Дата, ОбрабатываемыйДокумент);
КонецЕсли;
СтруктураПараметров.Вставить("УчетнаяПолитика", ПолучитьУчетнуюПолитику(ДокументМоментВремени));
Если КоличествоСтрокВДокументе > 0 Тогда
СтруктураПараметров.Вставить("ТекстСообщений", "");
СтруктураПараметров.Вставить("Отказ", Ложь);
СтруктураПараметров.Вставить("ЕстьСтрокиОтражатьВУправленческомУчете", ТаблицаСписания.Найти(Истина, "ОтражатьВУправленческомУчете")<>Неопределено);
СтруктураПараметров.Вставить("ЕстьСтрокиОтражатьВБухгалтерскомУчете", ТаблицаСписания.Найти(Истина, "ОтражатьВБухгалтерскомУчете")<>Неопределено);
СтруктураПараметров.Вставить("ЕстьСтрокиОтражатьВНалоговомУчете", ТаблицаСписания.Найти(Истина, "ОтражатьВНалоговомУчете")<>Неопределено);
СтруктураПараметров.Вставить("ВестиПартионныйУчетПоСкладам", УчетнаяПолитика("ВестиПартионныйУчетПоСкладам","Упр",,СтруктураПараметров));
Если НЕ СтруктураПараметров.ЕстьСтрокиОтражатьВУправленческомУчете Тогда
Возврат;
КонецЕсли;
Если СтруктураНаборовЗаписей = Неопределено Тогда
// Движения - наборы записей по регистрам
СоздатьНаборыЗаписей(СтруктураПараметров);
Иначе
Для каждого Элемент Из СтруктураНаборовЗаписей Цикл
СтруктураПараметров.Вставить(Элемент.Ключ, Элемент.Значение);
КонецЦикла;
КонецЕсли;
ПодготовитьТаблицуСписания(СтруктураПараметров, ТаблицаСписания, Упр, Бух, Нал);
Сообщить(ТаблицаСписания.Количество());
Строка0 = ТаблицаСписания[0];
Если НЕ ЗначениеЗаполнено(Строка0.Регистратор) Тогда
ТаблицаСписания.ЗаполнитьЗначения(ОбрабатываемыйДокумент, "Регистратор");
КонецЕсли;
Если НЕ ЗначениеЗаполнено(Строка0.Период) Тогда
ТаблицаСписания.ЗаполнитьЗначения(СтруктураДата.Дата, "Период");
КонецЕсли;
ВыполнитьСписание(СтруктураПараметров, ТаблицаСписания, ДокументМоментВремени, Останавливаться, ПроведениеОстановлено);
КонецЕсли;
// Сдвиг границы последовательности осуществляется только при онлайновом списании партий
// либо из обработки проведение по партиям.
ЗакрытиеЗаказовПокупателей = ТипЗнч(ОбрабатываемыйДокумент) = Тип("ДокументСсылка.ЗакрытиеЗаказовПокупателей");
Если СписаниеВыполняетсяОбработкой Или СтруктураПараметров.УчетнаяПолитика[0].СписыватьПартииПриПроведенииДокументовУпр Тогда
Если Упр Тогда
СдвигатьГраницу = ОпределитьНеобходимостьСдвигаГраницы(ДокументМоментВремени,"Упр");
Если СдвигатьГраницу Тогда
Последовательности.ПартионныйУчет.УстановитьГраницу(ДокументМоментВремени);
КонецЕсли;
КонецЕсли;
КонецЕсли;
КонецПроцедуры // ДвижениеПартийТоваров()
8.
Dream_kz
12913.06.19 16:33 Сейчас в теме+0.15 $m
1. Вариант самый простой, делать списание партий не при проведении документов, а регламентно по ночам (галочка в настройках)
2. Вариант второй, включать замер, искать длительные запросы, оптимизировать их. Возможно, итоги не рассчитаны, либо статистика тухлая, тут уже надо план запроса смотреть
(10) Должна быть настройка Списывать партии при проведении документов и обработка Проведение по партиям.
Если галку снимаем, по регистру ПартииТоваровНаСкладах движения не делаются, их надо будет делать этой обработкой, сама она запускаться не будет, но можно написать регламентное, которое будет ее вызывать
По поводу задним числом, будут проводиться документы по всей последовательности, т.е залезли в прошлый месяц, то документы с прошлого месяца
1. Сделать реструктуризацию.
2. Пересчитать итоги.
Если скульная база, то произвести реструктуризацию ИБ через ТиИ, запустить на SQL регламенты, рекомендованные 1С (index rebuild, statistic update). Сделать ежедневный регламент обновления статистики и reindex, раз в неделю - index rebuild.
Если база файловая, то сделать все через ТиИ - там есть пересчет итогов.
Данная ситуация стандартная в запросе который формирует таблицу партий есть неоптимальные вещи, которые требуют допилки. Сталкивался с таким в УТ 10.3, УПП - запрос один и тот же. После доработки запроса будет летать. Все регламентные операции типо индексирований тут бессильны. Часто при большом количестве пользователей вылетают ошибки транзацкций