Подключение к firebird из 1с через odbc

Обновлено: 07.07.2024

НаборЗаписей = Новый COMОбъект("ADODB.Recordset");
НаборЗаписей = Команда.Execute();

Если НаборЗаписей.RecordCount() <> 0 Тогда
Пока НаборЗаписей.EOF() = 0 Цикл
Сообщить("ыва");
НаборЗаписей.MoveNext();
КонецЦикла;
НаборЗаписей.Close();
КонецЕсли;

1. Используй LCPI.IBProvider.3 (бесплатную версию, если нет купленной). Для твоих задач - более чем достаточно.

3. Если не знаешь как определять параметры, то и не определяй их :). Провайдер сам за тебя вполне справится. Если очень хочется, то можешь вызвать Command.Parameters.Refresh

Единственная известная засада с (именнованными) параметрами связана передачей BLOB-данных. Чтобы на неё не попасть, следует устанавливать свойство команды NamedParameters=true. Это так к сведению.

Названия методов пишу по памяти :)

Это ты какой мануал читал? По VCL компонентам, что ли?

> Слушай, этот самый . весь такой белый и пушистый.

я бы предложил ввести на форуме цветовую дифференциацию штанов.
Чтоб сразу было понятно ху из ху. И не наезжали друг на друга, а
говорили "ку"
А то понимаешь.

Posted via ActualForum NNTP Server 1.4

А прочитав твое "из моей базы данные, и записывал их в базу, а так же работал с триггерами, ХП, и прочим" у меня вообще появилось желание поглумится над твоим представлением о доступе к базе данных.

Оба неправы. Да и ты вдобавок. :)
А пиписькомеряние - это дааа, это тут любят.

P.S. За "ку" (by Кочмин) +1.

Posted via ActualForum NNTP Server 1.4

Оба неправы. Да и ты вдобавок. :)
А пиписькомеряние - это дааа, это тут любят.

P.S. За "ку" (by Кочмин) +1.

Я прям не знаю, чтобы мы без тебя, Рустам, делали? Наверное, по старинке бы линейками бы пользовались.

А то что Kochmin_Alexandr получил на один инч больше - это не честно.

> По теме топика чего нибуть адекватное сказать можешь? Нет? Тогда в сад.

Дмитрий, ты же широко известен в узких кругах. Зачем ты полез в спор то?
Оно тебе надо? Пусть молодежь развлекается.

Posted via ActualForum NNTP Server 1.4

Куй его знает, Дим. Может и линейками. Во всяком случае
линейками - оно нагляднее, чем авторством IBProvider'a. :)

Коваленко Дмитрий> А то что Kochmin_Alexandr получил на один инч больше - это не честно.

Да не в "инках" дело. А в предложении. Если бы вы сказали
друг другу "кю", на вас бы даже внимание не обратили.
И твоему тезке не пришлось бы вмешиваться дабы
"прояснить ситуацию".

Коваленко Дмитрий> Тогда в сад.

Из сада, громко: я, конечно, понимаю, что тебе "за державу обидно"
(то бишь за свою игрушку), но если бы в сабжевом посте IBProvider
не был упомянут, то ты бы этот топик даже не заметил. Так что гонор
свой поумерь (ты уж извини, в стиле МП я не могу - нельзя-с, поэтому
так многословно).

P.S. Ты не подумай, что я именно Кота защищаю - ни в коем разе,
он афтар горячий и послан не первый раз и не только тут. Но все
же определенное чувство юмора иметь надо. Особенно тебе, как
автору "УСУС"а.

Коваленко Дмитрий> По теме топика чего нибуть адекватное сказать можешь?



Здравствуйте.
Этот материал призван обобщить и показать основные техники и приемы для работы с базами данных InterBase/FireBird из программ, запускаемых на платформе 1С. Почти все, что изложено здесь, так или иначе встречается в других интернет-источниках. Однако в этой статье материал достаточно полный. Возможно, что-то из заявленной темы и упущено, но все равно, изложенного материала (в моем понимании) достаточно для решения большинства задач (кстати, кое-что не получилось – может кто-нибудь подскажет решение, и можно будет дополнить материал). Кроме того, демонстрационный пример, приложенный к статье, может быть использован желающими в качестве каркаса для разработки собственных подобных программ. Несмотря на то, что большинство задач по доступу из 1С к сторонним базам ограничиваются необходимостью загрузить какие-либо данные из смежной информационной системы, мы покажем здесь более разнообразные варианты доступа к базам, в том числе различные виды записи информации в БД.
В этой публикации будет рассказано о том:
— как подключиться к серверу (базе) и отключиться при завершении работы;
— как выполнять SQL-запросы (принимать и передавать данные, в том числе и те, которые не могут быть размещены непосредственно в тексте запроса (длинные строки, BLOB-поля));
— как выполнять преобразование данных, в т.ч. текстовых кодировок, при передаче данных в базу и из базы;
— как обращаться к серверной логике базы (вызывать хранимые процедуры);
— как защитить свою программу от автоматического разрыва TCP-соединения сервером БД;
— прочие интересные приемы, связанные с программированием вообще (как сделать все вышеперечисленные действия удобно, надежно и переносимо).

Программа проверялась на версиях FireBird 1.5 и FireBird 2.1. Скорее всего, будет работать и для любой другой версии СУБД. Данный механизм доступа к базе использует технологию ADO. Соответственно, на компьютере, где запускается клиент 1С, должен быть установлен драйвер «Firebird_ODBC», а также клиентская библиотека «gds32.dll».

Полные исходные тексты программы приводить не буду (даже исходные тексты отдельных классов будут приведены с сокращениями). Для просмотра исходных текстов лучше открыть тестовый пример непосредственно в 1С – качество просмотра будет гораздо выше, чем то, что доступно средствами HTML-публикации.

Будем в качестве примера рассматривать несложную информационную систему, условно названную «Записная книжка». Она чем-то будет подобна справочнику, который можно создать в платформе. У нас будет справочник контактной информации. В справочнике будет дерево групп (каталогов) – можно будет создавать произвольное дерево любой вложенности. В качестве элементов такого справочника будут выступать так называемые «Карточки», т.е. собственно сами записи с контактной информацией. Кроме того, в этой информационной системе будут пользователи (учетные записи) со своими правами доступа. Поиска нет (только ввод данных и навигация по дереву групп). Какой-либо привязки пользователей к тем данным, что они вводили (наподобие поля ОсновнойОтветственный в документах типовых решений 1С) тоже нет, а также нет логирования (журнализации) действий пользователей. Для демонстрации работы с базой этого функционала достаточно, а еще более усложнять реализацию пользовательского интерфейса просто не хотелось.

Далее будем считать, что:
— «Текущая группа» — это группа, выбранная в дереве групп (в левой колонке);
— «Содержимое текущей группы» — это список групп и элементов, отображаемый в правой колонке;
— «Текущий объект текущей группы» — это группа или элемент, выбранный в правой колонке;

Все команды (добавить, редактировать, удалить, переместить) относятся к содержимому правой колонки (либо к текущей группе, либо к текущему элементу текущей группы) – как и в стандартном интерфейсе работы со справочниками 1С.

Главное меню и панель инструментов содержат следующие команды:

Изобр. Название команды Описание
«База»→«Подключение» Выполняет подключение к базе (закрывает предыдущее подключение, если оно было)

«База»→«Выход» Выход из программы


«Действия»→«Добавить» Создать новый элемент (карточку) в текущей группе справочника.


«Действия»→«Новая группа» Создать новую группу в текущей группе справочника.


«Действия»→«Скопировать» Создать новый объект в текущей группе справочника на основе данных текущего выделенного объекта. Что именно создается (группа или карточка) зависит от того, какой объект был выделен в текущей группе .

«Действия»→«Изменить» Открыть на редактирование текущий объект текущей группы (группу или карточку).


«Действия»→«Удалить» Удалить текущий объект текущей группы (группу или карточку).


«Действия»→«Переместить в группу» Переместить в другую группу текущий объект текущей группы (группу или карточку).


«Действия»→«Обновить» Заново перезагрузить все данные (и дерево групп и список содержимого текущей группы).
«Настройки»→«Смена пароля» Смена пароля текущего пользователя
«Настройки»→«Список пользователей» Редактирование списка пользователей базы.
«Настройки»→«Профили подключения» Редактирование профилей подключения к базам

Окно программы до подключения к базе:


Диалог выполнения подключения:
(Команда: «База»→«Подключение»)


Окно программы после подключения к базе:


Диалог настройки профилей подключения к базам:
(Команда: «Настройки»→«Профили подключения»)


Диалог смены пароля:
(Команда: «Настройки»→«Смена пароля»)


Настройки списка пользователей:
(Команда: «Настройки»→«Список пользователей»)


Редактирование группы справочника контактов:
(Команды: «Действия»→«Новая группа», «Действия»→«Скопировать», «Действия»→«Изменить»)


Редактирование элемента справочника контактов (карточки):
(Команды: «Действия»→«Добавить», «Действия»→«Скопировать», «Действия»→«Изменить»)


Диалог выбора группы в дереве групп:
Используется для указания родительской группы в диалогах редактирования группы и карточки, а также для указания группы на значения при перемещении текущего объекта текущей группы (объекта, выбранного в правом списке главного окна программы) в новую группу.

Основные сущности системы:
1. Справочник пользователей системы (учетных записей). Состоит только из элементов (учетных записей). Соответственно в базе представляется одной таблицей.
2. Собственно сам целевой справочник контактной информации. Состоит из групп (дерево справочника) и элементов (карточек). В базе справочник будет представлен отдельной таблицей групп (в ней будет храниться дерево уровней справочника) и отдельной таблицей элементов (в ней будут храниться сами карточки с контактами).

В нашей системе есть следующие информационные сущности:
группа справочника контактов (набор групп, образующих дерево (поддерево) групп – полное или частичное представление данных таблицы GROUPS);
элемент (карточка) справочника контактов (набор карточек – полное или частичное представление данных таблицы CARDS);
учетная запись системы (набор учетных записей – полное или частичное представление данных таблицы USERS)

Модель представлена в коде 1С следующими классами:
BaseObj (БазоваяСущность) – класс – абстрактный родитель для всех остальных классов из данной группы. Содержит общие поля и методы.
ObjGroup (СущностьГруппа) – потомок от BaseObj, представляет собой реализацию сущности «группа справочника контактов».
ObjCard (СущностьКарточка) – потомок от BaseObj, представляет собой реализацию сущности «элемент справочника контактов».
ObjUser (СущностьПользователь) – потомок от BaseObj, представляет собой реализацию сущности «пользователь системы».
ObjSet (НаборОбъектов) – тоже потомок от BaseObj, но является не сущностью, а универсальной коллекцией сущностей, которой можно представить набор из объектов любого типа (ObjGroup, ObjCard, ObjUser). Естественно, что нельзя смешивать в одном наборе сущности разных типов.

Понадобилось мне тут данные вытащить из одной программки, написанной на БД 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-разрядный провайдер. У меня как раз такой вариант и работает.

Порядок действий.

1. Устанавливаем провайдер (драйвер ODBC), устанавливаем сервер FB. Это всё довольно просто - запустили инсталлятор, ответили на пару вопросов. Подвохов там нет. Ставим/распаковываем базу куда-то туда, куда у нас и 1С в нашем аккаунте полный доступ. Единственно что, лучше не на примапленный диск. 2. В 1С создаём объект ADODB.Connection и работаем через него. Ему передаём текст запроса на языке FB, от него получаем выборку результата этого запроса, т.е. штатно работаем с FB из 1С. Для успешного соединения с базой самое важное - правильно скомпоновать строку команды соединения. Эта строка включает указание провайдера, авторизацию, настройки соединения. Именно с ней обычно возникают проблемы. Подробное описание этого дела см. в файле OdbcFb.chm из папки Firebird_ODBC в разделах "Connection attributes" и "Connection examples". Свойство "CursorLocation" желательно ставить равным 3, свойство "ConnectionTimeOut" я ставлю равным 180.

Есть любители работать через DSN - по сути, это поименованное пакетное описание всех тонкостей подключения. В этом случае сначала в настройках ODBC создаётся системный/пользовательский DSN, где всё прописывается один раз, и уже на его имя ссылаются в строке подключения. Я этим не пользуюсь, поэтому подробно рассказывать не буду. Отмечу, что DSN полезен, когда соединение из 1С не срабатывает - можно попробовать сделать DSN с такими же настройками и пощёлкать "Проверить соединение" - если не взлетит и оно, тогда проблема с драйвером и СУБД, с доступом итд, а если сработает - то накосячено что-то в коде 1С.

Пример подключения и инициализации переменной модуля:

Запрос к БД FB представляет собой по сути диалект SQL, поэтому в нём можно разобраться, просто зная язык запросов 1С. Есть токность: алиасы регистрочувствительны.

Я сделал единую функцию для передачи запросов в неё:

Разумеется, для написания запросов надо знать имена и свойства таблиц БД, имена и типы их полей, а также конкретику наполнения. Для этого есть множество вьюшек, отдельных утилит и приблуд, но я написал свою исключительно потому, что хотелось подробнее разобраться и сразу иметь возможность как-то обработать прочитанные данные. Поэтому прилагаю обработку под УФ, которая умеет читать данные о таблицах и их полях, читать содержимое таблиц, исполнять ваши запросы (эдакая мини-консоль запросов FB). Всё в ней изложенное спокойно заработает и на обычных формах.

Закончив работу, не забывайте сделать мСоединение.Close() или просто очистить переменную.

Пока не копал вопрос реляционных связей между таблицами, ключей и индексов. Будет время - постараюсь дополнить эту публикацию и приложенную обработку.

Типы полей имеют цифровую нотацию, которая в обработке представлена - как преобразование в более человекочитаемый вид.

Вот, собственно, и всё. Чтобы быстро изучить базу и вытащить из неё нужные данные, больше ничего и не требуется.

Поскольку ресурсы Интернета имеют свойство исчезать, а ссылки - биться, то основной софт вложен в публикацию.

НЕ советую связываться с IBProvider. Эта навороченная штуковина себе на уме, легко и просто - с ней может не выйти, возни с ней бывает неоправданно много.



ВИД (внешние источники данных) в 1С – это объекты конфигурации, позволяющие использовать информацию из внешних ODBC-источников (баз данных), не основанных на 1С:Предприятии, внутри прикладного решения так же, как будто бы она хранится в самой информационной базе.

В качестве ODBC-драйвера был выбран пакет FreeODBC, т.к. он бесплатный и его везде используют.

В процессе гугления использовались источники:

Установка

Достаточно установить пакет tdsodbc (разрядность должна совпадать с сервером 1С!):

(дополнительно установятся: libodbc1 odbcinst odbcinst1debian2)

В файл odbcinst.ini добавить (если не добавилось автоматически) секцию для FreeTDS:

  • Для 32-битного пакета: /usr/lib/i386-linux-gnu/odbc
  • Для 64-битного пакета: /usr/lib/x86_64-linux-gnu/odbc

Если этого не сделать, или поставить пакет не той же разрядности, что сервер 1С, то будет ошибка:
[unixODBC][Driver Manager]Can't open lib 'FreeTDS' : file not found

А вот такая ошибка будет, если неверно указали путь к либам:
/usr/lib/x86_64-linux-gnu/odbc/libtdsodbc.so file not found


"Ошибка аутентификации клиента 1cv8 средствми операционной системы: Аутентификационный контекст клиента отсутствует в рабочем процессе"

Как я понял, поключаться и работать с ВИД можно двумя способами:
1) Подключаться программно.
Пример:
(Спасибо caponid за инфу о поле СУБД):

Соед = Новый ПараметрыСоединенияВнешнегоИсточникаДанных ; Соед . СУБД = "MSSQLServer" ; //Явно указываем, потому что тот тип, что указали в строке соединения, игнорируется; Источник = ВнешниеИсточникиДанных [ "НазваниеИсточника" ] ; Источник . УстановитьПараметрыСоединенияСеанса ( Соед ) ;

Но тут у меня не получилось запихнуть проинициализированный объект ВИД в запрос:

2) Использовать механизм подключения в режиме Предприятия. Параметры подключения хранятся тут:
РегистрСведений.НастройкиПодключенияКВнешнемуИсточникуДанных
или
Все функции -> Стандартные -> Управление внешними источниками данных

Строка подключения выглядит так:
"Driver=; Server=SERVER,1433; Database=BASE; User Password=PASS;"
Пользователя и пароль я запихивал в отдельные поля.

Если в режиме предприятия будут отсутствовать параметры подключения к внешнему источнику данных, то будет ошибка:
"[unixODBC][Driver Manager]Data source name not found, and no default driver specified"

Дату нужно форматировать перед добавлением, например, так:

"[FreeTDS][SQL Server]Conversion failed when converting date and/or time from character string."

"[FreeTDS][SQL Server]Cannot insert explicit value for identity column in table 't_logs' when IDENTITY_INSERT is set to OFF."

При добавлении таблицы с помощью помощника, поля с внешними ключами (foreign_key) будут по-умолчанию устанавливаться в тип объекта, а не Число. Мне это небыло нужно, поэтому вручную менял тип.

Нужно быть внимательным с поиском записи с помощью функции НайтиПоПолю(). Значение должно совпадать с типом поля в таблице. Например, строку перегонять в число:

Что не получилось

Не получилось сделать поля выбора (а-ля combobox) с выпадающим списком значений из ВИД. Ставишь реквизиту формы тип таблицы ВИД, переносишь его на форму. Все ок, элемент (контрол) создается, но не отображается. Заморачиваться не стал, вводил вручную id-шники записи, этого было достаточно.

1) FuncName
2) [FreeTDS][SQL Server]Invalid column name 'FuncName'.

1) dbo.FuncName
2) [FreeTDS][SQL Server]Cannot find either column "dbo" or the user-defined function or aggregate "dbo.FuncName", or the name is ambiguous.

1) SELECT <FuncName>
2) [FreeTDS][SQL Server]Incorrect syntax near the keyword 'SELECT'.

1) EXECUTE <FuncName>
2) [FreeTDS][SQL Server]Incorrect syntax near the keyword 'EXECUTE'.

1) * from dbo.FuncName()
2) Обращение к процедуре объекта как к функции (FuncName)

Так же не решился вопрос с кириллицей. А точнее, при создании записей из 1С в MS SQL текст на русском языке превращался в кракозябры, например:

" 0:@KB85 70O2:8 87 1!, >

Параметры сортировки базы: Cyrillic_General_CI_AS.
Что пытался сделать:
1) настроить FreeTDS, всунув в его конфиг параметр charset в секцию [global]:

Читайте также: