Форум 1С
Программистам, бухгалтерам, администраторам, пользователям
Задай вопрос - получи решение проблемы
22 ноя 2024, 00:02

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

Автор Chop, 14 мар 2023, 07:27

0 Пользователей и 1 гость просматривают эту тему.

Chop

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

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

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

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

Для каждого СтрСертификаты Из РезСертификаты Цикл
Если ЗначениеЗаполнено(СтрСертификаты.ЭД) Тогда

Для каждого СтрРТиУ Из РезРТиУ Цикл
Если СтрРТиУ.Сертификат = СтрСертификаты.Ссылка Тогда
ДокСертификат = СтрСертификаты.Ссылка.ПолучитьОбъект();
СтрокаТЧ = ДокСертификат.ЭлектронныеДокументы.Добавить();
СтрокаТЧ.ЭлектронныйДокументСертификата = СтрСертификаты.ЭД;
СтрокаТЧ.РеализацияТоваровУслуг         = СтрРТиУ.Ссылка;
СтрокаТЧ.Вес                            = 0;
КонецЕсли;
КонецЦикла;
КонецЕсли;
КонецЦикла;

Для каждого СтрСертификаты Из РезСертификаты Цикл
Если ЗначениеЗаполнено(СтрСертификаты.ЭД) Тогда

Для каждого СтрРТиУ Из РезРТиУ Цикл
Если СтрРТиУ.Сертификат = СтрСертификаты.Ссылка Тогда
ДокСертификат = СтрСертификаты.Ссылка.ПолучитьОбъект();
ДокСертификат.ЭлектронныйДокумент = Неопределено;
ДокСертификат.Записать();
КонецЕсли;
КонецЦикла;
КонецЕсли;
КонецЦикла;

КонецПроцедуры

Я пробовал всячески засунуть "ДокСертификат.ЭлектронныйДокумент = Неопределено;" в первый цикл, но либо выдает ошибку, либо не отрабатывает как надо. Может я чего-то упустил, не исключаю, но как-то не хочется пускать код, где 10 записей обрабатываются 3,5 минуты (даже не смотря на то, что обработка одноразовая и после окончания отправиться в мусорку).

Chop

Чтоб не выглядеть совсем дураком был такой вариант

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

Может я его некорректно протестил, но отработал не так как надо

LexaK

Chop, ну рекомендации стандартные, попробуйте сделать ОДИН запрос,
и ОДИН обход результата ОДНИМ циклом!
будет гораздо оптимальнее!
если помогло нажмите: Спасибо!

Теги:

Похожие темы (5)

Рейтинг@Mail.ru

Поиск