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












Загрузка информации в базу данных платформы 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 с таким содержимым:

 

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

 

 

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

29 Comments

  1. yandextesting

    Чего-то я не понял: на кой в данном случае вообще используется конвертация данных, если мы все равно все в коде ручками прописываем? Куда интересней и универсальней, на мой взляд, реализация отсюда — «Загрузка информации из внешних данных с помощью конфигурации «Конвертация данных» «

    Reply ↓
  2. comol

    Хорошая идея. Вроде и просто а не всегда в голову придёт.

    Reply ↓
  3. comol

    (1) там модификация КД, которая уже не актуальна ввиду развития самой КД. Здесь просто описание решения конкретной задачи штатными средствами.

    Reply ↓
  4. vahate

    очень интересует обработка для перехода (переноса) с Розница 1.0 для Украины (от российской почти ничем не отдичается) на Розница 2.0 для России.

    Reply ↓
  5. klel

    хорошая статейка в особенности внешние источники данных

    Reply ↓
  6. higs

    Довольно своеобразный подход к Конвертации данных, однако, имеет право на жизнь. Спасибо за альтернативную точку зрения!

    Reply ↓
  7. Трактор

    Это статья конкурса http://mg.spec8.ru/2012/10/06/competition-july2012/ На мой взгляд самая толковая статья из всех статей конкурса. Плюс от меня достался только двум статьям. Этой и про УРИБ

    Reply ↓
  8. zipik

    отлично!

    Reply ↓
  9. pt_olga

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

    Reply ↓
  10. Gawws

    Плюс здесь в том, что создаются с помощью КД правила конвертации данных. А для переноса используется универсальная загрузка данных из xml. Хорошая статья.

    Reply ↓
  11. Kamikadze

    Плюс за идею однознчно

    Reply ↓
  12. and_r

    Спасибо за статью, вроде все не сложно, но когда впервые сталкиваешься, убивается много времени, благодаря автору шишек набъется меньше 🙂

    Reply ↓
  13. EvgeniuXP

    Если честно, ничего не понял, где связь между внешними источниками и конвертацией даннных…. такое ощущение, что автор показал как подключаться через внешние источники и отдельно как перенести данные…. только откуда из дбф напрямую?… но в качестве источника ничего не указано…

    Reply ↓
  14. EvgeniuXP

    всё, отбой, не доглядел :-

    Reply ↓
  15. Йожкин Кот

    Я в своей разработке использую прослойку с виде подключаемой обработки, в которой реализованы методы подключения к внешним источникам и получения данных этих источников в виде ТЗ. Пользуюсь еще со времен 8.1, где объекта «Внешние источники данных» нет. Идею подсмотрел где-то на партнерском форуме.

    Событие перед обработкой получается примерно похожее:

    ОбработкаРаботаСВнешнимиДанными = ДопОбработки.РаботаСВнешнимиДанными;

    ОбработкаРаботаСВнешнимиДанными.ТекстЗапроса =

    »

    |SELECT

    |posts.code,

    |posts.name

    |

    |FROM [posts] as posts

    |»;

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

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

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

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

    ВходящиеДанные.Очистить();

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

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

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

    КонецЦикла;

    КонецЕсли;

    Reply ↓
  16. Новенький_2209

    (15) Йожкин Кот, хорошая идея! Надо будет попробовать.

    Reply ↓
  17. daho

    Ставлю плюс, автору спасибо!

    Reply ↓
  18. Franchiser

    Интересно, кто-нибудь проверял код работает? Обычно если источник пустой, нужно в любом случае указывать Значение= «1»; И еще КД запоминает выгруженные объекты и скорее всего нужно определять переменную «КлючВыгружаемыхданных», иначе может загрузиться, например, только 1 элемент.

    Reply ↓
  19. SergeMalikov

    Работает. В screenshot-ах результаты работы на реальных данных.

    Reply ↓
  20. kn

    Спасибо, было полезно познакомиться с такой возможностью

    Reply ↓
  21. AlexO

    Только на курсах обучают грузить DBF через КД.

    Да, кому ничего не понятно — то ну очень интересное решение 🙂

    Reply ↓
  22. MaxS

    Самому в голову приходило такая идея. Но некогда было её исследовать и тем более оформить как статью. 😉 +

    Reply ↓
  23. Spacer

    Что-то я попробовал подключиться через внешние источники данных к dbf файлам FoxPro,

    используя вашу строку подключения: «Driver={Microsoft dBASE Driver (*.dbf)};DriverID=277;Dbq=c:mydbpath;».

    Вроде подключилось, таблицы видит, а поля этих таблиц — нет.

    И про каждую таблицу пишет: «Необъектные данные». Не могу понять в чем дело…

    Reply ↓
  24. daho

    (18) Franchiser, А если источник ТЗ или структура?

    Reply ↓
  25. daho

    (21) AlexO, dbf потихоньку умирает…

    Reply ↓
  26. Franchiser

    (24) Что значит источник ТЗ или структура. Если из тз или из структуры требуется вытащить некое значение то нужно определять переменную КлючВыгружаемыхданных, т.к. это в другой объект тоже может быть передана эта же тз или структура и получится что проставится не то значение. Если же говорить о структуре ВходящиеДанные или ТЗ Выборка Данных тогда мы работаем уже не с самой ТЗ а со строкой ТЗ, не с самой структурой а значением из структуры, поэтому тут все хорошо.

    Reply ↓
  27. MaxS

    Если в КД программно выбираются данные, зачем промежуточное звено в виде 1С и внешнего источника данных? Причем в примере выше, DBF выгружается в ТЗ.

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

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

    Показать

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

    Задача усложняется, если в dbf хранится например строковое поле УИД (ссылка на справочник), ссылающееся на другой dbf (справочник).

    В КД нужно будет создать ПКО для заполнения реквизита, в этом случае ПВД не сработает, а данные из dbf получить как-то нужно. Т.е. читать dbf нужно в ПКО или ещё раньше…

    Reply ↓
  28. Dragga

    Молодец, хорошая реализация. Как пример к использованию

    Reply ↓
  29. ураниум

    как строку перенести в перечисление, справочник?

    Reply ↓

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *