Имя: Пароль:
1C
1С v8
заполнение регистра сведений
0 vip67
 
10.07.12
12:27
всем добрый день!

в 8-ке не силен (каюсь сразу) но есть задача: импортировать из ДБФ справочник контрагентов. Сам справочник я уже импортнул, остались таки емелочи, как заполнить контактную информацию, которая в 1с хранится в регистре сведений контакнтаяИнформация. При попытке через обработку заполнить регистр - ругается на то, что поле "Объект" не может быть пустым, хотя я его заполняю. Подскажите - в чем ошибка.
код привожу:

Процедура КнопкаВыполнитьНажатие(Кнопка)
   ФайлДБФ = новый xBase();
   ФайлДБФ.Кодировка = КодировкаXBase.OEM;
   
   СпрКонтр = справочники.Контрагенты;
   Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
   Диалог.Фильтр = "*.dbf";

   Если Диалог.Выбрать() Тогда
       ВыбФайл = Диалог.ПолноеИмяФайла;
   Иначе
       Отказ = Истина;
       Возврат;
   КонецЕсли;

   ФайлДБФ.ОткрытьФайл(ВыбФайл);
   инд=0;
   ФайлДБФ.Первая();
   Пока ФайлДБФ.ВКонце()=Ложь цикл
       НаимКонтр = ФайлДБФ.ПолучитьЗначениеПоля("Naim_Kontr");
       ИНН = ФайлДБФ.ПолучитьЗначениеПоля("INN");
       Код_ = СокрЛП(ФайлДБФ.ПолучитьЗначениеПоля("Kod"));
       Код_=СтрЗаменить(Код_," ","");
       ОКПО = СокрЛП(ФайлДБФ.ПолучитьЗначениеПоля("K_Kontrag"));
       ОКПО = СтрЗаменить(ОКПО," ","");
       АДресПолный = ФайлДБФ.ПолучитьЗначениеПоля("Adres");
       АДресЮр = ФайлДБФ.ПолучитьЗначениеПоля("Adres_U");
       Телефон = ФайлДБФ.ПолучитьЗначениеПоля("Fone");
       
       Спр = СпрКонтр.НайтиПоКоду(Код_);
       Если спр  =  Справочники.Контрагенты.ПустаяСсылка() тогда
           Элемент = СпрКонтр.СоздатьЭлемент();
       иначе
           Элемент = Спр.ПолучитьОбъект();
       КонецЕсли;

       Элемент.Наименование = НаимКонтр;
       Элемент.НаименованиеПолное = НаимКонтр;
       Элемент.ИНН = ИНН;
       Элемент.Код = Код_;
       Элемент.КодПоЕДРПОУ = ОКПО;
       Элемент.Записать();
       сообщить(НаимКонтр);
       
//        Запишем в регистр сведений контактную инфу
   НаборД = РегистрыСведений.КонтактнаяИнформация.СоздатьНаборЗаписей();

   //// устанавливаем параметры отбора по полному набору Измерений регистра:
   //НаборД.Отбор.ОБъект.Установить(Элемент);
   //НаборД.Отбор.Тип.Установить(Перечисления.ТипыКонтактнойИнформации.Адрес);
   //ВидКИ_ = Справочники.ВидыКонтактнойИнформации.НайтиПоКоду("00008");
   //    //Запись1.Вид =  ВИдКИ_.ПолучитьОбъект();
   //НаборД.Отбор.Вид.Установить(ВИдКИ_.ПолучитьОбъект());

   // Создаем новую строку в этом наборе записей:
   СтрокаДанных = НаборД.Добавить();

   // определяем значения Измерений этой строки:
   СтрокаДанных.Объект = Элемент;
   СтрокаДанных.Тип = Перечисления.ТипыКонтактнойИнформации.Адрес;
   СтрокаДанных.Вид = ВИдКИ_.ПолучитьОбъект();

   // определяем значения Ресурсов
   СтрокаДанных.Представление = АдресПолный;

   НаборД.Записать(ложь);

   
       ФайлДБФ.Следующая();
   КонецЦикла;
   
   
КонецПроцедуры
1 MSII
 
10.07.12
12:28
Элемент у тебя объект, а тебе нужна ссылка.
2 DrShad
 
10.07.12
12:29
СтрокаДанных.Объект = Элемент.Ссылка;
3 gosn1ck
 
10.07.12
12:29
вам СоздатьМенеджерЗаписи, а не набор нужен
4 gosn1ck
 
10.07.12
12:30
это так на будущее
5 DrShad
 
10.07.12
12:31
(4) тогда уж уточняй, что только для независимых РС
6 vip67
 
10.07.12
12:33
(3) я пробовал через создатьменеджерзаписи - эффект был тот-же, счас попробую через ссылку.
7 gosn1ck
 
10.07.12
12:34
(5) ТС говорит о конкретном РС
(6) в (3) не совет для вашей текущей проблемы
8 vip67
 
10.07.12
12:35
через ссылку - получилось! спасибо!!!!
9 ssh2006
 
10.07.12
12:36
(8) кстати, сколько записей в регистре у тебя оказалось после импорта?
10 vip67
 
10.07.12
14:56
(9) так не считал, но если учесть, что контрагентов свыше 1000, и на каждого по 3 записи, то - более 3000
11 Eugene_life
 
10.07.12
14:57
(10) Посчитай, будь мужиком, бл..ть!!  :D
12 vip67
 
10.07.12
15:08
(11) ВЛОМ, да и зачем?!
13 vip67
 
13.07.12
12:47
возобновлю тему:
итак - есть справочник контрагентов, который заполнрил импортом из ДБФ, в файле ДБФ есть информация по адресу, поэтому ее я то-же заполняю в регистр сведений "контактнаяИнформация". после заполнения в регистре вижу 3 строки (адрес физ, адрес юр и телефон), а вот в самом элементе справочника в закладке "контактная информация" присутствуют 3 заполненные импортом записи и добалвяются еще 2(если нет телефона) или 3 пустых записи, которые я не могу удалять. как с этим бороться?
код обработки прилагаю:

Процедура КнопкаВыполнитьНажатие(Кнопка)
   ФайлДБФ = новый xBase();
   ФайлДБФ.Кодировка = КодировкаXBase.OEM;
   
   СпрКонтр = справочники.Контрагенты;
   Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
   Диалог.Фильтр = "*.dbf";

   Если Диалог.Выбрать() Тогда
       ВыбФайл = Диалог.ПолноеИмяФайла;
   Иначе
       Отказ = Истина;
       Возврат;
   КонецЕсли;

   ФайлДБФ.ОткрытьФайл(ВыбФайл);
   инд=0;
   ФайлДБФ.Первая();
   Пока ФайлДБФ.ВКонце()=Ложь цикл
       НаимКонтр_ = ФайлДБФ.ПолучитьЗначениеПоля("Naim_Kontr");
       НаимКонтр = Стрзаменить(НаимКонтр_,"?","І");
       
       ИНН = ФайлДБФ.ПолучитьЗначениеПоля("INN");
       Код_ = СокрЛП(ФайлДБФ.ПолучитьЗначениеПоля("Kod"));
       Код_=СтрЗаменить(Код_," ","");
       ОКПО = СокрЛП(ФайлДБФ.ПолучитьЗначениеПоля("K_Kontrag"));
       ОКПО = СтрЗаменить(ОКПО," ","");
       Город_= ФайлДБФ.ПолучитьЗначениеПоля("K_GOROD");
       АДресПолный = СокрЛП(Город_)+" "+ФайлДБФ.ПолучитьЗначениеПоля("Adres");
       АДресЮр =  СокрЛП(Город_)+" "+ФайлДБФ.ПолучитьЗначениеПоля("Adres_U");
       Телефон = ФайлДБФ.ПолучитьЗначениеПоля("Fone");
       
       Спр = СпрКонтр.НайтиПоКоду(Код_);
       Если спр  =  Справочники.Контрагенты.ПустаяСсылка() тогда
           Элемент = СпрКонтр.СоздатьЭлемент();
       иначе
           Элемент = Спр.ПолучитьОбъект();
       КонецЕсли;

       Элемент.Наименование = НаимКонтр;
       Элемент.НаименованиеПолное = НаимКонтр;
       Элемент.ИНН = ИНН;
       Элемент.Код = Код_;
       Элемент.КодПоЕДРПОУ = ОКПО;
       Элемент.Записать();
       сообщить(НаимКонтр);
       
//        Запишем в регистр сведений контактную инфу
   НаборД = РегистрыСведений.КонтактнаяИнформация.СоздатьНаборЗаписей();


   // Создаем новую строку в этом наборе записей:
   СтрокаДанных = НаборД.Добавить();

   ВидКИ_ = Справочники.ВидыКонтактнойИнформации.НайтиПоКоду("00008");
   // определяем значения Измерений этой строки:
   СтрокаДанных.Объект = Элемент.Ссылка;
   СтрокаДанных.Тип = Перечисления.ТипыКонтактнойИнформации.Адрес;
   СтрокаДанных.Вид = ВИдКИ_.ПолучитьОбъект();
   СтрокаДанных.Представление = АдресПолный;

   СтрокаДанных = НаборД.Добавить();

   ВидКИ_ = Справочники.ВидыКонтактнойИнформации.НайтиПоКоду("00010");
   СтрокаДанных.Объект = Элемент.Ссылка;
   СтрокаДанных.Тип = Перечисления.ТипыКонтактнойИнформации.Адрес;
   СтрокаДанных.Вид = ВИдКИ_.ПолучитьОбъект();
   СтрокаДанных.Представление = АдресЮр;
   
   СтрокаДанных = НаборД.Добавить();

   СтрокаДанных.Объект = Элемент.Ссылка;
   СтрокаДанных.Тип = Перечисления.ТипыКонтактнойИнформации.Телефон;
   СтрокаДанных.Вид = Справочники.ВидыКонтактнойИнформации.НайтиПоКоду("00005");
   СтрокаДанных.Представление = Телефон;
   
   НаборД.Записать(ложь);

       ФайлДБФ.Следующая();
   КонецЦикла;
   
   
КонецПроцедуры
14 hhhh
 
13.07.12
12:50
вы неисправимы. Ну это что за бред?

СтрокаДанных.Вид = ВИдКИ_.ПолучитьОбъект();
   
какой еще объект вы опять пытаетесь засунуть?
15 vip67
 
13.07.12
12:54
получаю элемент справочника
16 anddro
 
13.07.12
12:55
(14) человек сразу сказал, что не силен. После 7.7 не сразу люди понимают разницу между СправочникСсылка и СправочникОбъект. Все через это прошли, и он научится.
17 vip67
 
13.07.12
12:55
т.е., получаю ссылку на элемент справочника
18 anddro
 
13.07.12
12:55
(15) нет, ты получаешь объект, с помощью которого можно изменить элемент справочника. А тебе нужна ссылка на элемент справочника.
19 vip67
 
13.07.12
12:56
(16) сенкью за понимание. действительно - иногда в шок прихожу - нахрена так все усложнили?!
20 vip67
 
13.07.12
12:56
(18) а это поможет решить мою проблему? (с дублированием строчек)?
21 anddro
 
13.07.12
12:56
(17) в режиме отладки посмотри значение переменной и ее тип. Сразу станет понятнее. После 7.7 отладка в 8* очень радует.
22 anddro
 
13.07.12
12:59
Вы этом случае (поиск по коду внутри цикла - это отдельная тема) ты заполняешь ссылку:
СтрокаДанных.Вид = Справочники.ВидыКонтактнойИнформации.НайтиПоКоду("00005");

А в этом случае у тебя .Вид не заполнятся (типы не совпадают, но для 1с это не повод вызывать исключение)
СтрокаДанных.Вид = ВИдКИ_.ПолучитьОбъект();

Проверь в отладчике значение СтрокаДанных.Вид после каждого из вариантов.
23 vip67
 
13.07.12
13:05
заменил

СтрокаДанных.Вид = ВИдКИ_.ПолучитьОбъект();

на
СтрокаДанных.Вид = ВИдКИ_.Ссылка;

да, теперь в закладке контактная информация 3 строки - как и положено. но непонятно - если бы ВИД не заполнялся - почеему он отображался в закладке?! я бы тогда сразу обратил внимание.

ок, всем спасибо! с тяпницей и удачных выходных!!!
24 anddro
 
13.07.12
13:07
ВИдКИ_.Ссылка; - так не надо.
ВИдКИ_ - это уже и есть нужная ссылка. А ты из нее считываешь ссылку (результат тот же, но это лишнее обращение к базе/кэшу)
25 gosn1ck
 
13.07.12
13:09
(24) +1
(23) нажмите на картинку справа сверху или проблем не оберетесь...
зы интересно все ли 7шники когда переходили на 8ку говорили "почему всё так стало сложно?"