Имя: Пароль:
1C
1С v8
Подскажите как правильно работать с ссылкой и объектом
0 fungus
 
24.11.11
11:14
Цель. Вытащить из регистра сведений контргента и определить значение реквизита ФормаСобственности.

> Функция ПолучитьДанныеАвто(Выборка)
> Результат = Новый Структура;
> Результат.Очистить();
> Отбор = Новый Структура;
> Отбор.Очистить();
> Отбор.Вставить("Автомобиль",Выборка.Автомобиль);
> Отбор.Вставить("ВидЗначения",Перечисления.ДополнительнаяИнформацияАвтомобилей.Хозяин);
> Запись = РегистрыСведений.Автомобили.ПолучитьПоследнее(Выборка.Дата, Отбор);
> Хозяин = Запись.Значение; //посмотри в отладчике что это
> Контр = Хозяин.ПолучитьОбъект();  //ошибка здесь, пишет значение Контр не является значением объектного типа.

>ТипКонтр = Контр.ФормаСобственности;

------------
делаю это все в форме внешнего отчета. Подскажите что не так.
1 alkov
 
24.11.11
11:16
И в какой строке тут получают контрагента?
2 Maxus43
 
24.11.11
11:20
ничо не понял
3 fungus
 
24.11.11
11:27
Запись = РегистрыСведений.Автомобили.ПолучитьПоследнее(Выборка.Дата, Отбор);
Возвращает значение СправочникСсылка.Контрагенты.

Далее я пытаюсь получить объект чтобы потом извлечь значение реквизита ФормаСобственности.
конструкция Хозяин.ПолучитьОбъект() возвращает значение СправочникОбъект.Контрагенты

далее при присвоении переменной Контр значения Хозяин.ПолучитьОбъект() происходит ошибка. Выдается сообщение "Контр не является значением объектного типа "
4 Maxus43
 
24.11.11
11:30
>>Запись = РегистрыСведений.Автомобили.ПолучитьПоследнее(Выборка.Дата, Отбор);
>>Возвращает значение СправочникСсылка.Контрагенты

не может быть. оно возвращает запись регистра
5 Scooter
 
24.11.11
11:33
(0)объект нужно получать только если ты его будешь менять
6 DrShad
 
24.11.11
11:33
Запись.Значение; //посмотри в отладчике что это

посмотрел что это?
7 fungus
 
24.11.11
11:36
(4) пардон,  следующая строка Запись.Значение Возвращает значение СправочникСсылка.Контрагенты.
(5) мне читать надо только, т.е. объект ненадо поулчать? А почему тогда при попытке засунуть ссылку на контрагента выдается ошибка, я думал проблема в том что надо объект получить.

(6) извеняюсь. это не принимать во внимание, опечатка.
8 Scooter
 
24.11.11
11:38
(7)поставь точку останова на
>Хозяин = Запись.Значение;

посмотри в отладчике на "Запись.Значение" и скажи нам
9 fungus
 
24.11.11
11:38
(6) это значение типа СправочникСсылка.Контрагент
10 DrShad
 
24.11.11
11:40
(9) странно
11 fungus
 
24.11.11
11:40
А значение имеет что это выполняется в модуле формы внешнего отчета?
12 hhhh
 
24.11.11
11:41
(9) ну и пиши Контр = Хозяин;. Что ты нам мозги канифолишь?
13 Maxus43
 
24.11.11
11:41
Весь код в студию. ибо
Контр = Хозяин.ПолучитьОбъект();  //ошибка здесь, пишет значение Контр не является значением объектного типа

невозможно впринципе
14 fungus
 
24.11.11
11:45
Весь модуль формы внешнего отчета. На форме выбирается период.
К кнопке сформировать привязана процедура КнопкаСформироватьНажатие.
В итоге в макет выводится табличка с клиентами определенного бренда авто.
--------------
Процедура КнопкаСформироватьНажатие(Кнопка)
   
Макет = ПолучитьМакет("Макет");
ОблСтрока = Макет.ПолучитьОбласть("Строка");
ТабДок = Новый ТабличныйДокумент;
Выборка = Документы.ЗаказНаряд.Выбрать(НачПериода,КонПериода);
   
Пока Выборка.Следующий() Цикл

   Если не Выборка.Проведен ТОгда
       Продолжить;
   КонецЕсли;    

   Если Выборка.Автомобиль.Модель.Производитель = Справочники.Производители.НайтиПоНаименованию("SUZUKI") Тогда
       
        ОблСтрока.Параметры.ДатаДок = Формат(Выборка.Дата,"ДФ=dd.MM.yyyy");
        ОблСтрока.Параметры.VIN     = Выборка.Автомобиль.VIN;
        ОблСтрока.Параметры.Пробег  = Выборка.Автомобиль.ПолучитьОбъект().ЧтениеЗначенияРегистраСведения(Перечисления.ДополнительнаяИнформацияАвтомобилей.Пробег,Выборка.Дата);
        ПолучитьДанныеАвто(Выборка);
   
        ТабДок.Вывести(ОблСтрока);
   КонецЕсли;  
   
КонецЦикла;
         ТабДок.Показать();
КонецПроцедуры

Процедура ВыбПериодНажатие(Элемент)
   НастройкаПериода = Новый НастройкаПериода;
   НастройкаПериода.УстановитьПериод(НачПериода, ?(КонПериода='0001-01-01', КонПериода, КонецДня(КонПериода)));
   НастройкаПериода.РедактироватьКакИнтервал = Истина;
   НастройкаПериода.РедактироватьКакПериод = Истина;
   НастройкаПериода.ВариантНастройки = ВариантНастройкиПериода.Период;
   Если НастройкаПериода.Редактировать() Тогда
       НачПериода = НастройкаПериода.ПолучитьДатуНачала();
       КонПериода = НастройкаПериода.ПолучитьДатуОкончания();
   КонецЕсли;
КонецПроцедуры

Функция ПолучитьДанныеАвто(Выборка)
Результат = Новый Структура;
Результат.Очистить();
Отбор = Новый Структура;
Отбор.Очистить();
Отбор.Вставить("Автомобиль",Выборка.Автомобиль);
Отбор.Вставить("ВидЗначения",Перечисления.ДополнительнаяИнформацияАвтомобилей.Хозяин);
Запись = РегистрыСведений.Автомобили.ПолучитьПоследнее(Выборка.Дата, Отбор);
Хозяин = Запись.Значение;
Контр = Хозяин.ПолучитьОбъект();


Если Контр.ФормаСобственности = Перечисления.ФормыСобственности.ЧастноеЛицо ТОгда
    Результат.Вставить("Фамилия",Запись.Значение.ПолучитьОбъект().Фамилия);
    //Результат.Вставить("Имя",Хозяин.Имя);
    //Результат.Вставить("Отчество",Хозяин.Отчество);
Иначе    
   
КонецЕсли;    

Отбор.Очистить();
Отбор.Вставить("Автомобиль",Выборка.Автомобиль);
Отбор.Вставить("ВидЗначения", Перечисления.ДополнительнаяИнформацияАвтомобилей.Пробег);
Запись = РегистрыСведений.Автомобили.ПолучитьПоследнее(Выборка.Дата, Отбор);
Пробег = Запись.Значение;
Результат.Вставить("Пробег",Пробег);

Возврат    Результат;


КонецФункции
15 DrShad
 
24.11.11
11:49
[Если Контр.ФормаСобственности = Перечисления.ФормыСобственности.ЧастноеЛицо ТОгда
    Результат.Вставить("Фамилия",Запись.Значение.ПолучитьОбъект().Фамилия);]
просто порвало, вот нафига перед этим Запись.Значение пихать в  Хозяин, потом в Контр пихать Хозяин.ПолучитьОбъект() чтобы снова написать Запись.Значение.ПолучитьОбъект().Фамилия?
16 hhhh
 
24.11.11
11:51
(14) ну значит у тебя там уже есть поле Контр на форме или реквизит Контр, поэтому и ругается. Переименуй, напиши

ЧистоМойКонтрДляОпределенияЗначенияРеквизитаФормаСобственности = Хозяин.ПолучитьОбъект();

Если ЧистоМойКонтрДляОпределенияЗначенияРеквизитаФормаСобственности.ФормаСобственности = Перечисления.ФормыСобственности.ЧастноеЛицо ТОгда
17 fungus
 
24.11.11
12:10
(15) будем исправляться, на оскара не претендую, но понимать и делать выводы способен.
18 fungus
 
24.11.11
12:34
Переделал так


------
Отбор.Вставить("Автомобиль",Выборка.Автомобиль);
Отбор.Вставить("ВидЗначения",Перечисления.ДополнительнаяИнформацияАвтомобилей.Хозяин);
Запись = РегистрыСведений.Автомобили.ПолучитьПоследнее(Выборка.Дата, Отбор);
Хозяин = Запись.Значение;

Если Хозяин.ФормаСобственности = Перечисления.ФормыСобственности.ЧастноеЛицо ТОгда
    Результат.Вставить("Фамилия",Хозяин.Фамилия);
    //Результат.Вставить("Имя",Хозяин.Имя);
    //Результат.Вставить("Отчество",Хозяин.Отчество);
Иначе    
   
КонецЕсли;    

---------

теперь ругается что Значение не является значением объектного типа (ФормаСобственности)
Если Хозяин.ФормаСобственности = Перечисления.ФормыСобственности.ЧастноеЛицо ТОгда
19 DrShad
 
24.11.11
12:38
дык у тебя Запись должна быть Структурой, а свойство структуры ты не получил
20 fungus
 
24.11.11
13:22
(19) не совсем понял как это.
21 fungus
 
24.11.11
15:25
Вопрос снят. С точки зрения кода все верно, косяк в данных. Ошибка вылетала потомучто в ресурсе регистра не всегда есть значение. Нужно проверять есть ли там значение и только потом читать его.