gifts2017

Как подключиться к базе Firebird из 1С8 на примере программы "Стол заказов автозапчастей"

Опубликовал Максим Андреев (extalionos) в раздел Программирование - Практика программирования

Рассмотрим пример подключения к базе Firebird напрямую из 1С через COM соединение. Для примера возьмем базу программы "Стол заказов автозапчастей".

2011-06-01

  1. Добавил файлы более или менее живых обработок выгрузки из "Стола заказов автозапчастей" в УТ 10.3. Писал для интереса, можете на их основе написать что-то работоспособное.
  2. Обработки рассчитаны на конфигурацию, в которой добавлены новые метаданные и внесены  изменения.
  3. К сожалению, cf-ник выложить не могу.

Основные принципы:

Базу Firebird можно скачать ТУТ.

Для работы с Firebird советую Database Browser Portable. Программка бесплатна и имеет конструктор запросов.

  1. Должна быть установлена собственно ODBC Firebird.
  2. Заходим в Источники данных (ODBC) в винде, если видим там источник данных Firebird - значит все ок. Если что - правим.
  3. Затем в 1С пишем следующий код.
Перем Соединение;
//*******Подключились к базе************************************************
Процедура ПодключениеКБазе()
    Соединение      = Новый COMОбъект("ADODB.Connection");
    Команда         = Новый COMОбъект("ADODB.Command");
    НаборЗаписей    = Новый COMОбъект("ADODB.RecordSet");

    Соединение.ConnectionString     = "driver=Firebird/InterBase(r) driver; Dialect=3; CHARSET=NONE; Uid=SYSDBA;Pwd=masterkey;Dbname="+ФайлЗагрузки;
    Соединение.ConnectionTimeOut    = 1200;
    Соединение.CursorLocation       = 3;
    try
        Соединение.Open(Соединение.ConnectionString);
        //Сообщить("Соединение успешно уставнолено !!!");
    except
        Сообщить("Невозможно установить соединение с Firebird:
        | "+ОписаниеОшибки());
        Возврат;
    endtry;
КонецПроцедуры

//*********Загружаем данные в базу***********************************************************************
Процедура ЗагрузитьКонтрагентов()
   ТекстЗапроса ="
    |SELECT
    |CLIENTM.CLIENTM_ID,
    |CLIENTM.CLIENT_ID,
    |CLIENTM.MODEL,
    |CLIENTM.SUBMODEL,
    |CLIENTM.ENGINEV,
    |CLIENTM.ENGINETYPE,
    |CLIENTM.SHASSIN,
    |CLIENTM.VIN,
    |CLIENTM.GOSNOMER,
    |CLIENTM.TRANSMTYPE,
    |CLIENTM.FRONTBRAKETYPE,
    |CLIENTM.REARBRAKETYPE,
    |CLIENTM.AYEAR,
    |CLIENTM.FUEL,
    |CLIENTM.PRIVOD,
    |CLIENTM.AIRBAGP,
    |CLIENTM.AIRBAGV,
    |CLIENTM.STEERINGBOOSTER,
    |CLIENTM.CONDITIONER,
    |CLIENTM.ABS,
    |CLIENTM.INFO,
    |CLIENTS.CLIENT_ID,
    |CLIENTS.FIO,
    |CLIENTS.PHONE,
    |CLIENTS.DISCCARD,
    |CLIENTS.INN,
    |CLIENTS.FIRM,
    |CLIENTS.BANK,
    |CLIENTS.KS,
    |CLIENTS.RS,
    |CLIENTS.INF_S,
    |CLIENTS.INFO,
    |CLIENTS.DISCOUNT,
    |CLIENTS.PADRESS,
    |CLIENTS.FADRESS,
    |CLIENTS.CTYPE,
    |CLIENTS.BIK,
    |CLIENTS.FAX,
    |CLIENTS.EMAIL,
    |CLIENTS.WWW,
    |CLIENTS.BADCLIENT,
    |CLIENTS.CLIENT_ARCH,
    |CLIENTS.WWW_ACCESS,
    |CLIENTS.WWW_NICKNAME,
    |CLIENTS.WWW_PASSW,
    |CLIENTS.WWW_PRIHODDATE,
    |CLIENTS.WWW_P_INFO,
    |CLIENTS.ALTER_CLIENT_ID,
    |CLIENTS.KPP,
    |CLIENTS.FBANKADR,
    |CLIENTS.CATEG_ID
    |FROM
    |CLIENTM
    |INNER JOIN CLIENTS ON (CLIENTM.CLIENT_ID = CLIENTS.CLIENT_ID)
    |";
    Попытка
        // Выборка данных и перебор результата запроса
        ВыборкаСтрокС = Соединение.Execute(ТекстЗапроса);
    Исключение
        Сообщить(ОписаниеОшибки());
    КонецПопытки;
    Пока ВыборкаСтрокС.EOF=0 Цикл //Цикл по записям
        КодКонтрагента = СокрЛП(Строка(Формат(ВыборкаСтрокС.Fields("CLIENT_ID").value,"ЧГ="))); //уберем группировки
        КодАвтомобиль  = СокрЛП(Строка(Формат(ВыборкаСтрокС.Fields("CLIENTM_ID").value,"ЧГ=")));
        //посмотрим есть ли контрагент
        Если Справочники.Контрагенты.НайтиПоРеквизиту("КодСтолаЗаказов",КодКонтрагента) = Справочники.Контрагенты.ПустаяСсылка() Тогда
            НовыйКонтрагент                     = Справочники.Контрагенты.СоздатьЭлемент();
            Сообщить(""+СокрЛП(ВыборкаСтрокС.Fields("FIO").value)+" создаем...");
        Иначе
            Если ПерезаписыватьКонтрагентов Тогда
                НовыйКонтрагент                     = Справочники.Контрагенты.НайтиПоРеквизиту("КодСтолаЗаказов",КодКонтрагента).ПолучитьОбъект();
                Сообщить(""+НовыйКонтрагент+" перезаписываем...");
            Иначе
                НовыйКонтрагент                     = Справочники.Контрагенты.НайтиПоРеквизиту("КодСтолаЗаказов",КодКонтрагента).ПолучитьОбъект();
                Сообщить(""+НовыйКонтрагент+" пропускаем...");
            КонецЕсли;
        КонецЕсли;
        НовыйКонтрагент.Покупатель          = Истина;
        НовыйКонтрагент.Родитель            = ГруппаПокупателей;
        НовыйКонтрагент.Код                 = КодКонтрагента;
        НовыйКонтрагент.КодСтолаЗаказов     = КодКонтрагента;
        НовыйКонтрагент.Наименование        = СокрЛП(ВыборкаСтрокС.Fields("FIO").value);
        НовыйКонтрагент.НаименованиеПолное  = СокрЛП(ВыборкаСтрокС.Fields("FIO").value);
        НовыйКонтрагент.ИНН                 = ?(СокрЛП(ВыборкаСтрокС.Fields("INN").value) = "","",СокрЛП(ВыборкаСтрокС.Fields("INN").value));
        НовыйКонтрагент.ЮрФизЛицо           = Перечисления.ЮрФизЛицо.ФизЛицо;
        НовыйКонтрагент.КПП                 = ?(СокрЛП(ВыборкаСтрокС.Fields("KPP").value) = "","",СокрЛП(ВыборкаСтрокС.Fields("KPP").value));
        НовыйКонтрагент.Записать();
        //запишем основной договор
        СписокДоговоров = ПолучитьСписокДоговоровПоЗаказам(НовыйКонтрагент.Ссылка);
        Если СписокДоговоров.Количество() = 0 Тогда //нет соотвествующих договоров
            НовыйКонтрагент.ОсновнойДоговорКонтрагента = СоздатьДоговорПоЗаказам(НовыйКонтрагент);
        КонецЕсли;
        Если СокрЛП(ВыборкаСтрокС.Fields("PHONE").value) <> "" Тогда
            Попытка
                Набор = РегистрыСведений.КонтактнаяИнформация.СоздатьНаборЗаписей();
                Набор.Прочитать();
                НовЗапись               = Набор.Добавить();
                НовЗапись.Объект        = НовыйКонтрагент.Ссылка;
                НовЗапись.Тип           = Перечисления.ТипыКонтактнойИнформации.Телефон;
                НовЗапись.Вид           = Справочники.ВидыКонтактнойИнформации.ТелефонКонтрагента.Ссылка;
                НовЗапись.Представление = СокрЛП(ВыборкаСтрокС.Fields("PHONE").value);
                Набор.Записать();
            Исключение
            КонецПопытки;
        КонецЕсли;
        НовыйКонтрагент.Записать();
        Сообщить(""+НовыйКонтрагент + " успешно загружен.");
        ВыборкаСтрокС.MoveNext(); //Переходим к след. записи
    КонецЦикла;
КонецПроцедуры

Скачать файлы

Наименование Файл Версия Размер Кол. Скачив.
Выгрузка контрагентов из Firebird в УТ 10.3
.epf 10,01Kb
01.06.11
146
.epf 10,01Kb 146 Скачать
Выгрузка отгрузок и оплат из Firebird в УТ 10.3
.epf 23,33Kb
01.06.11
43
.epf 23,33Kb 43 Скачать

См. также

Подписаться Добавить вознаграждение

Комментарии

0. Максим Андреев (extalionos) 01.06.11 11:34
Рассмотрим пример подключения к базе Firebird напрямую из 1С через COM соединение. Для примера возьмем базу программы "Стол заказов автозапчастей".

Перейти к публикации

1. Serj (Serj1C) 01.06.11 12:04
советую почитать Внешние источники на новой 8.2.14
запрос можно будет составить стандартным конструктором запросов 1С.
сразу же выполнить запрос и выгрузить, например, в таблицу значений
(без всяких внешних компонент и ком-объектов)
Il; echo77; extalionos; +3 Ответить
2. Максим Андреев (extalionos) 01.06.11 13:54
Согласен, но как всегда все пишется все на коленке и оптимизацией кода не было времени заниматься. Главное что сделать это можно.
Кстати где то лежала обработка которая переносит все документы из "Стола заказов автозапчастей" в 10.3. или что то зачаточное было. Если надо могу поискать и выложить.
3. Александр Крынецкий (echo77) 03.06.11 18:16
Хреново, что у вас все пишется на коленке и хреново, что в процедуры и функции, что вы здесь привели не передаются параметры
4. Максим Андреев (extalionos) 06.06.11 09:56
Красивый, быстрый и грамотный код - всегда правильно и дорого, но как кто не говорил - это всегда отнимает много времени.
5. г. Казань Рустем Гумеров (Rustig) 06.06.11 14:39
(0) а как так получилось, что надо было подключаться к базе на Фаерберд? Можно услышать предысторию задачи?
Кто администрировал базу на Фаерберд? С помощью какой программы вносились данные в базу Фаерберд? Нельзя ли было с помощью этой программы выгрузить контрагентов?
6. Денис Яковлев (iceflash) 06.06.11 14:58
А в чем собственно "соль" поста? Ну скажем, берем любую БД у которой есть ODBC драйвер, ставим и конектимся точно так же (запросы все sql отличия не значительные в диалектах могут быть, и в архитектурах СУБД), заменив лишь connection string?! (или я чего то не понял) Кстати работая над одним проектом есть отдельная БД на firebird с которой нужно было производить работу, так вот собственно единственная загвостка, подобрать odbc драйвер который давал бы более лучшую реализацию. Который бы позволял устанавливать уровни изоляции, работу с курсором в данном случае могу посоветовать Gemini ODBC.
7. Максим Андреев (extalionos) 06.06.11 19:37
iceflash пишет:

А в чем собственно "соль" поста? Ну скажем, берем любую БД у которой есть ODBC драйвер, ставим и конектимся точно так же (запросы все sql отличия не значительные в диалектах могут быть, и в архитектурах СУБД), заменив лишь connection string?! (или я чего то не понял) Кстати работая над одним проектом есть отдельная БД на firebird с которой нужно было производить работу, так вот собственно единственная загвостка, подобрать odbc драйвер который давал бы более лучшую реализацию. Который бы позволял устанавливать уровни изоляции, работу с курсором в данном случае могу посоветовать Gemini ODBC.

Согласен, ничего сложного и уникального. Просто пример и ответ на вопрос. Зашел, увидел, скачал драйвер и написал.
8. Максим Андреев (extalionos) 06.06.11 19:41
Из заголовка статьи можно увидеть название достаточно распространенной программы "Стол заказов автозапчастей" (http://www.tradesoft.ru/products/orders/)
К базе данной программы мы и пытались подключиться.
Разработчики которой, к сожалению не предложили готовые варианты мостов и импорта данных.
9. г. Казань Рустем Гумеров (Rustig) 07.06.11 12:31
(8) хорошо, стало проясняться. а почему в эксель не выгрузили контрагентов? а уже потом из Эксель в 1С?
10. Ийон Тихий (cool.vlad4) 07.06.11 12:55
(9) потому, что вариант через ado лучше
11. Максим Андреев (extalionos) 07.06.11 16:39
Rustig пишет:
хорошо, стало проясняться. а почему в эксель не выгрузили контрагентов? а уже потом из Эксель в 1С?

Дольше писать и сложнее.))) И еще Эксель не было под рукой!
12. Владимир Гришин (braynt) 08.06.11 16:43
а кто-нибудь пробовал через внешние источники к базе Firebird подключаться?
13. Ийон Тихий (cool.vlad4) 08.06.11 16:57
+ к 12 вопросу, а кто-нибудь делал замер производительности на внешних источниках?
14. Максим Андреев (extalionos) 09.06.11 08:24
Приведите пример "внешних источников"?
15. Владимир Гришин (braynt) 09.06.11 10:06
в платформе 8.2.14 появился новый объект внешние источники данных. Пытался настроить подключение к базе Firebird - никак не видит базу.
16. Дмитрий Никс (aximo) 10.06.11 14:49
Поставлю плюс ... за готовое решение... м.б. когда-нибудь понадобиться
17. Maxim Trifonov (mysql_postfix) 06.10.11 12:41
неплохое решение, но проще использвать связку IBExpert+firebird.dll
18. Юлия Петрова (petrovaUL) 30.11.11 13:08
на платформе 8.2.14 к базе Firebird возможно
19. Vasya Pupkin (ALFik) 19.12.11 12:23
(15)Аналогично. В Конфигураторе всё видит, в предприятии "Ошибка ODBC. SQLSTATE: IM002" и хоть головой об стену.
20. Vasya Pupkin (ALFik) 19.12.11 12:53
Прописал строку подключения конструктором - добавились {} в имя драйвера.
Несколько запусков отладчик показывал пустую строку подключения почему-то.
Попробовал установить вручную - работает.
Убрал насильное подлючение после этого - всё равно работает, даже после перезапуска.
Возможно помогло удаление таблиц и добавление их заново.
Вывод - не хватает возможности задания строки подключения в конфигураторе
(не дай бог сменить адрес сервера и всё - таки прийдётся добавлять таблички заново).
И напоследок - обидно, что видны только TABLES, а VIEWS обошли стороной.
21. EvgeniuXP EvgeniuXP (EvgeniuXP) 20.05.12 17:56
(18) на платформе 8.2.14 возможно - но только посмотреть структуру Firebird-а, дальше если запустишь приложение 1С:Предприятие 8.2.14 и выше (8.2.15.315) - ошибка:

Описание: [ODBC Firebird Driver][Firebird]Dynamic SQL Error
SQL error code = -104
Token unknown - line 1, column 12

В запросах Firebird-а нужно использовать не ТОР, а FIRST! А в динамические списки попадают именно выбранные записи.

Поэтому возможна работа нормальная с запросами в Firebird-а через ADO. 8.2.14 в мусорное ведро :)
22. Михаил Зотов (ZOMI) 07.06.12 15:12
Очень полезная инфа.Спасибо !
23. sws sws (Wladymyr) 18.06.12 18:59
спасибо за полезную информацию
24. Il Il (Il) 29.06.12 06:55
25. Виктор Новожилов (compil7) 03.05.13 18:00
Спасибо за статью! Пригодилась для загрузки данных в базу 1С из Трансменеджера.
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа