Даный способ выгрузки разработан для заполнения таблиц оракл версии 11g. С помощью встроенного языка оракла достаточно просто перегнать передаваемые строки XML в таблицы. Пример в приложенной внешней обработке отправляет во внешнюю базу справочник номенклатуры, но он может быть легко модифицирован для любых табличных данных 1С. Для работы необходим настроенный доступ к серверу оракла.
Сначала в оракле необходимо создать таблицу для хранения наших данных. В нашем примере это STORAGE_TOVAR куда будем записывать код, наименование и артикул номенклатуры.
CREATE TABLE "USER_1C"."STORAGE_TOVAR"
( "NOMENKLATURA_CODE" VARCHAR2(11 BYTE) NOT NULL ENABLE,
"ARTIKUL" VARCHAR2(50 BYTE),
"NOMENKLATURA_NAME" VARCHAR2(100 BYTE) NOT NULL ENABLE,
CONSTRAINT "STORAGE_TOVAR_PK" PRIMARY KEY ("NOMENKLATURA_CODE")
)
Временную таблицу где будем разворачивать XML.
CREATE GLOBAL TEMPORARY TABLE "USER_1C"."TMP_TOVAR"
( "NOMENKLATURA_CODE" VARCHAR2(11 BYTE) NOT NULL ENABLE,
"ARTIKUL" VARCHAR2(50 BYTE),
"NOMENKLATURA_NAME" VARCHAR2(100 BYTE) NOT NULL ENABLE,
CONSTRAINT "TMP_TOVAR_PK" PRIMARY KEY ("NOMENKLATURA_CODE") ENABLE
) ON COMMIT DELETE ROWS ;
Далее в 1С формируем текст процедуры содержащей данные справочника.
ТекстЗапроса = "declare
| xml XMLType;
| type arr_type is table of XMLType
| index by binary_integer;
| arr arr_type;
| a binary_integer;
|begin
|
|" + ИтоговаяСтрока + "
|
|EXECUTE IMMEDIATE 'TRUNCATE TABLE tmp';
|
|a := arr.first;
|loop
| INSERT INTO tmp_tovar SELECT * FROM
| (WITH spisok_xml as(SELECT arr(a) xml from dual)
| SELECT extractValue(value(t1), 'b/v1') nomenklatura_code,
| extractValue(value(t1), 'b/v2') artikul,
| extractValue(value(t1), 'b/v3') nomenklatura_name
| FROM spisok_xml s, table(XMLSequence(s.xml.extract('a/b'))) t1);
|
| exit when a = arr.last;
| a := arr.next(a);
|end loop;
|
|MERGE INTO STORAGE_TOVAR D
| USING (SELECT * FROM tmp_tovar) S
| ON (D.nomenklatura_code = S.nomenklatura_code)
|WHEN MATCHED THEN
| UPDATE SET D.artikul = S.artikul, D.nomenklatura_name = S.nomenklatura_name
|WHEN NOT MATCHED THEN
| INSERT (D.nomenklatura_code, D.artikul, D.nomenklatura_name) VALUES (S.nomenklatura_code, S.artikul, S.nomenklatura_name);
|DELETE FROM STORAGE_TOVAR D
| WHERE NOT EXISTS (SELECT S.nomenklatura_code FROM tmp_tovar S WHERE D.nomenklatura_code = S.nomenklatura_code);
|
|COMMIT;
|
|end;";
Итоговая строка это массив данных в формате XML.
arr(1) := XMLType('<a><b><v1>ЦУ-00000053</v1><v2></v2><v3>Бутылка </v3></b><b><v1>ЦУ-00000054</v1><v2></v2><v3>Ящик </v3></b></a>');
arr(2) := XMLType('<a><b><v1>ЦУ-00000057</v1><v2>Л-90</v2><v3>Лимонад</v3></b><b><v1>ЦУ-00000058</v1><v2>Х-67891</v2><v3>Х-67891 1 Стинол 205 Завод бытовой техники</v3></b></a>');
arr(3) := XMLType('<a><b><v1>ЦУ-00000060</v1><v2></v2><v3>Пылесос Мобиль (Автомат) </v3></b><b><v1>ЦУ-00000061</v1><v2></v2><v3>Кофе-машина "Универсал"</v3></b></a>');
Отправляем процедуру на выполнение. Сначала информация загружается во временную таблицу, затем объединяется с основной таблицей.
Внешняя обработка тестировалась на конфигурации Управление небольшой фирмой (1.2.3.71) платформа 1С:Предприятие 8.3 (8.3.9.2309).