OraCon (1С+Oracle)

Внешняя компонента, предназначенная для организации двухсторонней связи с Oracle

OraCon — внешняя компонента для 1С, предназначенная для выполнения прямых запросов к Oracle

—————————————————————————

0. Установка 

  • Запустить setup.exe
  • После установки зайти в Program FilesOraCon и запустить reg.bat для регистрации компоненты.

Прим. Компонента регистрируется в реестре и ее не надо КОПИРОВАТЬ в папку с 1С и.т.д.

Системные требования.

  • необходим Net Framework 2
  • необходим установленный OracleClient (тестировалось на версии клиента 10g, если с Вашим клиентом не заработает — в Program FilesOraCon есть dll от клиента 10g)  

—————————————————————————

1. Подключение компоненты (глобальный модуль 1С) 

Перем ora Экспорт;

Процедура ПриНачалеРаботыСистемы()
...
// Работа с Ораклом
ИмяВК = "AddIn.OraCon";
ок = ПодключитьВнешнююКомпоненту(ИмяВК);
Если ок=0 Тогда
Сообщить("Не удалось подключить внешнюю компоненту");
Иначе
ora = СоздатьОбъект(ИмяВК);
КонецЕсли;
...
КонецПроцедуры

————————————————————————

2. Использование компоненты.

ora.Открыть();// открытие соединения с ораклом.
// данный метод использует параметры соединения которые можно задать
// на вкладке Сервис - параметры -  Параметры соединения с БД.

——————————————————————

// выполнение запроса, который возвращает множество строк.
ora.ЗапросСтр("select id,name from aaa");

Пока ora.Читать() = 1 Цикл // получение строки
Сообщить("" + ora.Элем("id") + " " + ora.Элем("name"));
// получение элемента строки ora.Элем("id") по наименованию
// получение элемента строки ora.Элем(0) по номеру
КонецЦикла;

——————————————————————-

// получение единичного (скалярного) значения
зн = ora.ЗапросЗн("select count(*) from aaa");

———————————————————————

// выполнение запроса не возвращающего значения
Если ora.Запрос("insert into aaa(id,name) values(1,'xxx')") = 1 Тогда
// данные записаны
КонецЕсли;

———————————————————————

// закрытие соединения
ora.Закрыть();

—————————————————————————-

Разработчик: Выхрыстюк Алексей (it.net). poshta.it@gmail.com

37 Comments

  1. ValeriVP

    а ADO отменили?

    Reply
  2. avhrst

    Так это и есть ADO.NET, задача была написать максимально простое решение способное использовать стандартный запрос и способное получить в 1С например 100 000 строк.

    Reply
  3. avhrst

    Плюс в моем варианте на надо объяснять админу что такое ConnectionString.

    И насколько я знаю 1С ADO не поддерживает.

    Reply
  4. Душелов

    (3) 1С поддерживает COM-объекты, к коим ADO и относится.

    Reply
  5. Душелов

    > — необходим Net Framework 2

    А без него никак?

    Reply
  6. avhrst

    для использования ADO.NET Net Framework 2 обязательное условие.

    Reply
  7. avhrst

    Душелов — идея конечно рабочая, но попробуйте привести реальный пример получения в 1С таблицы из Oracle с использованием COM

    Reply
  8. avhrst

    Net Framework 2 — наверное проблема для тех кто использует 1С на Unix 🙂

    Reply
  9. Душелов

    (7) Реального примера не имею, т.к. оракла нет. Но запросы так же спокойно пишутся через ADO

    (8) Mono решает…

    Reply
  10. avhrst

    Ну если оракла нет, тогда хоть для sql примерчик…

    Reply
  11. avhrst

    там разница только в ConnectionString и con,com,reeder объектах

    Reply
  12. Душелов
    Код
    DataBaseConnection = CreateObject("ADODB.Connection");
    // подстроки user_password, user_name, server_name заменить на свои
    DataBaseConnection.ConnectionString = "Provider=MSDAORA.1;Password=user_password;User ID=user_name;Data Source=server_name;Persist Security Info=True";
    DataBaseConnection.Open();
    
    RecordSet = СоздатьОбъект("ADODB.Recordset");
    RecordSet.ActiveConnection = DataBaseConnection;
    RecordSet.CursorLocation = 3; // UseClient
    
    RecordSet.Open("SELECT * FROM clients ORDER BY name");
    
    Для i = 1 По RecordSet.RecordCount Цикл
    
    Сообщить(RecordSet.Fields.Item("name").Value);
    RecordSet.MoveNext();
    
    КонецЦикла;
    
    RecordSet.Close();
    

    Показать полностью

    Reply
  13. avhrst

    Спасибо за пример. Только ADODB.Recordset и MSDAORA.1 это страшно тормознутые объекты из ADO. Моя же компонента использует ADO.NET, «родной» клиент оракла (можно и sql), более быстрый DataReeder.

    Reply
  14. avhrst

    И кстати неразумно всем в коде 1С показывать пароли к Ораклу

    Reply
  15. avhrst

    В моей компоненте пароль шифруется средствами .Net

    Reply
  16. Душелов

    (13) Это все тоже можно спокойно использовать. «MSDAORA.2» и т.д.

    (14) Кому показывать?

    Reply
  17. Душелов

    (15) А как пароль в компоненту передается?

    Reply
  18. avhrst

    MSDAORA.2 — ситуацию не изменит, нужен родной клиент.

    Пароль вводится при первоначальной установке в окне свойств внешней компоненты. Затем шифруется и хранится классом Seting (.Net 2.0).

    Reply
  19. avhrst

    Требовалось простое решение. с которым смогут работать рядовые программеры 1С (не знающие ADO).

    Reply
  20. Душелов

    В инсталлятор включать регасм — это сильно! 🙂

    Не проще ли в батнике прописать:

    Код
    @ECHO OFF
    set DOTNETFX2=%SystemRoot%\Microsoft.NET\Framework\v2.0.50727
    set PATH=%PATH%;%DOTNETFX2%
    regasm.exe oracon.dll /codebase
    

    Показать полностью

    Reply
  21. Душелов

    (19) Не знающие АДО, могущие писать запросы для него :)))

    Reply
  22. avhrst

    я думаю получилось достаточно просто:

    ———————————

    ora.Открыть();

    ora.ЗапросСтр(«select id,name from aaa»);

    Пока ora.Читать() = 1 Цикл

    Сообщить(ora.Элем(«name»));

    КонецЦикла;

    ora.Закрыть();

    ———————————-

    Reply
  23. avhrst

    (21) Звучит смешно, но к сожалению такое не редкость… (особенно среди 1С ников)

    Reply
  24. avhrst

    (20) регасм на скорость не влияет…

    Reply
  25. Душелов

    (24) При чем тут скорость?

    Reply
  26. avhrst

    (25) скорость не причем, но батничек у себя я уже обновиол 🙂

    Reply
  27. anbxp

    Лично я бы использовал oci. ADO изначально медленнее будет

    Reply
  28. Душелов

    (27) По каким замерам? И oci почему быстрее?

    Reply
  29. avhrst

    (28) Полностью согласен. ADO быстрее (пулы соединений, многопотоковость …)

    Reply
  30. vip

    Давным давно использую для работы с Ораклом 1С++.

    Вплоть до того, что в 1С++ Оракл может быть поставщиком данных для ТабличногоПоля.

    Reply
  31. Abadonna

    (30)>Давным давно использую для работы с Ораклом 1С++.

    «– Эти добрые люди, – заговорил арестант и, торопливо прибавив: – игемон, – продолжал: – ничему не учились и все перепутали, что я говорил.»

    М. Булгаков.

    (0) не обижайся, просто шутка 😉

    Reply
  32. anbxp

    (28) Замеры были ранее, когда я с ораклом плотно работал. Да и по-сути ado — дополнительная прослойка. Которая скорости явно не добавляет:) Хотя, для использования интерфейса occi в 1С нужно будет писать ВК, т.к. этот интерфейс для c++

    (29) ADO не может предоставить возможностей больше, чем умеет БД:)

    (0) Разработка, безусловно, имеет полное право на существование. Но не лежит у меня душа к .net:)

    Reply
  33. vip

    (31) Не поверишь, на неделе перечитал.

    Reply
  34. avhrst

    (32) Вы имееете в виду ADO, а я использую ADO.NET в котором существвено переработан reeder способный в паре с родным клинтом оракла рганизовать наиболее оптимального клиента (как по скорости так по надежности).

    Такж .NET платформа позволяет реализовать позднее связывание, что очень удобно для организации offline клиентов.

    Reply
  35. genych76

    2. Использование компоненты.

    ora.Открыть(); // открытие соединения с ораклом.

    // данный метод использует параметры соединения которые можно задать

    // на вкладке Сервис — параметры — Параметры соединения с БД.

    И где же в какой программе я могу посмотреть эту вкладку ? В 1с ее нет….

    Reply
  36. dour-dead

    Огромное спасибо автору!

    Reply
  37. denisbeta

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *