Узнать имя реквизита по в ссылке по значению.
Добрый день, коллеги!
Возможно имя темы сформировал немного криво. Суть вопроса вот в чем. Нахожу ссылки на объект через
Получаю ТЗ в которой есть список объектов, в которых есть ссылка на указанный объект. Нужно получить имя реквизита в объекте, в котором есть эта ссылка. Как реализовать? Единственная мысль: через метаданные получать все реквизиты объекта и в цикле искать совпадение по значению. Но это как-то громоздко и долго. М.б. есть способ проще?
Возможно имя темы сформировал немного криво. Суть вопроса вот в чем. Нахожу ссылки на объект через
НайтиПоСсылкам()
Получаю ТЗ в которой есть список объектов, в которых есть ссылка на указанный объект. Нужно получить имя реквизита в объекте, в котором есть эта ссылка. Как реализовать? Единственная мысль: через метаданные получать все реквизиты объекта и в цикле искать совпадение по значению. Но это как-то громоздко и долго. М.б. есть способ проще?
По теме из базы знаний
- Сравнение 1С8 и Navision
- Повышение качества разработки. Статья 3. Ошибки программы
- Зачем запросу план и кто его выполняет?
- Разработка и сценарное тестирование с Vanessa-ADD. Практические примеры сценариев. Шаги встроенной библиотеки
- Обновление нетиповой конфигурации с приведением к типовой и выносом всех доработок в расширение. Часть/Способ №1
Найденные решения
(6) действительно, в файл выгружать не надо, это если у вас Оччччень большой документ/объект,
я использовать такой код, под себч адаптируйте - это пример
получение ХМЛ строки
//получение ХМЛ строки
лкОбъектXDTO = СериализаторXDTO.ЗаписатьXDTO(лкДанные);
лкЗаписьXML = Новый ЗаписьXML;
лкЗаписьXML.УстановитьСтроку();
ФабрикаXDTO.ЗаписатьXML(лкЗаписьXML,лкОбъектXDTO);
лкСтрокаИсх = лкЗаписьXML.Закрыть();
//Какой-то ваш код
//лкСтрокаНов =Обработать(лкСтрокаИсх);
//обратно превращаем строку в объект
лкЧтениеXML = Новый ЧтениеXML;
лкЧтениеXML.УстановитьСтроку(лкСтрокаНов);
лкОбъектXDTO = СериализаторXDTO.ПрочитатьXML(лкЧтениеXML);
лкЧтениеXML.Закрыть();
Показать
я использовать такой код, под себч адаптируйте - это пример
получение ХМЛ строки
//получение ХМЛ строки
лкОбъектXDTO = СериализаторXDTO.ЗаписатьXDTO(лкДанные);
лкЗаписьXML = Новый ЗаписьXML;
лкЗаписьXML.УстановитьСтроку();
ФабрикаXDTO.ЗаписатьXML(лкЗаписьXML,лкОбъектXDTO);
лкСтрокаИсх = лкЗаписьXML.Закрыть();
//Какой-то ваш код
//лкСтрокаНов =Обработать(лкСтрокаИсх);
//обратно превращаем строку в объект
лкЧтениеXML = Новый ЧтениеXML;
лкЧтениеXML.УстановитьСтроку(лкСтрокаНов);
лкОбъектXDTO = СериализаторXDTO.ПрочитатьXML(лкЧтениеXML);
лкЧтениеXML.Закрыть();
(3)
да в общем все элементарно, сериализуете объект документа через Фабрику ХДТО,
получается такая длинная строка в формате ХМЛ
а затем выполняете замену
//одной командой можно заменить или очистить (не)нужную Ссылку
ХМЛНовыйДок = СтрЗаменить(ХМЛДанные, ХМЛСслкаЧтоЗаменить, ХМЛСсылкНаЧтоЗаменить);
затем обратно через ХДТО из ХМЛНовыйДок получаете объект Документ и сохраняете.
на все провсе 10 строчек кода
Если не трудно, развейте мысль. Любопытный вариант.
да в общем все элементарно, сериализуете объект документа через Фабрику ХДТО,
получается такая длинная строка в формате ХМЛ
а затем выполняете замену
//одной командой можно заменить или очистить (не)нужную Ссылку
ХМЛНовыйДок = СтрЗаменить(ХМЛДанные, ХМЛСслкаЧтоЗаменить, ХМЛСсылкНаЧтоЗаменить);
затем обратно через ХДТО из ХМЛНовыйДок получаете объект Документ и сохраняете.
на все провсе 10 строчек кода
(4) Смотрите, написал вот такой вот код:
Получается следующее:
1. Выгружаем объект в файл.
2. Меняем текст в файле.
3. загружаем объект из файла.
Все работает, но ощущение того, что удаляю гланды с задней стороны меня не покидает. Нигде не могу прочитать (или понять прочитанное) как сделать тоже самое, но без записи в файл. Подскажите?
&НаСервере
Процедура ЗаменаСсылокНаСервере()
Для каждого ТекСтр из Объект.НайденныеСсылки цикл
Об = ТекСтр.СсылкаНаОбъект.ПолучитьОбъект();
ИмяФайлаХМЛ = ПолучитьИмяВременногоФайла(".xml");
XDTO = Новый СериализаторXDTO(ФабрикаXDTO);
XML = Новый ЗаписьXML;
XML.ОткрытьФайл(ИмяФайлаХМЛ);
XDTO.ЗаписатьXML(XML, Об, НазначениеТипаXML.Явное);
XML.Закрыть();
ТекстФайл = Новый ТекстовыйДокумент;
ТекстФайл.Прочитать(ИмяФайлаХМЛ);
Текст = ТекстФайл.ПолучитьТекст();
НовыйТекст = СтрЗаменить(Текст,ТекСтр.ИсходнаяСсылка.УникальныйИдентификатор(),Объект.ЗаменитьНа.УникальныйИдентификатор());
ТекстФайл.УстановитьТекст(НовыйТекст);
ТекстФайл.Записать(ИмяФайлаХМЛ);
XML = Новый ЧтениеXML;
XML.ОткрытьФайл(ИмяФайлаХМЛ);
XDTO = Новый СериализаторXDTO(ФабрикаXDTO);
Об = XDTO.ПрочитатьXML(XML);
Об.Записать();
КонецЦикла;
КонецПроцедуры
ПоказатьПолучается следующее:
1. Выгружаем объект в файл.
2. Меняем текст в файле.
3. загружаем объект из файла.
Все работает, но ощущение того, что удаляю гланды с задней стороны меня не покидает. Нигде не могу прочитать (или понять прочитанное) как сделать тоже самое, но без записи в файл. Подскажите?
Остальные ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
(1) уж не замену ли дублей пишете?
если да, то лучше через объект ХДТО делайте!
а если нет, то перебором реквизитов, (можно ограничить проверкой на содержащих тип искомой ссылки)
а если в ТЧ, ваша ссылка находится?, как номера строчек будете возвращать/привязывать к имени колонки в которой данная Ссылка ?
если да, то лучше через объект ХДТО делайте!
а если нет, то перебором реквизитов, (можно ограничить проверкой на содержащих тип искомой ссылки)
а если в ТЧ, ваша ссылка находится?, как номера строчек будете возвращать/привязывать к имени колонки в которой данная Ссылка ?
(2) Спасибо, что откликнулись! Ну не замену дублей, но в целом что-то примерно подобное, но для более узких и специфических задач.
Если не трудно, развейте мысль. Любопытный вариант.
Да придумать-то можно много. Но будет очень линейно и громоздко. Вот и думаю как сделать это всё с человеческим лицом.
если да, то лучше через объект ХДТО делайте!
Если не трудно, развейте мысль. Любопытный вариант.
а если нет, то перебором реквизитов, (можно ограничить проверкой на содержащих тип искомой ссылки)
а если в ТЧ, ваша ссылка находится?, как номера строчек будете возвращать/привязывать к имени колонки в которой данная Ссылка ?
а если в ТЧ, ваша ссылка находится?, как номера строчек будете возвращать/привязывать к имени колонки в которой данная Ссылка ?
Да придумать-то можно много. Но будет очень линейно и громоздко. Вот и думаю как сделать это всё с человеческим лицом.
(3)
да в общем все элементарно, сериализуете объект документа через Фабрику ХДТО,
получается такая длинная строка в формате ХМЛ
а затем выполняете замену
//одной командой можно заменить или очистить (не)нужную Ссылку
ХМЛНовыйДок = СтрЗаменить(ХМЛДанные, ХМЛСслкаЧтоЗаменить, ХМЛСсылкНаЧтоЗаменить);
затем обратно через ХДТО из ХМЛНовыйДок получаете объект Документ и сохраняете.
на все провсе 10 строчек кода
Если не трудно, развейте мысль. Любопытный вариант.
да в общем все элементарно, сериализуете объект документа через Фабрику ХДТО,
получается такая длинная строка в формате ХМЛ
а затем выполняете замену
//одной командой можно заменить или очистить (не)нужную Ссылку
ХМЛНовыйДок = СтрЗаменить(ХМЛДанные, ХМЛСслкаЧтоЗаменить, ХМЛСсылкНаЧтоЗаменить);
затем обратно через ХДТО из ХМЛНовыйДок получаете объект Документ и сохраняете.
на все провсе 10 строчек кода
(4) Смотрите, написал вот такой вот код:
Получается следующее:
1. Выгружаем объект в файл.
2. Меняем текст в файле.
3. загружаем объект из файла.
Все работает, но ощущение того, что удаляю гланды с задней стороны меня не покидает. Нигде не могу прочитать (или понять прочитанное) как сделать тоже самое, но без записи в файл. Подскажите?
&НаСервере
Процедура ЗаменаСсылокНаСервере()
Для каждого ТекСтр из Объект.НайденныеСсылки цикл
Об = ТекСтр.СсылкаНаОбъект.ПолучитьОбъект();
ИмяФайлаХМЛ = ПолучитьИмяВременногоФайла(".xml");
XDTO = Новый СериализаторXDTO(ФабрикаXDTO);
XML = Новый ЗаписьXML;
XML.ОткрытьФайл(ИмяФайлаХМЛ);
XDTO.ЗаписатьXML(XML, Об, НазначениеТипаXML.Явное);
XML.Закрыть();
ТекстФайл = Новый ТекстовыйДокумент;
ТекстФайл.Прочитать(ИмяФайлаХМЛ);
Текст = ТекстФайл.ПолучитьТекст();
НовыйТекст = СтрЗаменить(Текст,ТекСтр.ИсходнаяСсылка.УникальныйИдентификатор(),Объект.ЗаменитьНа.УникальныйИдентификатор());
ТекстФайл.УстановитьТекст(НовыйТекст);
ТекстФайл.Записать(ИмяФайлаХМЛ);
XML = Новый ЧтениеXML;
XML.ОткрытьФайл(ИмяФайлаХМЛ);
XDTO = Новый СериализаторXDTO(ФабрикаXDTO);
Об = XDTO.ПрочитатьXML(XML);
Об.Записать();
КонецЦикла;
КонецПроцедуры
ПоказатьПолучается следующее:
1. Выгружаем объект в файл.
2. Меняем текст в файле.
3. загружаем объект из файла.
Все работает, но ощущение того, что удаляю гланды с задней стороны меня не покидает. Нигде не могу прочитать (или понять прочитанное) как сделать тоже самое, но без записи в файл. Подскажите?
(6) действительно, в файл выгружать не надо, это если у вас Оччччень большой документ/объект,
я использовать такой код, под себч адаптируйте - это пример
получение ХМЛ строки
//получение ХМЛ строки
лкОбъектXDTO = СериализаторXDTO.ЗаписатьXDTO(лкДанные);
лкЗаписьXML = Новый ЗаписьXML;
лкЗаписьXML.УстановитьСтроку();
ФабрикаXDTO.ЗаписатьXML(лкЗаписьXML,лкОбъектXDTO);
лкСтрокаИсх = лкЗаписьXML.Закрыть();
//Какой-то ваш код
//лкСтрокаНов =Обработать(лкСтрокаИсх);
//обратно превращаем строку в объект
лкЧтениеXML = Новый ЧтениеXML;
лкЧтениеXML.УстановитьСтроку(лкСтрокаНов);
лкОбъектXDTO = СериализаторXDTO.ПрочитатьXML(лкЧтениеXML);
лкЧтениеXML.Закрыть();
Показать
я использовать такой код, под себч адаптируйте - это пример
получение ХМЛ строки
//получение ХМЛ строки
лкОбъектXDTO = СериализаторXDTO.ЗаписатьXDTO(лкДанные);
лкЗаписьXML = Новый ЗаписьXML;
лкЗаписьXML.УстановитьСтроку();
ФабрикаXDTO.ЗаписатьXML(лкЗаписьXML,лкОбъектXDTO);
лкСтрокаИсх = лкЗаписьXML.Закрыть();
//Какой-то ваш код
//лкСтрокаНов =Обработать(лкСтрокаИсх);
//обратно превращаем строку в объект
лкЧтениеXML = Новый ЧтениеXML;
лкЧтениеXML.УстановитьСтроку(лкСтрокаНов);
лкОбъектXDTO = СериализаторXDTO.ПрочитатьXML(лкЧтениеXML);
лкЧтениеXML.Закрыть();
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот