Понадобилось мне тут данные вытащить из одной программки, написанной на БД Firebird. И оказалось, что да, в интернете полно примеров, где маститые гуру, выпятив губу, демонстрируют новичкам, как подключаться к Огнептице, но всё обрывочно и скомканно. На ИС нашлось несколько публикаций, вроде //infostart.ru/public/85844/ — но и там полезного крайне мало. Поскольку иногда бывает надо быстро «взять и сделать», то предлагаю материалы, которые помогли мне выполнить задачу, а также решение, которое достаточно универсально, чтобы применяться в самых разных жизненных случаях. Всё это без привязки к конкретному софту вроде всяких автосервисов или запчастей. Рассказываю на прикладном уровне (т.е. подробного изложения, чем ODBC отличается от ADO DB или что такое MDAC, не ждите). Есть задача «прочитать данные», её решаем.
FB здесь и далее, понятно дело, не фейсбук)
Описывается случай FB 2.0 как наиболее общий, обычно справедливо и для более поздних версий.
Необходимое:
1. На компьютере (на сервере либо локальном ПК, откуда идёт подключение к FB) должен быть источник данных ODBC, позволяющий работать провайдеру. Его один раз надо установить, зарегистрировать и запустить. При установке FB некоторых дистрибутивов он ставится сразу, но, увы, не всегда. Мы из 1С подключаемся к этому провайдеру и командуем, что нам надо сделать с БД FB. Дальше — не наша забота. Нас даже, в общем, не волнует граница ответственности между провайдером и собственно сервером FB. Провайдеров много, не все одинаково полезны) Дистрибутив того, который легко «взлетел» у меня, прилагаю.
2. На компьютере (на сервере либо локальном ПК, откуда идёт подключение к FB) желательно установить сервер FB. Запускать его после инсталляции как службу не обязательно. Сам по себе тихо крутится, интерфейса обычно не имеет. Установка его полезна тем, что даёт нам некоторые примитивные консольные утилиты для управления БД. Есть действия, которые вообще без этих утилит не сделать. Ну и документация там тоже есть. Дистрибутив прилагаю.
3. Собственно читаемая база — один или несколько файлов, обычно формата FDB или GDB. Сама база может лежать любом месте — главное, правильно указать путь; но лучше всё же (во избежание лишних причин для сбоев) положить её локально.
Замечу, что можно спокойно ставить под 64-разрядную ОС обычный 32-разрядный провайдер. У меня как раз такой вариант и работает.
Порядок действий.
Есть любители работать через DSN — по сути, это поименованное пакетное описание всех тонкостей подключения. В этом случае сначала в настройках ODBC создаётся системный/пользовательский DSN, где всё прописывается один раз, и уже на его имя ссылаются в строке подключения. Я этим не пользуюсь, поэтому подробно рассказывать не буду. Отмечу, что DSN полезен, когда соединение из 1С не срабатывает — можно попробовать сделать DSN с такими же настройками и пощёлкать «Проверить соединение» — если не взлетит и оно, тогда проблема с драйвером и СУБД, с доступом итд, а если сработает — то накосячено что-то в коде 1С.
Пример подключения и инициализации переменной модуля:
&НаКлиенте
Процедура ПодключитьсяКБазе();
мСоединение=Новый COMОбъект("ADODB.Connection");
мСоединение.ConnectionString="driver=Firebird/InterBase(r) driver;
|Dialect=3;
|CHARSET=NONE;
|Uid=SYSDBA;
|Pwd=123;
|Dbname="+СокрЛП(ПутьКБазе);
мСоединение.ConnectionTimeOut=180; // и хватит
мСоединение.CursorLocation=3;
Попытка
мСоединение.Open(мСоединение.ConnectionString);
ПоказатьОповещениеПользователя("ОК",,"Соединение успешно установлено!");
Исключение
Сообщить("Ошибка при установке соединения: "+ОписаниеОшибки());
мСоединение=Неопределено;
КонецПопытки;
КонецПроцедуры
Запрос к БД FB представляет собой по сути диалект SQL, поэтому в нём можно разобраться, просто зная язык запросов 1С. Есть токность: алиасы регистрочувствительны.
Я сделал единую функцию для передачи запросов в неё:
&НаКлиенте
Функция ВыполнитьЗапрос(тз)
Попытка
мрез=Новый Массив;
Если мСоединение=Неопределено Тогда Возврат мрез КонецЕсли;
рез=мСоединение.Execute(тз);
Пока не рез.EOF() Цикл
ОбработкаПрерыванияПользователя();
соот=Новый Соответствие;
Для й=0 По рез.Fields.Count-1 Цикл
итем=рез.Fields(й);
соот.Вставить(СокрЛП(итем.Name),итем.Value);
КонецЦикла;
мрез.Добавить(соот);
рез.MoveNext();
КонецЦикла;
Возврат мрез;
Исключение
Сообщить("Ошибка при выполнении запроса. Текст запроса:"+Символы.ПС+тз+Символы.ПС+"Описание ошибки: "+ОписаниеОшибки());
Возврат Новый Массив;
КонецПопытки;
КонецФункции
Разумеется, для написания запросов надо знать имена и свойства таблиц БД, имена и типы их полей, а также конкретику наполнения. Для этого есть множество вьюшек, отдельных утилит и приблуд, но я написал свою исключительно потому, что хотелось подробнее разобраться и сразу иметь возможность как-то обработать прочитанные данные. Поэтому прилагаю обработку под УФ, которая умеет читать данные о таблицах и их полях, читать содержимое таблиц, исполнять ваши запросы (эдакая мини-консоль запросов FB). Всё в ней изложенное спокойно заработает и на обычных формах.
Закончив работу, не забывайте сделать мСоединение.Close() или просто очистить переменную.
Пока не копал вопрос реляционных связей между таблицами, ключей и индексов. Будет время — постараюсь дополнить эту публикацию и приложенную обработку.
Типы полей имеют цифровую нотацию, которая в обработке представлена — как преобразование в более человекочитаемый вид.
Вот, собственно, и всё. Чтобы быстро изучить базу и вытащить из неё нужные данные, больше ничего и не требуется.
Поскольку ресурсы Интернета имеют свойство исчезать, а ссылки — биться, то основной софт вложен в публикацию.
Полезные ссылки:
http://www.ibase.ru/components/ — разные дистрибутивы софта; наиболее советую http://www.firebirdsql.org/en/odbc-driver/
http://www.firebirdsql.com/file/documentation/reference_manuals/user_manuals/Firebird-1.5-QuickStart-Russian.pdf — быстрый обзор;
http://www.firebirdsql.org/file/documentation/reference_manuals/Firebird_Language_Reference_RUS.pdf — полное руководство;
http://firebirdsql.su/doku.php?id=sistemnye_tablicy — сведения о системных таблицах (метаданные базы FB), и вообще там много полезного.
НЕ советую связываться с IBProvider. Эта навороченная штуковина себе на уме, легко и просто — с ней может не выйти, возни с ней бывает неоправданно много.
Удачи в интеграции) Авось кому пригодится.
Делал такое через самописную ВК (Native API, на Delphi, использует gdi32.dll), не требует дополнительных настроек на клиенте и установки. Если 1С и FB на разных серверах — не требует никаких танцев с бубном. Единственный минус — работает медленно.
(1) Так это ещё надо заморачиваться, ВК писать… И не на каждом компе гарантированно взлетит, ВК, они такие.
А внешние источники данных огнептицу не умеют?
(3) Теоретически должны бы, на практике, лично у меня, не взлетело. Провайдер, вишь, не тот.
Спасибо за информацию.