Как пройтись по всем реквизитам (в том числе в ТЧ)произвольного документа или справочника в цикле

1. AndrewKop 08.08.18 15:31 Сейчас в теме
Что написать чтобы взлетело?

Процедура ТыкНаСервере(ОбъектБД)
	МетаданныеОбъектБД = Метаданные.НайтиПоТипу(ТипЗнч(ОбъектБД));
	Для Каждого Реквизит Из МетаданныеОбъектБД.Реквизиты Цикл
		Сообщить(Реквизит + " = " + ОбъектБД[Реквизит.Имя]);
	КонецЦикла;
		
КонецПроцедуры


Не работает конкретно ОбъектБД[Реквизит.Имя].
По теме из базы знаний
Найденные решения
6. Octopus 337 08.08.18 15:43 Сейчас в теме
(5) Нет, к реквизиту можно обратиться или через точку, или через квадратные скобки. Так что вот такой код точно сработает для ссылочных типов:
    Для Каждого Реквизит Из ОбъектБД.Метаданные().Реквизиты Цикл
        Сообщить(Реквизит.Имя + " = " + ОбъектБД[Реквизит.Имя]);
    КонецЦикла;


Важно обращаться именно к свойству Имя
11. spacecraft 08.08.18 16:03 Сейчас в теме
(10) все просто.
Сообщить(Реквизит + " = " + ОбъектБД[Реквизит.Имя]);
Знак "+" может быть использован как в сложении, так и в конкатенации строк.
Реквизит это не строка. Платформа пытается привести к числу. Тоже не получается. Вот и ошибка: "Преобразование значения к типу Число не может быть выполнено"
Когда ставим "" + Реквизит, то уже объект Реквизит платформой неявно приводится к строке. Вот и отрабатывает.
Или сразу указываем "Реквизит.Имя". Это уже строка и конкатенация строк отрабатывает штатно.
12. Octopus 337 08.08.18 16:03 Сейчас в теме
(10)
Следите за пальцами

Реквизит - тип ОбъектМетаданных
"" + Реквизит - тип Строка, т.к при сложении все преобразуется к типу первого слагаемого
Реквизит.Имя - тип Строка

А сложение Реквизит + " = " выдаст ошибку, т.к. к объекту метаданных ничего прибавить нельзя
Остальные ответы
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
2. Octopus 337 08.08.18 15:33 Сейчас в теме
(1) А что есть ОбъектБД? Что значит, не работает, какую ошибку выдает?

Для ссылочных типов вместо НайтиПоТипу можно использовать ОбъектБД.Метаданные()
3. AndrewKop 08.08.18 15:36 Сейчас в теме
(2) Либо Документ.Ссылка либо Справочник Ссылка (составной тип на форме).

{ВнешняяОбработка.ВнешняяОбработка2.Форма.Форма.Форма(6)}: Преобразование значения к типу Число не может быть выполнено
Сообщить(Реквизит + " = " + ОбъектБД[Реквизит.Индекс]);
4. Octopus 337 08.08.18 15:38 Сейчас в теме
(3)
Сообщить("" + Реквизит.Имя + " = " + ОбъектБД[Реквизит.Имя]); 
5. AndrewKop 08.08.18 15:40 Сейчас в теме
Чет я запутался. Вы сообщение не правили? а то я увидел у вас ОбъектБД[Реквизит.Индекс] - Пишет. Поле объекта не обнаружено. И этот вариант не катит тоже.
Я так понимаю к реквизиту конкретного объекта можно обратиться только по индексу. Если вообще возможно. Просто к объекту метаданных можно так обращаться.
Пример из книги:

листинг 3.17. Использование итератора «Для Каждого»

Сообщение = Новый СообщениеПользователю;
Для Каждого Справочник из Метаданные.Справочники Цикл
Сообщение.Текст = Символы.ПС + Справочник.ПолноеИмя();
Сообщение.Сообщить();
МенеджерСправочника = Справочники[Справочник.Имя];
Выборка = МенеджерСправочника.Выбрать();
Пока Выборка.Следующий() Цикл
Сообщение.Текст = Выборка.Наименование;
Сообщение.Сообщить();
КонецЦикла;
КонецЦикла;
6. Octopus 337 08.08.18 15:43 Сейчас в теме
(5) Нет, к реквизиту можно обратиться или через точку, или через квадратные скобки. Так что вот такой код точно сработает для ссылочных типов:
    Для Каждого Реквизит Из ОбъектБД.Метаданные().Реквизиты Цикл
        Сообщить(Реквизит.Имя + " = " + ОбъектБД[Реквизит.Имя]);
    КонецЦикла;


Важно обращаться именно к свойству Имя
8. AndrewKop 08.08.18 15:49 Сейчас в теме
(6) Спасибо. Заработало. но не до конца одупляю почему ваш код отрабатывает а мой нет.
9. Octopus 337 08.08.18 15:50 Сейчас в теме
(8) Потому что у вас переменная Реквизит. А это не строка, а ОбъектМетаданных. У меня Реквизит.Имя - а это уже строка
10. AndrewKop 08.08.18 15:56 Сейчас в теме
(9) Вы уж простите, но все равно не доходит.
Прикрепленные файлы:
11. spacecraft 08.08.18 16:03 Сейчас в теме
(10) все просто.
Сообщить(Реквизит + " = " + ОбъектБД[Реквизит.Имя]);
Знак "+" может быть использован как в сложении, так и в конкатенации строк.
Реквизит это не строка. Платформа пытается привести к числу. Тоже не получается. Вот и ошибка: "Преобразование значения к типу Число не может быть выполнено"
Когда ставим "" + Реквизит, то уже объект Реквизит платформой неявно приводится к строке. Вот и отрабатывает.
Или сразу указываем "Реквизит.Имя". Это уже строка и конкатенация строк отрабатывает штатно.
12. Octopus 337 08.08.18 16:03 Сейчас в теме
(10)
Следите за пальцами

Реквизит - тип ОбъектМетаданных
"" + Реквизит - тип Строка, т.к при сложении все преобразуется к типу первого слагаемого
Реквизит.Имя - тип Строка

А сложение Реквизит + " = " выдаст ошибку, т.к. к объекту метаданных ничего прибавить нельзя
7. spacecraft 08.08.18 15:48 Сейчас в теме
(1) вообще-то этого достаточно:
Сообщить(""+Реквизит + " = " + ОбъектБД[Реквизит.Имя]);
13. AndrewKop 08.08.18 16:06 Сейчас в теме
Все дошло. Ругался он не на ОбъектБД[Реквизит.Имя] а на Реквизит + " = ". Огромное спасибо!!!
14. JohnGalt 57 08.08.18 16:56 Сейчас в теме
Кроме реквизитов есть еще коллекция "СтандартныеРеквизиты"
16. AndrewKop 08.08.18 18:09 Сейчас в теме
(14) Не знал, что они отдельно. спасибо за заметку!
17. Octopus 337 08.08.18 19:31 Сейчас в теме
(14) Еще есть общие реквизиты )))
18. spacecraft 08.08.18 19:46 Сейчас в теме
(17) много чего есть, только не доступные через метаданные объекта.
Реквизиты, ТабличныеЧасти и СтандартныеРеквизиты доступны. Общие резквизиты - нет.
15. AndrewKop 08.08.18 18:08 Сейчас в теме
"вончо" написал. даже работает)

Процедура ТыкНаСервере(ОбъектБД)
	
	МетаданныеОбъектБД = Метаданные.НайтиПоТипу(ТипЗнч(ОбъектБД));
	Для Каждого Реквизит Из МетаданныеОбъектБД.Реквизиты Цикл
		Сообщить(""+Реквизит + " = " + ОбъектБД[Реквизит.Имя]);
	КонецЦикла;

	Для Каждого ТЧ Из ОбъектБД.Метаданные().ТабличныеЧасти Цикл
				
		Сообщить(""+ТЧ);
		НомерСтроки = 1;
		Для Каждого Строка Из ОбъектБД[ТЧ.Имя] Цикл
			
			Для Каждого Реквизит Из ТЧ.Реквизиты Цикл
				Сообщить("Строка номер " + НомерСтроки + " " + Реквизит + " = " + Строка[Реквизит.Имя]);
			КонецЦикла;
			НомерСтроки = НомерСтроки + 1;
		КонецЦикла;
		
	КонецЦикла;
	
КонецПроцедуры
Показать
Оставьте свое сообщение
Вакансии
Руководитель направления 1С
Москва
зарплата от 350 000 руб.
Полный день

1С Программист
Москва
зарплата от 180 000 руб.
Полный день

Программист 1С
Москва
зарплата от 180 000 руб. до 220 000 руб.
Полный день

Аналитик 1С / Бизнес-аналитик
Нижний Новгород
зарплата от 100 000 руб. до 250 000 руб.
Временный (на проект)

Программист 1С
Москва
зарплата от 250 000 руб.
Полный день