Как исправить ошибку ODBC при работе с внешними источниками данных MySQL в 1С:Предприятие?

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

При интеграции платформы 1С:Предприятие с внешними базами данных посредством механизма «Внешние источники данных» (ВИД) разработчики часто сталкиваются со специфическими ошибками СУБД. Особенно остро эта проблема проявляется при попытке построения отчетов с использованием Системы компоновки данных (СКД) по таблицам из MySQL или MariaDB. В простых списках данные могут отображаться и редактироваться корректно, однако при выполнении запроса СКД система выдает синтаксическую ошибку СУБД (например, SQLSTATE: 42000, код ошибки: 1064).

В этой статье мы подробно разберем, почему возникают сбои при обращении к полям со знаком подчеркивания (например, shop_id, r_user_id) и логическим типам данных, проанализируем причины такого поведения транслятора запросов 1С и рассмотрим несколько эффективных способов решения проблемы.

Выясняем причины возникновения ошибок синтаксиса

Давайте разберем по шагам, что происходит «под капотом» платформы 1С при выполнении запроса к внешнему источнику данных через СКД. Проблема кроется в несовместимости стандартов трансляции SQL-запросов 1С и особенностей СУБД MySQL/MariaDB.

Причина №1. Попытка неявного приведения типов к BOOLEAN. При формировании схемы компоновки данных СКД опрашивает метаданные таблиц. Если в таблице MySQL присутствуют колонки типов TINYINT(1) или BIT, драйвер ODBC и платформа 1С автоматически распознают их как логический тип (Булево). При генерации итогового SQL-запроса 1С пытается выполнить валидацию типов, добавляя в запрос конструкцию приведения типа CAST(поле AS BOOLEAN). Однако СУБД MySQL/MariaDB не поддерживает приведение типов к BOOLEAN через функцию CAST(). Это и вызывает ошибку синтаксиса:


You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'BOOLEAN)

Причина №2. Некорректное экранирование полей со знаком подчеркивания. Символ подчеркивания «_» является служебным для транслятора 1С. Чтобы передать имя поля в СУБД в исходном виде, 1С оборачивает его в стандартные двойные кавычки (например, "shop_id"). По умолчанию в СУБД MySQL двойные кавычки служат для обозначения строковых литералов (обычного текста), а для идентификаторов таблиц и полей используются обратные апострофы (бэктэки). СУБД воспринимает имя поля как строку текста, из-за чего выполнение запроса падает с ошибкой.

Ниже рассмотрим пять надежных способов решения этих проблем.

Решение 1. Явное указание типа СУБД в режиме «1С:Предприятие»

Первое, что необходимо проверить — это настройки подключения к внешнему источнику данных непосредственно в режиме пользователя. Очень часто по умолчанию для параметра типа СУБД устанавливается значение «Прочее», что заставляет платформу использовать обобщенные и менее совместимые SQL-конструкции.

  1. Запустите информационную базу в режиме «1С:Предприятие».
  2. Перейдите в раздел администрирования внешних источников данных (Функции для специалиста — Справочники — Внешние источники данных).
  3. Откройте настройки вашего подключения и найдите параметр Тип СУБД.
  4. Вместо значения «Прочее» (или пустого значения) принудительно выберите MySQL.
  5. Сохраните настройки и перезапустите сессию. В ряде случаев это заставит транслятор запросов 1С использовать совместимый синтаксис экранирования.

Решение 2. Отключение параметра tinyInt1isBit в свойствах ODBC-драйвера

Если ошибка синтаксиса вызвана попыткой приведения числовых полей к логическому типу BOOLEAN, мы можем скорректировать поведение самого драйвера ODBC на сервере или рабочем компьютере.

Для этого в строке подключения (или в настройках системного DSN в администраторе источников данных ODBC) необходимо отключить интерпретацию однобайтовых целых чисел как логических значений. Добавьте в строку подключения следующий параметр:

tinyInt1isBit=false

Если вы используете графический интерфейс настройки ODBC-драйвера MySQL (ODBC Data Source Administrator):

  1. Перейдите на вкладку "System DSN" и выберите ваш источник данных.
  2. Нажмите кнопку "Configure" и перейдите в раздел "Details" (или "Data Type Mapping" в зависимости от версии драйвера).
  3. Снимите флажок с пункта Treat TINYINT(1) as BIT.
  4. Сохраните изменения.

После этого драйвер будет возвращать такие поля как обычные числа. В метаданных 1С тип поля изменится с Булево на Число, и генератор запросов СКД перестанет использовать ошибочную конструкцию CAST AS BOOLEAN.

Решение 3. Изменение сопоставления типов в конфигураторе 1С

Если у вас нет возможности перенастраивать ODBC-драйвер на всех клиентских машинах, мы можем переопределить типы данных непосредственно в свойствах внешнего источника в конфигураторе.

  1. Откройте конфигуратор вашей базы данных.
  2. Найдите нужный внешний источник данных в дереве метаданных и откройте его свойства.
  3. Перейдите на вкладку Данные, выберите проблемную таблицу (например, is_credits) и откройте список ее полей.
  4. Найдите поля, у которых автоматически определился тип Булево.
  5. В палитре свойств измените тип этих полей на Число (длина 1, точность 0) или Строка.
  6. Сохраните и обновите конфигурацию базы данных. На уровне отчета вы сможете легко преобразовать полученные «1» и «0» в «Да»/«Нет» с помощью условного оформления или вычисляемых полей СКД.

Решение 4. Включение режима совместимости ANSI_QUOTES на стороне MySQL

Чтобы заставить MySQL корректно воспринимать двойные кавычки (в которые 1С оборачивает поля со знаками подчеркивания "shop_id") как имена колонок, а не как строки, необходимо изменить режим работы СУБД.

Для этого включите режим ANSI_QUOTES в настройках вашего SQL-сервера. Вы можете сделать это временно для тестирования, выполнив SQL-запрос в консоли СУБД:

SET GLOBAL sql_mode = 'ANSI_QUOTES';

Для постоянного применения этой настройки откройте конфигурационный файл сервера MySQL/MariaDB (обычно это my.cnf или my.ini) и добавьте значение в директиву sql-mode:


[mysqld]
sql-mode="ANSI_QUOTES"

После перезапуска СУБД MySQL начнет распознавать стандартное для ANSI SQL экранирование идентификаторов двойными кавычками, и запросы СКД 1С к полям с подчеркиваниями начнут выполняться без ошибок.

Решение 5. Использование представлений (SQL-Views) на стороне СУБД

Если структуру оригинальных таблиц внешней базы данных менять категорически запрещено, а изменять настройки всего SQL-сервера нет возможности, наиболее надежным и профессиональным решением будет создание «прослойки» в виде SQL-представления (View).

Мы можем создать представление на стороне MySQL, в котором переименуем все поля со знаками подчеркивания в монолитные имена (или CamelCase), а также принудительно преобразуем проблемные типы данных:


CREATE VIEW v_is_credits AS
SELECT 
    f,
    auto,
    payment,
    first_payment AS firstpayment,
    bank_id AS bankid,
    a_date AS adate,
    comment,
    shop_id AS shopid,
    r_user_id AS ruserid,
    CAST(active_flag AS SIGNED) AS active_flag
FROM is_credits;

После создания представления выполните следующие шаги в 1С:

  1. Откройте конфигуратор и перейдите в свойства внешнего источника данных.
  2. На вкладке Данные добавьте новую таблицу. Платформа 1С позволяет выбирать не только физические таблицы, но и представления (Views). Выберите созданное представление v_is_credits.
  3. Настройте ключевые поля и типы данных для представления. Обратите внимание, что теперь имена полей (такие как shopid) не содержат знаков подчеркивания и не будут вызывать ошибок трансляции.
  4. В схеме компоновки данных вашего отчета выберите в качестве источника именно это представление.

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

← На главную