Пример работы с Oracle через OracleInProcServer

11.12.12

Интеграция - Внешние источники данных

В данной статье рассматривается пример работы с СУБД Oracle через OracleInProcServer.

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

Наименование Файл Версия Размер
ЗапросКOracle
.epf 6,70Kb
62
.epf 6,70Kb 62 Скачать

Существуют 2 способа соединения с базой Oracle:

1) Через ODBC (Open DataBase Connectivity)

2) Через OOO4O (Oracle Objects for OLE)

 

Небольшое отступление касаемо их отличий.

Что такое ODBC?

ОDBC - это стандартизованное API, разработанное по спецификации SQL Access Group, которое
позволяет соединяться с любой базой данных, поддерживающей SQL. В нем определен стандартный
набор функций, кодов ошибок и типов данных, которые можно использовать для разработки приложений,
независимо от базы данных. Обычно, ODBC используется, если требуется независимость от базы данных,
или осуществляется работа с разными источниками данных.

Основные преимущества:

  1. Простота работы с ним
  2. Входит в поставку ОС Windows

Недостатки:

  1. (Главное) Не поддерживает большинства расширений Oracle
  2. Производительность ниже чем у OOO4O

Что такое Oracle Objects for OLE (OO4O)?

OO4O – это средство доступа к БД, базирующееся на COM, позволяющее получать, оптимизированный доступ к БД Oracle. 
Входит в поставку Oracle и открывает перед разработчиками доступ ко всем возможностям предоставляемым БД Oracle.

Основные преимущества: 

  1. Полная поддержка координатора транзакций в Microsoft Transaction Server (MTS)
  2. (Главное) Простой доступ к переменным и объектам специализированных типов данных реализованных в Oracle, включая:
    1. Object References (REFs – ссылочный тип)
    2. Object Instances (Objects – объектный тип)
    3. Nested Tables (Вложенные таблицы)
    4. Varrays (Массивы переменной длины)
    5. BLOBs, CLOBs, NCLOBs and BFILEs
  3. Поддержка параметров типа курсор (это единственный способ возвратить результат выполнения оператора SELECT (Resultset) из PL/SQL-блока или хранимых PL/SQ-процедур)
  4. Полный доступ к возможностям Oracle Advanced Queuing
  5. Эффективное управление подключениями к БД и пользовательскими сессиями (connection pooling и multiplexing)
  6. Большая производительность

Недостатки: Необходимо установить клиент Oracle на каждой пользовательской машине где планируется работать через OO4O.

 

Теперь рассмотрим сам процесс работы через OO4O.

 Для начала нужно установить клиентскую часть Oracle которая идёт вместе с поставкой СУБД Oracle.
Затем сконфигурировать файл tnsnames.ora который находится в директории:
...\oracle\ora92\network\admin

Приведите содержание файла к следующему виду:

ИмяБазы=
  (DESCRIPTION=
    (ADDRESS=
      (PROTOCOL=TCP)
      (HOST=IPАдресСервера)
      (PORT=1521)
    )
    (CONNECT_DATA=
      (SERVICE_NAME=ИмяБазы)
    )
  )

Введите свое ИмяБазы и IPАдресСервера и сохраните файл.

 

В 1С соединение с базой  выглядит следующим образом:

session = Новый COMОбъект("OracleInProcServer.XOraSession");     //Создаем COM обьект
db = session.OpenDatabase(Base,Login+"/"+Pass,);                          //Открываем базу

Если метод session.LastServerErr возвратит ноль значит соединение прошло успешно, если возвратит другое число

значит произошла ошибка, которая будет описана в методе session.LastServerErrText

Пример соединения:


Функция ПодключитьсяКБазеOralce(Base,Login,Pass)
    Попытка
        session = Новый COMОбъект("OracleInProcServer.XOraSession");
        db = session.OpenDatabase(Base,Login+"/"+Pass,);                     
    Исключение
        Сообщить(session.LastServerErrText); 
    КонецПопытки;
    Возврат session.LastServerErr
КонецФункции

 

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

db.Parameters.Add (Ключ1, Значение1,1);

db.Parameters.Add (Ключ2, Значение2,1);

...

db.Parameters.Add (КлючN, ЗначениеN,1);

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

        Для й = 0 по db.Parameters.Count-1 Цикл
            db.Parameters.Remove(0);
        КонецЦикла;    
 

Ну и наконец сам запрос к базе выглядит так:

oradynaset = db.CreateDynaset(ТекстЗапроса,);

 

Пример функции которая записывает результат запроса в Таблицу значений :

Функция ЗапросКOracle(ТекстЗапроса,Параметры=Неопределено)      
    Если Параметры <> Неопределено Тогда
        Для й = 0 по db.Parameters.Count-1 Цикл
            db.Parameters.Remove(0);
        КонецЦикла;    
        Для Каждого СтрПараметр Из Параметры Цикл
            db.Parameters.Add (СтрПараметр.Ключ, СтрПараметр.Значение,1);    
        КонецЦикла;    
    КонецЕсли;

    oradynaset = db.CreateDynaset(ТекстЗапроса,);
    

    //Формируем структуру Таблицы значений из результата запроса
    Тз = Новый ТаблицаЗначений;
    ЧКТ = oradynaset.Fields.Count();
    Для сч = 0 По ЧКТ-1 Цикл
        Тз.Колонки.Добавить(Строка(oradynaset.Fields(сч).Name()));
    КонецЦикла;
    

    //Копируем в Таблицу значений строки результата запроса
    й=1;
    Пока (oradynaset.EOF=0) Цикл
        СТЗ = Тз.Добавить();            
        Для сч = 0 По ЧКТ-1 Цикл
            СТЗ[Строка(oradynaset.Fields(сч).Name())] = oradynaset.Fields(Строка(oradynaset.Fields(сч).Name())).Value;
        КонецЦикла;
        Состояние("загрузка данных в таблицу значений: "+й+" из "+oradynaset.RecordCount)=й+1;
        oradynaset.MoveNext();
    КонецЦикла;

    Возврат Тз
КонецФункции



Пример Процедуры которая использует выше описанные функции:

Процедура Выполнить()
     // подключаемся к базе
     Если ПодключитьсяКБазеOralce("ИмяБазы","Логин","Пароль") <> 0 Тогда

               Возврат
     КонецЕсли;
      

     // задаем текст запроса (в данном случае извлекаем данные за определенный период)
     ТекстЗапроса  = "SELECT *
                                 |FROM dbName.TableName
                                 |WHERE DATE between To_Date(:DATE1,:DFormat) And To_Date(:DATE2,:DFormat)
                                 |";

    
     // задаем параметры
     Параметр1=Дата1;
     Параметр2=Дата2;
     Параметр3="'yyyy.mm.dd hh24:mi:ss'";
     ПараметрыЗапроса = Новый Структура;
     ПараметрыЗапроса.Вставить("DATE1",Параметр1);
     ПараметрыЗапроса.Вставить("DATE2",Параметр2);
     ПараметрыЗапроса.Вставить("DFormat",Параметр3);
    
     // выполняем запрос
     Таблица = ЗапросКOracle(ТекстЗапроса,ПараметрыЗапроса)
КонецПроцедуры

И на последок. Не забудьте что формат дат в 1С и ORACLE разный, поэтому дату до передачи в параметр нужно форматировать,
привести к виду: yyyy.mm.dd hh24:mi:ss  


P.S. У кого есть дополнения пишите,  давайте расширим материал

См. также

Перенос данных из Парус 8 в ЗГУ 3

Зарплата Внешние источники данных Бюджетный учет Платформа 1С v8.3 Сложные периодические расчеты 1С:Зарплата и кадры государственного учреждения 3 Государственные, бюджетные структуры Россия Бухгалтерский учет Бюджетный учет Платные (руб)

Обработка позволяет перенести кадровую информацию и данные по заработной плате, фактических удержаниях, НДФЛ, вычетах, страховых взносах из базы Парус 8 учреждений в конфигурацию 1С:Зарплата и кадры государственного учреждения ред. 3 (ЗГУ) и начать с ней работать с любого месяца года.

84000 руб.

19.08.2020    22447    19    1    

22

Перенос данных из Парус 10 в ЗГУ ред.3

Внешние источники данных Кадровый учет Файловый обмен (TXT, XML, DBF), FTP Обмен между базами 1C Платформа 1С v8.3 Сложные периодические расчеты 1С:Зарплата и кадры государственного учреждения 3 Государственные, бюджетные структуры Россия Бухгалтерский учет Бюджетный учет Платные (руб)

Обработка позволяет перенести кадровую информацию и данные по заработной плате, фактических удержаниях, НДФЛ, вычетах, страховых взносах из базы Парус 10 учреждений в конфигурацию 1С:Зарплата и кадры государственного учреждения ред. 3 (ЗГУ) и начать с ней работать с любого месяца года.

60000 руб.

05.10.2022    9207    9    8    

10

Перенос данных из Парус 7.хх в ЗГУ ред.3

Внешние источники данных Зарплата Бюджетный учет Платформа 1С v8.3 Сложные периодические расчеты 1С:Зарплата и кадры государственного учреждения 3 Государственные, бюджетные структуры Россия Бухгалтерский учет Бюджетный учет Платные (руб)

Обработка позволяет перенести кадровую информацию и данные по заработной плате, фактических удержаниях, НДФЛ, вычетах, страховых взносах из базы Парус 7.хх учреждений в конфигурацию 1С:Зарплата и кадры государственного учреждения ред. 3 (ЗГУ) и начать с ней работать с любого месяца года.

24000 руб.

24.04.2017    48700    97    163    

86

Перенос начальных остатков из Парус 7.71 в БГУ

Внешние источники данных Взаиморасчеты Учет ОС и НМА Логистика, склад и ТМЦ Бюджетный учет Платформа 1С v8.3 Бухгалтерский учет 1С:Бухгалтерия 2.0 1С:Бухгалтерия государственного учреждения Государственные, бюджетные структуры Россия Бюджетный учет Платные (руб)

Перенос словарей и начальных остатков из ПП Парус-Бухгалтерия Бюджет 7.71 в 1Сv8 БГУ2. Заполнение словарей и документов по вводу начальных остатков. Не требуется установка ПП Парус7. Возможна дозагрузка. Позволит автоматически и наиболее полно ввести данные в программу для начала работы. 

15600 руб.

08.12.2011    81560    128    123    

147

Перенос данных из Парус 10 (Торнадо) в ЗГУ ред.3 через Excel

Внешние источники данных Загрузка и выгрузка в Excel Зарплата Бюджетный учет Платформа 1С v8.3 Сложные периодические расчеты 1С:Зарплата и кадры государственного учреждения 3 Государственные, бюджетные структуры Россия Бухгалтерский учет Бюджетный учет Платные (руб)

Обработка позволяет перенести кадровую информацию и данные по заработной плате из Парус 10(Торнадо) учреждений через файлы Excel в конфигурацию 1С:Зарплата и кадры государственного учреждения ред. 3 (ЗГУ). В принципе, обработка может быть использована для загрузки из файлов Excel, полученных из любых информационных систем.

24000 руб.

16.11.2018    29997    20    31    

21

Загрузка спецификаций в УНФ из системы Базис-мебельщик

Производство готовой продукции (работ, услуг) Внешние источники данных Платформа 1С v8.3 1С:Управление нашей фирмой 1.6 Лесное и деревообрабатывающее хозяйство Россия Управленческий учет Платные (руб)

Обработка предназначена для загрузки файлов, выгруженных из системы Базис-мебельщик, в справочник "Спецификации" для последующих процессов учета и диспетчирования полуфабрикатов и изделий.

7200 руб.

24.06.2021    19126    52    50    

29
Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
0. sckif 146 15.04.12 10:13 Сейчас в теме
В данной статье рассматривается пример работы с СУБД Oracle через OracleInProcServer.

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

1. Ish_2 1104 15.04.12 10:13 Сейчас в теме
Всё это хорошо. Но где же анализ ?
Сравнение с другими способами ? (ВнешниеИсточникиДанных,ADODB)
Зачем нам нужно такое соединение ? В чем его выигрыш ?
В клиент-серверном варианте я должен устанавливать клиента Oracle на каждом клиенте 1с Прелприятия ?
2. BRT 37 10.07.12 14:14 Сейчас в теме
В моем случае такое соединение как раз пригодилось.
По факту такой способ позволяет формировать запросы с необходимыми параметрами.
Во вторых, у меня на части машин ODBC не работает.
Клиент Oracle необходим даже при ODBC коннекте.
Однозначно необходимая вещь.
3. pri_hod 77 18.07.12 19:03 Сейчас в теме
валится на строке
session = Новый COMОбъект("OracleInProcServer.XOraSession");

все установил что только можно
{Форма.Форма.Форма(4)}: Ошибка при вызове конструктора (COMОбъект): Недопустимая строка с указанием класса: Недопустимая строка с указанием класса
4. sckif 146 20.07.12 14:40 Сейчас в теме
(3) pri_hod, он не видит класс OracleInProcServer.XOraSession, попробуй удалить и заново поставить клиент Oracle, если не поможет попробуй на другой машине, возможно винда моросит у тебя.
5. pri_hod 77 20.07.12 15:29 Сейчас в теме
проблема в клиенте оракл. нужно использовать 32 битную версию
6. rago 24.07.12 19:17 Сейчас в теме
Зачем тут какие-то сравнения с другими способами подключения?
Вещь действительно необходимая. Я вот использую на данный момент такое же подключение к БД Oracle, только работаю через внешние источники данных (пришлось, конечно, попотеть, чтобы подключить БД - получилось только через клиента Oracle тот, который в Ora92 ставится)
7. jake.cmlt@gmail.com 10.09.12 14:27 Сейчас в теме
Добрый день.
А что делать, если используется 64-разрядный сервер? Пробую - при создании COMОбъекта 1с рушится. 1с - файловая.
8. Rom_Kat 14 03.04.13 15:58 Сейчас в теме
добрый день.
При попытке подключения выдает ошибку ORA-12154: TNS:невозможно разрешить заданный идентификатор соединения
клиент версии 10. sqlplus подключается без проблем.
Не подскажете куда копать?
9. BRT 37 16.05.13 13:08 Сейчас в теме
Затем сконфигурировать файл tnsnames.ora который находится в директории:
...\oracle\ora92\network\admin

В основном проблемы могут быть тут.
Сам провозился с подобной ошибкой неделю.
Снес "все" оракл настройки, заново сконфигурировал, не работало. При этом на другой машине где только что оракл поставили, завелась без проблем даже на 64 бит.
Проверка на работоспособность это обычная попытка ODBC подключения. В ней можно построить строку подключения и использовать ее.
В инете много статей по этому поводу.
10. freebsdd 1 05.09.13 09:27 Сейчас в теме
Дополнение есть - Ввиду сложности полноценной настройки С НУЛЯ Оракла, не хватает добавить инструкцию по установке Oracle Objects for OLE и ODBC. Я работал всё время с MS SQL - просто прелесть, с "первой буквы", вышла нужда подключаться к базе Oracle с 1С, для меня это вышла большая ЖОПА, 3-ий день уже долблю долбанный ОРАКЛ, сотни вкладок, часы и тоны инфы (кто то неделю, кто 2 недели). Сложновато с нуля его, вот была бы путная статейка.
11. DenisCh 05.09.13 09:32 Сейчас в теме
Я работал с ораклём через InstantClient'а - на 64 бит повозиться пришлось, но настроил в конце концов...
Там хитрости в наличии длл, путях (точнее расположении нужных каталогов в порядке указания путей) и настройке TNS
mishkaaa; +1 Ответить
13. freebsdd 1 05.09.13 09:43 Сейчас в теме
(11) DenisCh, Оо, а какие хитрости?
14. DenisCh 05.09.13 09:49 Сейчас в теме
(13) freebsdd, минимальный клиент не содержит каких-то длл (их я искал через depence browser), пути к бинам должны быть первыми в переменной Path, ну и правильно настроить TNS - но это меньшая из всех проблем...
15. freebsdd 1 05.09.13 11:12 Сейчас в теме
(14) DenisCh, а правильно настроить TNS, это только файл tnsnames.ora или ещё что то?
16. DenisCh 05.09.13 12:18 Сейчас в теме
(15) freebsdd, он самый, насколько я помню...
17. freebsdd 1 05.09.13 12:35 Сейчас в теме
(16) DenisCh, Вижу это давно было :))) Буду продолжать настраивать ДОракл! Спасибо Вам за советы!
12. freebsdd 1 05.09.13 09:35 Сейчас в теме
Установил ODAC 11.2, дела продвигаются, кстати, кто нибудь знает, при открытии этой обработки выдаёт сообщение: "Запуск программы невозможен, т.к. на компьютере отсутствует OCI.DLL..." Запускается терминально на Сервере, OCI.DLL Закинул уже и в System32 и в папку 1c, есть у кого нибудь опыт борьбы с этим?
18. Alex_grem 256 09.02.14 22:11 Сейчас в теме
Спасибо за статью, очень вовремя нашел!
19. ben_art 13 18.11.14 11:27 Сейчас в теме
Подскажите какой клиент лучше использовать и будьте так добры выложить его тут.)
20. sckif 146 03.12.14 13:25 Сейчас в теме
(19) ben_art, Качай с сайта Oracle, там он в свободном доступе есть.
21. Nuuq 76 04.03.20 11:26 Сейчас в теме
На сервере 1С 8.3.16.1148 64-bit вылетает с ошибкой.

ОбъектПодключения = Новый COMОбъект("OracleInProcServer.XOraSession");
по причине:
-2147221164(0x80040154): Class not registered

Oracle клиент установлен - пробовал 10 и 11 x64 - никак не выходит, TNS прописан.

У кого-нибудь получилось это использовать на сервере?
(да и на клиенте в x64)
22. sckif 146 05.09.20 13:24 Сейчас в теме
(21) В (5) ответ на Вашу проблему.
Оставьте свое сообщение