Здравствуйте, подскажите пожалуйста как можно ускорить выполнение этой процедуры?
Как понимаю что-то нужно сделать с помощью "ИТОГИ ПО" в запросе.
Как понимаю что-то нужно сделать с помощью "ИТОГИ ПО" в запросе.
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
| ВВ.Номенклатура КАК Номенклатура,
| ВВ.Ссылка КАК Ссылка
|ИЗ
| (ВЫБРАТЬ
| ТоварыКОтгрузке.Номенклатура КАК Номенклатура,
| ТоварыКОтгрузке.КОтгрузкеОстаток КАК КОтгрузке,
| ТоварыКОтгрузке.ДокументОтгрузки КАК ДокументОтгрузки,
| ТоварыКОтгрузке.ДокументОтгрузки КАК Ссылка,
| ТоварыКОтгрузке.ДокументОтгрузки.Дата КАК ДокументОтгрузкиДата
| ИЗ
| РегистрНакопления.ТоварыКОтгрузке.Остатки(, ) КАК ТоварыКОтгрузке
| ГДЕ
| ТоварыКОтгрузке.ДокументОтгрузки ССЫЛКА Документ.ЗаказКлиента) КАК ВВ
|ГДЕ
| ВВ.КОтгрузке > 0
| И ВВ.Ссылка.Проведен
| И ВВ.Ссылка.ДатаОтгрузки > &Дата
| И ВВ.Ссылка.ДатаОтгрузки <> ДАТАВРЕМЯ(1, 1, 1, 0, 0, 0)
|
|СГРУППИРОВАТЬ ПО
| ВВ.Ссылка,
| ВВ.Номенклатура
|ИТОГИ ПО
| Ссылка";
ДатаЗначение = ТекущаяДата() + 60 * 60 * 24 * 3;
Запрос.УстановитьПараметр("Дата", ДатаЗначение);
Результат = Запрос.Выполнить().Выгрузить();
Для Каждого Значение Из Результат Цикл
Документ = Значение.Ссылка.ПолучитьОбъект();
НС = Документ.Товары.НайтиСтроки(Новый Структура("Номенклатура,Вариант",Значение.Номенклатура, Перечисления.ВариантыОбеспечения.Отгрузить));
Для Каждого Товар Из НС Цикл
Товар.ВариантОбеспечения = Перечисления.ВариантыОбеспечения.НеТребуется;
КонецЦикла;
Попытка
Документ.Записать(РежимЗаписиДокумента.Проведение);
Исключение
ОбщегоНазначенияКлиентСервер.СообщитьПользователю(""+Документ.Ссылка+": "+ОписаниеОшибки());
КонецПопытки;
КонецЦикла;
ПоказатьПо теме из базы знаний
- Ускорение расчета себестоимости в УПП (партионный учет)
- Многопоточная обработка документов БП3.0, КА2, (ERP с небольшим ограничением). Ускоряет основные процессы учета: проведение документов и другие массовые процедуры методом многопоточности
- Ускорение чтения правил обмена в УПП 1.3 в 20 раз!
- Многопоточное выполнение процедуры с помощью ДлительныеОперации
- Ускорение многоразового обращения к серверной процедуре/функции с помощью многопоточного вызова фоновых заданий
Найденные решения
(1)
чтото вроде такого ускорит
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
| ВВ.Номенклатура КАК Номенклатура,
| ВВ.Ссылка КАК Ссылка
|ИЗ
| (ВЫБРАТЬ
| ТоварыКОтгрузке.Номенклатура КАК Номенклатура,
| ТоварыКОтгрузке.КОтгрузкеОстаток КАК КОтгрузке,
| ТоварыКОтгрузке.ДокументОтгрузки КАК ДокументОтгрузки,
| ТоварыКОтгрузке.ДокументОтгрузки КАК Ссылка,
| ТоварыКОтгрузке.ДокументОтгрузки.Дата КАК ДокументОтгрузкиДата
| ИЗ
| РегистрНакопления.ТоварыКОтгрузке.Остатки(, ) КАК ТоварыКОтгрузке
| ГДЕ
| ТоварыКОтгрузке.ДокументОтгрузки ССЫЛКА Документ.ЗаказКлиента) КАК ВВ
|ГДЕ
| ВВ.КОтгрузке > 0
| И ВВ.Ссылка.Проведен
| И ВВ.Ссылка.ДатаОтгрузки > &Дата
| И ВВ.Ссылка.ДатаОтгрузки <> ДАТАВРЕМЯ(1, 1, 1, 0, 0, 0)
|
|СГРУППИРОВАТЬ ПО
| ВВ.Ссылка,
| ВВ.Номенклатура
|ИТОГИ ПО
| Ссылка";
ДатаЗначение = ТекущаяДата() + 60 * 60 * 24 * 3;
Запрос.УстановитьПараметр("Дата", ДатаЗначение);
Результат = Запрос.Выполнить.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
Пока Результат .Следующий() Цикл
Документ = Результат.Ссылка.ПолучитьОбъект();
Значение= Результат .Выбрать();
Пока Значение.Следующий() Цикл
НС = Документ.Товары.НайтиСтроки(Новый Структура("Номенклатура,Вариант",Значение.Номенклатура, Перечисления.ВариантыОбеспечения.Отгрузить));
Для Каждого Товар Из НС Цикл
Товар.ВариантОбеспечения = Перечисления.ВариантыОбеспечения.НеТребуется;
КонецЦикла;
КонецЦикла;
Попытка
Документ.Записать(РежимЗаписиДокумента.Проведение);
Исключение
ОбщегоНазначенияКлиентСервер.СообщитьПользователю(""+Документ.Ссылка+": "+ОписаниеОшибки());
КонецПопытки;
КонецЦикла;
Показатьчтото вроде такого ускорит
Остальные ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
(1)
Тут наверное беда у вас.
По ссылке получаете Объект!!! потом его табчасть , в ней ищите строки, потом перебор массива в цикле. Как то все коряво.
НС = Документ.Товары.НайтиСтроки(Новый Структура("Номенклатура,Вариант",Значение.Номенклатура, Перечисления.ВариантыОбеспечения.Отгрузить));
Для Каждого Товар Из НС Цикл
Товар.ВариантОбеспечения = Перечисления.ВариантыОбеспечения.НеТребуется;
КонецЦикла;
Для Каждого Товар Из НС Цикл
Товар.ВариантОбеспечения = Перечисления.ВариантыОбеспечения.НеТребуется;
КонецЦикла;
Тут наверное беда у вас.
По ссылке получаете Объект!!! потом его табчасть , в ней ищите строки, потом перебор массива в цикле. Как то все коряво.
(1)
чтото вроде такого ускорит
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
| ВВ.Номенклатура КАК Номенклатура,
| ВВ.Ссылка КАК Ссылка
|ИЗ
| (ВЫБРАТЬ
| ТоварыКОтгрузке.Номенклатура КАК Номенклатура,
| ТоварыКОтгрузке.КОтгрузкеОстаток КАК КОтгрузке,
| ТоварыКОтгрузке.ДокументОтгрузки КАК ДокументОтгрузки,
| ТоварыКОтгрузке.ДокументОтгрузки КАК Ссылка,
| ТоварыКОтгрузке.ДокументОтгрузки.Дата КАК ДокументОтгрузкиДата
| ИЗ
| РегистрНакопления.ТоварыКОтгрузке.Остатки(, ) КАК ТоварыКОтгрузке
| ГДЕ
| ТоварыКОтгрузке.ДокументОтгрузки ССЫЛКА Документ.ЗаказКлиента) КАК ВВ
|ГДЕ
| ВВ.КОтгрузке > 0
| И ВВ.Ссылка.Проведен
| И ВВ.Ссылка.ДатаОтгрузки > &Дата
| И ВВ.Ссылка.ДатаОтгрузки <> ДАТАВРЕМЯ(1, 1, 1, 0, 0, 0)
|
|СГРУППИРОВАТЬ ПО
| ВВ.Ссылка,
| ВВ.Номенклатура
|ИТОГИ ПО
| Ссылка";
ДатаЗначение = ТекущаяДата() + 60 * 60 * 24 * 3;
Запрос.УстановитьПараметр("Дата", ДатаЗначение);
Результат = Запрос.Выполнить.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
Пока Результат .Следующий() Цикл
Документ = Результат.Ссылка.ПолучитьОбъект();
Значение= Результат .Выбрать();
Пока Значение.Следующий() Цикл
НС = Документ.Товары.НайтиСтроки(Новый Структура("Номенклатура,Вариант",Значение.Номенклатура, Перечисления.ВариантыОбеспечения.Отгрузить));
Для Каждого Товар Из НС Цикл
Товар.ВариантОбеспечения = Перечисления.ВариантыОбеспечения.НеТребуется;
КонецЦикла;
КонецЦикла;
Попытка
Документ.Записать(РежимЗаписиДокумента.Проведение);
Исключение
ОбщегоНазначенияКлиентСервер.СообщитьПользователю(""+Документ.Ссылка+": "+ОписаниеОшибки());
КонецПопытки;
КонецЦикла;
Показатьчтото вроде такого ускорит
(11)Добавьте проверку, что документ модифицирован, чтобы зря не записывать, если ничего не менялось.
Если Документ.Модифицированность() Тогда
Попытка
Документ.Записать(РежимЗаписиДокумента.Проведение);
Исключение
ОбщегоНазначенияКлиентСервер.СообщитьПользователю(""+Документ.Ссылка+": "+ОписаниеОшибки());
КонецПопытки;
КонецЕсли;
замер производительности делали? Он покажет какие операции долго выполняются.
В запросе в строке
зачем проверять документы на ПРОВЕДЕННОСТЬ, вы же данные получаете из регистра.
Зачем на пустую дату проверять.?
В запросе в строке
зачем проверять документы на ПРОВЕДЕННОСТЬ, вы же данные получаете из регистра.
Зачем на пустую дату проверять.?
тут скорее всего основное время это запись документов... а где замер производительности, я что-то не заметил?
По-моему тут логичнее в выборке оставить только уникальные документы, а так, как сейчас написано, можно один и тот же документ много раз записывать, непонятно зачем.
По-моему тут логичнее в выборке оставить только уникальные документы, а так, как сейчас написано, можно один и тот же документ много раз записывать, непонятно зачем.
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот