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

Ошибка времени выполнения

Я
   Segate

08.05.15 — 13:05

Выборка = Справочники.ПодразделенияОрганизаций.Выбрать();

Подр = новый Структура;

Пока Выборка.Следующий() цикл

    Подр.вставить(УбратьЛишниеСимволы(Выборка.Наименование),Выборка.Ссылка);

КонецЦикла;

НУжно сформировать структуру из подразделения и его имени(из которого убрано все лишнее)

На одном из подразделений все падает. В соседней базе все отрабатывает без проблем. Куда копать?

ЗЫ база клиент-серверная, Функция «УбратьЛишниеСимволы» отрабатывает нормально, говорит отладчик.

   Segate

1 — 08.05.15 — 13:09

   vicof

2 — 08.05.15 — 13:13

по-моему отладчик падает на строке 1757

   Segate

3 — 08.05.15 — 13:20

(2) Ты просто гений

   vicof

4 — 08.05.15 — 13:25

(3) Я знаю. А ты похоже остановку по ошибке не можешь сделать.

   Segate

5 — 08.05.15 — 13:51

(4) а ты думаешь как я этот скрин извлек?

Я привел тебе пример кода:

Подр = новый Структура;

Пока Выборка.Следующий() цикл

    Ключ =УбратьЛишниеСимволы(Выборка.Наименование); ///Ключ на выходе тип строка.

    Значение =Выборка.Ссылка;                       /// Значение тип справочник ссылка подразделение

    Подр.вставить(Ключ,Значение);                   /// это строка 1758, на ней все падает. при чем на одном конкретном подразделении. Остановка по ошибке дает именно такой результат, который показан на скрине. Я с такой ошибкой сталкиваюсь в первый раз. В конфигурации с такой же точно структурой, все отрабатывает без проблем.

КонецЦикла;

   ДенисЧ

6 — 08.05.15 — 13:51

Значит в строке Ключ корявые данные, например, непечатные символы

   Segate

7 — 08.05.15 — 13:54

(6)из строки Ключ убраны все символы, кроме букв рус/лат и цифр. Вот по такой маске:ПравильныеСимволы=»QWERTYUIOPASDFGHJKLZXCVBNMqwertyuiopasdfghjklzxcvbnmЙЦУКЕНГШЩЗХЪФЫВАПРОЛДЖЭЯЧСМИТЬБЮйцукенгшщзхъфывапролджэячсмитьбю1234567890″)

Так что тоже не вариант…

   hhhh

8 — 08.05.15 — 13:54

(7) цифры тоже убирай. Зачем цифры туда запендюрил?

   ДенисЧ

9 — 08.05.15 — 13:55

похоже, таки черепашка…

   Segate

10 — 08.05.15 — 13:56

(8) потому что подразделение имеет название по адресу. И на одной улице может быть несколько подразделений… так что цифры нужны

   vde69

11 — 08.05.15 — 13:57

вставь перед этой строкой

сообщить(типЗнч(Ключ));

сообщить(типЗнч(Значение))

есть подозрение на null

   hhhh

12 — 08.05.15 — 13:57

(10) тогда чего удивляешься? Хотя бы сделай тогда

Подр.вставить(«Поле» + УбратьЛишниеСимволы(Выборка.Наименование),Выборка.Ссылка);

   H A D G E H O G s

13 — 08.05.15 — 14:01

Цифры впереди букоф.

   vde69

15 — 08.05.15 — 14:03

Ключ =»_»+УбратьЛишниеСимволы(Выборка.Наименование);

   Segate

16 — 08.05.15 — 14:10

(11)http://s45.radikal.ru/i109/1505/71/ce3d3e6366a7.jpg

Тип: «Самключ»

Тип: «СамоЗначение»

падает именно на этом подразделении

   ДенисЧ

17 — 08.05.15 — 14:10

(16) у тебя ключ на цифру начинается. О чём тебе уже долго твердят.

   H A D G E H O G s

18 — 08.05.15 — 14:14

Нельзя в Структуру много данных писать.

  

Segate

19 — 08.05.15 — 14:18

(17) Пятница дает о себе знать… читал сп, но почему то не придал значение…

(13),(15)Все решилось, спасибо всем.

(18) там не сильно много много.

0 / 0 / 0

Регистрация: 07.03.2010

Сообщений: 154

1

13.02.2013, 10:39. Показов 36178. Ответов 13


Студворк — интернет-сервис помощи студентам

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

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

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



0



0 / 0 / 0

Регистрация: 07.07.2008

Сообщений: 1,401

13.02.2013, 11:56

2

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



0



0 / 0 / 0

Регистрация: 07.03.2010

Сообщений: 154

13.02.2013, 12:19

3

Либо результат запроса из разряда «убей слона»,

Ну запрос делается один раз и его результат помещается в ТЗ, а затем работа только с ТЗ.
Вот кусок кода, в котором я так понимаю происходит сбой

Код

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

и увеличьте период опроса изменений Базы (Сервис/Параметры/Общие)

у меня стоит 10 сек. Этого мало?

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



0



0 / 0 / 0

Регистрация: 07.07.2008

Сообщений: 1,401

13.02.2013, 13:35

4

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

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



0



0 / 0 / 0

Регистрация: 07.03.2010

Сообщений: 154

13.02.2013, 15:13

5

Система тратит время на строку:

Код

Если ЖрнЗарпл.ВыполнитьРасчет() = 0 Тогда

Причем, я заметила, что первая тысяча человек рассчитывается довольно быстро (на одного человека тратится по 1 сек), но затем время возрастает до 3. Мне кажется это немного странно, ведь в ТаблРезКоп данные не накапливаются, а очищаются после расчета каждого человека.



0



0 / 0 / 0

Регистрация: 07.07.2008

Сообщений: 1,401

13.02.2013, 20:13

6

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



0



1 / 1 / 0

Регистрация: 15.11.2009

Сообщений: 947

13.02.2013, 20:15

7

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



0



0 / 0 / 0

Регистрация: 07.07.2008

Сообщений: 1,401

13.02.2013, 20:17

8

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

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



0



0 / 0 / 0

Регистрация: 07.03.2010

Сообщений: 154

14.02.2013, 12:05

9

ВыполнитьРасчет()
Назначение:
Выполнить расчет текущей записи журнала расчетов.

Это стандартный метод журнала расчетов.



0



1 / 1 / 0

Регистрация: 15.11.2009

Сообщений: 947

15.02.2013, 13:46

10

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

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



0



0 / 0 / 0

Регистрация: 24.12.2008

Сообщений: 1,399

17.02.2013, 14:21

11

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



0



0 / 0 / 0

Регистрация: 07.03.2010

Сообщений: 154

18.02.2013, 00:05

12

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



0



0 / 0 / 0

Регистрация: 15.02.2008

Сообщений: 173

19.02.2013, 15:56

13

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

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



0



0 / 0 / 0

Регистрация: 07.03.2010

Сообщений: 154

27.02.2013, 23:21

14

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



0



IT_Exp

Эксперт

87844 / 49110 / 22898

Регистрация: 17.06.2006

Сообщений: 92,604

27.02.2013, 23:21

Помогаю со студенческими работами здесь

Ошибка времени выполнения
Ошибка в 17 строке: Ссылка на объект не указывает на экземпляр объекта…

var
a: array of…

Ошибка времени выполнения
Я пишу проэкт в Visual Studia 2008 на C++. У меня есть несколько проблем.
Во-первых, когда я…

Ошибка времени выполнения
Помогите пожалуйста с кодом!

var
i,j,n1,n2,m1,m2:integer;
A,B: array of array of real;

Ошибка времени выполнения
Ошибка времени выполнения, индекс находится вне границ массива, строка 58, не понимаю в чем дело…

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:

14

Ошибка 8000401A

В свойствах COM+ приложения 1CV8 на серверном компьютере на закладке Identity установлен Interactive user, но никакой ользователь интерактивно не вошел в серверный компьютер. 

Ошибка 80004027

приложение 1CV8 или сомпонента v8.server.1 выключена, если сервер на Windows Server 2003. см. статью “Особенности настройки Windows Server 2003 при установке сервера 1С:Предприятия 8.0” на диске ИТС.

Ошибка 00000005, 00000041, 80070005, 80080005, 80000009, 80030005,8001011B

Клиент не имеет прав на доступ к серверу (access denied). Выполните рекомендации статьи “Вопросы установки и настройки 1C:Предприятия 8.0  варианте “клиент-сервер”” из раздела методической поддержки
1С:Предприятия 8.0 на диске ИТС.

Ошибка 80010108

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

Ошибка 8001011C, 80070005

На клиентском компьютере запрещено использование DCOM. Помогает

запустить на клиентском компьютере dcomcnfg.exe  на закладке Default Properties установить флаг Enable distributed COM on this computer.

Ошибка 800706BF “Объект сервера 1С предприятия не обнаружен” После выбора информационной базы (но до логина в 1С).

Возможные решения: 

    1.Права пользователя.Возможно, что пользователь, от имени которого запускается клиентское приложение не зарегистрирован и не доступен компьютеру сервера 1С:Предприятия.
    2. Проверьте на клиентском компьютере настройки DCOM.

  • dcomcnfg/ Default protocols:
  • Connection oriented TCP/IP
  • dcomcnfg/ Default properties:
  • Enable distributed COM on this computer
  • Default authentication level: Connect
  • Default impersonation level: Identify

    3. Попробуйте на серверном и клиентском компьютере понизить уровень аутентификации:

  • Default authentication level: None  

    4. Проверьте, не установлено ли сетевых экранов. Откройте порт 135 и те, которые указаны на клиенте и сервере в диалоге:

  • dcomcnfg/ Default protocols/ Properties/ Post Ranges. Если там диапазонов портов не указано – задайте их.

Ошибка 800706BA, 00706BE

На сервере произошло неожиданное исключение. Сервер упал. Нужны записи из Event Log с сервера.

Ошибка 80070721

Ошибка возникает при рассогласовании протоколов аутентификации между DCOM клиентом и сервером в том случае, если для связи между ними используется Microsoft Internet Information Services (IIS).
Возможно, для DCOM используется протокол Tunneling TCP/IP.

  • Установите а компьютере – сервере 1С:Предприятия и на клиентских компьютерах для DCOM протокол Connection-oriented TCP/IP.

Ошибка 80070776

Запустить DcomCnfg.exe и проверить протокол для DCOM должен быть TCP/IP с ориентацией на подключения

Ошибка СУБД:

OLE DB Provider for SQL Server: Intra-query parallelism caused your server command (process ID #XX) to deadlock. Rerun the query without intra-query parallelism by using the query hint option (maxdop 1)”

  • Для решения описанных выше проблем необходимо установить значение параметра max degree of parallelism равным 1. Следует учитывать, что эта установка ограничивает количество процессоров, которые использует SQL Server при выполнении отдельного запроса, и как правило, это не оказывает существеного влияния на время выполнения большинства используемых запросов.
  • Однако это не ограничивает количество доступных SQL Server процессоров в целом, т.е. два запроса от разных клиентских приложений будут выполняться параллельно.
  • Если при использовании этих рекомендаций существенно снижается производительность 1С:Предприятия, то единственным способом решения этой проблемы остается изменение запроса.

Добрый день. Подскажите, пожалуйста, почему может возникать «ошибка времени выполнения» при записи в регистр сведений? Регистр сведений непериодический, независимый. Все реквизиты, ресурсы, измерения задаются корректно. Использую следующий код:

+ к — Отбор при создании набора записей не делаю, но и при записи набора старые записи не удаляю (Набор.Записать(Ложь))

Варианта 2: 1) ты записываешь с признаком замещения Ложь, значит система пытается добавить новую запись в регистр, а если в ней есть дубли измерений, то это приводит к ошибке; 2) возможно все-таки не все свойства новой записи корректны. Кстати, если работаешь без отбора по одной записи, то вместо коллекции НаборЗаписей, лучше использовать объект МенеджерЗаписи.

«ошибка времени выполнения» это баг платформы или системы. А вообще приведи полное сообщение.

Автор, ответь (впрочем, можно не отвечать, — просто подумай): Почему эти две строки кода удаляют ВСЕ записи регистра?

Ничего подобного! Чаще всего это — кривой код, поставивший систему в тупик.

Пример такого кода покажи.

Да, Вы правы. Оказалось, что в регистре сведений уже есть записи с такими же измерениями, с которыми я повторно пытаюсь записать.

Да вот пож-та, в 1-м посте этого топика :-)

Тэги:

Комментарии доступны только авторизированным пользователям

lira89


  • #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

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

  • ошибка_сегодня.JPG

    ошибка_сегодня.JPG

    26,1 КБ

    · Просмотры: 646

puh14


  • #2

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

lira89


  • #3

Либо результат запроса из разряда «убей слона»,

Ну запрос делается один раз и его результат помещается в ТЗ, а затем работа только с ТЗ.
Вот кусок кода, в котором я так понимаю происходит сбой

Код:

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

и увеличьте период опроса изменений Базы (Сервис/Параметры/Общие)

у меня стоит 10 сек. Этого мало?

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

puh14


  • #4

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

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

lira89


  • #5

Система тратит время на строку:

Код:

Если ЖрнЗарпл.ВыполнитьРасчет() = 0 Тогда

Причем, я заметила, что первая тысяча человек рассчитывается довольно быстро (на одного человека тратится по 1 сек), но затем время возрастает до 3. Мне кажется это немного странно, ведь в ТаблРезКоп данные не накапливаются, а очищаются после расчета каждого человека.

puh14


  • #6

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

Дайнеко


  • #7

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

puh14


  • #8

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

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

lira89


  • #9

ВыполнитьРасчет()
Назначение:
Выполнить расчет текущей записи журнала расчетов.

Это стандартный метод журнала расчетов.

Дайнеко


  • #10

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

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

unknown181538


  • #11

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

lira89


  • #12

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

evgenyatam


  • #13

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

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

lira89


  • #14

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

Понравилась статья? Поделить с друзьями:

Не пропустите эти материалы по теме:

  • Яндекс еда ошибка привязки карты
  • 1с ошибка при выводе метода контекста
  • 1с ошибка преобразования значения к двоичному типу
  • 1с ошибка представление состояния
  • 1с ошибка после динамического обновления

  • 0 0 голоса
    Рейтинг статьи
    Подписаться
    Уведомить о
    guest

    0 комментариев
    Старые
    Новые Популярные
    Межтекстовые Отзывы
    Посмотреть все комментарии