При переводе справочника из dbf в 1С возникла следующая проблема:
компонент 1C не работает с memo-полями, и при импорте вышла
соответствующая ошибка. Искал по инету, как можно эту ситуацию обойти
или решить иначе. Оказалось, что с данной проблемой уже сталкивались, но
решения не найдено.
Пробовал различные dbf-конвертеры и пакетные обработчики, но результата это не принесло.
Не опуская руки, я решил написать свой метод импорта dbf с memo-полем. В голову пришла самая простая идея: заменить memo-поле простым строковым полем длиной по 250 символов. В новом строковом поле вносятся последовательно куски текста из memo-поля. В этом случае каждая строка дублируется до тех пор, пока не закончится текст в memo-поле. И для того, чтобы потом возможно было собрать обратно полную строку memo-поля, необходимо добавить еще одно поле-счетчик частей строки.
Допустим, унас есть следующая таблица dbf1(cod C(4), memo1 memo):
Создадим с помощью Visual FoxPro другую таблицу dbf2((cod C(4), N N(5), Ch C(250)):
и с помощью 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 легко импортируется в 1С. Проделаем это с помощью epf.
спр=справочники.тестТехника.Выбрать();
с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, и запишутся в справочник "АвтотракторнаяТехника".
Цель достигнута.
Пробовал различные 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 |
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с.Следующий()=Истина цикл
с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, и запишутся в справочник "АвтотракторнаяТехника".
Цель достигнута.
Комментариев нет:
Отправить комментарий