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

Обработка с черепашьей скоростью....

Автор Nail2010, 24 мар 2011, 09:54

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

Nail2010

В чем может быть причина медленного выполнения обработки? Всего-то 1015 документов заполняется и дозаписывается уже 2,5 часа.....делаю скидку на то, что работаю на сервере  с подключенными 6 рабочими машинами, но все равно.....В чем может быть причина?

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

Klyacksa

Посмотрите, что выполняется в документе ДокументРасчетовСКонтрагентом ПередЗаписью/ПриЗаписи/ПослеЗаписи/ОБработкаПроведения. Возможно, там есть тяжеловесный код, который и тормозит работу.
xxx: Спасибо! Я бы загуглил, но ты интересней. Материшься. Злишься. Послать можешь...

Мысль - это оргазм мозга. Кто способен его испытать - получают истинное наслаждение, остальным приходится имитировать

Nail2010

Процедура ПослеЗаписи()

// Установка кнопок печати
УстановитьКнопкиПечати();
МеханизмНумерацииОбъектов.ОбновитьПодсказкуКодНомерОбъекта(ЭтотОбъект.Метаданные(), ЭлементыФормы.ДействияФормы.Кнопки.Подменю, ЭлементыФормы.Номер);

КонецПроцедуры // ПослеЗаписи()

Да код то всего ничего.....хотя обработка до сих пор пашет... нехочется обрывать контрл-альт-дел, потому что так все зааписи стираются в ноль...

cska-fanat-kz

Отладьте с замером производительности. УзнАете где больше всего времени тратится...
Получил помощь - скажи СПАСИБО.
Разобрался сам - расскажи другим.

Klyacksa

Ну раз уж она уже работает, то код править бесполезно, наверное.
А вообще, в таких случаях, посоветовала бы Вам состояние писать. Хоть было бы понятно, на каком она месте сейчас.

И плюс несколько небольших замечаний:
1. Зачем запросом брать табличные части документов ВводНачальныхОстатков, если из запроса Вы все-равно берете только ссылку на сам документ, организацию и дату (это все данные из документа, а не из табличной части). Так запрос выполняется дольше.
2. Если уж Вам нужно обрабатывать табличную часть, то нужно ее было запросом сразу и получить, и не получать потом ее для каждого документа.
3. В цикле каждый раз получаете одно и то же значение:
Справочники.ДоговорыКонтрагентов.НайтиПоНаименованию("Основной договор");

Хотя можно было его получить один раз перед циклом и запомнить в переменную.
4. Можно использовать метод "ОбработкаПрерыванияПользователя", чтобы по Ctrl-break корректно прерывать затянувшуюся процедуру.

Помимо процедур ПередЗаписью/ПриЗаписи/ПослеЗаписи/ОбработкаПроведения могут еще отрабатывать Подписки на события.
xxx: Спасибо! Я бы загуглил, но ты интересней. Материшься. Злишься. Послать можешь...

Мысль - это оргазм мозга. Кто способен его испытать - получают истинное наслаждение, остальным приходится имитировать

Klyacksa

Кстати, перечисленные мной процедуры записи/проведения нужно у обоих документов проверять - и у ВводНачальныхОстатков, и у ДокументРасчетовСКонтрагентом.

Почему записи при прерывании стираются в ноль? По идее, должно что-то оставаться.

А, и еще момент. Вот на основании строк табличной части, Вы создаете документы ДокументРасчетовСКонтрагентом. А если второй раз запустим обработку? Данные задвоятся. Будете руками чистить?
xxx: Спасибо! Я бы загуглил, но ты интересней. Материшься. Злишься. Послать можешь...

Мысль - это оргазм мозга. Кто способен его испытать - получают истинное наслаждение, остальным приходится имитировать

Nail2010

Обработка Внешняя. Видимо, правда - запрос зацикливается может быть немного, что-ли... насчет лишних документов - так как процедура обработки в принципе, разовая - ввод остатков делается ведь раз в год - то есть кнопочка УДАЛИТЬ, обработчик которой и стирает лишние документы. А как по вашему, можно мой код оптимизировать без запроса?

Klyacksa

Что значит оптимизировать без запроса?)) Не оптимизировать запрос, или вообще его убрать?
Можно и без запроса, но так будет дольше перебирать документы. Лучше запрос допилить. Направление как допилить - я уже описала :)
xxx: Спасибо! Я бы загуглил, но ты интересней. Материшься. Злишься. Послать можешь...

Мысль - это оргазм мозга. Кто способен его испытать - получают истинное наслаждение, остальным приходится имитировать

Nail2010

А вот и мой рекорд - время выполнения обработки - 5 часов 15 минут..... Процедура ОбалдетьИПадСтол()....

Nail2010

Может к концу дня у меня мозг уже кипит, но.... где я так зациклил запись, что документ Расчета с Контрагентом у меня создался 1002001 раз???

Теги:

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

Рейтинг@Mail.ru

Поиск