Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Оптимизировать время выполнения
Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7 > Программисту > Программирование в 1С Предприятие 8.3
Veizdem
Добрый день всем. Дали на сопровождение базу (кочует с 7.7, пытались переводить "по живому" на управляемое приложение из обычного, добрались до версии 1с 8.3.8.1933 и спихнули мне), в которой обнаружились "тормоза". Замером производительности нашел где:
всего = тбНачисления.Количество();
    сч = 1;
    Удаления = Новый Массив;
    
    Пока сч <= всего Цикл
        Удаления.Очистить();
        строка = тбНачисления[сч - 1];
        Для каждого стрНач Из тбНачисления Цикл
            Если строка.ВидРасчета <> ПланыВидовРасчета.НачисленияНаФОТ.НайтиПоКоду("КМР")
                И строка.ВидРасчета <> ПланыВидовРасчета.НачисленияНаФОТ.ЕСВФОТБольничные
                И строка.ВидРасчета <> ПланыВидовРасчета.НачисленияНаФОТ.НайтиПоНаименованию("ЕСВ ФОТ (больничные инвалиды)")
                И стрНач.ВидРасчета = ПланыВидовРасчета.НачисленияНаФОТ.НайтиПоКоду("КМР")
                И стрНач.ФизЛицо = строка.ФизЛицо Тогда
                
                Попытка
                    Если стрНач.БазаРасчета <> строка.БазаРасчета
                        И стрНач.БазаРасчетаВсего <> строка.БазаРасчетаВсего Тогда
                    
                        Удаления.Добавить("Истина");
                    Иначе
                        Удаления.Добавить("Ложь");
                    КонецЕсли;
                Исключение
                    Продолжить;
                КонецПопытки;
            КонецЕсли;
            Если строка.ВидРасчета = ПланыВидовРасчета.НачисленияНаФОТ.ЕСВФОТБольничные
                И стрНач.ВидРасчета = ПланыВидовРасчета.НачисленияНаФОТ.ЕСВФОТБольничные
                И стрНач.ФизЛицо = строка.ФизЛицо Тогда
                
                Если стрНач.ДатаНачала = строка.ДатаНачала
                    И стрНач.ДатаОкончания = строка.ДатаОкончания
                    И стрНач.Результат > строка.Результат Тогда
                    
                    Удаления.Добавить("Истина");
                КонецЕсли;
                
            КонецЕсли;
        КонецЦикла;  
            
        Если Удаления.Найти("Ложь") = Неопределено И Удаления.Количество() <> 0 Тогда
            тбНачисления.Удалить(сч - 1);
            всего = всего - 1;
        Иначе
            сч = сч + 1;
        КонецЕсли;
    КонецЦикла;

С одной стороны вроде логично со счетчиком это все очищать от лишних записей, но когда сия зараза вызывается почти 2 миллиона раз это занимает почти 2 часа (по словам бухгалтера, замером производительности результат получился около 5000 секунд). Если честно, сам с 1с не настолько давно работаю и более оптимального варианта не знаю, потому прошу помощи, каким образом это вот чудо можно переписать, чтобы оно быстрее работало?

Уточню, конкретно тормозят строки
Если строка.ВидРасчета <> ПланыВидовРасчета.НачисленияНаФОТ.НайтиПоКоду("КМР")
и
И строка.ВидРасчета <> ПланыВидовРасчета.НачисленияНаФОТ.НайтиПоНаименованию("ЕСВ ФОТ (больничные инвалиды)")
Vofka
Попробуйте все подобны штуки

ПланыВидовРасчета.НачисленияНаФОТ.НайтиПоКоду("КМР")


вынести в отдельные переменные за пределы цикла и внутри цикла сравнивать уже с ними, а не каждый раз НайтиПоКоду().
Veizdem
Vofka @ Сегодня, 13:32 необходимо зарегистрироваться для просмотра ссылки,
В плане сделать что-то вроде этого?
ПоискПоКоду1 = ПланыВидовРасчета.НачисленияНаФОТ.НайтиПоКоду("КМР");
Цикл.....
Если строка.Значение = ПоискПоКоду1 Тогда
....


Заработало! ) Теперь всего 200 секунд на все. Спасибо огромное, у меня совсем из головы вылетело что "НайтиПоКоду" и им подобное это же запрос к базе.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.