Универсальный вариант XML-обмена данными для v8.1

Опубликовал Андрей Акулов (DrAku1a) в раздел Программирование - Практика программирования

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

При обмене допускается использовать только простые типы данных - текст, число, дата, булево. Никаких ссылок!

 
Суть метода при обмене 1С - 1С:

Выгрузка: данные предварительно нужно собрать в таблицу значений, например, с помощью запроса "Выбрать...". Затем таблицу значений записать в формате XML.

Загрузка: данные загружаются в таблицу значений, после этого можно работать уже с таблицей значений, а не с XML-файлом. Это проще и код будет более читабелен.


Суть метода при обмене Delphi - 1С:

Если вы занимаетесь задачей переписывания базы в 1С из другой учетной системы, может возникнуть необходимость переноса данных - при этом придется потратить время на разработку обработки обмена, отладку, возможно даже придется использовать сторонние разработки бррр... Или вызывать к 1С из внешней программы - но и тут в работе будет немало тонких моментов. Как вариант для разовой выгрузки-загрузки вполне сгодится XML. Но не спешите ваять "выгружалку" - возможно, Вам подойдет существующее решение.

Выгрузка: используем библиотеку компонентов Jedi - компонент JvgExportXML. Я выгружал данные из Firebird-базы и Access.

Сайт Delphi-Jedi

Загрузка: данные также загружаются в таблицу значений (той же функцией, что и при обмене 1С-1С). Формат обмена совместим с форматом экспорта от Jedi. После загрузки можно работать дальше уже с таблицей значений.

В прилагаемой обработке в основной форме есть процедура "ЗаписатьТаблицуXML(ИмяФайла, ТЗ, ИндикаторПроцесса=Неопределено)", которая соответственно названию, выгружает таблицу ТЗ в файл. Процедуру скопируйте в свою обработку и вызывайте при выгрузке данных. Функция "ПрочитатьТаблицуXML(ИмяФайла)" загружает таблицу и в случае успеха возвращает ее в качестве результата.

Сама обработка тоже пригодится - можно будет просмотреть содержимое выгруженных ранее таблиц.

Скачать файлы

Наименование Файл Версия Размер
ЧтениеТаблицыXML.epf
.epf 8,10Kb
09.01.11
621
.epf 8,10Kb 621 Скачать

См. также

Комментарии
1. Игорь Исхаков (Ish_2) 961 09.01.11 09:09 Сейчас в теме
1. В конфигурации-источнике Таблицу значений можно создать и записать ЗначениеВФайл(..).
2. В конфигурации-приемнике прочитать ЗначениеИзФайла().

А статья вообще о чём ?


2. Андрей Акулов (DrAku1a) 1187 09.01.11 13:21 Сейчас в теме
Ish_2 пишет:

1. В конфигурации-источнике Таблицу значений можно создать и записать ЗначениеВФайл(..).
2. В конфигурации-приемнике прочитать ЗначениеИзФайла().

А статья вообще о чём ?


Да, действительно. С помощью ЗначениеВФайл(..) можно и дерево значений выгружать и загружать... Выходит статья ниочем :|
Хотя все-же может пригодится тем, кто переносит данные не из 1С...
3. Ярослав Радкевич (WKBAPKA) 200 10.01.11 00:03 Сейчас в теме
ну разве что разобрать файл в дерево, полезно было бы для некоторых целей, и то, вроде такие разработки тут уже выкладывали... а так, не понятно, как можно древовидную структуру разложить в плоский список эффективно?!
4. Андрей Акулов (DrAku1a) 1187 10.01.11 08:15 Сейчас в теме
WKBAPKA пишет:
а так, не понятно, как можно древовидную структуру разложить в плоский список эффективно?!


В Delphi, да и в других БД для этих целей применяется два поля:
ID тип AutoInc (счётчик) - идентификатор строки,
RootID тип Integer (целочисленное 4 байта) - ссылка на родителя.
Можно еще добавить поле
Level тип число - уровень текущей записи, но Дельфисты это поле вычисляют во время выполнения.

У записей самого верхнего уровня RootID или не заполнено или установлено в -1. Автоинкрементные поля заполняются начиная с 0 или 1 - поэтому у таких записей "родителей" нет.
Такая структура удобна - берешь запись, читаешь ID и ищешь подчиненные по RootID. При построении дерева - то-же самое только в рекурсии...
Чтобы перенести элемент в другую группу достаточно изменить у него значение RootID.
Чтобы перенести группу со всеми подчиненными элементами - достаточно изменить RootID в строке, соответствующей группе.
Выходит, довольно удобная организация.

В нашем случае нужно добавлять два поля и пройтись по ним заполняя счетчиком. Попутно заполняя RootID у подчиненных значением Родитель.ID... Наверняка можно в запросе и что покрасивше придумать или еще как оптимизировать...
5. Ярослав Радкевич (WKBAPKA) 200 11.01.11 09:58 Сейчас в теме
работа с динамическими списками мне известна... ;) просто в чем смысл?