Ошибка Времени Выполнения В 1с

lira89

Well-known member
12.03.2010
154
0
#1
Здравствуйте. Есть самописная конфигурация на 1С 7.7. Ночью происходит запуск обработки, которая осуществляет пересчет записей в Журнале расчетов. Записей в Журнале расчетов много, т.е. всего около 4 000 человек и для каждого несколько видов расчета перерасчитывается. База хранится на MS SQL сервере (не локальная). Расчет занимает около 4 часов, причем на человека (на пересчет назначенных ему видов расчета) в среднем уходит по 3 секунды. Иногда при перерасчете возникает ошибка, после которой обработка завершается и соответственно дальше записи не расчитаны:

Если ЖрнЗарпл.ВыполнитьРасчет() = 0 Тогда : {Обработка.РасчетСтипендии.Форма.Модуль(352)}: SQL State: HYT00 Native: 0 Message: [Microsoft][ODBC SQL Server Driver]Timeout expired

Более подробно указано на картинке.
Это проблема связана с некорректным кодом или все таки проблема в том, что сам виртуальный сервер нагружен и плохо отрабатывает?
 

Вложения

puh14

Well-known member
11.07.2008
1 412
0
#2
Ну так же ясно написано - скулевый драйвер - время ожидания ответа скулевого сервера истекло. Либо результат запроса из разряда "убей слона", либо скулевый сервер по какой-то причине не отвечает. Для начала попробуйте увеличить время ожидания захвата таблиц и увеличьте период опроса изменений Базы (Сервис/Параметры/Общие). не поможет - копать в строну скуля.
 

lira89

Well-known member
12.03.2010
154
0
#3
Либо результат запроса из разряда "убей слона",
Ну запрос делается один раз и его результат помещается в ТЗ, а затем работа только с ТЗ.
Вот кусок кода, в котором я так понимаю происходит сбой
Код:
Если ТаблРезКоп.КоличествоСтрок()>0 Тогда
ТаблРезКоп.Сортировать("Студент,ОчерЗап,ОчерВидРасч");	
МД 	= СоздатьОбъект("MetaDataWork");
ЖрнЗарпл = СоздатьОбъект("ЖурналРасчетов.Стипендия");
ТаблРезКоп.ВыбратьСтроки();
Пока ТаблРезКоп.ПолучитьСтроку() = 1 Цикл
ТаблРезТекЗапись = МД.ЗначениеИзСтрокиБД("ЗаписьЖурналаРасчетов",ИмяЖурнала,ТаблРезКоп.ТекЗапись);
Если ЖрнЗарпл.НайтиЗапись(ТаблРезТекЗапись)=1 Тогда
Если ЖрнЗарпл.ВыполнитьРасчет() = 0 Тогда
Сообщить("Вид расчета:"+СокрЛП(ЖрнЗарпл.ВидРасч),"!!!");
КонецЕсли;
КонецЕсли;
Если КонтрольЦелостности=1 Тогда 
СтатусВозврата(0);
Прервать;
КонецЕсли;			 
КонецЦикла;		
ТаблРезКоп.УдалитьСтроки();
КонецЕсли;
и увеличьте период опроса изменений Базы (Сервис/Параметры/Общие)
у меня стоит 10 сек. Этого мало?

И еще вопросик, именно этот кусок и занимает 3 сек на человека. Можно ли как-то этот момент оптимизировать?
 

puh14

Well-known member
11.07.2008
1 412
0
#4
Увеличьте до минуты.

насчет оптимизировать не скажу. В замере тупит что именно из этого куска, какая строчка?
 

lira89

Well-known member
12.03.2010
154
0
#5
Система тратит время на строку:
Код:
Если ЖрнЗарпл.ВыполнитьРасчет() = 0 Тогда
Причем, я заметила, что первая тысяча человек рассчитывается довольно быстро (на одного человека тратится по 1 сек), но затем время возрастает до 3. Мне кажется это немного странно, ведь в ТаблРезКоп данные не накапливаются, а очищаются после расчета каждого человека.
 

puh14

Well-known member
11.07.2008
1 412
0
#6
Не уверен - возможно при расчете происходит запись в таблицы БД, в таком случае многократная запись может вызвать замедления. Попробуйте перед началом цикла НачатьТранзакцию() а после окончания цикла ЗафиксироватьТранзакцию()
 

Дайнеко

Well-known member
19.11.2009
951
0
#7
Вот я про нее и хотел сказать: Если ЖрнЗарпл.ВыполнитьРасчет() = 0 Тогда
Запускается процедура пересчета чего-то. А насколько она оптимально написана - вопрос.
Найдите ее и посмотрите.
 

puh14

Well-known member
11.07.2008
1 412
0
#8
Вот я про нее и хотел сказать: Если ЖрнЗарпл.ВыполнитьРасчет() = 0 Тогда
Запускается процедура пересчета чего-то. А насколько она оптимально написана - вопрос.
Найдите ее и посмотрите.
Насколько я понимаю - она вообще предопределенная.
 

Дайнеко

Well-known member
19.11.2009
951
0
#10
Я давно не занимался Расчетами. Но понимаю так: Да, "ВыполнитьРасчет()" - это некая предопределенная процедура. Но при ее выполнении делается что-то, причем написанное человеком.

Приведу аналогию:
Стоит команда Док.Провести()
Но для ее отработки запускается процедура ОбработкаПроведения() сотворенная кривыми руками человека, называемого "программист".
Здесь не то-же самое?
 

unknown181538

НеГуру
28.12.2008
1 417
0
#11
"Здесь не то-же самое?" - насколькоя я понимаю, она описана в платформе, в отличие от обработки проведения. Или нет?
 

lira89

Well-known member
12.03.2010
154
0
#12
Этот метод запускаем код, который написан в модуле Видов расчета. Там вроде все просто написано, но может мне и стоит полазить именно там и посмотреть, может что можно и упростить) Спасибо всем за советы.
 

evgenyatam

Well-known member
07.09.2007
175
0
#13
Этот метод запускаем код, который написан в модуле Видов расчета. Там вроде все просто написано, но может мне и стоит полазить именно там и посмотреть, может что можно и упростить) Спасибо всем за советы.

можно попробовать переписать этот код на прямые SQL запросы (нужна ВК 1С++)
 

lira89

Well-known member
12.03.2010
154
0
#14
спасибо за советы. Итог всей головной боли: перенесли базы с виртуального сервера на обычный комп с хорошим железом. Расчет уменьшился с приблизительно с 4 часов до 1,5.