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

Тема в разделе "1C и всё что с ней связано", создана пользователем lira89, 14 фев 2013.

  1. lira89

    lira89 Well-Known Member

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

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

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

    Вложения:

  2. puh14

    puh14 Well-Known Member
    1C Team

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

    lira89 Well-Known Member

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

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

    puh14 Well-Known Member
    1C Team

    Регистрация:
    11 июл 2008
    Сообщения:
    1.412
    Симпатии:
    0
    Увеличьте до минуты.

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

    lira89 Well-Known Member

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

    puh14 Well-Known Member
    1C Team

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

    Дайнеко Well-Known Member
    1C Team

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

    puh14 Well-Known Member
    1C Team

    Регистрация:
    11 июл 2008
    Сообщения:
    1.412
    Симпатии:
    0
    Насколько я понимаю - она вообще предопределенная.
     
  9. lira89

    lira89 Well-Known Member

    Регистрация:
    12 мар 2010
    Сообщения:
    159
    Симпатии:
    0
    Это стандартный метод журнала расчетов.
     
  10. Дайнеко

    Дайнеко Well-Known Member
    1C Team

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

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

    unknown181538 НеГуру
    1C Team

    Регистрация:
    28 дек 2008
    Сообщения:
    1.418
    Симпатии:
    0
    "Здесь не то-же самое?" - насколькоя я понимаю, она описана в платформе, в отличие от обработки проведения. Или нет?
     
  12. lira89

    lira89 Well-Known Member

    Регистрация:
    12 мар 2010
    Сообщения:
    159
    Симпатии:
    0
    Этот метод запускаем код, который написан в модуле Видов расчета. Там вроде все просто написано, но может мне и стоит полазить именно там и посмотреть, может что можно и упростить) Спасибо всем за советы.
     
  13. evgenyatam

    evgenyatam Well-Known Member

    Регистрация:
    7 сен 2007
    Сообщения:
    175
    Симпатии:
    0
    Этот метод запускаем код, который написан в модуле Видов расчета. Там вроде все просто написано, но может мне и стоит полазить именно там и посмотреть, может что можно и упростить) Спасибо всем за советы.

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

    lira89 Well-Known Member

    Регистрация:
    12 мар 2010
    Сообщения:
    159
    Симпатии:
    0
    спасибо за советы. Итог всей головной боли: перенесли базы с виртуального сервера на обычный комп с хорошим железом. Расчет уменьшился с приблизительно с 4 часов до 1,5.
     
Загрузка...
Похожие Темы - Ошибка Времени Выполнения
  1. Lamerman
    Ответов:
    0
    Просмотров:
    26
  2. Enima
    Ответов:
    0
    Просмотров:
    51
  3. Baindt
    Ответов:
    1
    Просмотров:
    73
  4. anna
    Ответов:
    2
    Просмотров:
    79
  5. gramzer
    Ответов:
    1
    Просмотров:
    120

Поделиться этой страницей