Интеграция 1С с внешними СУБД через Внешние источники данных (ODBC / Native)
При работе с объектами конфигурации «Внешние источники данных» возникают ошибки:
Ошибка при вызове метода контекста (УстановитьСоединение): Ошибка взаимодействия с внешним источником данных.Архитектура драйвера ODBC не соответствует архитектуре приложения (Data source name not found and no default driver specified).- Блокировки таблиц и таймауты запросов во внешней СУБД при транзакционном изменении данных из 1С.
- Некорректное сопоставление типов данных СУБД (
CLOB,BLOB,VARCHAR(MAX),UUID) с примитивными типами платформы 1С.
1. Принцип работы внешних источников данных (ВИД)
Внешние источники данных позволяют платформе 1С работать с таблицами сторонних СУБД (PostgreSQL, MS SQL, MySQL, Oracle) как с обычными справочниками и таблицами базы 1С на уровне запросов платформы. Подключение осуществляется через ODBC System DSN или прямую строку соединения (Connection String).
2. Настройка ODBC DSN в операционной системе
Драйвер ODBC должен совпадать по разрядности с процессом rphost (для клиент-серверной базы — строго 64-bit ODBC драйвер):
# Установка PostgreSQL ODBC драйвера в Linux:
apt-get install odbc-postgresql unixodbc -y
# Конфигурация /etc/odbc.ini:
[ExternalPG]
Description = PostgreSQL connection to legacy DB
Driver = PostgreSQL Unicode
Servername = 192.168.1.50
Database = warehouse_db
Port = 5432
Username = pg_reader
Password = secret_pass3. Программная инициализация и аутентификация в 1С
&НаСервере
Процедура ПодключитьВнешнююСУБД()
ВнешнийИсточник = ВнешниеИсточникиДанных.ВнешняяБазаДанных;
// Настройка строки соединения без создания DSN (Native OLE DB / ODBC)
ПараметрыСоединения = Новый ПараметрыСоединенияВнешнегоИсточникаДанных;
ПараметрыСоединения.СтрокаСоединения =
"Driver={PostgreSQL Unicode(x64)};Server=192.168.1.50;Port=5432;Database=warehouse_db;Uid=pg_reader;Pwd=secret_pass;";
ПараметрыСоединения.ИмяПользователя = "pg_reader";
ПараметрыСоединения.Пароль = "secret_pass";
ПараметрыСоединения.Таймаут = 30;
ПараметрыСоединения.АутентификацияСтандартная = Истина;
Попытка
ВнешнийИсточник.УстановитьСоединение(ПараметрыСоединения);
Исключение
ЗаписьЖурналаРегистрации("ВнешниеИсточники", УровеньЖурналаРегистрации.Ошибка,,,
"Ошибка подключения к СУБД: " + ОписаниеОшибки());
ВызватьИсключение;
КонецПопытки;
КонецПроцедуры4. Выполнение запросов 1С к таблицам внешнего источника данных
&НаСервере
Функция ПолучитьОстаткиИзВнешнейСУБД(АртикулТовара)
// Гарантируем открытое соединение
ПодключитьВнешнююСУБД();
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ВнешниеОстатки.sku КАК Артикул,
| ВнешниеОстатки.qty КАК Количество,
| ВнешниеОстатки.price КАК Цена
|ИЗ
| ВнешнийИсточникДанных.ВнешняяБазаДанных.Таблица.stock_balances КАК ВнешниеОстатки
|ГДЕ
| ВнешниеОстатки.sku = &АртикулТовара";
Запрос.УстановитьПараметр("АртикулТовара", АртикулТовара);
Возврат Запрос.Выполнить().Выгрузить();
КонецФункции Частые вопросы (FAQ)
Нужна ли клиентская лицензия 1С при чтении данных из Внешнего источника данных?
Сам внешний источник лицензий не потребляет, однако сеанс 1С, выполняющий код запроса к внешнему источнику на клиенте или сервере, должен иметь стандартную клиентскую лицензию 1С:Предприятие.
Почему 1С не видит таблицы при импорте схемы внешнего источника?
Пользователь СУБД должен обладать правами на чтение системного каталога схемы (например, информационной схемы information_schema в PostgreSQL/MySQL) и правами SELECT на целевые таблицы.
Можно ли использовать транзакции 1С при записи во внешний источник данных?
Да, если внешний драйвер СУБД поддерживает транзакции. При вызове платформенного 'НачатьТранзакцию()' транзакция открывается как в базе 1С, так и во внешней таблице с поддержкой двухфазного подтверждения.
Как обойти проблему несовпадения разрядности DSN (32 vs 64 bit)?
Для серверных баз 1С настройка DSN должна производиться строго через 64-битный диспетчер ODBC: C:\Windows\System32\odbcad32.exe. Для тонкого клиента в файловом режиме используется 32-битный диспетчер: C:\Windows\SysWOW64\odbcad32.exe.