Имя: Пароль:
1C
 
Как ускорить удаление записи из регистра сведений?
0 Leonix
 
07.09.06
11:21
Вот мой алгоритм и результаты экспериментов

//*************************************************************

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

//*************************************************************

До удаления: 24 383    Начало удаления: 07.09.2006 12:18:18
После удаления: 24 382    Конец удаления: 07.09.2006 12:18:34
Удалялось: 16 сек.

//*************************************************************
1 SASH_EG
 
07.09.06
11:31
ну убери третий запрос -он вообще зачем -чтоб ты сам себя проверил , что что-то удалил ?
2 Leonix
 
07.09.06
12:14
(1) Согласен. Убрал из времени выполнения время выполнения третьего запроса.
Вот так:

//****************************************************

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


//****************************************************
Ошибка? Это не ошибка, это системная функция.