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

Программист IT и автоматизация бизнеса
← На главную

При работе с внешними источниками данных (ВИД) в платформе «1С:Предприятие 8» разработчики часто сталкиваются с неприятным поведением системы при интеграции с СУБД MySQL. Если физическое имя таблицы или поля в MySQL содержит символ подчеркивания (_), то при попытке обращения к этому источнику платформа генерирует ошибку синтаксиса SQL.

Выясним причину этой проблемы. Платформа 1С, начиная с версии 8.2.14.519 (и вплоть до многих современных релизов ветки 8.3), содержит зарегистрированный баг под номером 10103123 (SW672486). При формировании SQL-запроса транслятор платформы автоматически оборачивает имена полей со спецсимволами (к которым он ошибочно относит и знак подчеркивания) в двойные кавычки "". В стандартном режиме работы MySQL двойные кавычки воспринимаются сервером базы данных как литералы (строки), а не как идентификаторы объектов. В результате СУБД возвращает ошибку синтаксиса, и запрос аварийно завершается.

В этой статье мы подробно разберем несколько вариантов решения этой проблемы: от элегантного "костыля" через настройки ODBC-драйвера до официального нативного метода, заложенного в саму платформу 1С.

Решение 1. Использование режима ANSI_QUOTES в настройках ODBC DSN (Метод с форума)

Рассмотрим детально первый способ, предложенный автором темы на форуме. Он базируется на изменении поведения самой СУБД MySQL при обработке запросов. Синтаксис MySQL позволяет интерпретировать двойные кавычки как обратные одинарные кавычки (гравис `, который стандартно используется в MySQL для экранирования имен), если в сессии включен специальный режим ANSI_QUOTES.

Чтобы реализовать этот обходной путь, выполним следующие шаги по настройке операционной системы и СУБД:

  1. Откройте «Администратор источников данных ODBC» на сервере, где выполняется код 1С (обратите внимание на разрядность: 32-bit или 64-bit в зависимости от разрядности вашего сервера или клиента 1С).
  2. Создайте или отредактируйте системный MySQL ODBC DSN, указав все необходимые параметры подключения (сервер, порт, базу данных, кодировку).
  3. Перейдите к расширенным настройкам драйвера. Найдите поле Initial Statement (Инициализирующий запрос) и впишите туда команду принудительной установки режима для сессии:
    SET SESSION SQL_MODE=ANSI_QUOTES;
  4. Дополнительно рекомендуется установить флаг (галочку) Allow Multiple Statements в настройках ODBC-драйвера. Это позволит драйверу корректно выполнять несколько запросов в рамках одной транзакции или пакета.
  5. Важное правило: При написании собственных SQL-запросов внутри 1С избегайте использования двойных кавычек для обозначения строк. Заменяйте их на одинарные кавычки.

После настройки DSN на уровне операционной системы, настроим подключение непосредственно в коде 1С. Разберем по шагам пример инициализации соединения:


ПараметрыСоединения = Новый ПараметрыСоединенияВнешнегоИсточникаДанных;
// Важно: без установки Истина параметры аутентификации из DSN могут игнорироваться
ПараметрыСоединения.АутентификацияОС = Истина; 
ПараметрыСоединения.СтрокаСоединения = "DSN=" + ИмяВашегоDSN;

ВнешниеИсточникиДанных.ИмяВашегоИсточникаВКонфигураторе.УстановитьОбщиеПараметрыСоединения(ПараметрыСоединения);
ВнешниеИсточникиДанных.ИмяВашегоИсточникаВКонфигураторе.УстановитьСоединение();

// ... Здесь выполняется ваш код работы с внешним источником данных ...

ВнешниеИсточникиДанных.ИмяВашегоИсточникаВКонфигураторе.РазорватьСоединение();

Этот способ полностью рабочий, однако он требует ручного администрирования операционной системы на каждом сервере, где планируется запуск базы 1С.

Решение 2. Официальное нативное решение платформы (Одинарные кавычки в метаданных)

Проанализируем более простое и надежное решение, которое рекомендует сама фирма «1С» в официальной документации ИТС. Для его реализации нам не потребуется вносить изменения в настройки СУБД или системные ODBC-драйверы.

Решение заключается в правильном заполнении свойств метаданных внешнего источника данных непосредственно в конфигураторе 1С:

  1. Откройте конфигуратор вашей информационной базы.
  2. Перейдите в ветку Внешние источники данных, разверните нужную таблицу и откройте список ее полей.
  3. Выберите поле, содержащее в имени символ подчеркивания (например, user_id), и откройте его палитру свойств.
  4. Найдите свойство «Имя в источнике данных». По умолчанию платформа записывает туда имя "как есть".
  5. Заключите это имя в одинарные кавычки. Вместо user_id запишите: 'user_id'.

Как это работает: Если значение свойства «Имя в источнике данных» обрамлено одинарными кавычками, внутренний транслятор запросов 1С понимает, что данное имя передается в СУБД "как есть" (as is). В этом случае платформа полностью отключает механизмы автоматического экранирования, не пытается добавить двойные кавычки и отправляет имя напрямую в MySQL. Этот метод одинаково хорошо работает как для имен полей, так и для физических имен самих таблиц.

Решение 3. Настройка режима совместимости конфигурации

Поведение транслятора запросов 1С напрямую зависит от используемого режима совместимости конфигурации. Посмотрим, на что это влияет:

Рекомендуется своевременно обновлять режим совместимости вашей конфигурации до актуальных версий платформы «1С:Предприятие 8.3».

Решение 4. Явное указание типа СУБД в параметрах подключения

Часто синтаксические ошибки при работе с MySQL возникают из-за того, что платформа 1С не может корректно определить тип СУБД, к которой происходит подключение через универсальный DSN. В таких случаях система считает базу данных «Прочей СУБД» и отправляет стандартные ANSI SQL запросы, которые могут не поддерживаться MySQL.

Чтобы избежать этой неопределенности, обязательно указывайте тип СУБД в коде инициализации подключения. Для этого используется свойство ТипСУБД объекта ПараметрыСоединенияВнешнегоИсточникаДанных:


ПараметрыСоединения = Новый ПараметрыСоединенияВнешнегоИсточникаДанных;
ПараметрыСоединения.СтрокаСоединения = "DSN=" + ИмяВашегоDSN;
ПараметрыСоединения.ТипСУБД = ТипСУБД.MySQL; // Принудительно задаем тип СУБД

Благодаря этому транслятор 1С будет генерировать SQL-запросы с использованием специфического синтаксиса, характерного исключительно для MySQL, что минимизирует вероятность ошибок парсинга.

Решение 5. Подбор стабильного ODBC-драйвера при проблемах с типами данных

Помимо проблем с кавычками, разработчики часто сталкиваются с ошибками приведения типов (например, "Truncated incorrect INTEGER value..."), когда первичным ключом в таблице MySQL выступает строковое поле (VARCHAR). Это происходит из-за того, что некоторые версии ODBC-драйверов отдают платформе 1С некорректные метаданные о типах полей.

Для минимизации таких проблем придерживайтесь следующих рекомендаций:

Альтернативные варианты интеграции (ADO и HTTP-сервисы)

В ходе обсуждения на форуме участники затронули важную тему: стоит ли вообще использовать механизм Внешних источников данных 1С, учитывая его капризность к драйверам и СУБД?

Рассмотрим две популярные альтернативы:

  1. Технология ADO (ActiveX Data Objects): Позволяет выполнять прямые SQL-запросы к MySQL в обход метаданных 1С. Главный плюс — полный контроль над SQL-текстом запроса (вы сами пишете кавычки так, как этого требует MySQL). Однако этот метод привязывает вас к операционной системе Windows, так как ADO является COM-объектом и не будет работать на серверах под управлением Linux.
  2. Разработка HTTP / REST-сервисов (API): Современный и наиболее надежный архитектурный подход. Вместо прямого подключения 1С к чужой базе данных создается небольшое веб-приложение (сервис-прослойка), которое принимает запросы от 1С по протоколу HTTP (в формате JSON или XML), самостоятельно обращается к MySQL и возвращает готовые данные. Это полностью решает проблемы несовместимости драйверов, кавычек и платформ.

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

← На главную