Заказы на доработку 1С (сервис удаленной работы)

Хранилище

База знаний
Неназначенных незавершенных заказов: 2, свеженьких 1
Бесплатные отчеты, обработки, конфигурации, внешние компоненты для 1С Статьи, описание работы, методики по работе с 1С

Здравствуйте, гость ( Вход | Зарегистрироваться )



> Оптимизировать время выполнения , Слишком долго думает, нужно ускорить          
Veizdem Подменю пользователя
сообщение 31.07.16, 12:15
Сообщение #1

Говорящий
***
Группа: Пользователи
Сообщений: 96
Из: Кривой Рог, Украина
Спасибо сказали: 10 раз
Рейтинг: 0

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

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

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


Сообщение отредактировал Vofka - 31.07.16, 20:03


Signature
В моих жилах текут нолики и единички...

Vofka Подменю пользователя
сообщение 31.07.16, 12:32
Сообщение #2

У нас здесь своя атмосфера...
***********
Группа: Основатель
Сообщений: 13955
Из: Киев
Спасибо сказали: 4519 раз
Рейтинг: 3641.2

Попробуйте все подобны штуки

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


вынести в отдельные переменные за пределы цикла и внутри цикла сравнивать уже с ними, а не каждый раз НайтиПоКоду().

Спасибо сказали: Veizdem,

Veizdem Подменю пользователя
сообщение 31.07.16, 13:00
Сообщение #3

Говорящий
***
Группа: Пользователи
Сообщений: 96
Из: Кривой Рог, Украина
Спасибо сказали: 10 раз
Рейтинг: 0

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


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


Signature
В моих жилах текут нолики и единички...

Не нашли ответа на свой вопрос?
Зарегистрируйтесь и задайте новый вопрос.


Ответить Новая тема
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 

RSS Текстовая версия Сейчас: 20.04.24, 5:41
1С Предприятие 8.3, 1С Предприятие 8.2, 1С Предприятие 8.1, 1С Предприятие 8.0, 1С Предприятие 7.7, Литература 1С, Общие вопросы по администрированию 1С, Методическая поддержка 1С - всё в одном месте: на Украинском 1С форуме!