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