Имя: Пароль:
1C
1С v8
v8: Запись в регистр сведений
,
0 manti
 
01.02.13
18:07
Как правильно записать в регистр сведений. Так ругается. Может отбор не так поставил в записываемый регистр?
СпрКонтраг = База.Справочники.Контрагенты;
   Выборка = СпрКонтраг.ВыбратьИерархически();
РегСведКонтактИнфа = База.РегистрыСведений.КонтактнаяИнформация.СоздатьНаборЗаписей();
                   КонтактыАгАт       = РегистрыСведений.КонтактнаяИнформация.СоздатьНаборЗаписей();
                   
                   КонтактыАгАт.Отбор.Объект.Установить(Выборка.Ссылка);
                   
                   РегСведКонтактИнфа.Отбор.Объект.Значение = Выборка.Ссылка;
                   РегСведКонтактИнфа.Отбор.Объект.Использование = Истина;
                   РегСведКонтактИнфа.Прочитать();
                   Для каждого ТекЗапись  Из РегСведКонтактИнфа Цикл
                       //читаем ТИП
                       ЗаписьРегистра = КонтактыАгАт.Добавить();
                       
                       НомТипа = База.Перечисления.ТипыКонтактнойИнформации.Индекс(ТекЗапись.Тип);
                       ИмяТипа = База.Метаданные().Перечисления.ТипыКонтактнойИнформации.EnumValues.Get(НомТипа).Name;
                       
                       Для Каждого метпер Из Метаданные.Перечисления.ТипыКонтактнойИнформации.ЗначенияПеречисления Цикл
                           Если метпер.Имя = ИмяТипа   тогда
                               //КонтактыАгАт.Тип = Перечисления.ТипыКонтактнойИнформации[метпер.ИмяТипа];
                               Тип = Перечисления.ТипыКонтактнойИнформации[метпер.Имя];
                           КонецЕсли;    
                       КонецЦикла;
                       //ТекЗапись.Объект.Наименование
                       ЗаписьРегистра.Объект = Справочники.Контрагенты.НайтиПоНаименованию(ТекЗапись.Объект.Наименование);                    
                       ЗаписьРегистра.Тип    = Тип;
                       ЗаписьРегистра.Вид    = Справочники.ВидыКонтактнойИнформации.НайтиПоНаименованию(ТекЗапись.Вид.Наименование);
                       ЗаписьРегистра.Представление = ТекЗапись.Представление;
                       КонтактыАгАт.Записать();
                       Сообщить("Х" +ТекЗапись.Объект.Наименование+" "+Тип+" "+ ТекЗапись.Вид.Наименование+" "+ТекЗапись.Представление);
                       //прет(+)
                   КонецЦикла;
1 Ayvengo
 
01.02.13
18:08
А че ругается то, что пишет?
2 Митор
 
01.02.13
18:09
(1) это надо самому протелепатить в этом вся фишка
3 GROOVY
 
01.02.13
18:10
Сломал мозг на работе с перечислениями, пошел чинить...
4 Ayvengo
 
01.02.13
18:11
КонтактыАгАт.Прочитать() - наверное, нужно...
А вообще код какой-то мозговыносящий :D
5 Ayvengo
 
01.02.13
18:12
(0) Код супер! Теперь давай ошибку, на что ругается 1Сина :)
6 sapphire
 
01.02.13
18:17
(3) Это он через COM-connector работает :)
7 DrShad
 
01.02.13
18:19
(6) да это не важно - фееричен цикл по метаданным
8 sapphire
 
01.02.13
18:20
(7) Ну там много чего такого интересного, особливо элементы справочника, кои "Полные тезки"
9 Ayvengo
 
01.02.13
18:24
(0) А цель какая у процедуры? Скопировать записи регистра из источника в приемник?
10 Ayvengo
 
01.02.13
18:26
Одинаковы ли регистры по составу?
Советую вместо этого
Справочники.Контрагенты.НайтиПоНаименованию
создать заранее соответствие с ключом- наименование и значением ссылка (будет в 100500 раз быстрее работать), если значений в РегСведКонтактИнфа много.
11 manti
 
04.02.13
09:31
Выходные были аднако))
пишет такую ошибку
Ошибка при вызове метода контекста (Записать)
                       КонтактыАгАт.Записать();
по причине:
Запись не верна! Значение поля не соответствует установленному отбору: КонтактнаяИнформация: Войсковая часть 75053, Телефон, Телефон контрагента (Регистр сведений: Контактная информация; Номер строки: 1; Поле: Объект)
12 manti
 
04.02.13
09:33
(4) запимываем, не считываем из регистра)
13 and2
 
04.02.13
09:33
КонтактыАгАт.Отбор.Объект.Установить(Выборка.Ссылка);

ЗаписьРегистра.Объект = Справочники.Контрагенты.НайтиПоНаименованию(ТекЗапись.Объект.Наименование);                    
                   

это 2 разных человека.....
14 Мыш
 
04.02.13
09:43
> СпрКонтраг = База.Справочники.Контрагенты;
Это из внешнего источника.
> Выборка = СпрКонтраг.ВыбратьИерархически();
Выборка соответственно тоже из внешнего источника.
> КонтактыАгАт = РегистрыСведений.КонтактнаяИнформация.СоздатьНаборЗаписей();
Набор записей из текущей БД.
> КонтактыАгАт.Отбор.Объект.Установить(Выборка.Ссылка);
И вот здесь кроется зло. Во-первых нет "Выборка.Следующий()", во-вторых отбор для текущей базы по внешней ссылке делать нельзя.

> Тип = Перечисления.ТипыКонтактнойИнформации[метпер.Имя];

Называть переменную "Тип" не комильфо.
15 manti
 
04.02.13
10:46
(13) вот подставил из выборки с проверкой на запись в базе примемнике
РегСведКонтактИнфа = База.РегистрыСведений.КонтактнаяИнформация.СоздатьНаборЗаписей();
   КонтактыАгАт       = РегистрыСведений.КонтактнаяИнформация.СоздатьНаборЗаписей();
   
   КонтактыАгАт.Отбор.Объект.Установить(Справочники.Контрагенты.НайтиПоНаименованию(Выборка.Ссылка.Наименование));
   
   РегСведКонтактИнфа.Отбор.Объект.Значение = Выборка.Ссылка;
   РегСведКонтактИнфа.Отбор.Объект.Использование = Истина;
   РегСведКонтактИнфа.Прочитать();

   Для каждого ТекЗапись  Из РегСведКонтактИнфа Цикл
       
       ЗаписьРегистра = КонтактыАгАт.Добавить();
       
       НомТипа = База.Перечисления.ТипыКонтактнойИнформации.Индекс(ТекЗапись.Тип);
       ИмяТипа = База.Метаданные().Перечисления.ТипыКонтактнойИнформации.EnumValues.Get(НомТипа).Name;
       
       Для Каждого метпер Из Метаданные.Перечисления.ТипыКонтактнойИнформации.ЗначенияПеречисления Цикл
           Если метпер.Имя = ИмяТипа   тогда
               //КонтактыАгАт.Тип = Перечисления.ТипыКонтактнойИнформации[метпер.ИмяТипа];
               Тип = Перечисления.ТипыКонтактнойИнформации[метпер.Имя];
           КонецЕсли;    
       КонецЦикла;
       
       ЗаписьРегистра.Объект = Справочники.Контрагенты.НайтиПоНаименованию(Выборка.Ссылка.Наименование);//ТекЗапись.Объект.Код
       ЗаписьРегистра.Тип    = Тип;
       ЗаписьРегистра.Вид    = Справочники.ВидыКонтактнойИнформации.НайтиПоНаименованию(ТекЗапись.Вид.Наименование);
       ЗаписьРегистра.Представление = ТекЗапись.Представление;
       КонтактыАгАт.Записать();
       
       Сообщить("Х" +ТекЗапись.Объект.Наименование+" "+Тип+" "+ ТекЗапись.Вид.Наименование+" "+ТекЗапись.Представление);
       
   КонецЦикла;
(14) << во-вторых отбор для текущей базы по внешней ссылке делать нельзя.
сам элемент был записан ранее, Следующий() - уже выполнилось) А как сделать отбор по другому? я же вроде проверю = существует ли в базе НайтиПоНаименованию()
16 manti
 
04.02.13
11:00
http://help1c.com/faq/view/648.html
вроде получилось))
17 Ayvengo
 
05.02.13
11:36
(16) избавься от этого
Справочники.Контрагенты.НайтиПоНаименованию(Выборка.Ссылка.Наименование);
Плохой тон :)
Проблемы невозможно решaть нa том же уровне компетентности, нa котором они возникaют. Альберт Эйнштейн