Имя: Пароль:
1C
1С v8
ЗУП 2.5 Медленная запись в ГрафикиРаботыПоВидамВремени
0 Homer
 
11.02.21
11:44
SQL. Базы идентичные. 8.3.17.1851
Создаем и проводим табель (орг1). В табеле 10 строк. В регистр ГрафикиРаботыПоВидамВремени осуществляется ~1200 перезаписей. Время записи 60 сек. (если очищать регистр то 40 сек). На том же сервере и SQL Есть еще одна база (Орг2). Аналогичная операция занимает 6 сек.
Смотрю общее кол записей в регистре ГрафикиРаботыПоВидамВремени.
Орг1: 1 мил записей – 60 сек перезапись
Орг2: 4 мил записей – 6 сек перезапись.
При проведении документа в Орг1 вижу в консоли 1с что идет большой захват базы данных. (в 10 раз больше чем в Орг2) Запись не линейна т.е. если в табеле 100 строк то запись уже может длится 1,5 часа.
Пытаюсь оптимизировать код. Результат 0

// Процедура удаляет все записи из регистра за ПериодРегистрации,
// если документ последний в этом периоде, в разрезе сотрудников
Процедура УдалитьЗаписиЗаПериодДокумента()
    Запрос = Новый Запрос;
    
    МенеджерВременныхТаблиц = Новый МенеджерВременныхТаблиц;
    
    Запрос.МенеджерВременныхТаблиц = МенеджерВременныхТаблиц;
    Запрос.УстановитьПараметр("Документ", Ссылка);
    Запрос.Текст = "ВЫБРАТЬ РАЗЛИЧНЫЕ
    |    ГрафикиРаботы.Сотрудник КАК ГрафикРаботы,
    |    ГрафикиРаботы.Ссылка.ПериодРегистрации КАК Месяц
    |ПОМЕСТИТЬ ВТСотрудникоМесяц
    |ИЗ
    |    Документ.ТабельУчетаРабочегоВремениОрганизации.ОтработанноеВремя КАК ГрафикиРаботы
    |ГДЕ
    |    ГрафикиРаботы.Ссылка = &Документ";
    Запрос.Выполнить();
    
    Запрос.Текст = "ВЫБРАТЬ РАЗЛИЧНЫЕ
    |СотрудникоМесяц.ГрафикРаботы КАК Сотрудник,
    |СотрудникоМесяц.Месяц КАК Месяц,
    |ВЫБОР
    |    КОГДА ВведенныеДокументы.ГрафикРаботы ЕСТЬ NULL
    |        ТОГДА ИСТИНА
    |    ИНАЧЕ ЛОЖЬ
    |КОНЕЦ КАК УдалятьЗаписиЗаПериод
    |
    |ИЗ
    |    ВТСотрудникоМесяц КАК СотрудникоМесяц
    |ЛЕВОЕ СОЕДИНЕНИЕ    
    |    (ВЫБРАТЬ
    |    СотрудникоМесяц.ГрафикРаботы,
    |    СотрудникоМесяц.Месяц
    |    ИЗ
    |        ВТСотрудникоМесяц КАК СотрудникоМесяц
    |    ВНУТРЕННЕЕ СОЕДИНЕНИЕ
    |        РегистрСведений.ГрафикиРаботыПоВидамВремени КАК ГрафикиРаботы
    |    ПО
    |        ГрафикиРаботы.ГрафикРаботы = СотрудникоМесяц.ГрафикРаботы
    |        И НЕ ГрафикиРаботы.План
    |        И ГрафикиРаботы.Месяц = СотрудникоМесяц.Месяц
    |        И ГрафикиРаботы.Документ <> &Документ
    |        И ГрафикиРаботы.Документ <> ЗНАЧЕНИЕ(Документ.СдельныйНаряд.ПустаяСсылка)
    |        И ГрафикиРаботы.Документ <> ЗНАЧЕНИЕ(Документ.ТабельУчетаРабочегоВремениОрганизации.ПустаяСсылка)
    |        И ГрафикиРаботы.Документ <> НЕОПРЕДЕЛЕНО
    |    )КАК ВведенныеДокументы
    |ПО
    |    ВведенныеДокументы.ГрафикРаботы = СотрудникоМесяц.ГрафикРаботы
    |    И ВведенныеДокументы.Месяц = СотрудникоМесяц.Месяц";
    мВыборкаЗапроса = Запрос.Выполнить().Выгрузить();
    МенеджерВременныхТаблиц.Закрыть();
    
    Блокировка = Новый БлокировкаДанных;
    ЭлементБлокировки = Блокировка.Добавить();
    ЭлементБлокировки.Область = "РегистрСведений.ГрафикиРаботыПоВидамВремени";
    ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный;
    ЭлементБлокировки.ИсточникДанных = мВыборкаЗапроса;
    ЭлементБлокировки.УстановитьЗначение("План", Ложь);
    ЭлементБлокировки.ИспользоватьИзИсточникаДанных("ГрафикРаботы", "ГрафикРаботы");
    ЭлементБлокировки.ИспользоватьИзИсточникаДанных("Месяц", "Месяц");
    Блокировка.Заблокировать();
    
    НаборЗаписей = РегистрыСведений.ГрафикиРаботыПоВидамВремени.СоздатьНаборЗаписей();
    НачатьТранзакцию();
    Для Каждого ВыборкаЗапроса ИЗ мВыборкаЗапроса Цикл
        
        НаборЗаписей.Отбор.План.Установить(Ложь);
        НаборЗаписей.Отбор.ГрафикРаботы.Установить(ВыборкаЗапроса.Сотрудник);
        НаборЗаписей.Отбор.Месяц.Установить(ВыборкаЗапроса.Месяц);
        
        Если ВыборкаЗапроса.УдалятьЗаписиЗаПериод Тогда
            НаборЗаписей.Очистить();
            НаборЗаписей.Записать();
        Иначе
            
            НаборЗаписей.Прочитать();
            Для Каждого Запись Из НаборЗаписей Цикл
                Если (Запись.Документ = Ссылка) Тогда
                    Запись.ОсновноеЗначениеПолное = 0;
                    Запись.ДополнительноеЗначениеПолное = 0;
                    Запись.Документ = Документы.ТабельУчетаРабочегоВремениОрганизации.ПустаяСсылка();
                КонецЕсли;
            КонецЦикла;
            НаборЗаписей.Записать();
        КонецЕсли;
    КонецЦикла;
    ЗафиксироватьТранзакцию();
КонецПроцедуры  // УдалитьЗаписиЗаПериодДокумента()
1 Homer
 
11.02.21
12:12
2 mistеr
 
11.02.21
12:34
(0) Статистику пересоберите.
3 mistеr
 
11.02.21
12:35
Дизайн всей этой хрени, конечно, то еще УГ.