gifts2017

1С Конвертация, использование внешнего источника данных

Опубликовал Сергей Маликов (SergeMalikov) в раздел Обмен - Обмен с другими системами

Загрузка информации в базу данных платформы 1С 8.2 из внешних источников с помощью "Конвертации данных"

1С Конвертация, использование внешнего источника данных.

В процессе работы возникла потребность перенести информационную базу из древней программы, написанной еще на foxpro, на платформу 1С 8.2

Решил воспользоваться конфигурацией «Конвертация данных» и возможностью подключения к внешнему источнику данных платформы 1С 8.2.

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

 

Создал новый источник данных, обозвал его подходящим именем.  На вкладке «Данные» нажал кнопку «Добавить». В открывшемся конструкторе выбрал вариант «Выбрать из списка таблиц внешнего источника данных».

 

Открывшаяся форма потребовала ввести строку соединения с источником данных. Для меня строки соединения как шаманские заклинания. Погуглив маленько, я нарыл несколько вариантов строк соединения. Мне подошла строка:

Driver={Microsoft dBASE Driver (*.dbf)};DriverID=277;Dbq=c:\mydbpath;

Заменив в ней «Dbq=c:\mydbpath» на путь к моей локальной базе и нажав ОК, получил список таблиц:

 

Выбрал таблицу, к которой нужно подключиться и нажал ОК.

В результате во внешнем источнике данных сформировалась таблица KVART.

 

Для проверки возможности выборки информации из этой таблицы написал обработку Test01.

Модуль формы обработки:

&НаКлиенте
Процедура Загрузить(Команда)
    ЗагрузитьНаСервере();
КонецПроцедуры

&НаСервере
Процедура ЗагрузитьНаСервере()
    ПараметрыСоединения = Новый ПараметрыСоединенияВнешнегоИсточникаДанных;
    ПараметрыСоединения.СтрокаСоединения="Driver={Microsoft dBASE Driver (*.dbf)};DriverID=277;Dbq=d:\79;";
    ВнешниеИсточникиДанных.KV.УстановитьОбщиеПараметрыСоединения(ПараметрыСоединения);
    ВнешниеИсточникиДанных.KV.УстановитьСоединение();
    Запрос = Новый Запрос;
    Запрос.Текст = "ВЫБРАТЬ
                   |    KVART.KOD,
                   |    KVART.FIO,
                   |    KVART.SEMJA,
                   |    KVART.POLPLO,
                   |    KVART.LLIFT,
                   |    KVART.LZNAL
                   |ИЗ
                   |    ВнешнийИсточникДанных.KV.Таблица.KVART КАК KVART";
    тз = Запрос.Выполнить().Выгрузить();
КонецПроцедуры

С помощью отладчика можно просмотреть содержимое таблицы значений:

 

 

 

Все ОК. Информация присутствует.

На втором этапе необходимо загрузить информацию из внешней таблицы в соответствующий объект конфигурации.

Для этого использую конфигурацию «Конвертация данных».

В качестве источника и приемника данных будет использоваться одна конфигурация.  

Для начала создадим справочник, в который будем загружать информацию. Назовем его «ЛицевыеСчета».

 

С помощью соответствующей обработки конфигурации «Конвертация данных» выгрузим структуру метаданных нашей конфигурации. Зарегистрируем нашу конфигурацию в списке конфигураций. Далее необходимо настроить правила обмена.  Для реализации механизма выгрузки информации из внешнего источника создадим «правило выгрузки данных».

 

В событии «Перед обработкой»  разместим запрос к внешнему источнику данных и обработаем результат.

Текст обработчика:

 ПараметрыСоединения = Новый ПараметрыСоединенияВнешнегоИсточникаДанных;
 ПараметрыСоединения.СтрокаСоединения="Driver={Microsoft dBASE Driver (*.dbf)};DriverID=277;Dbq=d:\79;";
 ВнешниеИсточникиДанных.KV.УстановитьОбщиеПараметрыСоединения(ПараметрыСоединения);
 ВнешниеИсточникиДанных.KV.УстановитьСоединение();
 Запрос = Новый Запрос;
 Запрос.Текст = "ВЫБРАТЬ
                |    KVART.KOD КАК КОД,
                |    KVART.FIO КАК ФИО,
                |    KVART.SEMJA КАК СЕМЬЯ,
                |    KVART.POLPLO КАК ПЛОЩАДЬОБЩАЯ
                |ИЗ
                |    ВнешнийИсточникДанных.KV.Таблица.KVART КАК KVART";
 Результат = Запрос.Выполнить();
 Строки = Результат.Выгрузить();
 Для Каждого строка из Строки Цикл
     ИсходящиеДанные = Новый Структура("КОД,ФИО,СЕМЬЯ,ПЛОЩАДЬОБЩАЯ");
     ИсходящиеДанные.КОД = Строка.КОД;
     ИсходящиеДанные.ФИО = Строка.ФИО;
     ИсходящиеДанные.СЕМЬЯ = Строка.СЕМЬЯ;
     ИсходящиеДанные.ПЛОЩАДЬОБЩАЯ = Строка.ПЛОЩАДЬОБЩАЯ;
     ВыгрузитьПоПравилу(,,ИсходящиеДанные,,"ЛицевыеСчета");
 КонецЦикла;

Создадим «Правило конвертации объектов» для справочника «Лицевые счета». 

 

 Реквизит «Источник» не заполняем. Правила конвертации свойств будут выглядеть следующим образом:

 

 Сохраняем правила и выгружаем информацию. В результате формируется файл Данные.XML с таким содержимым:

 

 С помощью обработки загрузки данных загружаем информацию в приемник:

 

 

Задача выполнена.

См. также

Подписаться Добавить вознаграждение

Комментарии

1. Максим Полянский (yandextesting) 26.09.12 14:47
Чего-то я не понял: на кой в данном случае вообще используется конвертация данных, если мы все равно все в коде ручками прописываем? Куда интересней и универсальней, на мой взляд, реализация отсюда - "Загрузка информации из внешних данных с помощью конфигурации "Конвертация данных" "
daho; maXon777; +2 Ответить 1
2. Олег Филиппов (comol) 02.10.12 08:57
Хорошая идея. Вроде и просто а не всегда в голову придёт.
3. Олег Филиппов (comol) 02.10.12 08:58
(1) yandextesting, там модификация КД, которая уже не актуальна ввиду развития самой КД. Здесь просто описание решения конкретной задачи штатными средствами.
4. vadim ttv ttv (vahate) 04.10.12 12:26
очень интересует обработка для перехода (переноса) с Розница 1.0 для Украины (от российской почти ничем не отдичается) на Розница 2.0 для России.
5. Dimon (klel) 11.10.12 07:36
хорошая статейка в особенности внешние источники данных
6. Александр Удалов (higs) 11.10.12 10:23
Довольно своеобразный подход к Конвертации данных, однако, имеет право на жизнь. Спасибо за альтернативную точку зрения!
7. Трактор Трактор (Трактор) 11.10.12 10:23
Это статья конкурса http://mg.spec8.ru/2012/10/06/competition-july2012/ На мой взгляд самая толковая статья из всех статей конкурса. Плюс от меня достался только двум статьям. Этой и про УРИБ
8. Viktor Kupko (zipik) 11.10.12 12:42
9. olga pt (pt_olga) 11.10.12 17:27
я бы конечно таким путем не пошла, т.к. к DBF таблицам можно обращаться и напрямую без бубна конвертации, автор использует достаточно креативный подход, за что ему плюс :)
10. Valery Gagarkin (Gawws) 11.10.12 20:23
Плюс здесь в том, что создаются с помощью КД правила конвертации данных. А для переноса используется универсальная загрузка данных из xml. Хорошая статья.
11. Игорь Дзеса (Kamikadze) 11.10.12 21:48
12. Андрей Романовский (and_r) 12.10.12 05:38
Спасибо за статью, вроде все не сложно, но когда впервые сталкиваешься, убивается много времени, благодаря автору шишек набъется меньше :-)
13. EvgeniuXP EvgeniuXP (EvgeniuXP) 12.10.12 20:17
Если честно, ничего не понял, где связь между внешними источниками и конвертацией даннных.... такое ощущение, что автор показал как подключаться через внешние источники и отдельно как перенести данные.... только откуда из дбф напрямую?... но в качестве источника ничего не указано...
14. EvgeniuXP EvgeniuXP (EvgeniuXP) 12.10.12 20:19
всё, отбой, не доглядел :-\
15. Артем Бардюг (Йожкин Кот) 17.10.12 17:16
Я в своей разработке использую прослойку с виде подключаемой обработки, в которой реализованы методы подключения к внешним источникам и получения данных этих источников в виде ТЗ. Пользуюсь еще со времен 8.1, где объекта "Внешние источники данных" нет. Идею подсмотрел где-то на партнерском форуме.
Событие перед обработкой получается примерно похожее:
ОбработкаРаботаСВнешнимиДанными = ДопОбработки.РаботаСВнешнимиДанными;

ОбработкаРаботаСВнешнимиДанными.ТекстЗапроса =
"
|SELECT
|posts.code,
|posts.name
|
|FROM [posts] as posts
|";

Если ОбработкаРаботаСВнешнимиДанными.ВыполнитьЗапрос() Тогда

ВходящиеДанные = Новый Структура;

Таблица = ОбработкаРаботаСВнешнимиДанными.Таблица.Скопировать();

Для каждого СтрокаТаблицы Из Таблица Цикл

ВходящиеДанные.Очистить();
ВходящиеДанные.Вставить("Код", СокрЛП(СтрокаТаблицы.code));
ВходящиеДанные.Вставить("Наименование", СокрЛП(СтрокаТаблицы.name));

ВыгрузитьПоПравилу(,, ВходящиеДанные,, "ДолжностиОрганизаций");

КонецЦикла;

КонецЕсли;
daho; Новенький_2209; +2 Ответить 1
16. Игорь Хитров (Новенький_2209) 04.11.12 00:06
(15) Йожкин Кот, хорошая идея! Надо будет попробовать.
17. Dmitriy (daho) 06.11.12 14:57
Ставлю плюс, автору спасибо!
18. Franchiser (Franchiser) 26.11.12 12:21
Интересно, кто-нибудь проверял код работает? Обычно если источник пустой, нужно в любом случае указывать Значение= "1"; И еще КД запоминает выгруженные объекты и скорее всего нужно определять переменную "КлючВыгружаемыхданных", иначе может загрузиться, например, только 1 элемент.
19. Сергей Маликов (SergeMalikov) 27.11.12 15:24
Работает. В screenshot-ах результаты работы на реальных данных.
20. Ольга Немешева (kn) 12.12.12 12:14
Спасибо, было полезно познакомиться с такой возможностью
21. Алекс Ю (AlexO) 18.01.13 14:16
Только на курсах обучают грузить DBF через КД.
Да, кому ничего не понятно - то ну очень интересное решение :)
22. Максим Сухов (MaxS) 13.04.13 00:27
Самому в голову приходило такая идея. Но некогда было её исследовать и тем более оформить как статью. ;) +
23. Владимир Насыров (Spacer) 01.05.13 23:25
Что-то я попробовал подключиться через внешние источники данных к dbf файлам FoxPro,
используя вашу строку подключения: "Driver={Microsoft dBASE Driver (*.dbf)};DriverID=277;Dbq=c:\mydbpath;".
Вроде подключилось, таблицы видит, а поля этих таблиц - нет.
И про каждую таблицу пишет: "Необъектные данные". Не могу понять в чем дело...
24. Dmitriy (daho) 23.05.13 11:31
(18) Franchiser, А если источник ТЗ или структура?
25. Dmitriy (daho) 23.05.13 11:33
(21) AlexO, dbf потихоньку умирает...
26. Franchiser (Franchiser) 23.05.13 14:09
(24) Что значит источник ТЗ или структура. Если из тз или из структуры требуется вытащить некое значение то нужно определять переменную КлючВыгружаемыхданных, т.к. это в другой объект тоже может быть передана эта же тз или структура и получится что проставится не то значение. Если же говорить о структуре ВходящиеДанные или ТЗ Выборка Данных тогда мы работаем уже не с самой ТЗ а со строкой ТЗ, не с самой структурой а значением из структуры, поэтому тут все хорошо.
27. Максим Сухов (MaxS) 13.09.13 07:22
Если в КД программно выбираются данные, зачем промежуточное звено в виде 1С и внешнего источника данных? Причем в примере выше, DBF выгружается в ТЗ.

С таким же успехом можно было в ПВД бы сделать так:

ДБФ = Новый XBase(ПолноеИмя,ИмяФайлаИндекса,Истина);

ДБФ.Первая();
  Пока НЕ ДБФ.ВКонце() Цикл
  ИсходящиеДанные = Новый Структура("КОД,ФИО,СЕМЬЯ,ПЛОЩАДЬОБЩАЯ");
  ИсходящиеДанные.КОД = ДБФ.ПолучитьЗначениеПоля("КОД");
  //...
  ВыгрузитьПоПравилу(,,ИсходящиеДанные,,"ЛицевыеСчета");
КонецЦикла;
...Показать Скрыть


В этом варианте если dbf файл огромный, мы читаем его последовательно, а не выгружаем целиком в таблицу значений.

Задача усложняется, если в dbf хранится например строковое поле УИД (ссылка на справочник), ссылающееся на другой dbf (справочник).
В КД нужно будет создать ПКО для заполнения реквизита, в этом случае ПВД не сработает, а данные из dbf получить как-то нужно. Т.е. читать dbf нужно в ПКО или ещё раньше...
28. Александр Алекс (Dragga) 17.02.14 01:22
Молодец, хорошая реализация. Как пример к использованию
29. ураниум (ураниум) 11.07.16 18:12
как строку перенести в перечисление, справочник?
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа