![]() |
|
Получение значения реквизита по его имени | ☑ | ||
---|---|---|---|---|
0
Beduir
18.08.05
✎
09:40
|
Здравствуйте!
Есть ссылка на Справочник.ТекущийЭлемент и есть имя реквизита в строке. Как можно получить значение реквизита по его имени для этого элемента. Спасибо. |
|||
1
Скользящий
18.08.05
✎
09:41
|
Лучше код покажи.
|
|||
2
Алгоритм
18.08.05
✎
09:42
|
ПолучитьАтрибут(<?>);
Синтаксис: ПолучитьАтрибут(<ИмяРеквизита>) Назначение: Получить значение реквизита по имени идентификатора. Возвращает значение реквизита. Параметры: <ИмяРеквизита> - строковое выражение, содержащее имя реквизита, как оно задано в конфигураторе. |
|||
3
ДенисЧ
18.08.05
✎
09:42
|
ПолучитьАтрибут()
|
|||
4
Beduir
18.08.05
✎
11:48
|
Нравится мне этот форум. Всегда такие оперативные ответы. :)
По результатам запроса, у меня строится отчет, в котором должны быть все реквизиты. Т.к. в запросе нельзя указать, чтобы выбирать все подряд, я в одном месте подглядел, и сделал так: |ТекущийЭлемент = Справочник.МойСправочник.ТекущийЭлемент(); Следовательно при обработке результатов запроса, у меня есть только ссылка на текущий элемент (Запрос.ТекущийЭлемент), но нет ссылки на справочник. Потому применить ПолучитьАтрибут() не получится. Как тут лучше сделать? Можно конечно я что-то не так понимаю, но в 1С я программирую совсем недавно. |
|||
5
Guk
18.08.05
✎
11:49
|
(4) Не то что бы что-то не так, ты напрочь не понимаешь...
|
|||
6
Zmich
18.08.05
✎
11:55
|
"Т.к. в запросе нельзя указать, чтобы выбирать все подряд..."
Это еще почему? Кажись, нельзя в запросе выбрать только строки неограниченной длины... |
|||
7
Beduir
18.08.05
✎
11:55
|
2Guk:
Возможно, в 1С все сильно оличается от других языков. А что не так? ТекстЗапроса = "//{{ЗАПРОС(Запрос) |Обрабатывать НеПомеченныеНаУдаление; |Наименование = Справочник.МойСправочник.Наименование; |ТекущийЭлемент = Справочник.МойСправочник.ТекущийЭлемент(); |Группировка Код без групп; |Условие(Наименование = "1") "; Запрос = СоздатьОбъект("Запрос"); Запрос.Выполнить(ТекстЗапроса); Пока Запрос.Группировка("Код") = 1 Цикл // Как мне здесь получить доступ к остальным реквизитам, не перечисленным в запросе? КонецЦикла; |
|||
8
Beduir
18.08.05
✎
11:56
|
Zmich
Да, это мне и мещает, мне они тоже нужны в результатах. |
|||
9
Guk
18.08.05
✎
11:57
|
(7) Ты хочешь сказать, что то что ты написал в (7) вообще может запуститься без ошибки?...
|
|||
10
Zmich
18.08.05
✎
11:58
|
(8) Допустим, Комментарий - реквизит спр-ка, строка неограниченной длины.
Доступ к нему получишь так (после выполнения запроса): Запрос.ТекущийЭлемент.Комментарий |
|||
11
Zmich
18.08.05
✎
12:02
|
(9) Мда, чо-то и впрямь ошибок дофига...
|
|||
13
Beduir
18.08.05
✎
12:07
|
(9)
Не знаю. Я не пробовал. Я поливину вырезал из всего кода, чтобы форум не загромождать. Мой оригниальный код работает. (10) Ну комментарий мне не нужен. Нужны другие ревизиты, имена которые я заранее не знаю. (11) А где хоть ошибки, чтобы мне знать? |
|||
14
Zmich
18.08.05
✎
12:10
|
1). В запросе после ТекущийЭлемент не надо ставить "()"
2). Объявлена группировка Код, но что такое Код - в запросе не указано. 3). Пишется Наименование = "1". Первая кавычка будет интерпретироваться как окончание текста запроса. 4). Не поставлена точка с запятой после строчки с условием в запросе. |
|||
15
Козёл
18.08.05
✎
12:12
|
Покажи весь код запроса. Очень интересно.
|
|||
16
Beduir
18.08.05
✎
12:15
|
(14)
В оригинале у меня этих ошибок нет. Это я тут их в спешке на лепил (писав код на память). |
|||
17
Zmich
18.08.05
✎
12:17
|
(16) Ну так дай код не на память.
И что значит - "...Нужны другие ревизиты, имена которые я заранее не знаю."? Справочник-то ты знаешь, значит, знаешь и его реквизиты. А вообще всё это фигня какая-то. |
|||
18
Козёл
18.08.05
✎
12:19
|
(16) Автор, с таким твоим подходом я не понимаю, почему Змичь ещё с тобой общается. Тему ф топку.
|
|||
19
Beduir
18.08.05
✎
12:23
|
(17)
Список реквизитов определяет пользовать и добавляет их в таблицу значений. После выполнения запроса, все эти реквизиты из списка должы выводится в отчет. Потом я заранее и не знаю, какие будут выбраны. |
|||
20
Козёл
18.08.05
✎
12:24
|
(19) АВТОР, ЧЕТАЙ НАДПЕСИ ВО ВТАРОМ ПОСТЕ и покаж код в конце концов.
|
|||
21
Guk
18.08.05
✎
12:24
|
(19) Если список реквизитов есть в ТЗ, то почему ты их не знаешь?...
|
|||
22
Beduir
18.08.05
✎
12:29
|
Допустим, имя реквизита "Адрес" (строка неограниченной длины), находится в ТЗ.Реквизит. Как теперь выудить значение этого реквизита из результатов запроса для каждого элемента?
(20) Я не понял, как это использовать. |
|||
23
Zmich
18.08.05
✎
12:36
|
Ну например, так:
Спр = СоздатьОбъект("Справочник.МойСправочник"); Пока Запрос.Группировка("Код") = 1 Цикл ТекущийЭлемент = Запрос.ТекущийЭлемент; ТЗ.ВыбратьСтроки(); Пока ТЗ.ПолучитьСтроку() = 1 Цикл Спр.НайтиЭлемент(ТекущийЭлемент); ЗначениеРеквизита = Спр.ПолучитьАтрибут(ТЗ.Реквизит); // теперь делай с ним, чо хочешь КонецЦикла; КонецЦикла; |
|||
24
Guk
18.08.05
✎
12:36
|
(22) Строишь динамический запрос. На этапе формирования текста запроса через метаданные проверяешь, если строка неограниченной длины, то в запрос не включаешь. Все остальные реквизиты включаешь в запрос по именам. Далее на этапе обхода запроса опять же проверяешь тип реквизита из ТЗ, если неогр. длины, то Запрос.ТекущийЭлемент.ПолучитьАтрибут("РекНеогрДлины"), если нормальный реквизит, то Запрос.ПолучитьАтрибут("НормальныйРек").
ЗЫ: как вариант... |
|||
26
Beduir
18.08.05
✎
12:45
|
(23)
Да это подойдет. Я думал так сделать, но подумал, что будет неправильным вызывать поиска элемента в справочнике (хоть и по ключевому полю) при обработке каждой "строки" запроса. (24) А почему нельзя использовать для всех реквизитов Запрос.ТекущийЭлемент.ПолучитьАтрибут, не включая их в запрос? |
|||
27
Guk
18.08.05
✎
12:47
|
(26) Если тебе не важна скорость и трафик, то можно. Я стараюсь по максимуму использовать локальную выборку запроса...
|
|||
28
Директор PR отдела
18.08.05
✎
12:50
|
В (23) Тупой код. В (24) Умный код.
|
|||
29
Zmich
18.08.05
✎
12:52
|
(28) Да блин, я не претендую на какую-то эстетику. Согласен, что в (24) идея лучше. Просто похоже, что автору в (0) будут не понятны такие выражения, как "Проверяешь через метаданные", "Строишь динамический запрос" и т.п.
|
|||
30
Директор PR отдела
18.08.05
✎
12:56
|
(29) Даже если не понятны, объясни мне зачем использовать НайтиЭлемент. Только как идиоту, у меня нет высшего образования.
|
|||
31
Beduir
18.08.05
✎
12:57
|
(29)
Я конечно в 1С новичок, но я не идиот. Я пробовал использовать Запрос.ТекущийЭлемент.ПолучитьАтрибут, но у меня не заработал. Я подумал, что делаю что-то не то, но видимо просто где-то было ошибка. Но мне все равно не понятно, почему для нормальных реквизитов нужно использовать Запрос.ПолучитьАтрибут("НормальныйРек"), а с неограниченной Запрос.ТекущийЭлемент.ПолучитьАтрибут. Почему нельзя сразу для всех использовать Запрос.ТекущийЭлемент.ПолучитьАтрибут? Объясните мне, чтобы понять. |
|||
32
Zmich
18.08.05
✎
13:01
|
(30). НайтиЭлемент, согласен, зря включил. Это я недавно делал в одном запросе для того, чтобы изменить элементы справочника (т.е. затем делал Записать() - тут без НайтиЭлемент никак не получится). На автомате записал эту фигню и сюда.
|
|||
33
Zmich
18.08.05
✎
13:05
|
(31). Я не говорю, что ты идиот. Просто тебе нужно сперва понять преимущество запросов перед конструкцией типа ВыбратьЭлементы(), ПолучитьЭлемент() и т.п.
|
|||
34
Guk
18.08.05
✎
13:06
|
(31) Запрос возвращает клиенту выборку на локальную машину. Чем больше реквизитов в этой выборке, тем быстрее будет обработка результатов запроса, т.к. понятно что работать с данными на локальной машине быстрее, чем с данными лежащими в сети. Запрос.ТекущийЭлемент возвращает тебе фактически ссылку на элемент справочника, но не на его реквизиты. Когда ты делаешь Запрос.ТекущийЭлемент.ПолучитьАтрибут, то 1С обращается за конкретным значением реквизита на сервер. Наверное ты понимаешь, что это медленнее...
|
|||
35
Beduir
18.08.05
✎
13:18
|
(33)
Преимущество я понимаю, это в 1С я новичок, в некоторых других языках у меня уже есть достаточно большой опыт. И что такое "Строишь динамический запрос", я тоже понимаю. :) (34) Спасибо, теперь понятно. Буду смотреть, почему у меня не работало. |
|||
36
Beduir
18.08.05
✎
13:21
|
Сразу вопрос в тему.
Когда мне выдавались ошибки, что в запросе не могут быть строки неограниченной длины, я думал может обойдусь и без них. Но не понял, как определить, что длина не ограничена. Вот собственно и вопрос, как это определить? Может для нее атрибут ".длина" принмает какое-либо специфическое значение? |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |