Основы работы с объектами ADODB в 1С, на примере интеграции с БД Oracle
Интеграция - Внешние источники данных
Для работы со сторонними БД из 1С, в ОС Windows, доступен инструментарий ADODB.
Для работы с БД Oracle на сервер 1С понадобится установить Oracle Provider for OLE DB той же разрядности, что и сервер приложений 1С (как правило x64)
Для стандартной выборки понадобится использование трёх COM-объектов:
- ADODB.Connection
- ADODB.Command
- ADODB.RecordSet
Перечисленные выше объекты, по своему назначению, очень похожи на троицу объектов из библиотеки .NET: SQLConnection, SQLCommand и SQLDataReader.
Ниже представлен пример использования перечисленных выше объектов, для универсальности в запросе отсутствует привязка к конкретным таблицам БД Oracle, а выборка делается по таблице, которая передаётся запросу JSON-строкой в качестве параметра, результат выборки из БД Oracle помещается в таблицу значений "тзДанныеOracle", колонки которой называются аналогично колонкам результата запроса.
Процедура ТестADODB()
Перем тзДанныеOracle, КЧ, КС, КД, ТаблицаJSON,
СписокМесяцев, СписокМесяцевJSON,
Connection, Cmd, RS, ио, ТекстОшибки,
СтрокаПодключенияКOracle;
Попытка
СтрокаПодключенияКOracle = "Provider=OraOLEDB.Oracle.1;Data Source=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.0.1)(PORT=1521)))(CONNECT_DATA=(SERVICE_NAME=ORCL)));User Id=user1c;Password=123;"
СписокМесяцев = Новый Массив();
СписокМесяцев.Добавить("Февраль");
СписокМесяцев.Добавить("Март");
КЧ = Новый КвалификаторыЧисла(10, 0);
КС = Новый КвалификаторыСтроки(16);
КД = Новый КвалификаторыДаты(ЧастиДаты.Дата);
тзДанныеOracle = Новый ТаблицаЗначений();
тзДанныеOracle.Колонки.Добавить("ID", Новый ОписаниеТипов("Число",,, КЧ));
тзДанныеOracle.Колонки.Добавить("Month", Новый ОписаниеТипов("Строка",,,, КС));
тзДанныеOracle.Колонки.Добавить("Dt", Новый ОписаниеТипов("Дата",,,,, КД));
ТаблицаJSON =
"[
|{ID:1, m:""Январь"", d:""2026-01-01"" },
|{ID:2, m:""Февраль"", d:""2026-02-01""},
|{ID:3, m:""Март"", d:""2026-03-01""}
|]";
СписокМесяцевJSON = СформироватьПараметрJSONИзМассиваСтрок(СписокМесяцев);
Connection = Новый COMОбъект("ADODB.Connection");
Connection.ConnectionString = СтрокаПодключенияКOracle;
Connection.Open();
Cmd = Новый COMОбъект("ADODB.Command");
Cmd.ActiveConnection = Connection;
Cmd.CommandType = 1; //adCmdText
Cmd.CommandText =
"SELECT
| *
|
|FROM (
|
| SELECT
| ID,
| m as Month,
| TO_DATE(d, 'YYYY-MM-DD') as Dt
|
| FROM JSON_TABLE(:TableJSON, '$[*]' COLUMNS(ID,m,d))
| ) t
|
|WHERE
| t.Dt BETWEEN :DateFrom AND :DateTo
| AND t.Month in
| (
| SELECT v FROM JSON_TABLE(:MonthsListJSON, '$[*]' COLUMNS(v))
| )
|";
// Параметры нужно добавлять в том же порядке,
// в котором они встречаются в запросе
// 129 - adChar
Parameter = Cmd.CreateParameter("TableJSON", 129, 1, СтрДлина(ТаблицаJSON), ТаблицаJSON);
Cmd.Parameters.Append(Parameter);
// 133 - adDBDate (дата формата yyyymmdd)
Parameter = Cmd.CreateParameter("DateFrom", 133, 1, , Дата(2026,1,1));
Cmd.Parameters.Append(Parameter);
// 133 - adDBDate (дата формата yyyymmdd)
Parameter = Cmd.CreateParameter("DateTo", 133, 1, , Дата(2026,2,1));
Cmd.Parameters.Append(Parameter);
// 129 - adChar
Parameter = Cmd.CreateParameter("MonthsListJSON", 129, 1, СтрДлина(СписокМесяцевJSON), СписокМесяцевJSON);
Cmd.Parameters.Append(Parameter);
RS = Новый COMОбъект("ADODB.RecordSet");
RS.ActiveConnection = Connection;
RS.LockType = 1; // adLockReadOnly
RS.CursorType = 3; // adOpenStatic
RS.Open(Cmd);
Пока НЕ RS.EOF Цикл
НСтр = тзДанныеOracle.Добавить();
Для Каждого Элем Из RS.Fields Цикл
НСтр[Элем.Name] = Элем.Value;
КонецЦикла;
RS.MoveNext();
КонецЦикла;
RS.Close();
Connection.Close();
Исключение
ио = ИнформацияОбОшибке();
ТекстОшибки = ОписаниеОшибки();
Если RS <> Неопределено Тогда
Если RS.State <> 0 Тогда
RS.Close();
КонецЕсли;
КонецЕсли;
Если Connection <> Неопределено Тогда
Если Connection.State <> 0 Тогда
Connection.Close();
КонецЕсли;
КонецЕсли;
ВызватьИсключение(ТекстОшибки,,,ио);
КонецПопытки;
КонецПроцедуры // ТестADODB
Функция СформироватьПараметрJSONИзМассиваСтрок(МассивСтрок)
Перем Элем, Стр;
Стр = "";
Для Каждого Элем Из МассивСтрок Цикл
Стр = Стр + "," + "{v:"""+ Элем +"""}";
КонецЦикла;
Если ЗначениеЗаполнено(Стр) Тогда
Стр = Сред(Стр, 2);
КонецЕсли;
Стр = "[" + Стр + "]";
Возврат Стр;
КонецФункции // СформироватьПараметрJSONИзМассиваСтрок
Коротко разберём части представленного выше кода, непосредственно взаимодействующие с объектами ADODB, а также назначение используемых объектов.
Объект ADODB.Connection
Первым, из трёх объектов ADODB, в коде 1С создаётся объект "Connection", в его свойство "ConnectionString" - задаётся актуальная строка подключения к БД Oracle, а затем вызывается метод "Open()" для открытия соединения.
СтрокаПодключенияКOracle = "Provider=OraOLEDB.Oracle.1;Data Source=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.0.1)(PORT=1521)))(CONNECT_DATA=(SERVICE_NAME=ORCL)));User Id=user1c;Password=123;"
Connection = Новый COMОбъект("ADODB.Connection");
Connection.ConnectionString = СтрокаПодключенияКOracle;
Connection.Open();
Объект ADODB.Command
Этот объект служит для задания текста запроса или имени вызываемой хранимой процедуры/функции, а также для передачи им параметров.
Cmd = Новый COMОбъект("ADODB.Command");
Cmd.ActiveConnection = Connection;
Cmd.CommandType = 1; //adCmdText
Cmd.CommandText = ТекстЗапроса;
// 129 - adChar
Parameter = Cmd.CreateParameter("TableJSON", 129, 1, СтрДлина(ТаблицаJSON), ТаблицаJSON);
Cmd.Parameters.Append(Parameter);
// 133 - adDBDate (дата формата yyyymmdd)
Parameter = Cmd.CreateParameter("DateFrom", 133, 1, , Дата(2026,1,1));
Cmd.Parameters.Append(Parameter);
Свойство "CommandType" определяет тип команды. Возможные значения:
- adCmdUnspecified(-1) - тип команды не определён.
- adCmdText(1) - в CommandText содержится текст SQL-запроса.
- adCmdTable(2) - в CommandText содержится имя таблицы, все данные которой будут считаны при выполнении команды.
- adCmdStoredProc(4) - в CommandText содержится имя хранимой процедуры, которая будет выполнена при выполнении команды.
- adCmdUnknown(8) - тип команды неизвестен (по умолчанию).
Метод "CreateParameter" создаёт и возвращает объект Parameter с заданными свойствами, все параметры метода необязательные. После создания параметра его нужно добавить в коллекцию Parameters объекта Command используя метод Append:
Cmd.Parameters.Append(Parameter);
Важно! В коллекцию "Parameters" параметры нужно добавлять ровно в том же порядке, в котором они встречаются в тексте запроса. Например, в запросе первым встречается параметр "TableJSON", вторым "DateFrom", третьим "DateTo", то и добавлять нужно первым "TableJSON", вторым "DateFrom", третьим "DateTo".
Рассмотрим параметры метода CreateParameter(Name, Type, Direction, Size, Value)
- Name - строка, имя параметра.
- Type - целое число (long), тип данных параметра (строка, число, булево и т.д.). Подробнее - см. ниже.
- Direction - целое число (long), "направление" параметра. Возможные значения:
- adParamUnknown(0) - направление параметра неизвестно.
- adParamInput(1) - по умолчанию, входной параметр.
- adParamOutput(2) - выходной параметр.
- adParamInputOutput(3) - параметр представляет собой и входной, и выходной параметр
- adParamReturnValue(4) - параметр представляет собой возвращаемое значение.
- Size - целое число (long), максимальная длина параметра в символах или байтах. (в случае значений параметров, чья длина однозначна (все скалярные типы: число, дата, булево), длину можно не указывать.
- Value - Variant, значение параметра.
Значения параметра "Type" представлены ниже:
- adEmpty(0) - значение не задано.
- adSmallInt(2) - двухбайтное целое со знаком.
- adInteger(3) - четырёхбайтное целое со знаком.
- adSingle(4) - число с плавающей запятой с одинарной точностью.
- adDouble(5) - число с плавающей запятой с двойной точностью.
- adCurrency(6) - денежная сумма с фиксированной точкой с четырьмя цифрами справа от десятичной точки (восьмибайтное целое число со знаком).
- adError(10) - 32-битный код ошибки.
- adBoolean(11) - булево значение.
- adDecimal(14) - числовое значение с фиксированной точностью и масштабом.
- adTinyInt(16) - однобайтное целое со знаком.
- adUnsignedTinyInt(17) - однобайтное целое без знака.
- adUnsignedSmallInt(18) - двухбайтное целое без знака.
- adUnsignedInt(19) - четырёхбайтное целое без знака.
- adBigInt(20) - восьмибайтное целое со знаком.
- adUnsignedBigInt(21) - восьмибайтное целое без знака.
- adBinary(128) - двоичное значение.
- adChar(129) - строковое значение.
- adUserDefined(132) - определяемая пользователем переменная.
- adDBDate(133) - дата формата yyyymmdd.
- adDBTime(134) - время формата hhmmss.
- adDBTimeStamp(135) - дата и время формата yyyymmddhhmmss плюс тысячные доли секунды.
Объект ADODB.RecordSet
Этот объект служит для обхода результата выполнения команды, по своему назначению он аналогичен объекту "ВыборкаДанных" в 1С. После создания объекта, в свойство ActiveConnection нужно поместить активное соединение с БД (Connection). Обход значений будет доступен, после успешного выполнения метода "Open", который принимает в качестве аргумента объект Command.
Объект RecordSet имеет свойство EOF, которое устанавливается в значение истина при достижении конца коллекции строк, выбранных из БД. Метод MoveNext() выбирает следующий элемент коллекции строк.
Коллекция значений текущей строки выборки доступна в свойстве Fields.
Пример работы с объектом RecordSet представлен ниже:
RS = Новый COMОбъект("ADODB.RecordSet");
RS.ActiveConnection = Connection;
RS.LockType = 1; // adLockReadOnly
RS.CursorType = 3; // adOpenStatic
RS.Open(Cmd);
Пока НЕ RS.EOF Цикл
НСтр = тзДанныеOracle.Добавить();
Для Каждого Элем Из RS.Fields Цикл
НСтр[Элем.Name] = Элем.Value;
КонецЦикла;
RS.MoveNext();
КонецЦикла;
RS.Close();
Данная статья не претендует на полноту изложения всех сведений об объектах ADODB, а лишь даёт минимальный набор сведений для написания кода импорта данных в 1С из сторонних БД с использованием объектов ADODB (На примере БД Oracle).
Более подробное описание объектов ADODB можно прочесть здесь.
Код тестировался на платформе 1С:Предприятие 8.3 (8.3.27.2214).
Вступайте в нашу телеграмм-группу Инфостарт
Вы можете заказать платную адаптацию этой статьи под ваши задачи на «Бирже заказов».
- 0% комиссии — оплата напрямую исполнителю;
- Исполнители любого масштаба — от отдельных специалистов до команд под проект;
- Прямой обмен контактами между заказчиком и исполнителем;
- Безопасная сделка — при необходимости;
- Рейтинги, кейсы и прозрачная система откликов.