RSS

Взаимодействие 1С с ADODB Печать E-mail
( 4 Голосов )

За все время работы с системой 1С мне очень часто может понадобиться работать с внешними источниками данных в режиме online. Информации в интернете, которая могла бы мне помочь было крайне мало, поэтому хочу привести примеры работы с ADODB из 1С в этой статье. Я не буду вдаваться в подробности технологии

Работа с ADODB производится через несколько объектов.

  • ADODB.Connection - объект производит подключение к источнику данных, а так же трансляцию команд и наборов данных
  • ADODB.RecordSet - Объект предоставляющий механизмы работы с набором данных, такие как получение, модификация, удаление или добавление данных.
  • ADODB.Command - Объект, так же предоставляющий механизмы работы с наборами данных, но, в отличие от RecordSet, не возвращает данные на клиента.

Перед тем как начать работать с данными из внешнего источника необходимо установить с ним связь, для этого вызывается функция Open объекта Connection, в единственный параметр этой функции передается строка ConnectionString с описанием параметров подключения. В этой статье используется источник данных Microsoft SQL server. Приведенные параметры ConnectionString используются для подключения к драйверу SQLOLEDB.1. Параметры для других источников данных соответственно другие.
Provider - Имя драйвера источника данных (к примеру SQLOLEDB.1 для MS SQL server)
Persist Security Info - необходимость использования шифрованого канала
User ID - Имя пользователя внешнего источника
Password - Пароль пользователя
Initial Catalog - Имя базы внешного источника
Data Source - Имя сервера


Подключение к серверу по технологии ADO

Попытка

ADOСоединение = Новый COMОбъект("ADODB.Connection");
ADOСоединение.Open("Provider=SQLOLEDB.1;
|Persist Security Info=False;
|User ID="
+Пользователь+";
|Password="
+ Пароль+";
|Initial Catalog="
+ База+";
|Data Source="
+ Сервер);

Возврат
ADOСоединение;

Исключение

КонецПопытки;

Открытие набора данных для всей таблицы. Этот вариант хорош тем, что есть возможность указания дополнительных параметров набора данных.

Сигнатура вызова такова RecordSet.Open(Источник, Соединение, ТипКурсора, ТипБлокировки, Параметры)

 

В приведенном ниже примере набор данных открывается с параметрами

  • Источник - "IMPORT_PRODUCTS"
  • Соединение - мADOСоединение
  • ТипКурсора - "0" (adOpenForwardOnly)
  • ТипБлокировки - "2" (adLockPessimistic)
  • Параметры - "2" (adCmdTable)
ADOНаборДанныхТовары  = Новый COMОбъект("ADODB.RecordSet");
ADOНаборДанныхТовары.Open("IMPORT_PRODUCTS", мADOСоединение, 0, 2, 2);

 

Открытие набора данных по запросу. В данном варианте получения набора данных использование дополнительных параметров вызывает исключения. Причину исключений я не выяснял, не было необходимости, так что если кто поэкспериментирует и выложит результаты - буду премного благодарен.

ТекстЗапросаТоваров  = "SELECT *
| FROM [IMPORT_PRODUCTS]
| where[orders_id] in (SELECT [orders_id] FROM [IMPORT_ORDERS] where (([orders_UUID] = '')
|or ([orders_UUID] = 'NULL') or([modified] = '1')))"
;
ADOНаборДанныхТовары = Новый COMОбъект("ADODB.RecordSet");
ADOНаборДанныхТовары .Open(ТекстЗапросаТоваров, мADOСоединение);

Для удобства работы с полученными данными я перегружаю данные в таблицы значений и затем помещаю их в менеджер виртуальных таблиц. В данном примере я особо не заморачивался с типом данных в колонках. Все колонки имеют тип строка, длинной 100 символов. Строго типизированные колонки нужны для передачи таблицы значений менеджер виртуальных таблиц. (Далее покажу пример работы с МВТ).

Создание полей в таблице значений.

КС  = Новый КвалификаторыСтроки(100);
Массив = Новый Массив;
Массив.Добавить(Тип("Строка"));
ОписаниеТиповС = Новый ОписаниеТипов(Массив, , КС);

//Циклом пробегаем по всем полям в наборе данных
//и создаем поля в таблице значений
КоличествоПолейТовары = ADOНаборДанныхТовары.Fields.Count - 1;
Для
ПолеСч = 0 по КоличествоПолейТовары Цикл
ТаблицаТоваров.Колонки.Добавить(ADOНаборДанныхТовары.Fields.item(ПолеСч).name, ОписаниеТиповС);
КонецЦикла;

Заполнение таблицы значений


//Заполнение полей "Товары"
Пока ADOНаборДанныхТовары.EOF = false Цикл
НоваяСтрока = ТаблицаТоваров.Добавить();
Для
ПолеСч = 0 по КоличествоПолейТовары Цикл
Поле = ADOНаборДанныхТовары.Fields.item(ПолеСч);
НоваяСтрока[Поле.name] = Поле.Value;
КонецЦикла;

//Переходим дальше
ADOНаборДанныхТовары.MoveNext();
КонецЦикла;

Продолжение

 

 

Добавить комментарий


Защитный код
Обновить

RU-CENTER. Регистрация доменов. Хостинг

Введите ваш Email:

Подписка предоставлена FeedBurner

 

 

 

 

 

 

 

 

Подписка на RSS
Закрыть вкладку