Как исправить ошибку при работе с колонками MySQL, содержащими знак подчеркивания в 1С?

Программист 1С v8.3 (Обычные формы) IT и автоматизация бизнеса
← На главную

При обращении из 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. Указание апострофов в свойствах поля источника данных

Если работа ведется через стандартный механизм внешних источников данных в Конфигураторе 1С, существует простое и эффективное решение без изменения схемы базы MySQL.

  1. Откроем Конфигуратор и перейдем в ветку Внешние источники данных.
  2. Найдем проблемную таблицу и зайдём в свойства поля, содержащего символ подчеркивания.
  3. В палитре свойств найдем параметр Имя в источнике данных.
  4. Заключим имя колонки в одинарные кавычки (апострофы). Например, вместо outbound_cnum укажем 'outbound_cnum'.

После сохранения конфигурации 1С начинает корректно формировать синтаксис запроса к драйверу MySQL, и ошибка 1064 исчезает.

Способ 2. Включение режима ANSI_QUOTES на стороне MySQL или в ODBC

Перевод СУБД MySQL в режим совместимости со стандартом ANSI позволяет серверу воспринимать двойные кавычки как имена идентификаторов. Сделать это можно двумя путями:

  1. На стороне сервера MySQL: Добавить режим ANSI_QUOTES в значение переменной sql_mode в файле конфигурации my.cnf (или my.ini).
  2. В строке подключения ODBC: Настроить параметр инициализации сессии, передав команду: INITSTMT=SET sql_mode='ANSI_QUOTES';

Способ 3. Прямое выполнение SQL-запросов через ADO

Если использование внешних источников данных невозможно или неудобно, обратимся к прямому подключению через объект 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-разрядный драйвер СУБД.

Способ 4. Использование представлений (Views) и процедур на стороне СУБД

Если изменения в конфигурации 1С ограничены, разберем решение на стороне самой базы данных MySQL:

  1. Создание Представлений (View): На стороне MySQL создается представление, в котором имени колонки с подчеркиванием присваивается псевдоним без подчеркивания. CREATE VIEW v_import_products AS SELECT outbound_cnum AS outboundcnum FROM import_products; После этого в 1С подключается данное представление.
  2. Хранимые процедуры (Stored Procedures): Для выполнения операций записи (INSERT/UPDATE) на стороне MySQL создается хранимая процедура, принимающая параметры и выполняющая запись в нужную таблицу. В 1С производится только вызов этой процедуры.

Таким образом, мы рассмотрели основные методы решения проблемы с синтаксисом символа подчеркивания в MySQL: от простой настройки свойства Имя в источнике данных в Конфигураторе 1С до использования прямого соединения ADO и создания объектов на стороне СУБД.

← На главную