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) там модификация КД, которая уже не актуальна ввиду развития самой КД. Здесь просто описание решения конкретной задачи штатными средствами.
очень интересует обработка для перехода (переноса) с Розница 1.0 для Украины (от российской почти ничем не отдичается) на Розница 2.0 для России.
хорошая статейка в особенности внешние источники данных
Довольно своеобразный подход к Конвертации данных, однако, имеет право на жизнь. Спасибо за альтернативную точку зрения!
Это статья конкурсаhttp://mg.spec8.ru/2012/10/06/competition-july2012/ На мой взгляд самая толковая статья из всех статей конкурса. Плюс от меня достался только двум статьям. Этой и про УРИБ
отлично!
я бы конечно таким путем не пошла, т.к. к DBF таблицам можно обращаться и напрямую без бубна конвертации, автор использует достаточно креативный подход, за что ему плюс 🙂
Плюс здесь в том, что создаются с помощью КД правила конвертации данных. А для переноса используется универсальная загрузка данных из xml. Хорошая статья.
Плюс за идею однознчно
Спасибо за статью, вроде все не сложно, но когда впервые сталкиваешься, убивается много времени, благодаря автору шишек набъется меньше 🙂
Если честно, ничего не понял, где связь между внешними источниками и конвертацией даннных…. такое ощущение, что автор показал как подключаться через внешние источники и отдельно как перенести данные…. только откуда из дбф напрямую?… но в качестве источника ничего не указано…
всё, отбой, не доглядел :-
Я в своей разработке использую прослойку с виде подключаемой обработки, в которой реализованы методы подключения к внешним источникам и получения данных этих источников в виде ТЗ. Пользуюсь еще со времен 8.1, где объекта «Внешние источники данных» нет. Идею подсмотрел где-то на партнерском форуме.
Событие перед обработкой получается примерно похожее:
ОбработкаРаботаСВнешнимиДанными = ДопОбработки.РаботаСВнешнимиДанными;
ОбработкаРаботаСВнешнимиДанными.ТекстЗапроса =
»
|SELECT
|posts.code,
|posts.name
|
|FROM [posts] as posts
|»;
Если ОбработкаРаботаСВнешнимиДанными.ВыполнитьЗапрос() Тогда
ВходящиеДанные = Новый Структура;
Таблица = ОбработкаРаботаСВнешнимиДанными.Таблица.Скопировать();
Для каждого СтрокаТаблицы Из Таблица Цикл
ВходящиеДанные.Очистить();
ВходящиеДанные.Вставить(«Код», СокрЛП(СтрокаТаблицы.code));
ВходящиеДанные.Вставить(«Наименование», СокрЛП(СтрокаТаблицы.name));
ВыгрузитьПоПравилу(,, ВходящиеДанные,, «ДолжностиОрганизаций»);
КонецЦикла;
КонецЕсли;
(15) Йожкин Кот, хорошая идея! Надо будет попробовать.
Ставлю плюс, автору спасибо!
Интересно, кто-нибудь проверял код работает? Обычно если источник пустой, нужно в любом случае указывать Значение= «1»; И еще КД запоминает выгруженные объекты и скорее всего нужно определять переменную «КлючВыгружаемыхданных», иначе может загрузиться, например, только 1 элемент.
Работает. В screenshot-ах результаты работы на реальных данных.
Спасибо, было полезно познакомиться с такой возможностью
Только на курсах обучают грузить DBF через КД.
Да, кому ничего не понятно — то ну очень интересное решение 🙂
Самому в голову приходило такая идея. Но некогда было её исследовать и тем более оформить как статью. 😉 +
Что-то я попробовал подключиться через внешние источники данных к dbf файлам FoxPro,
используя вашу строку подключения: «Driver={Microsoft dBASE Driver (*.dbf)};DriverID=277;Dbq=c:mydbpath;».
Вроде подключилось, таблицы видит, а поля этих таблиц — нет.
И про каждую таблицу пишет: «Необъектные данные». Не могу понять в чем дело…
(18) Franchiser, А если источник ТЗ или структура?
(21) AlexO, dbf потихоньку умирает…
(24) Что значит источник ТЗ или структура. Если из тз или из структуры требуется вытащить некое значение то нужно определять переменную КлючВыгружаемыхданных, т.к. это в другой объект тоже может быть передана эта же тз или структура и получится что проставится не то значение. Если же говорить о структуре ВходящиеДанные или ТЗ Выборка Данных тогда мы работаем уже не с самой ТЗ а со строкой ТЗ, не с самой структурой а значением из структуры, поэтому тут все хорошо.
Если в КД программно выбираются данные, зачем промежуточное звено в виде 1С и внешнего источника данных? Причем в примере выше, DBF выгружается в ТЗ.
С таким же успехом можно было в ПВД бы сделать так:
Показать
В этом варианте если dbf файл огромный, мы читаем его последовательно, а не выгружаем целиком в таблицу значений.
Задача усложняется, если в dbf хранится например строковое поле УИД (ссылка на справочник), ссылающееся на другой dbf (справочник).
В КД нужно будет создать ПКО для заполнения реквизита, в этом случае ПВД не сработает, а данные из dbf получить как-то нужно. Т.е. читать dbf нужно в ПКО или ещё раньше…
Молодец, хорошая реализация. Как пример к использованию
как строку перенести в перечисление, справочник?