Подключение 1С к внешним базам данных, таким как Firebird или InterBase, часто сопровождается трудностями, которые не проявляются при проверке через стандартные консольные утилиты. Основная сложность заключается в несовпадении архитектуры (разрядности) приложения 1С и установленных в системе драйверов ODBC, а также в правах доступа при выполнении кода на стороне сервера. В этой статье мы подробно разберем, как настроить стабильное соединение, проанализируем типичные ошибки и рассмотрим готовые примеры кода.
Первое, с чем мы сталкиваемся — это разница между выполнением кода &НаКлиенте и &НаСервере. Если ваше клиентское приложение 1С является 32-разрядным, оно будет успешно использовать 32-битные драйверы ODBC. Однако, как только код переносится в модуль сервера (который в современных реализациях почти всегда 64-разрядный), система перестает "видеть" 32-битные драйверы. Проанализируем ситуацию: диспетчер драйверов ODBC в 64-битной Windows разделен на две части. Один находится в System32 (для 64-бит), другой в SysWOW64 (для 32-бит). Для успешной работы сервера 1С необходимо установить именно 64-разрядный ODBC драйвер Firebird.
Важно помнить: файл базы данных .fdb сам по себе не имеет жесткой "битности", но клиентская библиотека fbclient.dll, через которую работает драйвер, должна строго соответствовать разрядности вызывающего приложения (в нашем случае — сервера 1С).
Рассмотрим классический способ подключения с использованием технологии ADO. Этот метод гибкий, так как позволяет динамически формировать строку подключения в коде. Посмотрим на пример рабочего кода для получения данных из системы СКУД на базе Firebird:
&НаКлиенте
Процедура ПодключитьсяКFirebird()
// Формируем строку подключения
// Обратите внимание на использование драйвера и кодировки
АдресБД = "192.168.1.10/3050:C:\Bases\SKUD_BASE.FDB";
Пользователь = "SYSDBA";
Пароль = "masterkey";
Соединение = Новый COMОбъект("ADODB.Connection");
СтрокаСоединения = "DRIVER=Firebird/InterBase(r) driver; " +
"CHARSET=WIN1251; " +
"Uid=" + Пользователь + "; " +
"Pwd=" + Пароль + "; " +
"Dbname=" + АдресБД;
Соединение.ConnectionTimeOut = 30;
Соединение.CursorLocation = 3;
Попытка
Соединение.Open(СтрокаСоединения);
Сообщить("Соединение с Firebird успешно установлено!");
Исключение
Сообщить("Ошибка подключения: " + ОписаниеОшибки());
Возврат;
КонецПопытки;
// Пример выполнения запроса
ТекстЗапроса = "SELECT FIRST 10 FULLNAME, TABNUM FROM USERS ORDER BY FULLNAME";
RecordSet = Новый COMОбъект("ADODB.Recordset");
Попытка
RecordSet.Open(ТекстЗапроса, Соединение);
Пока RecordSet.EOF() = 0 Цикл
ФИО = RecordSet.Fields("FULLNAME").Value;
ТабельныйНомер = RecordSet.Fields("TABNUM").Value;
Сообщить("Сотрудник: " + ФИО + " (ТН: " + ТабельныйНомер + ")");
RecordSet.MoveNext();
КонецЦикла;
RecordSet.Close();
Исключение
Сообщить("Ошибка при выполнении запроса: " + ОписаниеОшибки());
КонецПопытки;
Соединение.Close();
КонецПроцедуры
В данном примере мы используем ADODB.Connection для открытия сессии и ADODB.Recordset для получения результатов. Если этот код запускается на сервере, убедитесь, что в строке DRIVER указано точное имя драйвера, как оно отображается в 64-битном администраторе ODBC. Для расширения возможностей обмена можно использовать набор методов для выполнения запросов и модификации данных Firebird через ADO.
Наиболее современным и производительным способом работы с Firebird в 1С является механизм Внешних источников данных. Рассмотрим преимущества этого подхода:
Запрос и МенеджерВременныхТаблиц.Для настройки выполним следующие шаги:
После этого работа с данными сводится к простому коду:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ВнешнийИсточник.ФИО КАК ФИО,
| ВнешнийИсточник.ДатаВхода КАК ДатаВхода
|ИЗ
| ВнешнийИсточникДанных.СКУД.Таблица.События КАК ВнешнийИсточник
|ГДЕ
| ВнешнийИсточник.ДатаВхода >= &ДатаНачала";
Запрос.УстановитьПараметр("ДатаНачала", НачалоДня(ТекущаяДата()));
Результат = Запрос.Выполнить().Выгрузить();
Проанализируем специфическую ошибку SQLSTATE: 08004, Номер ошибки: -902. Часто пользователи интерпретируют её буквально — как неверный логин или пароль. Однако в контексте Firebird и 1С это часто означает одну из трех системных проблем:
fbclient.dll, которая не может корректно авторизоваться на сервере из-за различий в протоколах (например, сервер версии 2.1, а драйвер версии 3.0).security2.fdb, где хранятся пользователи, из-за ограничений прав ОС на удаленном компьютере.Чтобы выяснить точную причину, попробуйте изменить формат DBNAME в строке подключения. Вместо прямого пути к файлу используйте формат IP-адрес/Порт:Путь_к_файлу. Это заставит драйвер работать через сетевой протокол TCP/IP, делегируя авторизацию серверной части Firebird, что снимает большинство проблем с правами доступа к файлам.
Для обеспечения бесперебойной связи между 1С и Firebird придерживайтесь следующих правил:
CHARSET=WIN1251 или UTF8), чтобы избежать "кракозябр" в строковых данных.ADODB не забывайте явно закрывать соединения методом Close() и обнулять COM-объекты, чтобы избежать утечек памяти на сервере.Рассмотренные методы позволяют интегрировать 1С с любыми СКУД или производственными системами, использующими Firebird, обеспечивая надежный обмен данными как в интерактивном режиме, так и в регламентных заданиях на сервере. При необходимости можно воспользоваться готовой конфигурацией для интеграции 1С со СКУД PERCo-S-20.