Оптимизация кода обработки

1. ShramkoRS 14.03.23 08:30 Сейчас в теме
Здравствуйте. Хочу оптимизировать код, перепробывал несколь вариантов, но все не делают лучше. Хочу спросить ваших советов/помощи.

Программа должна сделать записи в ТЧ документа ИжСертификаты и убрать данные из реквизита ЭлектронныйДокумент.

Код:
Процедура ЗаполнениеТЧ() Экспорт
    ЗапросРТиУ = Новый Запрос;
    ЗапросРТиУ.Текст = "ВЫБРАТЬ РАЗЛИЧНЫЕ
    |    РеализацияТоваровУслугТовары.Ссылка,
    |    РеализацияТоваровУслугТовары.СерияНоменклатуры.ижСертификат КАК Сертификат
    |ИЗ
    |    Документ.РеализацияТоваровУслуг.Товары КАК РеализацияТоваровУслугТовары";
    РезРТиУ = ЗапросРТиУ.Выполнить().Выгрузить();
    
    ЗапросСертификаты = Новый Запрос;
    ЗапросСертификаты.Текст = "ВЫБРАТЬ
                              |    ижСертификат.Ссылка КАК Ссылка,
                              |    ижСертификат.ЭлектронныйДокумент КАК ЭД
                              |ИЗ
                              |    Документ.ижСертификат КАК ижСертификат
                              |ГДЕ
                              |    ижСертификат.ЭлектронныйДокумент > &ЭлектронныйДокумент";
    ЭДшка = Документы.ЭлектронныйДокументИсходящий.НайтиПоНомеру("00000000001"); 
    ЗапросСертификаты.УстановитьПараметр("ЭлектронныйДокумент",ЭДшка);
    РезСертификаты = ЗапросСертификаты.Выполнить().Выгрузить();
    
    Для каждого СтрСертификаты Из РезСертификаты Цикл
        Если ЗначениеЗаполнено(СтрСертификаты.ЭД) Тогда
            
            Для каждого СтрРТиУ Из РезРТиУ Цикл
                Если СтрРТиУ.Сертификат = СтрСертификаты.Ссылка Тогда
                    ДокСертификат = СтрСертификаты.Ссылка.ПолучитьОбъект();
                    СтрокаТЧ = ДокСертификат.ЭлектронныеДокументы.Добавить();
                    СтрокаТЧ.ЭлектронныйДокументСертификата = СтрСертификаты.ЭД;
                    СтрокаТЧ.РеализацияТоваровУслуг         = СтрРТиУ.Ссылка;
                    СтрокаТЧ.Вес                            = 0; 
                КонецЕсли;
            КонецЦикла;
        КонецЕсли;
    КонецЦикла; 
    
    Для каждого СтрСертификаты Из РезСертификаты Цикл
        Если ЗначениеЗаполнено(СтрСертификаты.ЭД) Тогда
            
            Для каждого СтрРТиУ Из РезРТиУ Цикл
                Если СтрРТиУ.Сертификат = СтрСертификаты.Ссылка Тогда
                    ДокСертификат = СтрСертификаты.Ссылка.ПолучитьОбъект();
                    ДокСертификат.ЭлектронныйДокумент = Неопределено;
                    ДокСертификат.Записать();    
                КонецЕсли;
            КонецЦикла;
        КонецЕсли;
    КонецЦикла;
        
КонецПроцедуры
Показать


Я пробовал всячески засунуть "ДокСертификат.ЭлектронныйДокумент = Неопределено;" в первый цикл, но либо выдает ошибку, либо не отрабатывает как надо. Может я чего-то упустил, не исключаю, но как-то не хочется пускать код, где 10 записей обрабатываются 3,5 минуты (даже не смотря на то, что обработка одноразовая и после окончания отправиться в мусорку).
По теме из базы знаний
Найденные решения
6. SlavaKron 14.03.23 09:11 Сейчас в теме
Попробуйте так
Процедура ЗаполнениеТЧ()
	
	Запрос = Новый Запрос(
	"ВЫБРАТЬ
	|	ижСертификат.Ссылка КАК Ссылка,
	|	ижСертификат.ЭлектронныйДокумент КАК ЭлектронныйДокумент,
	|	РеализацияТоваровУслугТовары.Ссылка КАК ДокументРТУ
	|ИЗ
	|	Документ.ижСертификат КАК ижСертификат
	|		ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.РеализацияТоваровУслуг.Товары КАК РеализацияТоваровУслугТовары
	|		ПО ижСертификат.Ссылка = РеализацияТоваровУслугТовары.СерияНоменклатуры.ижСертификат
	|ГДЕ
	|	ижСертификат.ЭлектронныйДокумент > &ЭДшка
	|
	|СГРУППИРОВАТЬ ПО
	|	ижСертификат.Ссылка,
	|	ижСертификат.ЭлектронныйДокумент,
	|	РеализацияТоваровУслугТовары.Ссылка");
	
	Запрос.УстановитьПараметр("ЭДшка", Документы.ЭлектронныйДокументИсходящий.НайтиПоНомеру("00000000001"));
	
	ТЗ = Запрос.Выполнить().Выгрузить();
	ТЗ.Индексы.Добавить("Ссылка");
	
	Сертификаты = ТЗ.Скопировать(, "Ссылка");
	Сертификаты.Свернуть("Ссылка");
	Сертификаты = Сертификаты.ВыгрузитьКолонку(0);
	
	Для Каждого Сертификат Из Сертификаты Цикл
		
		ДокументОбъект = Сертификат.ПолучитьОбъект();
		
		МассивСтрок = ТЗ.НайтиСтроки(Новый Структура("Ссылка", Сертификат));
		ДокументОбъект.ЭлектронныеДокументы.Очистить();
		Для Каждого Стр Из МассивСтрок Цикл
			НоваяСтрока = ДокументОбъект.ЭлектронныеДокументы.Добавить();
			НоваяСтрока.ЭлектронныйДокументСертификата = Стр.ЭлектронныйДокумент;
			НоваяСтрока.РеализацияТоваровУслуг = Стр.ДокументРТУ;
		КонецЦикла;
		
		ДокументОбъект.ЭлектронныйДокумент = Неопределено;
		РежимЗаписи = ?(ДокументОбъект.Проведен, РежимЗаписиДокумента.Проведение, РежимЗаписиДокумента.Запись);
		Попытка
			ДокументОбъект.Записать(РежимЗаписи);
		Исключение
			ТекстОшибки = ОписаниеОшибки();
			Сообщить(ТекстОшибки);
		КонецПопытки;
		
	КонецЦикла;
	
КонецПроцедуры
Показать
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. RustamZz 14.03.23 08:38 Сейчас в теме
(1) По сравнению с прошлым вариантом - все плохо. Нет не плохо, а ужасно.
4. ShramkoRS 14.03.23 09:01 Сейчас в теме
(2)Да, плохо, но отрабатывает как надо. Потому что раньше оно затирало Электронынй документ после того как находило перове совпадение, в то время как их могло быть три. И мне надо было отразить все три, а не только первое. Если знаете как это лучше организовать буду только рад послушать
5. ShramkoRS 14.03.23 09:07 Сейчас в теме
(2)Че, думаете я не пробовал через один вложенный цикл сделать? Пробовал, в нескольких версиях, работать оно работало, но совершенно не так как должно. Не исключаю, что версия правильная у меня была, просто тестил я так себе, но если это как-то успокоит ваши нервы, был у меня такой вариант:

Процедура ЗаполнениеТЧ() Экспорт
    ЗапросРТиУ = Новый Запрос;
    ЗапросРТиУ.Текст = "ВЫБРАТЬ РАЗЛИЧНЫЕ
    |    РеализацияТоваровУслугТовары.Ссылка,
    |    РеализацияТоваровУслугТовары.СерияНоменклатуры.ижСертификат КАК Сертификат
    |ИЗ
    |    Документ.РеализацияТоваровУслуг.Товары КАК РеализацияТоваровУслугТовары";
    РезРТиУ = ЗапросРТиУ.Выполнить().Выгрузить();
    
    ЗапросСертификаты = Новый Запрос;
    ЗапросСертификаты.Текст = "ВЫБРАТЬ
                              |    ижСертификат.Ссылка КАК Ссылка,
                              |    ижСертификат.ЭлектронныйДокумент КАК ЭД
                              |ИЗ
                              |    Документ.ижСертификат КАК ижСертификат
                              |ГДЕ
                              |    ижСертификат.ЭлектронныйДокумент > &ЭлектронныйДокумент";
    ЭДшка = Документы.ЭлектронныйДокументИсходящий.НайтиПоНомеру("00000000001"); 
    ЗапросСертификаты.УстановитьПараметр("ЭлектронныйДокумент",ЭДшка);
    РезСертификаты = ЗапросСертификаты.Выполнить().Выгрузить();
    
    Для каждого СтрСертификаты Из РезСертификаты Цикл
        Если ЗначениеЗаполнено(СтрСертификаты.ЭД) Тогда
            
            Для каждого СтрРТиУ Из РезРТиУ Цикл
                Если СтрРТиУ.Сертификат = СтрСертификаты.Ссылка Тогда
                    ДокСертификат = СтрСертификаты.Ссылка.ПолучитьОбъект();
                    СтрокаТЧ = ДокСертификат.ЭлектронныеДокументы.Добавить();
                    СтрокаТЧ.ЭлектронныйДокументСертификата = СтрСертификаты.ЭД;
                    СтрокаТЧ.РеализацияТоваровУслуг         = СтрРТиУ.Ссылка;
                    СтрокаТЧ.Вес                            = 0; 
                КонецЕсли;
            КонецЦикла;
 ДопДокСертификат = СтрСертификаты.Ссылка.ПолучитьОбъект();
                    ДопДокСертификат.ЭлектронныйДокумент = Неопределено;
                    ДопДокСертификат.Записать();    
        КонецЕсли;
    КонецЦикла; 
        
КонецПроцедуры
Показать
3. nomad_irk 80 14.03.23 08:54 Сейчас в теме
6. SlavaKron 14.03.23 09:11 Сейчас в теме
Попробуйте так
Процедура ЗаполнениеТЧ()
	
	Запрос = Новый Запрос(
	"ВЫБРАТЬ
	|	ижСертификат.Ссылка КАК Ссылка,
	|	ижСертификат.ЭлектронныйДокумент КАК ЭлектронныйДокумент,
	|	РеализацияТоваровУслугТовары.Ссылка КАК ДокументРТУ
	|ИЗ
	|	Документ.ижСертификат КАК ижСертификат
	|		ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.РеализацияТоваровУслуг.Товары КАК РеализацияТоваровУслугТовары
	|		ПО ижСертификат.Ссылка = РеализацияТоваровУслугТовары.СерияНоменклатуры.ижСертификат
	|ГДЕ
	|	ижСертификат.ЭлектронныйДокумент > &ЭДшка
	|
	|СГРУППИРОВАТЬ ПО
	|	ижСертификат.Ссылка,
	|	ижСертификат.ЭлектронныйДокумент,
	|	РеализацияТоваровУслугТовары.Ссылка");
	
	Запрос.УстановитьПараметр("ЭДшка", Документы.ЭлектронныйДокументИсходящий.НайтиПоНомеру("00000000001"));
	
	ТЗ = Запрос.Выполнить().Выгрузить();
	ТЗ.Индексы.Добавить("Ссылка");
	
	Сертификаты = ТЗ.Скопировать(, "Ссылка");
	Сертификаты.Свернуть("Ссылка");
	Сертификаты = Сертификаты.ВыгрузитьКолонку(0);
	
	Для Каждого Сертификат Из Сертификаты Цикл
		
		ДокументОбъект = Сертификат.ПолучитьОбъект();
		
		МассивСтрок = ТЗ.НайтиСтроки(Новый Структура("Ссылка", Сертификат));
		ДокументОбъект.ЭлектронныеДокументы.Очистить();
		Для Каждого Стр Из МассивСтрок Цикл
			НоваяСтрока = ДокументОбъект.ЭлектронныеДокументы.Добавить();
			НоваяСтрока.ЭлектронныйДокументСертификата = Стр.ЭлектронныйДокумент;
			НоваяСтрока.РеализацияТоваровУслуг = Стр.ДокументРТУ;
		КонецЦикла;
		
		ДокументОбъект.ЭлектронныйДокумент = Неопределено;
		РежимЗаписи = ?(ДокументОбъект.Проведен, РежимЗаписиДокумента.Проведение, РежимЗаписиДокумента.Запись);
		Попытка
			ДокументОбъект.Записать(РежимЗаписи);
		Исключение
			ТекстОшибки = ОписаниеОшибки();
			Сообщить(ТекстОшибки);
		КонецПопытки;
		
	КонецЦикла;
	
КонецПроцедуры
Показать
Оставьте свое сообщение

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