Ошибка заключается в том, что платформа 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/ |
