При обращении из 1С к таблицам СУБД MySQL через механизм Внешние источники данных разработчики часто сталкиваются с ситуацией, когда запрос завершается ошибкой, если в имени колонки присутствует символ подчеркивания (например, outbound_cnum или partner_id). Рассмотрим подробно причинно-следственную связь этой проблемы и разберем практические способы её решения.
Проанализируем техническую сторону взаимодействия платформы 1С и базы данных MySQL через ODBC-драйвер. При генерации SQL-запросов к внешнему источнику платформа 1С (в релизах 8.2 и ранних версиях 8.3) оборачивает имена полей с подчеркиванием в двойные кавычки (например, "partner_id"), руководствуясь стандартом ANSI SQL.
СУБД MySQL по умолчанию воспринимает двойные кавычки как строковые литералы, а для идентификаторов колонок и таблиц требует использовать обратные апострофы (backticks: `partner_id`). В результате выполнения запроса MySQL возвращает ошибку синтаксиса:
Ошибка внешней базы данных: ошибка при выполнении запроса по причине: Ошибка ODBC. SQLSTATE: 42000 Номер ошибки: 1064 Описание: [MySQL][ODBC Driver] You have an error in your SQL syntax...
В платформе 1С начиная с релиза 8.3.1.531 данное поведение было исправлено, однако на платформе 1С 8.2 и более ранних сборках 8.3 проблема сохраняется. Выясним, как ее обойти.
Если работа ведется через стандартный механизм внешних источников данных в Конфигураторе 1С, существует простое и эффективное решение без изменения схемы базы MySQL.
outbound_cnum укажем 'outbound_cnum'.После сохранения конфигурации 1С начинает корректно формировать синтаксис запроса к драйверу MySQL, и ошибка 1064 исчезает.
Перевод СУБД MySQL в режим совместимости со стандартом ANSI позволяет серверу воспринимать двойные кавычки как имена идентификаторов. Сделать это можно двумя путями:
ANSI_QUOTES в значение переменной sql_mode в файле конфигурации my.cnf (или my.ini).INITSTMT=SET sql_mode='ANSI_QUOTES';Если использование внешних источников данных невозможно или неудобно, обратимся к прямому подключению через объект ADODB.Connection. В этом случае платформа 1С не транслирует текст запроса, а передает его в базу MySQL в исходном виде. Посмотрим на пример кода:
Попытка
ADOСоединение = Новый COMОбъект("ADODB.Connection");
// Указываем корректный ODBC драйвер MySQL
СтрокаПодключения = "DRIVER={MySQL ODBC 8.0 Unicode Driver};"
+ "SERVER=127.0.0.1;"
+ "DATABASE=my_database;"
+ "UID=admin;"
+ "PWD=password;";
ADOСоединение.Open(СтрокаПодключения);
Исключение
Сообщить("Ошибка подключения к MySQL: " + ОписаниеОшибки());
Возврат;
КонецПопытки;
// В тексте запроса экранируем имена колонок обратными апострофами
ТекстЗапроса = "SELECT `orders_id`, `outbound_cnum`
|FROM `import_products`
|WHERE `modified` = '1'";
Записи = Новый COMОбъект("ADODB.RecordSet");
Записи.Open(ТекстЗапроса, ADOСоединение);
Пока НЕ Записи.EOF Цикл
Сообщить("Заказ ID: " + Строка(Записи.Fields("orders_id").Value));
Записи.MoveNext();
КонецЦикла;
Записи.Close();
ADOСоединение.Close();
Важно: Обратим внимание на разрядность драйвера MySQL ODBC. Для 32-разрядного клиента/сервера 1С необходим 32-разрядный ODBC-драйвер, а для 64-разрядного сервера 1С — 64-разрядный драйвер СУБД.
Если изменения в конфигурации 1С ограничены, разберем решение на стороне самой базы данных MySQL:
CREATE VIEW v_import_products AS SELECT outbound_cnum AS outboundcnum FROM import_products;
После этого в 1С подключается данное представление.Таким образом, мы рассмотрели основные методы решения проблемы с синтаксисом символа подчеркивания в MySQL: от простой настройки свойства Имя в источнике данных в Конфигураторе 1С до использования прямого соединения ADO и создания объектов на стороне СУБД.