|
нужна помощь в оптимизации кода обработки | ☑ | ||
---|---|---|---|---|
0
Black Dragon
09.02.15
✎
13:31
|
Доброго дня!
есть обработка по удалению документов из базы 1С, нетиповая конфа. запрос работает хорошо, быстро! при обработке результата запроса при изменении уровня вложенности наблюдаются тормоза. подскажите, кто знает, в чем может быть причина? Функция ЗаполнитьТаблицуДокументов() Запрос = Новый Запрос; Запрос.УстановитьПараметр("Собственник",Собственник); Запрос.Текст = "ВЫБРАТЬ | ЗаказыОбороты.Заказ КАК Заказ, | ЗаказыОбороты.Регистратор КАК Операция, | ЗаказыОбороты.Регистратор.Владелец КАК Документ |ИЗ | РегистрНакопления.Заказы.Обороты(ДАТАВРЕМЯ(2009,1,1), ДАТАВРЕМЯ(2014,12,31), Регистратор, Заказ.Собственник = &Собственник) КАК ЗаказыОбороты | |ОБЪЕДИНИТЬ | |ВЫБРАТЬ | ОстаткиТоваровОстаткиИОбороты.Заказ, | ОстаткиТоваровОстаткиИОбороты.Регистратор, | ОстаткиТоваровОстаткиИОбороты.Регистратор.Владелец |ИЗ | РегистрНакопления.ОстаткиТоваров.ОстаткиИОбороты(, , Регистратор, , Заказ.Собственник = &Собственник) КАК ОстаткиТоваровОстаткиИОбороты | |УПОРЯДОЧИТЬ ПО ЗаказыОбороты.Заказ |ИТОГИ ПО | Заказ, | Документ"; Попытка РезультатЗапроса = Запрос.Выполнить(); ТабЗависимыхСсылок = РезультатЗапроса.Выгрузить(); ЭлементыФормы.ТабЗависимыхСсылок.СоздатьКолонки(); Возврат РезультатЗапроса; Исключение Возврат Неопределено; КонецПопытки; КонецФункции ... ... НомЗаказа = 0; НомТранзакции = 0; КолВТранзакции = 300; НачатаТранзакция = Ложь; Если ТабЗависимыхСсылок.Количество() Тогда КолЗаписейВсего = ВыборкаДанных.Выбрать().Количество(); ВыборкаЗаказ = ВыборкаДанных.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкамСИерархией,"Заказ"); КолЗаказов = ВыборкаЗаказ.Количество(); Сообщить("Будет удалено " + КолЗаписейВсего + " записей"); НомЗаписи = 0; Пока ВыборкаЗаказ.Следующий() Цикл НомЗаказа = НомЗаказа + 1; НомТранзакции = НомТранзакции + 1; Если НЕ НачатаТранзакция Тогда НачатьТранзакцию(); НачатаТранзакция = Истина; КонецЕсли; Если ТипЗнч(ВыборкаЗаказ.Заказ) = Тип("ДокументСсылка.ЗаказНаПриемку") ИЛИ ТипЗнч(ВыборкаЗаказ.Заказ) = Тип("ДокументСсылка.ЗаказНаОтгрузку") Тогда ОбЗаказ = ВыборкаЗаказ.Заказ.ПолучитьОбъект(); //Состояние("" + ТекущаяДата() + " Обрабатывается " + НомЗаказа + " из " + КолЗаказов); ВыборкаДок = ВыборкаЗаказ.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкамСИерархией,"Документ"); Пока ВыборкаДок.Следующий() Цикл // поиск в исключениях Если ТабИсклДоков.Количество() Тогда // есть строки исключений Если ТипЗнч(ВыборкаДок.Документ) = Тип("ДокументСсылка.ЗаказНаПриемку") ИЛИ ТипЗнч(ВыборкаДок.Документ) = Тип("ДокументСсылка.ЗаказНаОтгрузку") Тогда СтрЗаказ = ТабИсклДоков.Найти(ВыборкаДок.Документ,"ЗаказНеУдалять"); Если НЕ СтрЗаказ = Неопределено Тогда //Сообщить("Документ " + ВыборкаДок.Документ + " в списке исключений!"); Продолжить; КонецЕсли; Иначе СтрДок = ТабИсклДоков.Найти(ВыборкаДок.Документ,"Документ"); Если НЕ СтрДок = Неопределено Тогда //Сообщить("Документ " + ВыборкаДок.Документ + " в списке исключений!"); Продолжить; КонецЕсли; КонецЕсли; КонецЕсли; ОбДок = ВыборкаДок.Документ.ПолучитьОбъект(); Если НЕ ОбДок = Неопределено Тогда //Сообщить("Обрабатывается " + ОбДок); Выборка = ВыборкаДок.Выбрать(); Пока Выборка.Следующий() Цикл НомЗаписи = НомЗаписи + 1; Состояние("" + ТекущаяДата() + " Обрабатывается " + НомЗаписи + " из " + КолЗаписейВсего + " записей...Заказ " + НомЗаказа + " из " + КолЗаказов); Если ТипЗнч(Выборка.Операция) = Тип("ДокументСсылка.Операция") Тогда ОбОпер = Выборка.Операция.ПолучитьОбъект(); Если НЕ ФлагЭмуляции Тогда Попытка ОбОпер.Удалить(); Исключение //Сообщить(ОписаниеОшибки()); КонецПопытки; КонецЕсли; КонецЕсли; КонецЦикла; Если НЕ ФлагЭмуляции Тогда Попытка ОбДок.Удалить(); Исключение //Сообщить(ОписаниеОшибки()); КонецПопытки; КонецЕсли; КонецЕсли; КонецЦикла; КонецЕсли; Если НачатаТранзакция Тогда Если НомТранзакции = КолВТранзакции Тогда ЗафиксироватьТранзакцию(); НачатаТранзакция = Ложь; НомТранзакции = 0; КонецЕсли; КонецЕсли; ОбработкаПрерыванияПользователя(); Если ПроверитьВремяОстанова() Тогда Прервать; КонецЕсли; КонецЦикла; Если НачатаТранзакция Тогда ЗафиксироватьТранзакцию(); КонецЕсли; КонецЕсли; Сообщить("Удаление записей по заказам выполнено..."); |
|||
1
Быдло замкадное
09.02.15
✎
13:45
|
Закомментируй все "ОбОпер.Удалить();" будет работать быстрее 100%
|
|||
2
Быдло замкадное
09.02.15
✎
13:45
|
(1) и "ОбДок.Удалить();" тоже.
Вобщем все где Удалить() |
|||
3
Black Dragon
09.02.15
✎
13:46
|
(1)(2) очень смешно! правда!
|
|||
4
Быдло замкадное
09.02.15
✎
13:47
|
(3) ну удаление и запись всегда дольше чем Запрос..
|
|||
5
Borteg
09.02.15
✎
13:48
|
(0) столько объектов получаешь, конечно обработка тормозит.
|
|||
6
Black Dragon
09.02.15
✎
13:49
|
(5) чем можно заменить выражение ПолучитьОбъект() ???
|
|||
7
Black Dragon
09.02.15
✎
13:50
|
либо как еще? возможно ли получать объекты запросом непосредственно?
|
|||
8
lxndr
09.02.15
✎
13:51
|
(6) Ничем. Заменишь - не получишь объект ))
|
|||
9
lxndr
09.02.15
✎
13:52
|
ТабИсклДоков - фильтруй в запросе
|
|||
10
Black Dragon
09.02.15
✎
13:54
|
(9) эта таблица по замыслу к моменту удаления доков пустая должна быть
|
|||
11
Black Dragon
09.02.15
✎
13:55
|
Функция ЗаполнитьТаблицуИсключений()
Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ РАЗЛИЧНЫЕ | ЗаказыОбороты1.Регистратор КАК Операция, | ЗаказыОбороты1.Регистратор.Владелец КАК Документ, | ЗаказыОбороты1.Заказ КАК ЗаказНеУдалять, | ЗаказыОбороты1.Заказ.Собственник КАК Собственник |ИЗ | РегистрНакопления.Заказы.Обороты(ДАТАВРЕМЯ(2009, 1, 1), , Регистратор, Заказ.Собственник = &Собственник) КАК ЗаказыОбороты1 | ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрНакопления.Заказы.Обороты(ДАТАВРЕМЯ(2009, 1, 1), , Регистратор, ) КАК ЗаказыОбороты2 | ПО ЗаказыОбороты1.Регистратор.Владелец = ЗаказыОбороты2.Регистратор.Владелец | И ЗаказыОбороты1.Заказ.Собственник <> ЗаказыОбороты2.Заказ.Собственник | И ЗаказыОбороты1.Регистратор.Владелец.Дата > ДАТАВРЕМЯ(2009,1,1) | |ОБЪЕДИНИТЬ | |ВЫБРАТЬ РАЗЛИЧНЫЕ | ОстаткиОбороты1.Регистратор КАК Операция, | ОстаткиОбороты1.Регистратор.Владелец КАК Документ, | ОстаткиОбороты1.Заказ КАК ЗаказНеУдалять, | ОстаткиОбороты1.Заказ.Собственник КАК Собственник |ИЗ | РегистрНакопления.ОстаткиТоваров.Обороты(ДАТАВРЕМЯ(2009, 1, 1), , Регистратор, Заказ.Собственник = &Собственник) КАК ОстаткиОбороты1 | ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрНакопления.ОстаткиТоваров.Обороты(ДАТАВРЕМЯ(2009, 1, 1), , Регистратор, ) КАК ОстаткиОбороты2 | ПО ОстаткиОбороты1.Регистратор.Владелец = ОстаткиОбороты2.Регистратор.Владелец | И ОстаткиОбороты1.Заказ.Собственник <> ОстаткиОбороты2.Заказ.Собственник | И ОстаткиОбороты1.Регистратор.Владелец.Дата > ДАТАВРЕМЯ(2009,1,1)"; Запрос.УстановитьПараметр("Собственник", Собственник); Возврат Запрос.Выполнить().Выгрузить(); КонецФункции |
|||
12
Dmitrii
гуру
09.02.15
✎
13:55
|
(6)(7) Какой-то безумный алгоритм.
Напиши запрос таким образом, чтобы на выходе сразу получить список ссылок на документы, которые надо удалить (с учетом типов, исключений и прочих условий). Чтобы потом только в цикле обхода результатов запроса выполнить две строчки: ДокОбъект = Выборка.Ссылка.ПолучитьОбъект(); ДокОбъект.Удалить(); |
|||
13
alle68
09.02.15
✎
13:57
|
(7) Попробуй "УдалениеОбъекта". Потом расскажешь что быстрее.
|
|||
14
Black Dragon
09.02.15
✎
14:01
|
УдалениеОбъекта (ObjectDeletion)
На основании ссылки Синтаксис: Новый УдалениеОбъекта(<Ссылка>) Параметры: <Ссылка> (обязательный) Ссылка на объект базы данных, который должен быть удален. Описание: Создает экземпляр объекта с заданным значением ссылки на объект базы данных. Также может быть создан с использованием функциональной формы оператора Новый. Пример: Массив = Новый Массив; Массив.Добавить(Справочники.Валюты.НайтиПоКоду("999")); УдалениеОбъекта = Новый (Тип("УдалениеОбъекта"),Массив); УдалениеОбъекта.Записать(); |
|||
15
Black Dragon
09.02.15
✎
14:02
|
не очень понятно - удаляет ли объект???
|
|||
16
Black Dragon
09.02.15
✎
14:05
|
все, разобрался
УдалениеОбъекта (ObjectDeletion) Свойства: ОбменДанными (DataExchange) Ссылка (Ref) Методы: Записать (Write) Конструкторы: На основании ссылки Описание: Предназначен для удаления объекта базы данных. Объект хранит ссылку на объект базы данных и при обращении к методу Записать() производит удаление объекта базы данных, на который показывает ссылка. Кроме того, данный объект имеет свойство ОбменДанными, которое содержит параметры обмена данными, используемые при удалении объекта, на который показывает ссылка. Основное назначение данного объекта - переносить удаление объектов базы данных при использовании в составе других механизмов обмена данными. Доступность: Сервер, толстый клиент, внешнее соединение, мобильное приложение(сервер). Данный объект может быть сериализован в/из XML. Данный объект может быть сериализован в/из XDTO. Тип XDTO, соответствующий данному объекту, определяется в пространстве имен {http://v8.1c.ru/8.1/data/enterprise}. Имя типа XDTO: ObjectDeletion. |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |