Ускорение процедуры

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

Значение= Результат .Выбрать();
Пока Значение.Следующий() Цикл
        
        НС = Документ.Товары.НайтиСтроки(Новый Структура("Номенклатура,Вариант",Значение.Номенклатура, Перечисления.ВариантыОбеспечения.Отгрузить));
            
        Для Каждого Товар Из НС Цикл
            
            Товар.ВариантОбеспечения = Перечисления.ВариантыОбеспечения.НеТребуется; 
            
        КонецЦикла; 
КонецЦикла;   
        
        Попытка    
            Документ.Записать(РежимЗаписиДокумента.Проведение);  
        Исключение
            ОбщегоНазначенияКлиентСервер.СообщитьПользователю(""+Документ.Ссылка+": "+ОписаниеОшибки());
        КонецПопытки;
        
    КонецЦикла;  
Показать


чтото вроде такого ускорит
Synthersizer; +1 Ответить
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
3. Pavel Rodinchenko 02.12.22 11:37 Сейчас в теме
(1)не проще ли для таких целей использовать типовую обработку "Групповое изменение реквизитов"?
В отборе установите необходимые условия и потом для ТЧ Товары установите новое значение для реквизита Вариант обеспечения
4. STELEICE 02.12.22 11:42 Сейчас в теме
(1)
НС = Документ.Товары.НайтиСтроки(Новый Структура("Номенклатура,Вариант",Значение.Номенклатура, Перечисления.ВариантыОбеспечения.Отгрузить));

Для Каждого Товар Из НС Цикл

Товар.ВариантОбеспечения = Перечисления.ВариантыОбеспечения.НеТребуется;

КонецЦикла;


Тут наверное беда у вас.
По ссылке получаете Объект!!! потом его табчасть , в ней ищите строки, потом перебор массива в цикле. Как то все коряво.
Krotov_Valery; Synthersizer; +2 Ответить
8. minarenko 02.12.22 12:43 Сейчас в теме
(1)
Запрос = Новый Запрос;
    Запрос.Текст = "ВЫБРАТЬ
                   |    ВВ.Номенклатура КАК Номенклатура,
                   |    ВВ.Ссылка КАК Ссылка
                   |ИЗ
                   |    (ВЫБРАТЬ
                   |        ТоварыКОтгрузке.Номенклатура КАК Номенклатура,
                   |        ТоварыКОтгрузке.КОтгрузкеОстаток КАК КОтгрузке,
                   |        ТоварыКОтгрузке.ДокументОтгрузки КАК ДокументОтгрузки,
                   |        ТоварыКОтгрузке.ДокументОтгрузки КАК Ссылка,
                   |        ТоварыКОтгрузке.ДокументОтгрузки.Дата КАК ДокументОтгрузкиДата
                   |    ИЗ
                   |        РегистрНакопления.ТоварыКОтгрузке.Остатки(, ) КАК ТоварыКОтгрузке
                   |    ГДЕ
                   |        ТоварыКОтгрузке.ДокументОтгрузки ССЫЛКА Документ.ЗаказКлиента) КАК ВВ
                   |ГДЕ
                   |    ВВ.КОтгрузке > 0
                   |    И ВВ.Ссылка.Проведен
                   |    И ВВ.Ссылка.ДатаОтгрузки > &Дата
                   |    И ВВ.Ссылка.ДатаОтгрузки <> ДАТАВРЕМЯ(1, 1, 1, 0, 0, 0)
                   |
                   |СГРУППИРОВАТЬ ПО
                   |    ВВ.Ссылка,
                   |    ВВ.Номенклатура
                   |ИТОГИ ПО
                   |    Ссылка"; 
                   
    ДатаЗначение = ТекущаяДата() + 60 * 60 * 24 * 3;
    
    Запрос.УстановитьПараметр("Дата", ДатаЗначение);
    
    Результат = Запрос.Выполнить.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
    
    Пока Результат .Следующий() Цикл
        
        Документ = Результат.Ссылка.ПолучитьОбъект(); 

Значение= Результат .Выбрать();
Пока Значение.Следующий() Цикл
        
        НС = Документ.Товары.НайтиСтроки(Новый Структура("Номенклатура,Вариант",Значение.Номенклатура, Перечисления.ВариантыОбеспечения.Отгрузить));
            
        Для Каждого Товар Из НС Цикл
            
            Товар.ВариантОбеспечения = Перечисления.ВариантыОбеспечения.НеТребуется; 
            
        КонецЦикла; 
КонецЦикла;   
        
        Попытка    
            Документ.Записать(РежимЗаписиДокумента.Проведение);  
        Исключение
            ОбщегоНазначенияКлиентСервер.СообщитьПользователю(""+Документ.Ссылка+": "+ОписаниеОшибки());
        КонецПопытки;
        
    КонецЦикла;  
Показать


чтото вроде такого ускорит
Synthersizer; +1 Ответить
11. Synthersizer 02.12.22 13:30 Сейчас в теме
12. Sashares 34 02.12.22 13:36 Сейчас в теме
(11)Добавьте проверку, что документ модифицирован, чтобы зря не записывать, если ничего не менялось.

Если Документ.Модифицированность() Тогда
Попытка    
            Документ.Записать(РежимЗаписиДокумента.Проведение);  
        Исключение
            ОбщегоНазначенияКлиентСервер.СообщитьПользователю(""+Документ.Ссылка+": "+ОписаниеОшибки());
        КонецПопытки;
КонецЕсли;
Synthersizer; +1 Ответить
2. t278 56 02.12.22 11:37 Сейчас в теме
замер производительности делали? Он покажет какие операции долго выполняются.

В запросе в строке
зачем проверять документы на ПРОВЕДЕННОСТЬ, вы же данные получаете из регистра.
Зачем на пустую дату проверять.?
Synthersizer; +1 Ответить
5. starjevschik 02.12.22 12:10 Сейчас в теме
тут скорее всего основное время это запись документов... а где замер производительности, я что-то не заметил?
По-моему тут логичнее в выборке оставить только уникальные документы, а так, как сейчас написано, можно один и тот же документ много раз записывать, непонятно зачем.
Synthersizer; +1 Ответить
6. Synthersizer 02.12.22 12:14 Сейчас в теме
(5) Запись документов как я понимаю можно как-то ускорить с помощью итогов в запросе и еще чего-то, нигде не могу найти темы про это(
7. minarenko 02.12.22 12:38 Сейчас в теме
9. lmnlmn 69 02.12.22 12:48 Сейчас в теме
(6) Можно попробовать в транзакцию обернуть запись документов, например по 20 шт. в одной транзакции записывать. Но это такое себе при некоторых сценариях использования.
10. lmnlmn 69 02.12.22 12:53 Сейчас в теме
(6) А еще можно в запросе отсечь документы с нужным вариантом обеспечения чтоб не менять на то же самое и перепроводить.
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот