Имя: Пароль:
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ку говорили "почему всё так стало сложно?"
Чтобы обнаруживать ошибки, программист должен иметь ум, которому доставляет удовольствие находить изъяны там, где, казалось, царят красота и совершенство. Фредерик Брукс-младший