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

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;
		КонецЦикла;
		
	КонецЦикла;
	
КонецПроцедуры
Показать
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот