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 не будет опубликован. Обязательные поля помечены *