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 не будет опубликован. Обязательные поля помечены *