среда, 18 июля 2012 г.

Импорт данных из dbf, содержащего memo-поле

При переводе справочника из dbf в 1С возникла следующая проблема: компонент 1C не работает с memo-полями, и при импорте вышла соответствующая ошибка. Искал по инету, как можно эту ситуацию обойти или решить иначе. Оказалось, что с данной проблемой уже сталкивались, но решения не найдено.
Пробовал различные dbf-конвертеры и пакетные обработчики, но результата это не принесло.
Не опуская руки, я решил написать свой метод импорта dbf с memo-полем. В голову пришла самая простая идея: заменить memo-поле простым строковым полем длиной по 250 символов. В новом строковом поле вносятся последовательно куски текста из memo-поля. В этом случае каждая строка дублируется до тех пор, пока не закончится текст в memo-поле. И для того, чтобы потом возможно было собрать обратно полную строку memo-поля, необходимо добавить еще одно поле-счетчик частей строки.


Допустим, унас есть следующая таблица dbf1(cod C(4), memo1 memo):
dbf1
Cod Memo1
0005 Погрузка и реализация готовой продукции, процессы производства и переоснащение.
0009 Накланая на сдачу готовой продукции подана в плановый экономический отдел технологии нормирования и оплаты труда.

Создадим с помощью Visual FoxPro другую таблицу dbf2((cod C(4), N N(5), Ch C(250)):
dbf2
cod N Ch
и с помощью FoxPro заполним таблицу dbf2 следующим способом:
USE "DBF1.dbf" ALIAS dbf1 in 0
use dbf2.dbf alias dbf2 in 0
local cm &&для занесения текста из мемо-поля
local nrec &&для количества строк, на которые разбито мемо-поле
local i &&счетчик строк
select dbf1
go top
scan
    cm=dbf1.memo1
    nrec=len(cm)/250
    for i=1 to nrec
        select dbf2
        append blank
        replace dbf2.cod with dbf1.cod
        replace dbf2.N with i
        replace dbf2.Ch with left(cm, 250)
        cm=substr(dbf1.dop, i*250, 250)
    endfor
endscan
Допустим, в строке с кодом 0005 мемо-поле разделилось 3 раза, а с кодом 0009 — 5 раз. В результате получаем следующие данные:
dbf2
cod N Ch
0005 1 Погрузка и реализац
0005 2 Готовой продукции и
0005 3 переоснащение.
0009 1 Накладная на сдачу
0009 2 Готовой продукции
0009 3 Подана в плановый э
0009 4 Отдел технологии н
0009 5 И оплаты труда.

Теперь таблица dbf2 легко импортируется в 1С. Проделаем это с помощью epf.

Далее в конфигураторе 1С создаем подобный тестовый справочник с такими же полями:

Запускаем конфигурацию и открываем дополнение для загрузки данных из табличного документа «ЗагрузкаДанныхИзТабличногоДокумента.epf»

После открытия epf-файла в открывшемся окне нажимаем кнопку-значок «Открыть файл».
Нажимаем кнопку "Загрузить" и дожидаемся конца загрузки.
Итак, дело импорта выполнено. Осталось собрать исходные строки в прежнее состояние, для этого создаем обработку либо кнопку в любой форме и пишем следующий 1с-код:
спр=справочники.тестТехника.Выбрать();
    с1с=справочники.АвтотракторнаяТехника.Выбрать();
    пока с1с.Следующий()=Истина цикл
        с1с.num=0;         
    конеццикла; 
    пока спр.Следующий()=Истина цикл
        ф1=0;
        пока с1с.Следующий()=Истина цикл
            если (с1с.код = спр.код) и (с1с.наименование = спр.наименование) и (спр.num-1=с1с.num)  тогда
                доп1=сокрлп(с1с.dop);
                с1с.dop=доп1+спр.ch;
                   с1с.num=спр.num;
                   ф1=1;
            конецесли;            
        конеццикла;
        если ф1=0 тогда
            н=справочники.АвтотракторнаяТехника.СоздатьЭлемент();
            н.код=спр.код;
            н.наименование=спр.наименование;
            н.dop=спр.ch;
            н.num=спр.num;
            н.Записать();
        конецесли;
    конеццикла;
    сообщить("готово");

После отработки обработки или кнопки данные соберутся в исходное состояние, которое было в таблице dbf1, и запишутся в справочник "АвтотракторнаяТехника".
Цель достигнута.

Комментариев нет:

Отправить комментарий