Имя: Пароль:
1C
 
Как отличить созданный объект от пустого?
0 AlexYa
 
27.05.10
16:36
Есть реквизит формы типа СправочникОбъект. При открытии формы он пустой.
Затем он либо находиться в Справочнике, либо создается. Но вновь созданный от пустого никак не могу отличить. Например, при работе с формой нужно понять, объект создан или нет, чтобы не получить исключение "Элемент не выбран!".

Вот примерный код:

Функция ОбъектПолучить(Владелец)
   Перем ОбъектНайден;
   //Объект создан
   Если (Объект.Ссылка <> Справочники.Спр1.ПустаяСсылка()) Тогда
       Возврат Истина; //Уже есть объект
   КонецЕсли;
   
   ОбъектНайден = Ложь;
   //Ищем первый по владельцу
   Выборка = Справочники.Спр1.Выбрать(, Владелец);
   Если Выборка.Следующий() Тогда
       Объект = ВыборкаМодификацияУГП.Ссылка.ПолучитьОбъект();
       ОбъектНайден = Истина;
   КонецЕсли;
   Если Не ОбъектНайден Тогда
       Объект = Справочники.Спр1.СоздатьЭлемент();
       СоздатьСсылкуНовомуОбъекту( Объект);
       Возврат Ложь; //Новый объект
   КонецЕсли;
   Возврат Истина;
   
КонецФункции

Процедура СоздатьСсылкуНовомуОбъекту(пОбъект, СсылкаНового = Неопределено) Экспорт

   Если пОбъект.ЭтоНовый() Тогда
       
       СсылкаНового = пОбъект.ПолучитьСсылкуНового();
       Если НЕ ЗначениеЗаполнено(СсылкаНового) Тогда
           СсылкаНового = Справочники[пОбъект.Метаданные().Имя].ПолучитьСсылку();
       КонецЕсли;
       
       Если НЕ ЗначениеЗаполнено(пОбъект.ПолучитьСсылкуНового()) Тогда
           пОбъект.УстановитьСсылкуНового(СсылкаНового);
       КонецЕсли;    
       
   КонецЕсли;

КонецПроцедуры


Дело в том, что после создания Объект.Ссылка всегда пустая, даже после последней процедуры. При этом до создания Объект.Ссылка.Пустая() выдает ошибку, а после = Истина. Т.е. два варианта пустоты :). Совсем пустая и не совсем.

Вариант обработки исключений или переменная в модуле - выход из положения. Но я хотел бы системное решение, которое позволит отличить пустой реквизит типа Объект от созданного Объекта.
Форум посмотрел, но ничего пока не нашел.
Кто что предложит?
1 Mort
 
27.05.10
16:41
Какая жесть
2 levlvov
 
27.05.10
16:43
СовсемПустая = (Объект.Ссылка = Объект.Ссылка);
НеСовсемПустая = Ложь;

Попытка
   НеСовсемПустая = (Объект.Ссылка.Пустая() = Объект.Ссылка.Пустая());

Исключение

КонецПопытки;
3 nop
 
27.05.10
16:45
ппц сколько вас...
Объект = Новый (ТипЗнч(Объект))
4 nop
 
27.05.10
16:46
"Форум посмотрел, но ничего пока не нашел. "

вот соседняя ветка v8: НайтиПоРеквизиту. Если ничего не найдено...
5 AlexNew
 
27.05.10
16:46
ЭтоНовый()
6 Mitriy
 
27.05.10
16:50
это что тут было вообще?
7 levlvov
 
27.05.10
16:51
(3) а им читать некогда...
8 Aprobator
 
27.05.10
17:18
(0) нефига не понял - нужна проверка на заполнение реквизита формы или где?
9 AlexYa
 
27.05.10
23:28
Спасибо всем, кто давил на клавиши.
Было бы ещё лучше, если бы предварительно проверяли то ,что пишут.
Итак (3) всегда Ложь
(2) для попытки есть более надежный вариант Объект.ЭтоНовый()
(4) немного не тот звон

Пока однозначный вариант дает

ЭтоНесозданный = Ложь;
ЭтоНовый = Ложь;
Попытка
  ЭтоНовый = Объект.ЭтоНовый();
Исключение
  ЭтоНесозданный = Истина;
КонецПопытки;

Хотелось, конечно, изящный и простой вариант определения состояния (объект не создан - объект создан новый - объект есть в справочнике). Но увы...

Для (8). У формы есть реквизит типа СправочникОбъект. Заполнить и сохранить его нельзя до тех пор, пока он не будет приравнен созданному элементу:
Объект = Справочники.Спр1.СоздатьЭлемент()

(0) Исправление:
Вместо
Объект = ВыборкаМодификацияУГП.Ссылка.ПолучитьОбъект();
Надо
Объект = Выборка.Ссылка.ПолучитьОбъект();
10 levlvov
 
27.05.10
23:34
(9) Атлична, топик в книгу знаний...
11 nop
 
28.05.10
08:28
(9) 1. Подумай когда Истина будет. Если не менять поля наверно.
2. Используй Объект.ДополнительныеСвойства, раз переменная модуля не устраивает
12 Aprobator
 
28.05.10
15:38
(() народ где вы такие задачи тока берете?
13 Ненавижу 1С
 
гуру
31.05.10
10:34
(9) если хочется изящней, то анализировать тип значения переменной
Основная теорема систематики: Новые системы плодят новые проблемы.