Форум 1С
Программистам, бухгалтерам, администраторам, пользователям
Задай вопрос - получи решение проблемы
18 апр 2024, 07:11

Загрузка DBF

Автор Greiv, 17 фев 2015, 16:44

0 Пользователей и 1 гость просматривают эту тему.

Greiv

Приветствую. Есть файл dbf написал обработку для загрузки его в справочник всё нормально, но есть одна проблема, дело в том что в dbf есть ограничение по длине поля в 254 символа ну по крайней мере его нам так выгружают, и там есть строки которые не помещаются в 254 символа и соответственно он переносится на следующую строкуа мне нужно чтобы данная строка писалась в созданный элемент просто продолжением, а не новым элементом. В таблице есть 2 параметра 3 и 0 так вот если 3 то это новый элемент, а если 0 то это продолжение предидущего, вот только как это всё реализовать в цикле? Надеюсь понятно написал.

дфтын

Если параметр = 0 Тогда
Спр.реквизит = Спр.ревзизит + Дбф.поле;
иначе
Спр.Новый();
КонецЕслИ;
Помог? Нажми - Спасибо :)
skype: Soprov1C

Greiv

Цитата: дфтын от 17 фев 2015, 16:54
Если параметр = 0 Тогда
Спр.реквизит = Спр.ревзизит + Дбф.поле;
иначе
Спр.Новый();
КонецЕслИ;

Вот код не очень понимаю как правильно в него воткнуть это:
&НаСервере
Процедура ЗагрузитьДанныеНаСервере(СтруктураПараметров)

ФайлИмя = ПолучитьИмяВременногоФайла("dbf");
ДанныеХранилища = ПолучитьИзВременногоХранилища(СтруктураПараметров.АдресХранилища);
ДанныеХранилища.Записать(ФайлИмя);
Сообщить(ФайлИмя);
ПереименованыйДБ = "E:\Tmp\db.dbf";
    КопироватьФайл(ФайлИмя, ПереименованыйДБ);
    БазаДанных = Новый XBase;

БазаДанных.ОткрытьФайл(ПереименованыйДБ);

Если БазаДанных.Открыта()=Ложь Тогда
Сообщить("Не удалось открыть файл");
Возврат
КонецЕсли;
//БазаДанных.Первая();
ПовторяющеесяЧисло = БазаДанных.NUMBER;
Счетчик = 0;
Пока БазаДанных.Следующая() Цикл

Счетчик = Счетчик + 1;

СправочникиСоздатьЭл = Справочники.СписокТеррористов.СоздатьЭлемент();
СправочникиСоздатьЭл.Наименование = Счетчик;
СправочникиСоздатьЭл.ФИО = БазаДанных.NAMEU;
СправочникиСоздатьЭл.Описание= БазаДанных.DESCRIPT;
СправочникиСоздатьЭл.КодЦР= БазаДанных.KODCR;
СправочникиСоздатьЭл.КодЦН= БазаДанных.KODCN;
СправочникиСоздатьЭл.АдресМестаРегистрации= БазаДанных.AMR;
СправочникиСоздатьЭл.ФактическийАдрес= БазаДанных.ADRESS;
СправочникиСоздатьЭл.КодДокумента= БазаДанных.KD;
СправочникиСоздатьЭл.СерияДокумента= БазаДанных.SD;
СправочникиСоздатьЭл.НомерДокументаПаспорта= БазаДанных.RG;
СправочникиСоздатьЭл.НомерДокумента= БазаДанных.ND;
СправочникиСоздатьЭл.ВидДокумента= БазаДанных.VD;
СправочникиСоздатьЭл.ДатаРождения= БазаДанных.GR;
СправочникиСоздатьЭл.ГодРождения= БазаДанных.YR;
СправочникиСоздатьЭл.ДатаВнесения= БазаДанных.MR;
СправочникиСоздатьЭл.Директор= БазаДанных.DIRECTOR;
СправочникиСоздатьЭл.Учредитель= БазаДанных.FOUNDER;
//СправочникиСоздатьЭл.ИД= БазаДанных.ROW_ID;
СправочникиСоздатьЭл.ТипУгрозы= БазаДанных.TERRTYPE;
СправочникиСоздатьЭл.ДатаВнесения= БазаДанных.CB_DATE;
СправочникиСоздатьЭл.ДатаЦЕ= БазаДанных.CE_DATE;
Если БазаДанных.TU = 0 Тогда
СправочникиСоздатьЭл.ФИО = СправочникиСоздатьЭл.ФИО+БазаДанных.NAMEU;
СправочникиСоздатьЭл.Описание = СправочникиСоздатьЭл.Описание+БазаДанных.DESCRIPT;
СправочникиСоздатьЭл.Записать();
иначе
СправочникиСоздатьЭл.Записать(); 
КонецЕсли;


Сообщить("Обработано записей "+ Счетчик);

КонецЦикла;
БазаДанных.ЗакрытьФайл();


Сообщить("Загрузка завершена.");
КонецПроцедуры

Там получается что при 3 нужно создать новый элмент, а пока идут нули в таблице нужно писать в строки открытого нового элемента и лишь потом его записывать.

дфтын

Если БазаДанных.TU = 0 Тогда
    СправочникиСоздатьЭл.ФИО         =    СправочникиСоздатьЭл.ФИО+БазаДанных.NAMEU;
    СправочникиСоздатьЭл.Описание     =     СправочникиСоздатьЭл.Описание+БазаДанных.DESCRIPT;
    СправочникиСоздатьЭл.Записать();
   ПРодолжить;
    КонецЕсли;


перед
СправочникиСоздатьЭл = Справочники.СписокТеррористов.СоздатьЭлемент();   

Вместо:
  Если БазаДанных.TU = 0 Тогда
    СправочникиСоздатьЭл.ФИО         =    СправочникиСоздатьЭл.ФИО+БазаДанных.NAMEU;
    СправочникиСоздатьЭл.Описание     =     СправочникиСоздатьЭл.Описание+БазаДанных.DESCRIPT;
    СправочникиСоздатьЭл.Записать();
    иначе
    СправочникиСоздатьЭл.Записать(); 
    КонецЕсли;

просто:
СправочникиСоздатьЭл.Записать();
Помог? Нажми - Спасибо :)
skype: Soprov1C

Greiv

Цитата: дфтын от 17 фев 2015, 17:31
Если БазаДанных.TU = 0 Тогда
    СправочникиСоздатьЭл.ФИО         =    СправочникиСоздатьЭл.ФИО+БазаДанных.NAMEU;
    СправочникиСоздатьЭл.Описание     =     СправочникиСоздатьЭл.Описание+БазаДанных.DESCRIPT;
    СправочникиСоздатьЭл.Записать();
   ПРодолжить;
    КонецЕсли;



перед
СправочникиСоздатьЭл = Справочники.СписокТеррористов.СоздатьЭлемент();   

Вместо:
  Если БазаДанных.TU = 0 Тогда
    СправочникиСоздатьЭл.ФИО         =    СправочникиСоздатьЭл.ФИО+БазаДанных.NAMEU;
    СправочникиСоздатьЭл.Описание     =     СправочникиСоздатьЭл.Описание+БазаДанных.DESCRIPT;
    СправочникиСоздатьЭл.Записать();
    иначе
    СправочникиСоздатьЭл.Записать(); 
    КонецЕсли;

просто:
СправочникиСоздатьЭл.Записать();

Я не могу поставить условие до того как переменная СправочникиСоздатьЭл будет объявлена, даже если я ещё создаю в начале процедуры в виде Перем СправочникиСоздатьЭл; всё ровно у меня вываливается ошибка "Значение не является значением объектного типа (ФИО)", причем как ведёт себя переменная при объявлении её в таком виде тоже для меня пока загадка, так как в конце у меня всё ровно выполняется процедура Записать, то когда цикл перезапускается то элемент закрыт для записи я так понимаю.  Но всё ровно спасибо за помошь может просто я чего не понял.

дфтын

изучайте чему равно  БазаДанных.TU  и когда присваивается.
тут уже чистое программирование.
Помог? Нажми - Спасибо :)
skype: Soprov1C

Greiv

Вот так решил задачу, может кому пригодится.
&НаСервере
Процедура ЗагрузитьДанныеНаСервере(СтруктураПараметров)


ФайлИмя = ПолучитьИмяВременногоФайла("dbf");
ДанныеХранилища = ПолучитьИзВременногоХранилища(СтруктураПараметров.АдресХранилища);
ДанныеХранилища.Записать(ФайлИмя);
Сообщить(ФайлИмя);
ПереименованыйДБ = "E:\Tmp\db.dbf";
    КопироватьФайл(ФайлИмя, ПереименованыйДБ);
    БазаДанных = Новый XBase;

БазаДанных.ОткрытьФайл(ПереименованыйДБ);
БазаДанных.Кодировка = КодировкаXBase.OEM;
Если БазаДанных.Открыта()=Ложь Тогда
Сообщить("Не удалось открыть файл");
Возврат
КонецЕсли;

Счетчик = 0;
СправочникиСоздатьЭл = Справочники.СписокТеррористов.СоздатьЭлемент();
СправочникиСоздатьЭл.Наименование = Счетчик;
СправочникиСоздатьЭл.ФИО = БазаДанных.NAMEU;
СправочникиСоздатьЭл.Описание= БазаДанных.DESCRIPT;
СправочникиСоздатьЭл.КодЦР= БазаДанных.KODCR;
СправочникиСоздатьЭл.КодЦН= БазаДанных.KODCN;
СправочникиСоздатьЭл.АдресМестаРегистрации= БазаДанных.AMR;
СправочникиСоздатьЭл.ФактическийАдрес= БазаДанных.ADRESS;
СправочникиСоздатьЭл.КодДокумента= БазаДанных.KD;
СправочникиСоздатьЭл.СерияДокумента= БазаДанных.SD;
СправочникиСоздатьЭл.НомерДокументаПаспорта= БазаДанных.RG;
СправочникиСоздатьЭл.НомерДокумента= БазаДанных.ND;
СправочникиСоздатьЭл.ВидДокумента= БазаДанных.VD;
СправочникиСоздатьЭл.ДатаРождения= БазаДанных.GR;
СправочникиСоздатьЭл.ГодРождения= БазаДанных.YR;
СправочникиСоздатьЭл.ДатаВнесения= БазаДанных.MR;
СправочникиСоздатьЭл.Директор= БазаДанных.DIRECTOR;
СправочникиСоздатьЭл.Учредитель= БазаДанных.FOUNDER;
//СправочникиСоздатьЭл.ИД= БазаДанных.ROW_ID;
СправочникиСоздатьЭл.ТипУгрозы= БазаДанных.TERRTYPE;
СправочникиСоздатьЭл.ДатаВнесения= БазаДанных.CB_DATE;
СправочникиСоздатьЭл.ДатаЦЕ= БазаДанных.CE_DATE;
СправочникиСоздатьЭл.Записать();
Пока БазаДанных.Следующая() Цикл

Счетчик = Счетчик + 1;

Если БазаДанных.TU = 3 Тогда
СправочникиСоздатьЭл = Справочники.СписокТеррористов.СоздатьЭлемент();
ИначеЕсли БазаДанных.TU =0 тогда
    СправочникиСоздатьЭл.ФИО        = СправочникиСоздатьЭл.ФИО+" "+БазаДанных.NAMEU;
    СправочникиСоздатьЭл.Описание    = СправочникиСоздатьЭл.Описание+" "+БазаДанных.DESCRIPT;
    СправочникиСоздатьЭл.Записать();
    Продолжить;
иначе
Сообщить("БазаДанных.TU не равна не 0, не 3");
    КонецЕсли;

   

СправочникиСоздатьЭл.Наименование = Счетчик;
СправочникиСоздатьЭл.ФИО = БазаДанных.NAMEU;
СправочникиСоздатьЭл.Описание= БазаДанных.DESCRIPT;
СправочникиСоздатьЭл.КодЦР= БазаДанных.KODCR;
СправочникиСоздатьЭл.КодЦН= БазаДанных.KODCN;
СправочникиСоздатьЭл.АдресМестаРегистрации= БазаДанных.AMR;
СправочникиСоздатьЭл.ФактическийАдрес= БазаДанных.ADRESS;
СправочникиСоздатьЭл.КодДокумента= БазаДанных.KD;
СправочникиСоздатьЭл.СерияДокумента= БазаДанных.SD;
СправочникиСоздатьЭл.НомерДокументаПаспорта= БазаДанных.RG;
СправочникиСоздатьЭл.НомерДокумента= БазаДанных.ND;
СправочникиСоздатьЭл.ВидДокумента= БазаДанных.VD;
СправочникиСоздатьЭл.ДатаРождения= БазаДанных.GR;
СправочникиСоздатьЭл.ГодРождения= БазаДанных.YR;
СправочникиСоздатьЭл.ДатаВнесения= БазаДанных.MR;
СправочникиСоздатьЭл.Директор= БазаДанных.DIRECTOR;
СправочникиСоздатьЭл.Учредитель= БазаДанных.FOUNDER;
//СправочникиСоздатьЭл.ИД= БазаДанных.ROW_ID;
СправочникиСоздатьЭл.ТипУгрозы= БазаДанных.TERRTYPE;
СправочникиСоздатьЭл.ДатаВнесения= БазаДанных.CB_DATE;
СправочникиСоздатьЭл.ДатаЦЕ= БазаДанных.CE_DATE;
СправочникиСоздатьЭл.Записать();

Если Счетчик = 1000 Тогда
Сообщить("Обработано записей "+ Счетчик);
ИначеЕсли Счетчик = 2000 Тогда
Сообщить("Обработано записей "+ Счетчик);
ИначеЕсли Счетчик = 3000 Тогда
Сообщить("Обработано записей "+ Счетчик);
ИначеЕсли Счетчик = 4000 Тогда
Сообщить("Обработано записей "+ Счетчик);
ИначеЕсли Счетчик = 5000 Тогда
Сообщить("Обработано записей "+ Счетчик);
КонецЕсли;

КонецЦикла;
БазаДанных.ЗакрытьФайл();
Сообщить("Загрузка завершена.");
УдалитьИзВременногоХранилища(СтруктураПараметров.АдресХранилища);
УдалитьФайлы(ФайлИмя);
УдалитьФайлы("E:\Tmp\db.dbf");
КонецПроцедуры

Теги:

Похожие темы (5)

Рейтинг@Mail.ru

Поиск