Как связать 1С 8.3 с базой Oracle через ODBC, ADO и внешние источники

· 10 мин

Содержание

Чтобы подключить 1С к Oracle, на компьютер, где выполняется код 1С, ставят клиент Oracle (Instant Client + ODBC-драйвер) той же разрядности, что и процесс 1С. Затем описывают сервер в tnsnames.ora и подключаются из 1С одним из трёх способов: объект конфигурации «Внешний источник данных», COM-объект ADODB.Connection в коде или Oracle как СУБД самой информационной базы.

Первые два способа нужны для интеграции: читать таблицы чужой учётной системы, писать в неё данные, строить отчёты по данным Oracle. Третий — это размещение базы 1С на сервере Oracle вместо MS SQL или PostgreSQL. Порядок действий дан для 1С:Предприятия 8.3 на Windows, отличия для Linux вынесены в отдельный подраздел.

Что проверить до начала: версии, разрядность, доступ

Большая часть неудачных подключений ломается не в 1С, а на этапе подготовки. Перед установкой драйвера выясните четыре вещи.

  • 🖥️ Где выполняется код. Код с директивой &НаСервере в клиент-серверной базе работает в рабочем процессе rphost на сервере 1С. Драйвер нужен там, а не на компьютере пользователя. В файловой базе код сервера выполняется на клиенте — драйвер ставят на рабочее место.
  • 🔢 Разрядность. 32-битный процесс 1С видит только 32-битный драйвер, 64-битный — только 64-битный. Смешивать нельзя.
  • 🌐 Сетевой доступ. С сервера 1С должен открываться порт листенера Oracle (по умолчанию 1521). Проверка: Test-NetConnection 10.0.0.5 -Port 1521 в PowerShell.
  • 🔑 Учётные данные и имя сервиса. Нужны логин, пароль и SERVICE_NAME (или SID) базы. Их выдаёт администратор Oracle.
Что выясняемГде смотреть
Разрядность клиента 1СПуть установки: C:\Program Files\1cv8 — 64 бита, C:\Program Files (x86)\1cv8 — 32 бита
Разрядность сервера 1ССлужба «Агент сервера 1С:Предприятия», путь к ragent.exe в её свойствах
Версия OracleЗапрос SELECT banner FROM v$version у администратора Oracle
Имя сервисаlsnrctl status на сервере Oracle или у администратора

Instant Client версии 19 и 21 подключается к серверам Oracle нескольких предыдущих версий. Точную матрицу совместимости клиента и сервера смотрите в документации Oracle на выбранную версию клиента.

Установка Oracle Instant Client и ODBC-драйвера

Полный клиент Oracle ставить не обязательно. Для 1С хватает Instant Client — архивов без инсталлятора.

  1. Скачайте с сайта Oracle два пакета одной версии и одной разрядности: Basic (или Basic Light) и ODBC.
  2. Распакуйте оба в одну папку, например C:\oracle\instantclient_19_x.
  3. Установите Microsoft Visual C++ Redistributable нужной разрядности — без него библиотеки клиента не загружаются.
  4. Добавьте папку клиента в системную переменную PATH.
  5. Запустите командную строку от имени администратора, перейдите в папку и выполните odbc_install.exe. Скрипт зарегистрирует драйвер с именем вида Oracle in instantclient_19_x.
cd /d C:\oracle\instantclient_19_x
odbc_install.exe
setx TNS_ADMIN "C:\oracle\network\admin" /M
setx NLS_LANG "RUSSIAN_RUSSIA.CL8MSWIN1251" /M

Переменная TNS_ADMIN указывает, где лежит tnsnames.ora. NLS_LANG задаёт кодировку клиента: без неё кириллица из Oracle часто приходит знаками вопроса. Значение согласуйте с кодировкой базы Oracle; для баз в AL32UTF8 обычно ставят RUSSIAN_RUSSIA.AL32UTF8.

Служба сервера 1С читает системные переменные только при старте. После setx её нужно перезапустить, а это оборвёт все сеансы пользователей. Делайте перезапуск вне рабочего времени и предупредите пользователей заранее.

Для способа через OLE DB (OraOLEDB.Oracle) Instant Client мало: провайдер входит в пакет ODAC. Если ODAC не ставите, используйте ODBC-драйвер — он покрывает все задачи 1С.

Сервер 1С на Linux

На Linux внешние источники данных и ODBC работают через unixODBC. Ставят Instant Client (rpm или zip), регистрируют драйвер в /etc/odbcinst.ini, DSN — в /etc/odbc.ini. COM-объекта ADODB.Connection на Linux нет, поэтому код через ADO там не работает — только внешние источники данных.

Файл tnsnames.ora: описание сервера Oracle

tnsnames.ora сопоставляет короткий псевдоним с адресом сервера. Создайте его в папке из TNS_ADMIN:

ERPORA =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = 10.0.0.5)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = erppdb)
    )
  )
  • ERPORA — псевдоним, который будете писать в строке подключения.
  • HOST и PORT — адрес листенера Oracle.
  • SERVICE_NAME — имя сервиса. Для старых баз без сервисов вместо него пишут SID = ....

Скобки должны быть парными, а псевдоним — начинаться с первой позиции строки. Лишний пробел перед именем или незакрытая скобка дают ошибку ORA-12154.

Без файла можно обойтись: Instant Client понимает формат Easy Connect — 10.0.0.5:1521/erppdb. Его подставляют на место псевдонима. Для одного-двух подключений это проще, для десятка баз удобнее tnsnames.ora.

Источник данных ODBC в Windows

DSN не обязателен — строку подключения можно собрать целиком в 1С. Но через DSN удобно проверить связь до того, как писать код.

  1. Откройте администратор ODBC нужной разрядности. 64-битный — C:\Windows\System32\odbcad32.exe, 32-битный — C:\Windows\SysWOW64\odbcad32.exe.
  2. Перейдите на вкладку Системный DSN (пользовательский DSN служба 1С не увидит).
  3. Нажмите «Добавить» и выберите драйвер Oracle in instantclient_19_x.
  4. Заполните поля: имя источника (например, ERP_ORACLE), TNS Service Name — ERPORA, User ID — логин.
  5. Нажмите Test Connection, введите пароль. Сообщение «Connection successful» значит, что драйвер, сеть и учётка в порядке.

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

Подключение из 1С: три рабочих способа

СпособКогда выбратьОграничения
Внешний источник данныхРегулярная интеграция, отчёты и запросы на языке 1СНужно менять конфигурацию или расширение
ADO из кодаРазовая выгрузка, обработка, сложный SQL OracleТолько Windows, код на чистом SQL
Oracle как СУБД базыСама база 1С хранится в OracleТолько клиент-серверный вариант, подбор версий по требованиям платформы

Способ 1. Внешний источник данных

Объект появился в платформе 8.3 и лучше всего подходит для постоянной связи.

  1. В Конфигураторе откройте ветку Общие → Внешние источники данных и добавьте источник, например ORA.
  2. В контекстном меню ветки «Таблицы» нового источника выберите добавление таблиц из источника. Конфигуратор запросит строку соединения, подключится к Oracle и покажет список таблиц и представлений.
  3. Отметьте нужные таблицы. У каждой проверьте ключевые поля: без них таблица не будет объектной, и по ссылкам работать не получится.
  4. Обновите конфигурацию базы данных.

Параметры соединения задаются в режиме Предприятия. Вручную — через Все функции → Стандартные → Управление внешними источниками данных. Программно — так:

&НаСервере
Процедура ПодключитьOracleНаСервере()
    Параметры = Новый ОписаниеПараметровСоединенияСВнешнимИсточникомДанных;
    Параметры.СтрокаСоединения = "Driver={Oracle in instantclient_19_x};Dbq=ERPORA;";
    Параметры.ИмяПользователя = "ONEC_READER";
    Параметры.Пароль = ПарольИзХранилища();
    Параметры.СУБД = "Oracle";
    ВнешниеИсточникиДанных.ORA.УстановитьОбщиеПараметрыСоединения(Параметры);
    ВнешниеИсточникиДанных.ORA.УстановитьСоединение();
КонецПроцедуры

Свойство СУБД подсказывает платформе диалект SQL, который она генерирует. После подключения таблицы Oracle доступны в обычном языке запросов:

Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
|    К.CLIENT_ID,
|    К.NAME
|ИЗ
|    ВнешнийИсточникДанных.ORA.Таблица.CLIENTS КАК К";
Выборка = Запрос.Выполнить().Выбрать();

Способ 2. ADO из кода

Подходит для обработок и разовых задач. Запрос пишется на SQL Oracle и выполняется на стороне Oracle целиком.

&НаСервере
Процедура ПрочитатьКлиентовOracle()
    Соединение = Новый COMОбъект("ADODB.Connection");
    Соединение.ConnectionString =
        "Driver={Oracle in instantclient_19_x};Dbq=ERPORA;Uid=ONEC_READER;Pwd=" + ПарольИзХранилища() + ";";
    Соединение.Open();

    НаборЗаписей = Новый COMОбъект("ADODB.Recordset");
    НаборЗаписей.Open("SELECT client_id, name FROM erp.clients WHERE active = 1", Соединение);

    Пока НЕ НаборЗаписей.EOF Цикл
        Код = НаборЗаписей.Fields("CLIENT_ID").Value;
        Наименование = НаборЗаписей.Fields("NAME").Value;
        Сообщить(Строка(Код) + " — " + Наименование);
        НаборЗаписей.MoveNext();
    КонецЦикла;

    НаборЗаписей.Close();
    Соединение.Close();
КонецПроцедуры

Oracle возвращает имена колонок в верхнем регистре, если при создании таблицы их не заключили в кавычки. Поэтому Fields("CLIENT_ID"), а не Fields("client_id"). Если подключаетесь через DSN, строка сокращается до DSN=ERP_ORACLE;Uid=...;Pwd=...;.

Способ 3. Oracle как СУБД информационной базы

Это не интеграция, а размещение самой базы 1С в Oracle. Клиент Oracle ставится на сервер 1С, затем в консоли кластера создаётся информационная база:

  1. В консоли администрирования серверов 1С откройте кластер и добавьте новую информационную базу.
  2. Тип СУБД — Oracle Database.
  3. Сервер баз данных — псевдоним из tnsnames.ora или строка Easy Connect.
  4. Укажите пользователя Oracle с правами на создание объектов схемы.

Поддерживаемые версии Oracle для конкретной сборки платформы перечислены в её системных требованиях — сверьтесь с ними до развёртывания. На практике для новых внедрений чаще выбирают PostgreSQL или MS SQL: под них больше опыта и готовых регламентов обслуживания.

Как ускорить обмен данными между 1С и Oracle

Медленная интеграция почти всегда упирается в объём данных, которые гоняются по сети.

  • 🎯 Фильтруйте на стороне Oracle. Условие WHERE в SQL-запросе или в запросе к внешнему источнику, а не перебор всей таблицы в цикле 1С.
  • 📋 Выбирайте только нужные колонки. SELECT * по широкой таблице тянет лишние мегабайты.
  • 🔁 Не открывайте соединение в цикле. Одно соединение на всю выгрузку; запрос на каждую строку справочника — главный убийца скорости.
  • 📦 Увеличьте предвыборку. В настройках DSN Oracle ODBC есть параметр Prefetch Count — сколько строк драйвер забирает за одно обращение. Значение 500–1000 для пакетных выгрузок заметно сокращает число сетевых обменов.
  • 👁️ Попросите представление. Сложное соединение таблиц лучше оформить представлением (VIEW) в Oracle и подключить его как одну таблицу внешнего источника.
  • 🗂️ Индексы. Поля, по которым 1С фильтрует и соединяет данные, должны быть проиндексированы в Oracle. Это задача администратора Oracle, но запрос на неё формулирует разработчик 1С.
Перед запуском интеграции в работу
Выполнено: 0 / 6

Безопасность подключения 1С к Oracle

Связка с чужой учётной системой — это ещё одна дверь в данные. Закройте её тремя мерами.

Отдельный пользователь Oracle с минимальными правами

Не подключайтесь под владельцем схемы или под SYSTEM. Создайте пользователя только для 1С и выдайте права на конкретные объекты:

CREATE USER onec_reader IDENTIFIED BY "<надёжный пароль>";
GRANT CREATE SESSION TO onec_reader;
GRANT SELECT ON erp.clients TO onec_reader;
GRANT SELECT ON erp.v_orders TO onec_reader;

Если 1С должна писать в Oracle, дайте INSERT или UPDATE только на служебную таблицу-буфер. Чужая система сама заберёт данные оттуда своими проверками.

Пароль не в коде

Пароль в тексте модуля видит каждый, кто откроет конфигурацию или выгрузит её в файлы. В типовых конфигурациях на БСП для этого есть безопасное хранилище: процедуры ОбщегоНазначения.ЗаписатьДанныеВБезопасноеХранилище и ОбщегоНазначения.ПрочитатьДанныеИзБезопасногоХранилища. Функция ПарольИзХранилища() в примерах выше — ваша обёртка над вторым методом.

Шифрование трафика

По умолчанию трафик Oracle Net идёт открытым. Включите встроенное шифрование в sqlnet.ora на клиенте (в папке TNS_ADMIN):

SQLNET.ENCRYPTION_CLIENT = REQUIRED
SQLNET.ENCRYPTION_TYPES_CLIENT = (AES256)
SQLNET.CRYPTO_CHECKSUM_CLIENT = REQUIRED

На стороне сервера Oracle администратор должен разрешить шифрование, иначе соединение не установится. Дополнительно ограничьте порт 1521 на межсетевом экране: доступ только с адреса сервера 1С.

Ошибки ORA и ODBC при подключении 1С к Oracle

Текст ошибки сразу показывает, на каком уровне сломалось подключение: драйвер, сеть, имя сервиса или учётка.

Диагностика: выберите симптом

Если из администратора ODBC тест проходит, а из 1С — нет, запустите odbcad32.exe и тест под той же учётной записью, под которой работает служба сервера 1С. Так вы увидите ровно то окружение, что и rphost.

Частые вопросы

Можно ли подключиться к Oracle из файловой базы 1С?
Да. Внешние источники данных и ADO работают и в файловом варианте. Драйвер ставится на компьютер пользователя, разрядность — как у его клиента 1С.
Нужен ли полный клиент Oracle или хватит Instant Client?
Для ODBC и внешних источников данных хватает Instant Client с пакетами Basic и ODBC. Полный клиент или ODAC нужен, если хотите использовать провайдер OraOLEDB.
Можно ли из 1С записывать данные в Oracle?
Да. Через ADO выполняют INSERT и UPDATE методом Execute соединения. У внешнего источника данных объектные таблицы с ключевыми полями тоже позволяют запись, если у пользователя Oracle есть права.
Как вызвать хранимую процедуру Oracle из 1С?
Через ADO: выполните Execute с текстом вида BEGIN имя_пакета.имя_процедуры(параметры); END; Для процедур с выходными параметрами используют объект ADODB.Command с коллекцией Parameters.
Почему в Конфигураторе таблицы видны, а в Предприятии подключения нет?
Строка соединения, введённая при добавлении таблиц в Конфигураторе, в базе не сохраняется. В режиме Предприятия параметры задают заново — через «Управление внешними источниками данных» или методом УстановитьОбщиеПараметрыСоединения.