официальный партнёр 1С по деловому софту
Закрыть
Логин:
Пароль:
Забыли свой пароль?
  Войти
Войти как пользователь
Вы можете войти на сайт, если вы зарегистрированы на одном из этих сервисов:
 
8(495)229-30-42

Чтение данных из MYSQL базы используя ODBC драйвер

В связи с внезапно возникшей ошибкой в работе внешних источников данных в релизе 8.2.15.289, пришлось воспользоваться механизмом обращения к базе данных используя COM соединение к ODBC драйверу.
Ошибка заключается в том, что платформа 8.2.15.289 не может правильно транслировать запрос, если поля содержат символ "_" в имени поля. А у меня был настроен обмен с базой данных сайта на Bitrix в котором большинство полей именуются таким вот образом.
[spoiler]
Т.к. конфигурацию менять не очень хотелось, я сделал следующее.
Сначала создал функцию, которая возвращает результат запроса к ODBC в таблицу значений.
Функция ВернутьТЗЧерезODBCДрайвер()
   
   ПараметрыСоединенияССайтомМИКО = Новый ПараметрыСоединенияВнешнегоИсточникаДанных;
   ПараметрыСоединенияССайтомМИКО.СтрокаСоединения= "
   |DRIVER={MySQL ODBC 5.1 Driver};
   |SERVER=192.168.1.234;
   |DATABASE=bitrixDataBaseName;
   |UID=BitrixDBUserName;
   |PWD=BitrixDBPassword";
   
   Connection = Новый COMОбъект("ADODB.Connection"); 
   Connection.Open(ПараметрыСоединенияССайтомМИКО.СтрокаСоединения);
   
   RS = Новый COMОбъект("ADODB.Recordset"); 
   RS.CursorType=3;
   // Запрос к базе на языке SQL запросов.
   RS.ActiveConnection=Connection;
   RS.Open("select RESULT_ID,USER_TEXT,ANSWER_ID,FORM_ID from b_form_result_answer where RESULT_ID>710");
   
   //Перемещаем указатель на первую запись.
   RS.MoveFirst(); 
   ТЗ=Новый ТаблицаЗначений;
   ТЗ.Колонки.Добавить("RESULT_ID", Новый ОписаниеТипов("Число"));
   ТЗ.Колонки.Добавить("USER_TEXT", Новый ОписаниеТипов("Строка"));
   ТЗ.Колонки.Добавить("ANSWER_ID", Новый ОписаниеТипов("Число"));
   ТЗ.Колонки.Добавить("FORM_ID", Новый ОписаниеТипов("Число"));
   
   Пока RS.EOF()=0 Цикл
      // Обрабатываем значения полей выборки.
      СтрокаТЗ=ТЗ.Добавить();
      СтрокаТЗ.RESULT_ID   =RS.Fields("RESULT_ID").Value;
      СтрокаТЗ.USER_TEXT   =RS.Fields("USER_TEXT").Value;
      СтрокаТЗ.ANSWER_ID   =RS.Fields("ANSWER_ID").Value;
      СтрокаТЗ.FORM_ID   =RS.Fields("FORM_ID").Value;   
      // Перемещаем указатель.
      RS.MoveNext();    
   КонецЦикла;    
   
   //Закрываем соединения.
   RS.Close();
   Connection.Close();
   
   Возврат ТЗ;
   
КонецФункции



Ну а дальше во всех функциях использующих внешние источники данных я переписал кусочек запроса:
   Запрос = Новый Запрос;
   Запрос.Текст = "ВЫБРАТЬ
   |   ТЗ.RESULT_ID,
   |   ТЗ.USER_TEXT,
   |   ТЗ.FORM_ID,
   |   ТЗ.ANSWER_ID
   |ПОМЕСТИТЬ ТаблицаODBC
   |ИЗ
   |   &ТЗ КАК ТЗ
   |;
   |
   |////////////////////////////////////////////////////////////////////////////////
   |ВЫБРАТЬ
   |   ТЗ.RESULT_ID,
   |   ТЗ.USER_TEXT КАК Ответ,
   |   ТЗ.ANSWER_ID
   |ИЗ
   |   ТаблицаODBC КАК ТЗ
   |ГДЕ
   |   ТЗ.FORM_ID = 10
   |   И ТЗ.RESULT_ID > 710";
   
   Запрос.УстановитьПараметр("ТЗ",ТаблицаСДанными);
   
   
   //Запрос = Новый Запрос("ВЫБРАТЬ
   //|   b_form_result_answer.RESULT_ID,
   //|   b_form_result_answer.USER_TEXT КАК Ответ,
   //|   b_form_result_answer.ANSWER_ID
   //|ИЗ
   //|   ВнешнийИсточникДанных.www_miko_ru.Таблица.b_form_result_answer КАК b_form_result_answer
   //|ГДЕ
   //|   b_form_result_answer.FORM_ID = 10           //Тест-драйв 1С
   //|   И b_form_result_answer.RESULT_ID > 600      // Старые формы не нужны
   //|АВТОУПОРЯДОЧИВАНИЕ");
   
   Результат = Запрос.Выполнить();
   Выборка = Результат.Выбрать();
   
   Пока Выборка.СледующийПоЗначениюПоля("RESULT_ID") Цикл
.......


В итоге фоновое задание благополучно продолжило работу без ошибок. :)

О том как изменять данные через ODBC я писал тут: http://www.miko.ru/blogs/SwordBlog/88/