При работе с внешними источниками данных (ВИД) в платформе «1С:Предприятие 8» разработчики часто сталкиваются с неприятным поведением системы при интеграции с СУБД MySQL. Если физическое имя таблицы или поля в MySQL содержит символ подчеркивания (_), то при попытке обращения к этому источнику платформа генерирует ошибку синтаксиса SQL.
Выясним причину этой проблемы. Платформа 1С, начиная с версии 8.2.14.519 (и вплоть до многих современных релизов ветки 8.3), содержит зарегистрированный баг под номером 10103123 (SW672486). При формировании SQL-запроса транслятор платформы автоматически оборачивает имена полей со спецсимволами (к которым он ошибочно относит и знак подчеркивания) в двойные кавычки "". В стандартном режиме работы MySQL двойные кавычки воспринимаются сервером базы данных как литералы (строки), а не как идентификаторы объектов. В результате СУБД возвращает ошибку синтаксиса, и запрос аварийно завершается.
В этой статье мы подробно разберем несколько вариантов решения этой проблемы: от элегантного "костыля" через настройки ODBC-драйвера до официального нативного метода, заложенного в саму платформу 1С.
Рассмотрим детально первый способ, предложенный автором темы на форуме. Он базируется на изменении поведения самой СУБД MySQL при обработке запросов. Синтаксис MySQL позволяет интерпретировать двойные кавычки как обратные одинарные кавычки (гравис `, который стандартно используется в MySQL для экранирования имен), если в сессии включен специальный режим ANSI_QUOTES.
Чтобы реализовать этот обходной путь, выполним следующие шаги по настройке операционной системы и СУБД:
SET SESSION SQL_MODE=ANSI_QUOTES;
После настройки DSN на уровне операционной системы, настроим подключение непосредственно в коде 1С. Разберем по шагам пример инициализации соединения:
ПараметрыСоединения = Новый ПараметрыСоединенияВнешнегоИсточникаДанных;
// Важно: без установки Истина параметры аутентификации из DSN могут игнорироваться
ПараметрыСоединения.АутентификацияОС = Истина;
ПараметрыСоединения.СтрокаСоединения = "DSN=" + ИмяВашегоDSN;
ВнешниеИсточникиДанных.ИмяВашегоИсточникаВКонфигураторе.УстановитьОбщиеПараметрыСоединения(ПараметрыСоединения);
ВнешниеИсточникиДанных.ИмяВашегоИсточникаВКонфигураторе.УстановитьСоединение();
// ... Здесь выполняется ваш код работы с внешним источником данных ...
ВнешниеИсточникиДанных.ИмяВашегоИсточникаВКонфигураторе.РазорватьСоединение();
Этот способ полностью рабочий, однако он требует ручного администрирования операционной системы на каждом сервере, где планируется запуск базы 1С.
Проанализируем более простое и надежное решение, которое рекомендует сама фирма «1С» в официальной документации ИТС. Для его реализации нам не потребуется вносить изменения в настройки СУБД или системные ODBC-драйверы.
Решение заключается в правильном заполнении свойств метаданных внешнего источника данных непосредственно в конфигураторе 1С:
user_id), и откройте его палитру свойств.user_id запишите: 'user_id'.Как это работает: Если значение свойства «Имя в источнике данных» обрамлено одинарными кавычками, внутренний транслятор запросов 1С понимает, что данное имя передается в СУБД "как есть" (as is). В этом случае платформа полностью отключает механизмы автоматического экранирования, не пытается добавить двойные кавычки и отправляет имя напрямую в MySQL. Этот метод одинаково хорошо работает как для имен полей, так и для физических имен самих таблиц.
Поведение транслятора запросов 1С напрямую зависит от используемого режима совместимости конфигурации. Посмотрим, на что это влияет:
Рекомендуется своевременно обновлять режим совместимости вашей конфигурации до актуальных версий платформы «1С:Предприятие 8.3».
Часто синтаксические ошибки при работе с MySQL возникают из-за того, что платформа 1С не может корректно определить тип СУБД, к которой происходит подключение через универсальный DSN. В таких случаях система считает базу данных «Прочей СУБД» и отправляет стандартные ANSI SQL запросы, которые могут не поддерживаться MySQL.
Чтобы избежать этой неопределенности, обязательно указывайте тип СУБД в коде инициализации подключения. Для этого используется свойство ТипСУБД объекта ПараметрыСоединенияВнешнегоИсточникаДанных:
ПараметрыСоединения = Новый ПараметрыСоединенияВнешнегоИсточникаДанных;
ПараметрыСоединения.СтрокаСоединения = "DSN=" + ИмяВашегоDSN;
ПараметрыСоединения.ТипСУБД = ТипСУБД.MySQL; // Принудительно задаем тип СУБД
Благодаря этому транслятор 1С будет генерировать SQL-запросы с использованием специфического синтаксиса, характерного исключительно для MySQL, что минимизирует вероятность ошибок парсинга.
Помимо проблем с кавычками, разработчики часто сталкиваются с ошибками приведения типов (например, "Truncated incorrect INTEGER value..."), когда первичным ключом в таблице MySQL выступает строковое поле (VARCHAR). Это происходит из-за того, что некоторые версии ODBC-драйверов отдают платформе 1С некорректные метаданные о типах полей.
Для минимизации таких проблем придерживайтесь следующих рекомендаций:
В ходе обсуждения на форуме участники затронули важную тему: стоит ли вообще использовать механизм Внешних источников данных 1С, учитывая его капризность к драйверам и СУБД?
Рассмотрим две популярные альтернативы:
Подводя итог, отметим: если вам необходимо быстро настроить работу с MySQL через стандартные механизмы 1С без написания сторонних сервисов, оптимальным решением будет использование одинарных кавычек в свойстве «Имя в источнике данных» в сочетании с явным указанием ТипСУБД.MySQL в коде подключения.