Работа с внешними источниками данных в 1С — это мощный инструмент интеграции, однако он часто преподносит сюрпризы в виде трудночитаемых ошибок SQL. Одной из самых распространенных является связка SQLSTATE: 42000 и Код ошибки: 1064. В этой статье мы подробно разберем, почему эта ошибка возникает именно на именах полей с нижним подчеркиванием, и как правильно настроить соединение, чтобы избежать конфликтов синтаксиса.
Для начала давайте разберем, что именно сообщает нам сервер базы данных. Код ошибки 1064 в диалекте MySQL означает "You have an error in your SQL syntax" (у вас ошибка в синтаксисе SQL). Тот факт, что ошибка возникает только при наличии нижнего подчеркивания в именах колонок (например, PARENT_ID), наталкивает нас на мысль о проблемах с экранированием идентификаторов.
Проанализируем ситуацию: когда платформа 1С обращается к внешнему источнику, она генерирует SQL-запрос "на лету". Если в настройках внешнего источника данных тип СУБД указан как "Прочее", 1С пытается использовать универсальные стандарты SQL. В большинстве СУБД для экранирования имен таблиц и полей используются двойные кавычки ("field_name"). Однако MySQL по умолчанию использует для этих целей обратные апострофы (бэктики) — `field_name`.
Если запрос уходит на сервер MySQL с двойными кавычками или вовсе без экранирования, и при этом в имени поля есть спецсимволы (к которым относится и нижнее подчеркивание) или имя совпадает с зарезервированным словом, сервер выдает ошибку 1064. Рассмотрим, как это исправить.
Это самый простой и эффективный способ, который решает проблему в 99% случаев. Если мы явно укажем платформе 1С, что работаем именно с MySQL, встроенный генератор запросов начнет использовать специфический синтаксис этой СУБД, включая правильное экранирование бэктиками.
Выполним следующие шаги в конфигураторе:
Прочее.MySQL.После этой манипуляции 1С начнет корректно обрамлять имена полей типа personal.PARENT_ID в понятные для MySQL символы, и ошибка исчезнет.
Иногда требуется настроить подключение динамически из кода. В этом случае недостаточно просто передать строку соединения ODBC. Нам необходимо явно инициализировать объект параметров соединения и указать тип СУБД программно. Рассмотрим пример кода, который помогает решить проблему:
Процедура ПодключитьсяКВнешнемуИсточнику()
// Создаем объект параметров соединения
ПараметрыСоед = Новый ПараметрыСоединенияВнешнегоИсточникаДанных;
// Указываем строку соединения через установленный драйвер ODBC
ПараметрыСоед.СтрокаСоединения = "DRIVER={MySQL ODBC 8.0 ANSI Driver};SERVER=localhost;DATABASE=my_db;UID=root;PWD=password;";
// КРИТИЧЕСКИ ВАЖНО: Указываем тип СУБД явно
// Это заставит 1С использовать диалект MySQL при формировании запросов
ПараметрыСоед.СУБД = "MySQL";
// Устанавливаем параметры для внешнего источника
ВнешниеИсточникиДанных.ИмяВашегоИсточника.УстановитьОбщиеПараметрыСоединения(ПараметрыСоед);
КонецПроцедуры
Использование свойства ПараметрыСоед.СУБД = "MySQL" является ключевым моментом. Без него 1С может игнорировать особенности синтаксиса MySQL, даже если драйвер в строке соединения указан верно.
Разберем ситуацию с драйверами. В обсуждении упоминались версии 5.1 и 8.0. Платформа 1С более стабильно работает с драйверами версии Unicode, а не ANSI. Если вы используете драйвер версии 8.0, убедитесь, что в системе установлен именно MySQL ODBC 8.0 Unicode Driver.
Также проанализируем настройки самого драйвера в Windows (ODBC Data Source Administrator):
Return matched rows instead of affected rows (флаг OPTION=2), хотя это больше влияет на запись данных.utf8mb4).Если по каким-то причинам вы не можете изменить тип СУБД в 1С, существует способ заставить MySQL понимать стандартные двойные кавычки. Для этого используется системная переменная sql_mode. Выясним, как это работает.
В MySQL существует режим ANSI_QUOTES. Если он включен, сервер воспринимает двойные кавычки как идентификаторы (как это делает MSSQL или PostgreSQL). Чтобы включить этот режим, необходимо выполнить SQL-команду на стороне сервера:
SET GLOBAL sql_mode = 'ANSI_QUOTES';
-- Или для текущей сессии:
SET SESSION sql_mode = 'ANSI_QUOTES';
Важное замечание: Мы рекомендуем использовать этот метод только в крайнем случае, так как изменение глобального режима sql_mode может повлиять на работу других приложений, использующих эту базу данных, которые могут ожидать стандартного поведения MySQL (где двойные кавычки используются для строк, а не для имен полей).
Подводя итог, можно сказать, что ошибка 1064 в 1С при работе с MySQL — это почти всегда конфликт диалектов SQL. Рассмотрим основные выводы:
MySQL в свойствах внешнего источника данных в Конфигураторе или в программном коде через ПараметрыСоединенияВнешнегоИсточникаДанных.Следуя этим правилам, вы обеспечите стабильную работу интеграции и забудете о синтаксических ошибках при обращении к внешним таблицам.