Имя: Пароль:
1C
1С v8
Проблема при связке 1с8 MSSQL и внешнего MySQL сервера
0 memogolik
 
22.11.12
14:15
Есть самописный документ "Путевой лист".
При его проведении идет вызов глобальной функции общего модуля(самописный) "ЛогистикаИТранспорт", который получает данные с Mysql сервера и записывает некоторые данные в документ "Путевой".
Проблема следующая, после некоторого времени работы при проведении документа начинает выскакивать ошибка:
Ошибка при выполнении обработчика - 'ОбработкаПроведения'
по причине:
{ОбщийМодуль.ЛогистикаИТранспорт.Модуль(43)}: Ошибка при вызове метода контекста (Выполнить)

по причине:

по причине:
Ошибка выполнения запроса
по причине:
Ошибка внешней базы данных:
ошибка при выполнении запроса
по причине:
Ошибка ODBC. SQLSTATE: 08S01
Номер ошибки: 2006
Описание: [MySQL][ODBC 5.1 Driver][mysqld-5.0.51a-community]MySQL server has gone away

вот функция, в которой вылетает ошибка:
Функция РасчитатьРасстояниеПоДанныхСпутника(ВыбТС,ВыбДатаНачала,ВыбДатаКонца) Экспорт
   Если ЛогистикаИТранспорт.ИнициализацияПодключенияMySQL() Тогда    
       Запрос = Новый Запрос;
       Запрос.УстановитьПараметр("ИдентификаторТС",ВыбТС.ИдентификаторТС);    
       Запрос.УстановитьПараметр("ВыбДатаНачала",ПолучитьUnixTS(ВыбДатаНачала));    
       Запрос.УстановитьПараметр("ВыбДатаКонца",ПолучитьUnixTS(ВыбДатаКонца));    
       Запрос.Текст="ВЫБРАТЬ
                    |    navdata.Track
                    |ИЗ
                    |    ВнешнийИсточникДанных.БазаТранспорт.Таблица.navdata КАК navdata
                    |ГДЕ
                    |    navdata.GMTime >= &ВыбДатаНачала И
                    |    navdata.GMTime <= &ВыбДатаКонца И
                    |    navdata.VehicleId=&ИдентификаторТС
                    |";
       Выборка=Запрос.Выполнить();//вот на этой строчке ошибка.                
       Если Выборка.Пустой() Тогда
           Возврат 0
       Иначе
           Таблица = Выборка.Выгрузить();
           Возврат Таблица.Итог("track")/1000;
       КонецЕсли;
   Иначе Возврат 0;
   КонецЕсли
КонецФункции

Есть идеи с чем это может быть связано? После перезапуска сервака какое то время ошибки не возникает.
1 memogolik
 
22.11.12
14:23
Причем сам mysql сервер работает и к нему можно делать запросы.
2 Александр_
Тверь
 
22.11.12
14:24
не знаю как работают "ВнешнийИсточникДанных", но проверь после выполнения запроса, корректно ли закрывается ли соединение с MySQL?

Может оно у тебя не закрывается вовсе, а открывается открывается открывается и после отваливается ODBC (если через него соединение)?
3 Александр_
Тверь
 
22.11.12
14:27
раз в явном виде вызваешь ИнициализацияПодключенияMySQL()
попробуй принудительно взывать что-нибудь типа ОтключитьMySQL()

Типа
Connection.Close();
4 memogolik
 
22.11.12
14:27
Очень может быть.
Вот функция
ЛогистикаИТранспорт.ИнициализацияПодключенияMySQL()

Функция  ИнициализацияПодключенияMySQL() Экспорт
   ПараметрыСоединенияССерверомСбораДанных = Новый ПараметрыСоединенияВнешнегоИсточникаДанных;
   ПараметрыСоединенияССерверомСбораДанных.СтрокаСоединения= "
   |DRIVER={MySQL ODBC 5.1 Driver};
   |SERVER=********;
   |DATABASE=navdb;
   |UID=root;
   |PWD=******;";
   ВнешниеИсточникиДанных.БазаТранспорт.УстановитьОбщиеПараметрыСоединения(ПараметрыСоединенияССерверомСбораДанных);
   Попытка
       ВнешниеИсточникиДанных.БазаТранспорт.УстановитьСоединение();
       Возврат 1;
   Исключение
       Сообщить("Не удалось соединиться с базой по данным спутника");
       Возврат 0;
   КонецПопытки;
КонецФункции

Какой код нужно добавить после выполнения запроса?
5 Александр_
Тверь
 
22.11.12
14:29
РазорватьСоединение (Disconnect)
Синтаксис:

РазорватьСоединение()
Описание:

Выполняет разрыв соединения с внешним источником данных.

Доступность:

Сервер, толстый клиент, внешнее соединение.
6 memogolik
 
22.11.12
14:29
Спасибо, буду пробовать
7 Александр_
Тверь
 
22.11.12
14:29
т.е. в твоем случае должно выполняться как-то так:
ВнешниеИсточникиДанных.БазаТранспорт.РазорватьСоединение();
8 Александр_
Тверь
 
22.11.12
14:31
Код семерошник писал?
в 1С 8 давно присутствуют значения типа булево...
возврат 0
возврат 1
:)
9 memogolik
 
22.11.12
14:34
Проблема походу не там, ведь он проходит успешно функцию ИнициализацияПодключенияMySQL(). Значит авторизация прошла успешно и соединение тоже.
10 Александр_
Тверь
 
22.11.12
14:37
(9)
ты не понял.
Ты открываешь открываешь и еще открываешь соединения.
А кто их закрывает?
11 Serginio1
 
22.11.12
14:38
Попробуй дату так указать
ДатаСтр=Формат(НачалоДня(ДатаПрайса),"ДФ='yyyy-MM-dd ЧЧ:мм:сс'");

                   ТекстЗапроса=ТекстЗапроса+"
                   |and (navdata.GMTime >='"+ДатаСтр+"' ....
12 memogolik
 
22.11.12
14:43
(11) но после перезагрузке сервака все же работает нормально.
(10) т.к. вызов ИнициализацияПодключенияMySQL() проходит нормально значит соединился он без проблем. Проблема в том, что сразу обновление не могу поставить на рабочую базу. Вот пока анализирую.
На тестовой базе таких ошибок не выявлял. (win7, файловая база). Рабочий сервак winserv 2008 sql 2008
13 Александр_
Тверь
 
22.11.12
14:45
(12) да все правильно. Соединился без проблем, а как начал передавать данные - выяснил, что какой-то ресурс (может порт, может еще что-то) кончился.
Возможно ODBC драйвер падает.
У меня были похожие проблемы (правда я не через встроенный механизм подключаюсь, а через программное создание).
14 Serginio1
 
22.11.12
14:51
15 memogolik
 
22.11.12
15:02
Самое интересное, что эту ошибку он выдает даже при остановленном mysql сервере.
16 memogolik
 
22.11.12
15:10
(13) а если действитель ODBC драйвер "Падает" как его перезапустить?
17 memogolik
 
22.11.12
15:16
Еще такой факт - если скопировать тестовую базу на сервак, где наблюдалась ошибка, то при проведении все нормально. Т.е. ошибка наблюдается только в серверной версии,а в файловой все норм.
18 sapphire
 
22.11.12
15:19
(0) На unix-е mysqld падает.
19 memogolik
 
22.11.12
15:24
(18) причем тут unix?
Проблема что на одном и том же компе в серверной версии базы ошибка есть, а в файловой нет - вот что не понятно.
20 Serginio1
 
22.11.12
15:25
А сервер 1С 64 разрядный?
21 memogolik
 
22.11.12
15:27
(20) а как это можно проверить? вроде 32 разрядный, он вроде дешевле.
22 rsv
 
22.11.12
15:27
(0) Ну как вариант выкинь 1C - й объект ВнешнийОбъектДанных и подключайся к мускулу по ADO.
23 memogolik
 
22.11.12
15:29
(20) rmngr.exe (32) Это оно?
24 rsv
 
22.11.12
15:30
+(22) По крайней мере все это будет попрозрачней и не обернуто  1С еще в свой интерфейс.
25 Serginio1
 
22.11.12
15:31
Посмотри какой агент работает в сервисах
26 memogolik
 
22.11.12
15:32
(25) rmngr.exe 32
27 Serginio1
 
22.11.12
15:34
Панель управления\Все элементы панели управления\Администрирование\службы\Агент сервера 1С:Предприятия 8.2 (x86-64)

Обычно его переодически приходится перезапускать
28 memogolik
 
22.11.12
15:36
32 разрядный... а драйвер mysql вроде 64.... попробовать поставить 32?
29 Serginio1
 
22.11.12
15:40
(28) Да трам помоему разные. 64 разрядный работает только для 64 разрядных приложений. У самого в так было. На сервере 64 разрядном выполняется, а с клиента нет.
30 memogolik
 
22.11.12
16:13
(29) и какой выход? в 64 драйвере он вроде оба ставит?
31 Serginio1
 
22.11.12
16:26
(30) Сноси 64 и Ставь 32 разрядный.
32 memogolik
 
26.11.12
18:08
(29) а почему тогда после перезагрузки сервера некоторое время все работает нормально? И ошибка обычно появляется через несколько часов работы. При этом из файловой копии той же базы на том же серваке все работает нормально. Какие дрова посоветуете на 32битный 1с сервер + server 2008&MSSQL 2008 64bit?
33 Serginio1
 
27.11.12
10:55
(32) У меня 64 разрядный 1С сервер был. Дрова стандартные последние. Подключение к американскому серверу. Особых проблем не было Но MySQL конечно очень капризный. Нужно было запросы подбирать. Попробуй через ADO. Не доверяю я этим ВнешнийИсточникДанных. Тем более тебе то не нужно соединять данные.