Узнать имя реквизита по в ссылке по значению.

1. Serega-artem 17 23.04.20 18:01 Сейчас в теме
Добрый день, коллеги!

Возможно имя темы сформировал немного криво. Суть вопроса вот в чем. Нахожу ссылки на объект через

НайтиПоСсылкам()


Получаю ТЗ в которой есть список объектов, в которых есть ссылка на указанный объект. Нужно получить имя реквизита в объекте, в котором есть эта ссылка. Как реализовать? Единственная мысль: через метаданные получать все реквизиты объекта и в цикле искать совпадение по значению. Но это как-то громоздко и долго. М.б. есть способ проще?
По теме из базы знаний
Найденные решения
7. soft_wind 27.04.20 12:32 Сейчас в теме
(6) действительно, в файл выгружать не надо, это если у вас Оччччень большой документ/объект,
я использовать такой код, под себч адаптируйте - это пример
получение ХМЛ строки

//получение ХМЛ строки
лкОбъектXDTO = СериализаторXDTO.ЗаписатьXDTO(лкДанные);
лкЗаписьXML = Новый ЗаписьXML;
лкЗаписьXML.УстановитьСтроку();
ФабрикаXDTO.ЗаписатьXML(лкЗаписьXML,лкОбъектXDTO);
лкСтрокаИсх = лкЗаписьXML.Закрыть();

//Какой-то ваш код
//лкСтрокаНов =Обработать(лкСтрокаИсх);

//обратно превращаем строку в объект
лкЧтениеXML = Новый ЧтениеXML;
лкЧтениеXML.УстановитьСтроку(лкСтрокаНов);
лкОбъектXDTO = СериализаторXDTO.ПрочитатьXML(лкЧтениеXML);
лкЧтениеXML.Закрыть();

Показать
Serega-artem; +1 Ответить
4. soft_wind 23.04.20 23:26 Сейчас в теме
(3)
Если не трудно, развейте мысль. Любопытный вариант.


да в общем все элементарно, сериализуете объект документа через Фабрику ХДТО,
получается такая длинная строка в формате ХМЛ
а затем выполняете замену

//одной командой можно заменить или очистить (не)нужную Ссылку
ХМЛНовыйДок = СтрЗаменить(ХМЛДанные, ХМЛСслкаЧтоЗаменить, ХМЛСсылкНаЧтоЗаменить);

затем обратно через ХДТО из ХМЛНовыйДок получаете объект Документ и сохраняете.

на все провсе 10 строчек кода
6. Serega-artem 17 24.04.20 13:06 Сейчас в теме
(4) Смотрите, написал вот такой вот код:

&НаСервере
Процедура ЗаменаСсылокНаСервере()
	Для каждого ТекСтр из Объект.НайденныеСсылки цикл 
		Об = ТекСтр.СсылкаНаОбъект.ПолучитьОбъект(); 
		ИмяФайлаХМЛ = ПолучитьИмяВременногоФайла(".xml"); 
	    XDTO = Новый СериализаторXDTO(ФабрикаXDTO);
		XML = Новый ЗаписьXML;
		XML.ОткрытьФайл(ИмяФайлаХМЛ);
		XDTO.ЗаписатьXML(XML, Об, НазначениеТипаXML.Явное);
		XML.Закрыть();
		ТекстФайл = Новый ТекстовыйДокумент; 
		ТекстФайл.Прочитать(ИмяФайлаХМЛ); 
		Текст =  ТекстФайл.ПолучитьТекст(); 
		НовыйТекст = СтрЗаменить(Текст,ТекСтр.ИсходнаяСсылка.УникальныйИдентификатор(),Объект.ЗаменитьНа.УникальныйИдентификатор()); 
		ТекстФайл.УстановитьТекст(НовыйТекст); 
		ТекстФайл.Записать(ИмяФайлаХМЛ);
		XML = Новый ЧтениеXML;
		XML.ОткрытьФайл(ИмяФайлаХМЛ);		
		XDTO = Новый СериализаторXDTO(ФабрикаXDTO);
		Об = XDTO.ПрочитатьXML(XML);
		Об.Записать(); 
	КонецЦикла; 	
	КонецПроцедуры
Показать


Получается следующее:

1. Выгружаем объект в файл.
2. Меняем текст в файле.
3. загружаем объект из файла.

Все работает, но ощущение того, что удаляю гланды с задней стороны меня не покидает. Нигде не могу прочитать (или понять прочитанное) как сделать тоже самое, но без записи в файл. Подскажите?
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. soft_wind 23.04.20 22:00 Сейчас в теме
(1) уж не замену ли дублей пишете?

если да, то лучше через объект ХДТО делайте!
а если нет, то перебором реквизитов, (можно ограничить проверкой на содержащих тип искомой ссылки)

а если в ТЧ, ваша ссылка находится?, как номера строчек будете возвращать/привязывать к имени колонки в которой данная Ссылка ?
3. Serega-artem 17 23.04.20 22:43 Сейчас в теме
(2) Спасибо, что откликнулись! Ну не замену дублей, но в целом что-то примерно подобное, но для более узких и специфических задач.

если да, то лучше через объект ХДТО делайте!


Если не трудно, развейте мысль. Любопытный вариант.


а если нет, то перебором реквизитов, (можно ограничить проверкой на содержащих тип искомой ссылки)

а если в ТЧ, ваша ссылка находится?, как номера строчек будете возвращать/привязывать к имени колонки в которой данная Ссылка ?


Да придумать-то можно много. Но будет очень линейно и громоздко. Вот и думаю как сделать это всё с человеческим лицом.
4. soft_wind 23.04.20 23:26 Сейчас в теме
(3)
Если не трудно, развейте мысль. Любопытный вариант.


да в общем все элементарно, сериализуете объект документа через Фабрику ХДТО,
получается такая длинная строка в формате ХМЛ
а затем выполняете замену

//одной командой можно заменить или очистить (не)нужную Ссылку
ХМЛНовыйДок = СтрЗаменить(ХМЛДанные, ХМЛСслкаЧтоЗаменить, ХМЛСсылкНаЧтоЗаменить);

затем обратно через ХДТО из ХМЛНовыйДок получаете объект Документ и сохраняете.

на все провсе 10 строчек кода
6. Serega-artem 17 24.04.20 13:06 Сейчас в теме
(4) Смотрите, написал вот такой вот код:

&НаСервере
Процедура ЗаменаСсылокНаСервере()
	Для каждого ТекСтр из Объект.НайденныеСсылки цикл 
		Об = ТекСтр.СсылкаНаОбъект.ПолучитьОбъект(); 
		ИмяФайлаХМЛ = ПолучитьИмяВременногоФайла(".xml"); 
	    XDTO = Новый СериализаторXDTO(ФабрикаXDTO);
		XML = Новый ЗаписьXML;
		XML.ОткрытьФайл(ИмяФайлаХМЛ);
		XDTO.ЗаписатьXML(XML, Об, НазначениеТипаXML.Явное);
		XML.Закрыть();
		ТекстФайл = Новый ТекстовыйДокумент; 
		ТекстФайл.Прочитать(ИмяФайлаХМЛ); 
		Текст =  ТекстФайл.ПолучитьТекст(); 
		НовыйТекст = СтрЗаменить(Текст,ТекСтр.ИсходнаяСсылка.УникальныйИдентификатор(),Объект.ЗаменитьНа.УникальныйИдентификатор()); 
		ТекстФайл.УстановитьТекст(НовыйТекст); 
		ТекстФайл.Записать(ИмяФайлаХМЛ);
		XML = Новый ЧтениеXML;
		XML.ОткрытьФайл(ИмяФайлаХМЛ);		
		XDTO = Новый СериализаторXDTO(ФабрикаXDTO);
		Об = XDTO.ПрочитатьXML(XML);
		Об.Записать(); 
	КонецЦикла; 	
	КонецПроцедуры
Показать


Получается следующее:

1. Выгружаем объект в файл.
2. Меняем текст в файле.
3. загружаем объект из файла.

Все работает, но ощущение того, что удаляю гланды с задней стороны меня не покидает. Нигде не могу прочитать (или понять прочитанное) как сделать тоже самое, но без записи в файл. Подскажите?
7. soft_wind 27.04.20 12:32 Сейчас в теме
(6) действительно, в файл выгружать не надо, это если у вас Оччччень большой документ/объект,
я использовать такой код, под себч адаптируйте - это пример
получение ХМЛ строки

//получение ХМЛ строки
лкОбъектXDTO = СериализаторXDTO.ЗаписатьXDTO(лкДанные);
лкЗаписьXML = Новый ЗаписьXML;
лкЗаписьXML.УстановитьСтроку();
ФабрикаXDTO.ЗаписатьXML(лкЗаписьXML,лкОбъектXDTO);
лкСтрокаИсх = лкЗаписьXML.Закрыть();

//Какой-то ваш код
//лкСтрокаНов =Обработать(лкСтрокаИсх);

//обратно превращаем строку в объект
лкЧтениеXML = Новый ЧтениеXML;
лкЧтениеXML.УстановитьСтроку(лкСтрокаНов);
лкОбъектXDTO = СериализаторXDTO.ПрочитатьXML(лкЧтениеXML);
лкЧтениеXML.Закрыть();

Показать
Serega-artem; +1 Ответить
8. Serega-artem 17 27.04.20 12:59 Сейчас в теме
(7) Спасибо большое за подсказку!
5. Serega-artem 17 24.04.20 09:50 Сейчас в теме
Хм! А ведь и правда всё гениальное просто! Спасибо большое!
Оставьте свое сообщение

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