Имя: Пароль:
1C
1C 7.7
v7: Подскажите про ТекущийЭлемент()
0 Double_Medved
 
07.12.12
15:34
Подскажите пожалуйста, если мы обходим справочник в цикле, и обращаемся к его реквизитам, и вызываем методы, то обязательно ли писать ТекущийЭлемент()? Как правильно? отладчику пофигу - у него и Спр и Спр.ТекущийЭлемент() - одно и тоже.

Пока (СпрЦеныНоменклатуры.ПолучитьЭлемент() = 1) Цикл
  Если СпрЦеныНоменклатуры.ТекущийЭлемент().ТипЦен = ТипЦены.БазовыйТипЦен Тогда                                 ЕстьБазовыйтипЦен = 1;    
КонецЕсли;
КонецЦикла;
1 Double_Medved
 
07.12.12
15:35
Ой извините это я про 7-ку
2 mikecool
 
07.12.12
15:35
не надо так писать
3 mikecool
 
07.12.12
15:35
Если СпрЦеныНоменклатуры.ТипЦен = ТипЦены.БазовыйТипЦен Тогда
4 Double_Medved
 
07.12.12
15:36
А, спасибо. А когда ТекущийЭлемент() нужен? я что -то не пойму
5 НЕА123
 
07.12.12
15:39
Пока (СпрЦеныНоменклатуры.ПолучитьЭлемент() = 1) Цикл
  Если СпрЦеныНоменклатуры.ТекущийЭлемент().ТипЦен = ТипЦены.БазовыйТипЦен Тогда                                 ЕстьБазовыйтипЦен = 1;    

   Эл = СпрЦеныНоменклатуры.ТекущийЭлемент(); //тут просто необходимо
КонецЕсли;
КонецЦикла;
6 Double_Medved
 
07.12.12
15:39
То есть при присвоении это надо?
7 Double_Medved
 
07.12.12
15:40
А просто при обращении к атрибутам и методам справочника?
8 mikecool
 
07.12.12
15:41
(4) когда надо сравнить с ссылкой или передать куда ее
9 LegO
 
07.12.12
15:41
(6) для того чтобы передать этот элемент.
При присвоении - да.
10 Double_Medved
 
07.12.12
15:41
А например СпрЦеныНоменклатуры.ИспользоватьВладельца(СпрНоменклатура);
11 Double_Medved
 
07.12.12
15:42
Или СпрЦеныНоменклатуры.ИспользоватьВладельца(СпрНоменклатура.Текущийэлемент());
12 LegO
 
07.12.12
15:42
Вот тут на примере можешь увидеть разницу:
13 LegO
 
07.12.12
15:42
спр = СоздатьОбъект("Справочник.ТехОперации");
  спр.ПорядокКодов();
  спр.ВыбратьЭлементы();
  ТекЭл = спр.ТекущийЭлемент();
   
  Сообщить(спр.Наименование);
  спр.Наименование = "Новое наименование";
   
  Сообщить("++++++++++++++++");
  Сообщить(спр.Наименование);
  Сообщить(ТекЭл.Наименование);
  спр.Записать();
  Сообщить("++++++++++++++++");
  Сообщить(спр.Наименование);
  Сообщить(ТекЭл.Наименование);
14 НЕА123
 
07.12.12
15:42
(6)
если нужно на ссылку на элемент(не на выборку), тот да.
еще к (5).

цена = СпрЦеныНоменклатуры.ТекущийЭлемент().ТипЦен

цена = СпрЦеныНоменклатуры.ТипЦен

во втором случае делается кэш объекта.
15 Double_Medved
 
07.12.12
15:48
А если
Эл = СпрЦеныНоменклатуры.ТекущийЭлемент();
То потом Эл.Записать();
Сработает?
16 НЕА123
 
07.12.12
15:48
(14)+
эээ... это только в контексте (0)!
если касается объекта, то в первом случае значение из базы, во втором из объекта.
17 Double_Medved
 
07.12.12
15:49
То есть если я хочу запомнить найденный элемент справочника в переборе и пойти дальше - то так получится?
18 НЕА123
 
07.12.12
15:50
(17)
да.
про Записать() уже не помню.
19 Double_Medved
 
07.12.12
15:50
Пока (СпрЦеныНоменклатуры.ПолучитьЭлемент() = 1) Цикл
  Если СпрЦеныНоменклатуры.ТекущийЭлемент().ТипЦен = ТипЦены.БазовыйТипЦен Тогда                                 ЕстьБазовыйтипЦен = 1;    

   Эл = СпрЦеныНоменклатуры.ТекущийЭлемент(); //тут просто необходимо

КонецЕсли;
КонецЦикла;

Потом я же могу работать с Эл? Это будет объект? Его можно будет сохранять и менять? Извините, я понимаю что вопрос простой, но я что-то запутался, пятница
20 Double_Medved
 
07.12.12
15:52
HEA123, спасибо, мне как раз надо найти в переборе 2 разных элемента справочника, отвечающих 2-м разным условиям, и я хочу из отдельно запомнить, перебрав справочник только 1 раз.
21 Cthulhu
 
07.12.12
15:55
(15): нет.
(17): да.
22 Double_Medved
 
07.12.12
15:58
А почему (15) не сработает? То есть допустим я запомнил элемент справочника Эл = СпрЦеныНоменклатуры.ТекущийЭлемент() и пошел дальше искать по циклу другой элемент. Как мне потом работать с Эл? Что-то типа СпрЦеныНоменклатуры.НайтиПоКоду(Эл.Код)?
23 ADirks
 
07.12.12
16:40
(22) СпрЦеныНоменклатуры.НайтиЭлемент(Эл)

твоё СпрЦеныНоменклатуры - это выборка, её можно перепозиционировать, и через неё записывать инфу в базу.
.ТекущийЭлемент() - это ссылка на объект в базе, с ней особо ничего не сделаешь.
24 Cthulhu
 
07.12.12
22:03
(22): потому что Эл - это ссылка на объект данных. это все равно, как если бы ты, например, пылался овинтить крышку у бутылки на фотографии.
25 Torquader
 
07.12.12
23:32
В семёрке также есть объекты и ссылки, только объект может позиционироваться на разных элементах.
Ссылка же является просто "номером" объекта в базе данных.
Когда мы к ней применяем запрос какого-то реквизита, то создаётся временный объект доступа - достаются данные и объект доступа разрушается.
Чтобы каждый раз не выполнять создание объекта - выполняется кеширование, которое при втором запросе данных выдаёт их из памяти - это достаточно тонкие грабли, и желательно на них не наступать, так как кеширование работает не всегда корректно.
Кроме того, есть объект формы, то есть текущего документа, который нельзя спозиционировать, но можно менять все свойства. В отличие от восьмёрки, он от формы не отделим.

Поэтому, ТекущийОбъект() нужно писать, если мы хотим передать "номер" самого объекта, а не его содержимое.
Дело в том, что у Объекта, который используется для позиционирования, номера нет - так как он зависит от позиции - это тоже достаточно странное поведение программы (даже во внутреннее представление она преобразует объект неспозиционированным).
26 Torquader
 
07.12.12
23:39
P.S.
Что касается применимости присвоения к ссылке, то если обсуждать его строго, то происходит следующее:
Мы выполняем Спр.Наименование="Вася", где Спр=...ТекущийЭлемент();

Перед присвоением создаётся объект - уже спозиционированный на нужном значении и запрашивается значение - в отличие от обычного объекта создаётся упрощённый объект для запроса только нужных данных.
Потом для этого объекта выполняется присвоение - поэтому оно происходит без ошибок.
Перед переходом на следующую строку объект разрушается - и вся присвоенная информация теряется.
Соответственно, выполнить запись также нельзя.
Компьютеры — прекрасное средство для решения проблем, которых до их появления не было.