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