Основы работы с объектами ADODB в 1С, на примере интеграции с БД Oracle

05.10.26

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

Поскольку необходимость работы из 1С со сторонними базами данных, через ActiveX компонент ADODB, возникает довольно редко, то особенности работы с этим инструментарием забываются и приходится заново искать в интернет информацию. Эта публикация попытка собрать в одном месте необходимый минимум, чтобы в случае возникновения необходимости, вся нужная информация была под рукой.

Для работы со сторонними БД из 1С, в ОС Windows, доступен инструментарий ADODB.

Для работы с БД Oracle на сервер 1С понадобится установить Oracle Provider for OLE DB той же разрядности, что и сервер приложений 1С (как правило x64)

Для стандартной выборки понадобится использование трёх COM-объектов:

  1. ADODB.Connection
  2. ADODB.Command
  3. 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).

Вступайте в нашу телеграмм-группу Инфостарт

ADODB Импорт данных из Oracle

Вы можете заказать платную адаптацию этой статьи под ваши задачи на «Бирже заказов».

  • 0% комиссии — оплата напрямую исполнителю;
  • Исполнители любого масштаба — от отдельных специалистов до команд под проект;
  • Прямой обмен контактами между заказчиком и исполнителем;
  • Безопасная сделка — при необходимости;
  • Рейтинги, кейсы и прозрачная система откликов.

См. также

Внешние источники данных Разработчик Аналитик Пользователь 1С:Предприятие 8 1C:Бухгалтерия Узбекистан Беларусь Кыргызстан Молдова Россия Казахстан Платные (руб)

Готовое решение для автоматической выгрузки данных из 1С 8.3 в базу данных ClickHouse, PostgreSQL или Microsoft SQL для работы с данными 1С в BI-системах. «Экстрактор данных 1С в BI» работает со всеми типовыми и нестандартными конфигурациями 1С 8.3 и упрощает работу бизнес-аналитиков. Благодаря этому решению, специалистам не требуется быть программистами, чтобы легко получать данные из 1С в вашей BI-системе.

35000 руб.

15.11.2022    33868    53    49    

51

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

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

85400 руб.

05.10.2022    14597    17    8    

17

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

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

122000 руб.

19.08.2020    30666    28    3    

29

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

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

85400 руб.

24.04.2017    57688    99    165    

91

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

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

10370 руб.

24.06.2021    26865    66    55    

48

Файловый обмен (TXT, XML, DBF), FTP Внешние источники данных Бухгалтер Пользователь 1С:Предприятие 8 1С:Бухгалтерия 3.0 Здравоохранение, медицина, стоматология Фармацевтика, аптеки Россия Платные (руб)

Внешняя обработка «Загрузка документов из eФарма» создана для программы 1С:Бухгалтерия предприятия, редакция 3.0 (версии Базовая, Проф и Корп). Обработка позволяет загружать документы в базу 1С из файлов выгрузки, имеющих формат .DBF, которые создаются в программе eФарма или eФарма2, а также из любых других программ, формирующих файлы-выгрузки с таким же расширением.

9760 руб.

15.03.2024    2891    5    0    

7
Для отправки сообщения требуется регистрация/авторизация