Интеграция сторонних баз данных с платформой 1С — это частая задача при автоматизации бизнес-процессов. Одним из популярных решений для хранения данных в стороннем софте (например, в POS-системах, весовом оборудовании или АЗС) является СУБД Firebird. Для подключения к ней из среды 1С традиционно используется технология ActiveX Data Objects (ADO) через COM-объекты ADODB.Connection и ADODB.Recordset.
Однако при написании SQL-запросов разработчики регулярно сталкиваются со специфическими ошибками СУБД Firebird. В этой статье мы подробно разберем, почему возникают ошибки синтаксиса (Dynamic SQL Error SQL error code = -104 / -204) при обращении к таблицам, как на это влияют раскладка клавиатуры и диалекты базы данных, а также рассмотрим лучшие практики настройки стабильного соединения.
Проанализируем классическую ситуацию. При попытке выполнить простейший запрос на получение данных из таблицы разработчик получает следующее сообщение об ошибке:
Відбулася виняткова ситуація (Microsoft OLE DB Provider for ODBC Drivers): [ODBC Firebird Driver][Firebird]Dynamic SQL Error SQL error code = -104 Token unknown - line 1, column 15 С
Выясним причину этого поведения. Ошибка SQL error code = -104 указывает на наличие неизвестного символа (токена) в теле запроса. Обратите внимание на конец сообщения: СУБД явно указывает на позицию ошибки и символ С.
Очень часто при написании кода в среде разработки 1С из-за быстрого переключения раскладок клавиатуры (русская/английская) вместо латинской буквы C в коде оказывается визуально идентичная кириллическая буква С. Для СУБД Firebird использование символов национальных алфавитов (включая русский) вне кавычек в именах таблиц или полей является грубейшим нарушением синтаксиса SQL.
Решение проблемы: тщательно проверьте раскладку клавиатуры в тексте запроса. Перепишите имя таблицы полностью на латинице. Избегайте копирования кода со сторонних форумов, где автоформатирование или движок сайта могли заменить латинские символы на кириллические.
После исправления опечатки с раскладкой клавиатуры разработчики часто наступают на вторые «грабли» СУБД Firebird:
[ODBC Firebird Driver][Firebird]Dynamic SQL Error SQL error code = -204 Table unknown CAR At line 1, column 15
Казалось бы, таблица с именем Car точно существует в базе данных, но сервер упорно утверждает, что она неизвестна (Table unknown CAR). Почему это происходит?
Разберем по шагам особенности работы СУБД Firebird с SQL Dialect 3 (третьим диалектом), который является стандартом для современных баз данных:
CREATE TABLE Car ...), Firebird автоматически приводит её имя к верхнему регистру и сохраняет в системном каталоге как CAR. При последующих обращениях вы можете писать имя таблицы в любом регистре: select * from car, SELECT * FROM CAR или Select * from Car. Сервер сам приведет всё к верхнему регистру, и запрос отработает успешно.CREATE TABLE "Car" ...), имя таблицы сохранилось в системных таблицах в точном соответствии с указанным регистром — Car (с большой буквы, остальные маленькие). В этом случае СУБД требует строгого соблюдения регистра при любых запросах.Если мы пишем запрос без кавычек: SELECT * FROM Car, драйвер Firebird транслирует его для СУБД как запрос к таблице CAR в верхнем регистре. Но таблицы CAR в структуре нет (там лежит строго Car). Возникает ошибка Table unknown CAR.
Решение проблемы: Чтобы сделать запрос регистрозависимым и указать СУБД точное имя таблицы, его необходимо обернуть в двойные кавычки. В языке 1С двойные кавычки внутри строки экранируются еще одними двойными кавычками.
Посмотрим на пример правильного написания запроса в коде 1С:
// Неправильно (вызовет ошибку Table unknown, если таблица создана с учетом регистра):
Запрос = "SELECT * FROM Car";
// Правильно (экранируем двойные кавычки в 1С):
Запрос = "SELECT * FROM ""Car""";
Разберем сопутствующие настройки подключения, без которых интеграция может работать некорректно или вызывать непредвиденные сбои в многопользовательской среде.
1. Указание правильной кодировки (CHARSET)
В строке подключения часто можно встретить параметр CHARSET=NONE. Это критическая ошибка, если ваша база данных содержит текстовые поля на русском языке. При чтении таких данных в 1С вы вместо нормального текста получите вопросительные знаки или нечитаемые символы («кракозябры»). При записи данных СУБД выдаст ошибку транслитерации.
Рекомендуется указывать кодировку, в которой реально создана база данных. Чаще всего это WIN1251 (для старых баз данных) или UTF8 (для современных информационных систем):
БД.ConnectionString = "driver=Firebird/InterBase® driver; Dialect=3; CHARSET=WIN1251; Uid=SYSDBA; Pwd=masterkey; Dbname=" + СокрЛП(ПутьКБазе);
2. Разрядность платформы 1С и ODBC-драйвера
Компонент ADODB.Connection обращается к системным драйверам операционной системы Windows. Здесь действует жесткое правило соответствия разрядности:
При несовпадении разрядности операционная система не сможет инициализировать драйвер, и вы получите ошибку о том, что источник данных (DSN) или драйвер по умолчанию не найдены.
3. Явное указание клиентской библиотеки (fbclient.dll)
Для предотвращения конфликтов версий (например, если на компьютере установлены разные версии Firebird или остатки InterBase) настоятельно рекомендуется в параметрах подключения явно прописывать путь к актуальной клиентской библиотеке fbclient.dll:
ПутьККлиенту = "C:\Program Files\Firebird\Firebird_3_0\fbclient.dll";
БД.ConnectionString = "driver=Firebird/InterBase® driver; Dialect=3; CHARSET=WIN1251; client=" + ПутьККлиенту + "; Uid=SYSDBA; Pwd=masterkey; Dbname=" + СокрЛП(ПутьКБазе);
4. Использование параметров вместо склеивания строк
Если вам необходимо передавать в SQL-запрос условия (например, искать конкретный автомобиль по его госномеру), никогда не склеивайте строку запроса вручную. Одинарные кавычки внутри параметров (например, в названиях контрагентов 'ООО 'Вектор'') приведут к синтаксическим ошибкам СУБД. Используйте безопасную передачу параметров через объект ADODB.Command:
// Создаем соединение
БД = Новый COMОбъект("ADODB.Connection");
БД.Open(СтрокаПодключения);
// Создаем команду для безопасного выполнения запроса
Команда = Новый COMОбъект("ADODB.Command");
Команда.ActiveConnection = БД;
Команда.CommandText = "SELECT * FROM ""Car"" WHERE ""GosNomer"" = ?";
// Создаем и добавляем параметр (защита от инъекций и ошибок кавычек)
Параметр = Команда.CreateParameter("Nomer", 200, 1, 20, "А123АА77"); // 200 - adVarChar
Команда.Parameters.Append(Параметр);
// Выполняем запрос
Выборка = Команда.Execute();
Пока НЕ Выборка.EOF Цикл
Сообщить("Найден автомобиль: " + Выборка.Fields("CarName").Value);
Выборка.MoveNext();
КонецЦикла;
Проанализировав эти нюансы, мы видим, что успешная интеграция 1С и Firebird строится на строгом контроле раскладки клавиатуры при написании SQL-кода, правильном экранировании идентификаторов кавычками для Dialect 3, а также на корректной предварительной настройке кодировок и разрядности системных драйверов ODBC.