Как связать 1С 8.3 с базой Oracle через ODBC, ADO и внешние источники
Содержание
Чтобы подключить 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 — архивов без инсталлятора.
- Скачайте с сайта Oracle два пакета одной версии и одной разрядности: Basic (или Basic Light) и ODBC.
- Распакуйте оба в одну папку, например
C:\oracle\instantclient_19_x. - Установите Microsoft Visual C++ Redistributable нужной разрядности — без него библиотеки клиента не загружаются.
- Добавьте папку клиента в системную переменную
PATH. - Запустите командную строку от имени администратора, перейдите в папку и выполните
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 удобно проверить связь до того, как писать код.
- Откройте администратор ODBC нужной разрядности. 64-битный —
C:\Windows\System32\odbcad32.exe, 32-битный —C:\Windows\SysWOW64\odbcad32.exe. - Перейдите на вкладку Системный DSN (пользовательский DSN служба 1С не увидит).
- Нажмите «Добавить» и выберите драйвер
Oracle in instantclient_19_x. - Заполните поля: имя источника (например,
ERP_ORACLE), TNS Service Name —ERPORA, User ID — логин. - Нажмите Test Connection, введите пароль. Сообщение «Connection successful» значит, что драйвер, сеть и учётка в порядке.
Если тест прошёл, а 1С всё равно не подключается, почти всегда дело в разрядности или в том, что служба 1С работает под другой учётной записью и не видит переменные окружения.
Подключение из 1С: три рабочих способа
| Способ | Когда выбрать | Ограничения |
|---|---|---|
| Внешний источник данных | Регулярная интеграция, отчёты и запросы на языке 1С | Нужно менять конфигурацию или расширение |
| ADO из кода | Разовая выгрузка, обработка, сложный SQL Oracle | Только Windows, код на чистом SQL |
| Oracle как СУБД базы | Сама база 1С хранится в Oracle | Только клиент-серверный вариант, подбор версий по требованиям платформы |
Способ 1. Внешний источник данных
Объект появился в платформе 8.3 и лучше всего подходит для постоянной связи.
- В Конфигураторе откройте ветку
Общие → Внешние источники данныхи добавьте источник, напримерORA. - В контекстном меню ветки «Таблицы» нового источника выберите добавление таблиц из источника. Конфигуратор запросит строку соединения, подключится к Oracle и покажет список таблиц и представлений.
- Отметьте нужные таблицы. У каждой проверьте ключевые поля: без них таблица не будет объектной, и по ссылкам работать не получится.
- Обновите конфигурацию базы данных.
Параметры соединения задаются в режиме Предприятия. Вручную — через Все функции → Стандартные → Управление внешними источниками данных. Программно — так:
&НаСервере
Процедура Подключить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С откройте кластер и добавьте новую информационную базу.
- Тип СУБД —
Oracle Database. - Сервер баз данных — псевдоним из
tnsnames.oraили строка Easy Connect. - Укажите пользователя 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С.
Безопасность подключения 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.