|
За все время работы с системой 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(); КонецЦикла;
Продолжение
|