• 15 апреля стартует «Курс «SQL-injection Master» ©» от команды The Codeby

    За 3 месяца вы пройдете путь от начальных навыков работы с SQL-запросами к базам данных до продвинутых техник. Научитесь находить уязвимости связанные с базами данных, и внедрять произвольный SQL-код в уязвимые приложения.

    На последнюю неделю приходится экзамен, где нужно будет показать свои навыки, взломав ряд уязвимых учебных сайтов, и добыть флаги. Успешно сдавшие экзамен получат сертификат.

    Запись на курс до 25 апреля. Получить промодоступ ...

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

  • Автор темы lira89
  • Дата начала
L

lira89

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

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

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

Вложения

  • ошибка_сегодня.JPG
    ошибка_сегодня.JPG
    26,1 КБ · Просмотры: 713
P

puh14

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

lira89

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

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

puh14

Увеличьте до минуты.

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

lira89

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

puh14

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

Дайнеко

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

puh14

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

Насколько я понимаю - она вообще предопределенная.
 
Д

Дайнеко

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

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

unknown181538

"Здесь не то-же самое?" - насколькоя я понимаю, она описана в платформе, в отличие от обработки проведения. Или нет?
 
L

lira89

Этот метод запускаем код, который написан в модуле Видов расчета. Там вроде все просто написано, но может мне и стоит полазить именно там и посмотреть, может что можно и упростить) Спасибо всем за советы.
 
E

evgenyatam

Этот метод запускаем код, который написан в модуле Видов расчета. Там вроде все просто написано, но может мне и стоит полазить именно там и посмотреть, может что можно и упростить) Спасибо всем за советы.

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

lira89

спасибо за советы. Итог всей головной боли: перенесли базы с виртуального сервера на обычный комп с хорошим железом. Расчет уменьшился с приблизительно с 4 часов до 1,5.
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!