Загрузка данных из DBF в справочник!

1. JLaikova 19.02.19 13:26 Сейчас в теме
Док = ПолучитьИзВременногоХранилища(Хранение); 
ВрФайл = ПолучитьИмяВременногоФайла("dbf"); 
Док.Записать(ВрФайл); 
	//Файл = Новый Файл(ИмяФайла);
	Если ЭтоАдресВременногоХранилища(Хранение) Тогда
		ИмяВременногоФайла = ПолучитьИмяВременногоФайла("dbf");
		ДвоичныеДанные = ПолучитьИзВременногоХранилища(Хранение);
		ДвоичныеДанные.Записать(ИмяВременногоФайла);
		РабФайл = Новый Файл(ИмяВременногоФайла);
		ВременныеФайлы.Добавить(ИмяВременногоФайла);
	Иначе
		РабФайл = ВрФайл;
	КонецЕсли;

    //Получаем первые 8-мь симовол имени нашего исходного файла
    НашеИмяФайла = Лев(РабФайл.ИмяБезРасширения,8)+".dbf";

    //Копируем наш исходный файл во временный каталог с нормальным именем
    НашПолныйПутьФайла = КаталогВременныхФайлов()+НашеИмяФайла;
    КопироватьФайл( ВрФайл,НашПолныйПутьФайла);
	Сообщить (НашПолныйПутьФайла);
				База = Новый XBase;
		
				База.Кодировка=КодировкаXBase.OEM;
				База.ОткрытьФайл(НашПолныйПутьФайла);
				Если База.Открыта()=Ложь Тогда
					Возврат;
				КонецЕсли;
								
				База.ОтображатьУдаленные=Ложь;
				Записей=База.КоличествоЗаписей();
				Для й=1 По Записей Цикл
					База.Перейти(й);
					Код 			= СокрЛП(База.LS);
					Наименование 	= СокрЛП(База.FIO);
					Город			= СокрЛП(База.NPUNKT);
					Улица 			= СокрЛП(База.UL);
					Дом 			= СокрЛП(База.NDOM);
					Владелец 		= СокрЛП(База.POD);
					Квартира 		= СокрЛП(База.NKVAR);	

					НовыйДокумент = Справочники.ЛицевыеСчета.СоздатьЭлемент();
					
					МассивОснований = Новый Массив;
					МассивОснований.Добавить(НовыйДокумент.Ссылка);

					
					СтрокаТаблицыДок="";
					ПараметрыОтбора = Новый Структура;
					ПараметрыОтбора.Вставить("Наименование",Справочники.ЛицевыеСчета.НайтиПоКоду(Код));
					
					Наименование=Справочники.ЛицевыеСчета.НайтиПоКоду(Код);
                     НайденныеСтроки = НовыйДокумент.Наименование;
						НовыйДокумент.Владелец 							= Владелец;
						НовыйДокумент.Код			 					= Код;
						НовыйДокумент.Наименование 						= СокрЛП(База.FIO);
						
						 						
					//	НомерДокПров=НомерДок;
					НовыйДокумент.Записать();
				КонецЦикла;
			    УдалитьФайлы(ВрФайл);
Показать


Добрый день! Имеется конфа, необходимо загрузить данные из .dbf в поле наименование. Элементы справочника заведены. Синхронизация планируется по полю Код. Выходит ошибка - Значение поля "Владелец" не заполнено или заполнено неверно! Поле владелец заполнено.
По теме из базы знаний
Найденные решения
11. JLaikova 20.02.19 09:15 Сейчас в теме
Нашла верное решение.) Всем спасибо! Решила выложить фрагмент кода. Вдруг кому пригодится.

НашПолныйПутьФайла = КаталогВременныхФайлов()+НашеИмяФайла;
    КопироватьФайл( ВрФайл,НашПолныйПутьФайла);
	Сообщить (НашПолныйПутьФайла);
				База = Новый XBase;
		
				База.Кодировка=КодировкаXBase.OEM;
				База.ОткрытьФайл(НашПолныйПутьФайла);
				Если База.Открыта()=Ложь Тогда
					Возврат;
				КонецЕсли;
								
				База.ОтображатьУдаленные=Ложь;
				Записей=База.КоличествоЗаписей();
				
				Для й=1 По Записей Цикл
					База.Перейти(й);
					Код 			= СокрЛП(База.LS);
				//	Наим            = СтрЗаменить(СокрЛП(База.FIO),"","");
					Стр = Справочники.ЛицевыеСчета.НайтиПоКоду(Код);
					
									
				НовыйДокумент = Стр.ПолучитьОбъект();
				
				Если  Стр.Пустая()Тогда
					Сообщить("Пусто!");
					Иначе
											
					НовыйДокумент.Наименование = База.FIO;
					НовыйДокумент.Записать();
					
					Сообщить ("Запись обновлена"); 
					КонецЕсли;
				
				КонецЦикла;
			    УдалитьФайлы(ВрФайл);
		        База.ЗакрытьФайл();
Показать
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. t.v.s. 111 19.02.19 13:30 Сейчас в теме
Потому что владелец это СправочникСсылка, а вы в него строку пихаете. Найдите владельца через НайтиПоКоду
3. lexin1976 13 19.02.19 13:38 Сейчас в теме
Владелец = СокрЛП(База.POD);
Квартира = СокрЛП(База.NKVAR);	

НовыйДокумент = Справочники.ЛицевыеСчета.СоздатьЭлемент(); 

МассивОснований = Новый Массив; 
МассивОснований.Добавить(НовыйДокумент.Ссылка); 


СтрокаТаблицыДок=""; 
ПараметрыОтбора = Новый Структура; 
ПараметрыОтбора.Вставить("Наименование",Справочники.ЛицевыеСчета.НайтиПоКоду(Код)); 

Наименование=Справочники.ЛицевыеСчета.НайтиПоКоду(Код); 
НайденныеСтроки = НовыйДокумент.Наименование; 
Показать

НовыйДокумент.Владелец = Владелец;

Владелец в данном коде это строка. А должна быть Ссылка.
4. lexin1976 13 19.02.19 13:41 Сейчас в теме
и еще
У Вас Наименование как переменная переопределяется в коде несколько раз.
Вы потом запутаетесь или вообще ошибка будет.
5. JLaikova 19.02.19 13:48 Сейчас в теме
(4) Спасибо. Владельца убрала, это заполненный элемент. Теперь на метод Записать() ругается((

Для й=1 По Записей Цикл
					База.Перейти(й);
					Код 			= СокрЛП(База.LS);
					Наим		 	= СокрЛП(База.FIO);
					Город			= СокрЛП(База.NPUNKT);
					Улица 			= СокрЛП(База.UL);
					Дом 			= СокрЛП(База.NDOM);
					//Владелец 		= СокрЛП(База.POD);
					Квартира 		= СокрЛП(База.NKVAR);	

					НовыйДокумент = Справочники.ЛицевыеСчета.Выбрать(Код);
					
					МассивОснований = Новый Массив;
					МассивОснований.Добавить(НовыйДокумент.Ссылка);

					
					СтрокаТаблицыДок="";
					ПараметрыОтбора = Новый Структура;
					ПараметрыОтбора.Вставить("Наименование",Справочники.ЛицевыеСчета.НайтиПоКоду(Код));
					
					Наименование=Справочники.ЛицевыеСчета.НайтиПоКоду(Код);
					
					Пока НовыйДокумент.Следующий() Цикл
						
						Наим = НовыйДокумент.Наименование;
						НовыйДокумент.Записать();
					КонецЦикла;
				КонецЦикла;
			    УдалитьФайлы(ВрФайл);
		        База.ЗакрытьФайл();
Показать
6. JLaikova 19.02.19 13:49 Сейчас в теме
НовыйДокумент.Записать(); и что то не соображу Вроде по (Код) находит, как теперь перезаписать существующее поле текстом из dbf
7. JLaikova 19.02.19 14:42 Сейчас в теме
Для й=1 По Записей Цикл
					База.Перейти(й);
					Код 			= СокрЛП(База.LS);
					НовыйДокумент = Справочники.ЛицевыеСчета.Выбрать();
					ПараметрыОтбора = Новый Структура;
					ПараметрыОтбора.Вставить("Код",Справочники.ЛицевыеСчета.НайтиПоКоду(Код));
					
					Код = Справочники.ЛицевыеСчета.НайтиПоКоду(Код);
					
				Если Не Код.Пустая()Тогда
					НовыйДокумент = Код.ПолучитьОбъект();						
							
					НовыйДокумент.Наименование = СокрЛП(База.FIO);
					НовыйДокумент.Записать();
				КонецЕсли;
				
				КонецЦикла;
			    УдалитьФайлы(ВрФайл);
		        База.ЗакрытьФайл();
Показать

изменила код. Ошибок нет, но Наименование так и не записывается из dbf((
8. lexin1976 13 19.02.19 14:57 Сейчас в теме
Ну вот сейчас верно. Для записи нужно получить объект и с ним работать.
Но при этом.
Трудно понять.
Код - это справочникссылка. НовыйДокумент это СправочникОбъект.
Как в этом коде понять что можно то?
Для й=1 По Записей Цикл 
База.Перейти(й); 
Код = СокрЛП(База.LS); 
НовыйДокумент = Справочники.ЛицевыеСчета.Выбрать();  // Это выборка. И потом не используется. Зачем?
ПараметрыОтбора = Новый Структура;   // это вообще зачем?
ПараметрыОтбора.Вставить("Код",Справочники.ЛицевыеСчета.НайтиПоКоду(Код));   // это вообще зачем?

Код = Справочники.ЛицевыеСчета.НайтиПоКоду(Код);   // это понятно, теперь это СправочникСсылка

Если Не Код.Пустая()Тогда 
НовыйДокумент = Код.ПолучитьОбъект();	   // это понятно. Получение СправочникаОбъект

НовыйДокумент.Наименование = СокрЛП(База.FIO);  А тут точно что-то есть. Может тут пустота?
НовыйДокумент.Записать();  ну и тут верно. 
КонецЕсли; 

КонецЦикла; 
УдалитьФайлы(ВрФайл); 
База.ЗакрытьФайл(); 
Показать

Сделайте через попытку Запись и посмотрите через ОписаниеОшибки(). Может ошибка какая. Посмотрите Журнал регистрации.
9. JLaikova 19.02.19 15:16 Сейчас в теме
(8) [IS-QUOTE]НовыйДокумент = Справочники.ЛицевыеСчета.Выбрать(); // Это выборка. И потом не используется. Зачем? А как прописать, в справочнике заведены элементы, код и в dbf и в справочнике идентичен.Поэтому ж и НайтиПоКоду(Код) Обработка должна только Выбрать() - по идее и заменить наименование из файла НовыйДокумент.Наименование = СокрЛП(База.FIO); ?!
10. lexin1976 13 20.02.19 09:11 Сейчас в теме
Код = Справочники.ЛицевыеСчета.НайтиПоКоду(Код);
Вот тут то и находится как раз элемент код, которого соответствует коду из ДБФ.
Выбрать() используется для открытия выборки. Это Следующий(), Получить(). Это перебор элементов. Это другое в вашем случае.
11. JLaikova 20.02.19 09:15 Сейчас в теме
Нашла верное решение.) Всем спасибо! Решила выложить фрагмент кода. Вдруг кому пригодится.

НашПолныйПутьФайла = КаталогВременныхФайлов()+НашеИмяФайла;
    КопироватьФайл( ВрФайл,НашПолныйПутьФайла);
	Сообщить (НашПолныйПутьФайла);
				База = Новый XBase;
		
				База.Кодировка=КодировкаXBase.OEM;
				База.ОткрытьФайл(НашПолныйПутьФайла);
				Если База.Открыта()=Ложь Тогда
					Возврат;
				КонецЕсли;
								
				База.ОтображатьУдаленные=Ложь;
				Записей=База.КоличествоЗаписей();
				
				Для й=1 По Записей Цикл
					База.Перейти(й);
					Код 			= СокрЛП(База.LS);
				//	Наим            = СтрЗаменить(СокрЛП(База.FIO),"","");
					Стр = Справочники.ЛицевыеСчета.НайтиПоКоду(Код);
					
									
				НовыйДокумент = Стр.ПолучитьОбъект();
				
				Если  Стр.Пустая()Тогда
					Сообщить("Пусто!");
					Иначе
											
					НовыйДокумент.Наименование = База.FIO;
					НовыйДокумент.Записать();
					
					Сообщить ("Запись обновлена"); 
					КонецЕсли;
				
				КонецЦикла;
			    УдалитьФайлы(ВрФайл);
		        База.ЗакрытьФайл();
Показать
12. tolyan_ekb 104 20.02.19 20:00 Сейчас в теме
(11) НовыйДокумент - это справочник?
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот