helpf.pro
Регистрация

v8: Загрузка в Справочник

Ermak
12.11.2015 14:44Прочитано: 2754

Пытаюсь загрузить в справочник, если запись существует я ее удалю и записываю заново, но не работает, подскажите что не так

Код 1C v 8.х
 Номер=0;
Данные=Справочники.ЛицевыеСчетаАбонентовГРО;
Выборка=Справочники.ЛицевыеСчетаАбонентовГРО.Выбрать();
Пока Выборка.Следующий() Цикл
Если Не ЗначениеЗаполнено(Выборка.Код)  Тогда
НовЭл=Данные.СоздатьЭлемент();
НовЭл.Код=ЛС;
НовЭл.Наименование=Адрес;
НовЭл.ФИО=ФИО;
НовЭл.Телефон=ТЕЛЕФОН;
Для Каждого Стр из НовЭл.Оборудование Цикл
Номер=Номер+1;
Стр.НомерСтроки=Номер;
Если Стр.Тип=ПЛИТА Тогда  
Стр.Модель=Перечисления.ВидОборудования.ГазоваяПлита;
Стр.Тип=ПЛИТА;
ИначеЕсли Стр.Тип=КОЛОНКА Тогда
Стр.Модель=Перечисления.ВидОборудования.ГазоваяКолонка;
Стр.Тип=КОЛОНКА;
КонецЕсли;
КонецЦикла;
Для Каждого Стр из НовЭл.Долги Цикл
Номер=Номер+1;
Стр.НомерСтроки=Номер;
Если Стр.СуммаОстаток=ДОЛГГАЗ Тогда  
Стр.Услуга=Справочники.Номенклатура.Газоснабжение;
Стр.СуммаОстаток=ДОЛГГАЗ;
ИначеЕсли Стр.СуммаОстаток=ДОЛГТО Тогда  
Стр.Услуга=Справочники.Номенклатура.Техобслуживание;
Стр.СуммаОстаток=ДОЛГТО; 
КонецЕсли;
КонецЦикла;
Состояние("Загрузка данных Абонент ГРО = "+ НовЭл.Ссылка);
НовЭл.Записать();
Иначе
Выборка.ПолучитьОбъект().Удалить();
НовЭл=Данные.СоздатьЭлемент();
НовЭл.Код=ЛС;
НовЭл.Наименование=Адрес;
НовЭл.ФИО=ФИО;
НовЭл.Телефон=ТЕЛЕФОН;
Для Каждого Стр из НовЭл.Оборудование Цикл
Номер=Номер+1;
Стр.НомерСтроки=Номер;
Если Стр.Тип=ПЛИТА Тогда  
Стр.Модель=Перечисления.ВидОборудования.ГазоваяПлита;
Стр.Тип=ПЛИТА;
ИначеЕсли Стр.Тип=КОЛОНКА Тогда
Стр.Модель=Перечисления.ВидОборудования.ГазоваяКолонка;
Стр.Тип=КОЛОНКА;
КонецЕсли;
КонецЦикла;
Для Каждого Стр из НовЭл.Долги Цикл
Номер=Номер+1;
Стр.НомерСтроки=Номер;
Если Стр.СуммаОстаток=ДОЛГГАЗ Тогда  
Стр.Услуга=Справочники.Номенклатура.Газоснабжение;
Стр.СуммаОстаток=ДОЛГГАЗ;
ИначеЕсли Стр.СуммаОстаток=ДОЛГТО Тогда  
Стр.Услуга=Справочники.Номенклатура.Техобслуживание;
Стр.СуммаОстаток=ДОЛГТО; 
КонецЕсли;
КонецЦикла;
Состояние("Загрузка данных Абонент ГРО = "+ НовЭл.Ссылка);
НовЭл.Записать();
КонецЕсли;
КонецЦикла;
Yandex
Возможно, вас также заинтересует
Реклама на портале
E_Migachev
13.11.2015 01:22Ответ № 1

А Зачем удалять, просто измени/ обнови ее?!

Ermak
13.11.2015 07:22Ответ № 2

Можете показать как

E_Migachev
13.11.2015 23:44Ответ № 3

Выборка.ПолучитьОбъект().Удалить();

НовЭл=Данные.СоздатьЭлемент();

заменить на:

НовЭл=Выборка.ПолучитьОбъект();

Ermak
16.11.2015 09:03Ответ № 4

Не понимаю почему не работает?

Код 1C v 8.х
 		
Пока Данные.Выбрать().Следующий() Цикл
Если Не ЗначениеЗаполнено(Данные.Выбрать().Код) Тогда
НовЭл=Данные.СоздатьЭлемент();
НовЭл.Код=ЛС;
НовЭл.Наименование=Адрес;
НовЭл.ФИО=ФИО;
НовЭл.Телефон=ТЕЛЕФОН;
Состояние("Загрузка данных Абонент ГРО = "+ НовЭл.Ссылка);
НовЭл.Записать();
Иначе
Данные.Выбрать().ПолучитьОбъект().Удалить();
КонецЕсли;
КонецЦикла;
Ermak
16.11.2015 09:47Ответ № 5

Выдает ошибку

{Форма.Форма.Форма(36)}: Ошибка при вызове метода контекста (Записать)

НовЭл.Записать();

по причине:

Значение "101000014" поля "Код" не уникально

Код 1C v 8.х
 			Если Не ЗначениеЗаполнено(Данные.Выбрать().Код) Тогда
НовЭл=Данные.СоздатьЭлемент();
НовЭл.Код=ЛС;
НовЭл.Наименование=Адрес;
НовЭл.ФИО=ФИО;
НовЭл.Телефон=ТЕЛЕФОН;
Состояние("Загрузка данных Абонент ГРО = "+ НовЭл.Ссылка);
НовЭл.Записать();
Иначе
НовЭл=Данные.Выбрать().ПолучитьОбъект();
НовЭл.Код=ЛС;
НовЭл.Наименование=Адрес;
НовЭл.ФИО=ФИО;
НовЭл.Телефон=ТЕЛЕФОН;
Состояние("Загрузка данных Абонент ГРО = "+ НовЭл.Ссылка);
НовЭл.Записать();
КонецЕсли;
IBReiter
16.11.2015 12:59Ответ № 6

Ошибка вроде описана, все понятно.

Куда выборка  ваша подевалась? Ерунду пытаетесь сейчас сделать

Ermak
16.11.2015 13:17Ответ № 7

Я уже запутался весь, можете подсказать как правильно надо, смысл такой, загружаю данные если данные существую то перезаписываем.

Код 1C v 8.х
 ФайлДБФ = Новый XBASE;
ФайлДБФ.Кодировка = КодировкаXBase.OEM;
ФайлДБФ.ОткрытьФайл(ИмяФайлаДанных);
ФайлДБФ.Первая();
Номер=0;
Данные=Справочники.ЛицевыеСчетаАбонентовГРО;
Выборка=Данные.Выбрать();
Пока НЕ ФайлДБФ.ВКонце() Цикл
ЛС = СокрЛП(ФайлДБФ.ПолучитьЗначениеПоля("LSHET"));
ФИО = СокрЛП(ФайлДБФ.ПолучитьЗначениеПоля("FIO"));
РАЙОН = СокрЛП(ФайлДБФ.ПолучитьЗначениеПоля("PUNKT"));
УЛ = СокрЛП(ФайлДБФ.ПолучитьЗначениеПоля("STREET"));
ДОМ = СокрЛП(ФайлДБФ.ПолучитьЗначениеПоля("HOUSE"));
БУК = СокрЛП(ФайлДБФ.ПолучитьЗначениеПоля("HOUSEPSTFX"));
КОРП = СокрЛП(ФайлДБФ.ПолучитьЗначениеПоля("KORPUS"));
КВ = СокрЛП(ФайлДБФ.ПолучитьЗначениеПоля("FLAT"));
КОМ = СокрЛП(ФайлДБФ.ПолучитьЗначениеПоля("KOMN"));
ПЛИТА = СокрЛП(ФайлДБФ.ПолучитьЗначениеПоля("PLITA"));
КОЛОНКА = СокрЛП(ФайлДБФ.ПолучитьЗначениеПоля("KOLONKA"));
ТЕЛЕФОН = СокрЛП(ФайлДБФ.ПолучитьЗначениеПоля("TELEPHONE"));
ТО_ПЛИТА = СокрЛП(ФайлДБФ.ПолучитьЗначениеПоля("TO_PLITA"));
ТО_КОЛОНКА = СокрЛП(ФайлДБФ.ПолучитьЗначениеПоля("TO_KOLONKA"));
ДОЛГГАЗ = СокрЛП(ФайлДБФ.ПолучитьЗначениеПоля("DOLG_GAZ"));
ДОЛГТО = СокрЛП(ФайлДБФ.ПолучитьЗначениеПоля("DOLG_TO"));
Если КОМ="0" Тогда
КОМ=" ";
Иначе
КОМ=", К" + КОМ;
КонецЕсли;
Если КОРП="" Тогда
КОРП="";
Иначе
КОРП=", Корп" + КОРП;
КонецЕсли;
Адрес= РАЙОН + "," + " " + УЛ + "," + ДОМ + БУК + КОМ + "," + КВ + КОРП;
Пока Выборка.Следующий() Цикл
Если Не ЗначениеЗаполнено(Выборка.Код) Тогда
НовЭл=Данные.СоздатьЭлемент();
НовЭл.Код=ЛС;
НовЭл.Наименование=Адрес;
НовЭл.ФИО=ФИО;
НовЭл.Телефон=ТЕЛЕФОН;
НовЭл.ОбменДанными.Загрузка=Истина;
Для Каждого Стр из НовЭл.Оборудование Цикл
Стр.Модель=Перечисления.ВидОборудования.ГазоваяПлита;
Стр.Тип=ПЛИТА;
КонецЦикла;
Состояние("Загрузка данных Абонент ГРО = "+ НовЭл.Ссылка);
НовЭл.Записать(); 
Иначе
Выборка.ПолучитьОбъект().Удалить();
КонецЕсли;
КонецЦикла;
ФайлДБФ.Следующая(); 
КонецЦикла;
ФайлДБФ.ЗакрытьФайл();
IBReiter
16.11.2015 13:26Ответ № 8

У вас есть элементы с незаполненным кодом?

Ermak
16.11.2015 14:15Ответ № 9

Нет, все заполнены

IBReiter
16.11.2015 15:04Ответ № 10

Значит вот это условие у вас никогда не выполнится

Код 1C v 8.3
 

Если Не ЗначениеЗаполнено(Выборка.Код) Тогда
НовЭл=Данные.СоздатьЭлемент();
НовЭл.Код=ЛС;
НовЭл.Наименование=Адрес;
НовЭл.ФИО=ФИО;
НовЭл.Телефон=ТЕЛЕФОН;
НовЭл.ОбменДанными.Загрузка=Истина;
Для Каждого Стр из НовЭл.Оборудование Цикл
Стр.Модель=Перечисления.ВидОборудования.ГазоваяПлита;
Стр.Тип=ПЛИТА;
КонецЦикла;
Состояние("Загрузка данных Абонент ГРО = "+ НовЭл.Ссылка);
НовЭл.Записать(); 
Иначе


IBReiter
16.11.2015 15:06Ответ № 11

Что значит "загружаю данные если данные существую то перезаписываем" - что существует? что перезаписываем? какие данные?

Ermak
16.11.2015 15:44Ответ № 12

мне нужно загрузить данные с dbf файла в справочник, данные будут загружаться в каждый день, т.е при загрузке старые данные удаляются а новый записываются. Вот и встала задача как это сделать, подскажите

IBReiter
16.11.2015 16:31Ответ № 13

Запрос = Новый Запрос("Выбрать Ссылка Из Справочник.ВашСправочник");

Выборка = Запрос.Выполнить().Выбрать();

Пока Выборка.Следующий() Цикл ОБ = Выборка.Ссылка.ПолучитьОбъект(); ОБ.Удалить(); КонецЦикла;

Пока Условие по файлу Цикл ОБ = Справочники.ВашСправочник.СоздатьЭлемент(); ОБ.Записать(); КонецЦикла;

Ermak
16.11.2015 16:47Ответ № 14

Что то я вас не понял, у меня же тоже самое сделано только вы через запрос делаете

Ermak
16.11.2015 17:01Ответ № 15
Код 1C v 8.х
 Запрос = Новый Запрос("ВЫБРАТЬ
| ЛицевыеСчетаАбонентовГРО.Ссылка,
| ЛицевыеСчетаАбонентовГРО.Код
|ИЗ
| Справочник.ЛицевыеСчетаАбонентовГРО КАК ЛицевыеСчетаАбонентовГРО");
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл 
ОБ = Выборка.Ссылка.ПолучитьОбъект(); 
ОБ.Удалить(); 
КонецЦикла;
Если Не ЗначениеЗаполнено(Выборка.Код) Тогда
НовЭл = Справочники.ЛицевыеСчетаАбонентовГРО.СоздатьЭлемент();
НовЭл.Код=ЛС;
НовЭл.Наименование=Адрес;
НовЭл.ФИО=ФИО;
НовЭл.Телефон=ТЕЛЕФОН;
Для Каждого Стр из НовЭл.Оборудование Цикл
Стр.Модель=Перечисления.ВидОборудования.ГазоваяПлита;
Стр.Тип=ПЛИТА;
КонецЦикла;
Состояние("Загрузка данных Абонент ГРО = "+ НовЭл.Ссылка);
НовЭл.Записать(); 
КонецЕсли;

Вы так имели ввиду?

IBReiter
16.11.2015 17:03Ответ № 16

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

Ermak
16.11.2015 17:08Ответ № 17

Как тогда быть

IBReiter
16.11.2015 17:12Ответ № 18

Я же вам написал уже, сначала циклом по выборке из справочника удалить элементы справочника, потом циклом по файлу добавлять в справочник новые элементы

Ermak
16.11.2015 17:22Ответ № 19

Почему в ТЧ не записывает

Код 1C v 8.х
 	ФайлДБФ = Новый XBASE;
ФайлДБФ.Кодировка = КодировкаXBase.OEM;
ФайлДБФ.ОткрытьФайл(ИмяФайлаДанных);
ФайлДБФ.Первая();
Номер=0;

Запрос = Новый Запрос("ВЫБРАТЬ
| ЛицевыеСчетаАбонентовГРО.Ссылка,
| ЛицевыеСчетаАбонентовГРО.Код
|ИЗ
| Справочник.ЛицевыеСчетаАбонентовГРО КАК ЛицевыеСчетаАбонентовГРО");
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл 
ОБ = Выборка.Ссылка.ПолучитьОбъект(); 
ОБ.Удалить(); 
КонецЦикла;

Пока НЕ ФайлДБФ.ВКонце() Цикл
ЛС = СокрЛП(ФайлДБФ.ПолучитьЗначениеПоля("LSHET"));
ФИО = СокрЛП(ФайлДБФ.ПолучитьЗначениеПоля("FIO"));
РАЙОН = СокрЛП(ФайлДБФ.ПолучитьЗначениеПоля("PUNKT"));
УЛ = СокрЛП(ФайлДБФ.ПолучитьЗначениеПоля("STREET"));
ДОМ = СокрЛП(ФайлДБФ.ПолучитьЗначениеПоля("HOUSE"));
БУК = СокрЛП(ФайлДБФ.ПолучитьЗначениеПоля("HOUSEPSTFX"));
КОРП = СокрЛП(ФайлДБФ.ПолучитьЗначениеПоля("KORPUS"));
КВ = СокрЛП(ФайлДБФ.ПолучитьЗначениеПоля("FLAT"));
КОМ = СокрЛП(ФайлДБФ.ПолучитьЗначениеПоля("KOMN"));
ПЛИТА = СокрЛП(ФайлДБФ.ПолучитьЗначениеПоля("PLITA"));
КОЛОНКА = СокрЛП(ФайлДБФ.ПолучитьЗначениеПоля("KOLONKA"));
ТЕЛЕФОН = СокрЛП(ФайлДБФ.ПолучитьЗначениеПоля("TELEPHONE"));
ТО_ПЛИТА = СокрЛП(ФайлДБФ.ПолучитьЗначениеПоля("TO_PLITA"));
ТО_КОЛОНКА = СокрЛП(ФайлДБФ.ПолучитьЗначениеПоля("TO_KOLONKA"));
ДОЛГГАЗ = СокрЛП(ФайлДБФ.ПолучитьЗначениеПоля("DOLG_GAZ"));
ДОЛГТО = СокрЛП(ФайлДБФ.ПолучитьЗначениеПоля("DOLG_TO"));
Если КОМ="0" Тогда
КОМ=" ";
Иначе
КОМ=", К" + КОМ;
КонецЕсли;
Если КОРП="" Тогда
КОРП="";
Иначе
КОРП=", Корп" + КОРП;
КонецЕсли;
Адрес= РАЙОН + "," + " " + УЛ + "," + ДОМ + БУК + КОМ + "," + КВ + КОРП;
НовЭл = Справочники.ЛицевыеСчетаАбонентовГРО.СоздатьЭлемент();
НовЭл.Код=ЛС;
НовЭл.Наименование=Адрес;
НовЭл.ФИО=ФИО;
НовЭл.Телефон=ТЕЛЕФОН;
Для Каждого Стр из НовЭл.Оборудование Цикл
Стр.Модель=Перечисления.ВидОборудования.ГазоваяПлита;
Стр.Тип=ПЛИТА;
КонецЦикла;
Состояние("Загрузка данных Абонент ГРО = "+ НовЭл.Ссылка);
НовЭл.Записать(); 
ФайлДБФ.Следующая(); 
КонецЦикла;
ФайлДБФ.ЗакрытьФайл();
IBReiter
16.11.2015 17:24Ответ № 20

Это которая НовЭлемент.Оборудование ?

У нового элемента нет ни одной строчки и вы их туда не добавляете, вот и не заполняется.

Ermak
16.11.2015 17:25Ответ № 21

Покажите на примере как добавить

IBReiter
16.11.2015 17:29Ответ № 22

НоваяСтрока = НовЭл.Оборудование.Добавить()

Ermak
17.11.2015 09:46Ответ № 23

Спасибо разобрался!

Ermak
17.11.2015 09:46Ответ № 24
Вопрос закрыт!
Подсказка: Щелникни по Имени пользователя напротив ответа, и тем самым покажешь, что сообщение адресовано ему.
Вы не можете отправить комментарий анонимно, пожалуйста войдите или зарегистрируйтесь.