Как получить ссылку на реквизит объекта метаданных?

1. Goose113 04.02.19 19:40 Сейчас в теме
Приветствую всех. Пишу тестовое задание, которое дали на собеседовании. Есть заминка следующего характера: имеется объект метаданных, полученный через Метаданные.НайтиПоПолномуИмени(...). Необходимо из этого объекта получить ссылку на реквизит, имя которого известно.

То есть когда я пишу Ссылка = Перечисления.ВидыОперацийРеализацияТоваров[Стр.Значение]; (где Стр.Значение = "Товары") все работает так, как нужно, но проблема в том что на месте перечисления может быть и документ и справочник. Попытался применить следующую конструкцию: Ссылка = ОбъектМетаданных[Стр.Значение]; , но к моему великому сожалению, оно не работает)

Прошу строго не судить за, возможно, глупый вопрос, с 1С только начинаю свое знакомство.
// МассивСтруктур - массив, содержащий реквизиты, скопированные с другого документа.
// Имеет три поля: Имя, Значение и Тип реквизита вида Перечисления.ВидыОперацийРеализацияТоваров

    Для каждого Стр из МассивСтруктур Цикл
        Если Стр.Тип = "Строка" или Стр.Тип = "Число" или Стр.Тип = "Булево" тогда      // Если тип реквизита строка или число, то просто вставляем значение
            НовыйДокумент[Стр.Имя] = Стр.Значение;
        Иначе
            ОбъектМетаданных = Метаданные.НайтиПоПолномуИмени(Стр.Тип);
            //Ссылка = Перечисления.ВидыОперацийРеализацияТоваров[Стр.Значение];
            Ссылка = ОбъектМетаданных[Стр.Значение];
            НовыйДокумент[Стр.Имя] = Ссылка;
        КонецЕсли;
    КонецЦикла;
Показать
Прикрепленные файлы:
Перегрузка_документа.epf
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. dhurricane 04.02.19 19:43 Сейчас в теме
А что в "Стр.Значение"? Значение строкой? Нужно найти, например, в справочнике соответствующий элемент по наименованию? Или это имя предопределенного? Как выглядит значение для документа?
3. Goose113 04.02.19 20:16 Сейчас в теме
(2) Да, нужно найти элемент по наименованию. Проблема в том, что наименование динамическое и берется из метаданных.

Стр - это структура, которая заполняется данными реквизита с другого документа. Стр.Имя - это имя реквизита, Стр.Значение - это его значение, а Стр.Тип - это его тип. Вообще задача стоит: реализовать выгрузку документа в .txt и загрузку из .txt. Знаю, что есть множество удачных решений, однако условия задачи их исключают. Собственно, с выгрузкой и загрузкой простых типов (Число, строка, булево) проблем нет, а вот с загрузкой объектных типов беда.
4. kumi2012 116 04.02.19 20:22 Сейчас в теме
(3) А так?
Ссылка = ОбъектМетаданных[Стр.Значение].Ссылка;
6. Goose113 04.02.19 20:27 Сейчас в теме
8. kumi2012 116 04.02.19 20:33 Сейчас в теме
(6) В вашем случае позиционирования на объект данных типа документ/справочник нет. Ссылки не получите. Попытайтесь правильно сформулировать задачу.
12. Goose113 04.02.19 20:46 Сейчас в теме
(8) Постараюсь перефразировать. Есть процедура, которая в качестве аргумента принимает массив структур, которые содержат Имя реквизита, Тип реквизита и его значение. Есть документ, на котором располагаются эти реквизиты, но они пустые. Их как раз необходимо заполнить данными, которые передаются в процедуру.

То есть, предположим, заполняемый документ имеет имя НовыйДокумент. Я циклом прохожусь по моему массиву структур:
Для каждого Стр из МассивСтруктур Цикл
		Если Стр.Тип = "Строка" или Стр.Тип = "Число" или Стр.Тип = "Булево" тогда  	// Если тип реквизита строка или число, то просто вставляем значение
			НовыйДокумент[Стр.Имя] = Стр.Значение;
		Иначе      // Если тип реквизита - это объект Справочника, Перечисления и тд.
			ОбъектМетаданных = Метаданные.НайтиПоПолномуИмени(Стр.Тип);    
			Ссылка = ОбъектМетаданных[Стр.Значение].Ссылка;          // Вот тут как раз ошибка
			НовыйДокумент[Стр.Имя] = Ссылка;
		КонецЕсли;
	КонецЦикла;
Показать


Прошу извинить за неточности, объяснение, увы, не мой конёк.
5. dhurricane 04.02.19 20:23 Сейчас в теме
(3) Так Вы сами решаете, в каком виде выгружать в файл?
И если честно, от Ваших объяснений понятней не стало, извините. :) Не понял, что значит "динамическое наименование", и почему оно берется из метаданных? Может таки из данных? Как представление элемента справочника/документа?
7. Goose113 04.02.19 20:32 Сейчас в теме
(5) Да. Задание : разработать внешнюю обработку "Перегрузка документа". В самом верхнем поле должна быть возможность выбрать любой документ из базы данных, в нижнем - путь к файлу и имя файла выгрузки. При нажатии кнопки "Выгрузить" - информация выгружается в указанный файл. Информация должна быть исчерпывающей , т.е выгружаться должны данные ,чтобы при нажатии "Загрузить " - в базе создавалась бы копия исходного документа (за искл. номера т.к он уникален для каждого документа).
Необходимо использовать метаданные,запрещено использовать ф-ии "ЗначениеВСтрокуВнутр()" ,"Уникальные Идентификатор()" и подобные ф-ии ,выгружающие уник. идентификаторы объектов , запрещается использовать выгрузку и загрузку в XML и JSON,строго txt.

Я реализовал выгрузку в txt следующего формата:

ВидОперации=Товары:Перечисление.ВидыОперацийРеализацияТоваров
Организация=Торговый дом "Комплексный" ООО:Справочник.Организации
Склад=Основной склад:Справочник.Склады
ПодразделениеОрганизации=Головное подразделение:Справочник.ПодразделенияОрганизаций
ДеятельностьНаПатенте=Нет:Булево

После чего я считываю Имя, Значение и Тип, и пытаюсь создать копию исходного документа на основе этих данных
9. kumi2012 116 04.02.19 20:36 Сейчас в теме
(7) Тогда
Ссылка = ОбъектМетаданных.НайтиПоНаименованию(Стр.Значение)
11. dhurricane 04.02.19 20:40 Сейчас в теме
(9) У метаданных нет метода "НайтиПоНаименованию". Этот метод принадлежит менеджеру.
10. dhurricane 04.02.19 20:39 Сейчас в теме
(7) Уже понятнее. Вам необходимо для полученного имени объекта метаданных получить менеджер. Например:
Если Метаданные.Справочники.Содержит(ОбъектМетаданных) Тогда
   Ссылка = Справочники[ОбъектМетаданных.Имя].НайтиПоНаименованию(Стр.Значение);
ИначеЕсли Метаданные.ПланыВидовХарактеристик.Содержит(ОбъектМетаданных) Тогда
   Ссылка = ПланыВидовХарактеристик[ОбъектМетаданных.Имя].НайтиПоНаименованию(Стр.Значение);
ИначеЕсли Метаданные.ПланСчетов.Содержит(ОбъектМетаданных) Тогда
   Ссылка = ПланыСчетов[ОбъектМетаданных.Имя].НайтиПоКоду(Стр.Значение);
ИначеЕсли ...
   //... и т.д.
КонецЕсли
Показать

Непонятно только, как Вы храните ссылки на документы.
13. Goose113 04.02.19 22:53 Сейчас в теме
(10) Большое спасибо, это решило большую часть моих проблем :)
14. prog1c_vl 25 07.02.23 00:28 Сейчас в теме
для того чтобы получить Соответствие с набором значений перечисления с типом ПеречислениеСсылка я сделал для себя вот такую функцию:
Прикрепленные файлы:
15. prog1c_vl 25 07.02.23 08:50 Сейчас в теме
(14)
Вот так будет удобнее:
&НаСервереБезКонтекста
Функция ПолучитьСписокЗначенийПеречисления(НаименованиеПеречисления)
	
	СоответствиеЗначенийПеречисления = Новый Соответствие;
	Для каждого ЭлементПеречисления Из Метаданные.Перечисления[НаименованиеПеречисления].ЗначенияПеречисления Цикл
		// в Соответствие отправляем значение с типом ПеречислениеСсылка
		СоответствиеЗначенийПеречисления.Вставить(СокрЛП(ЭлементПеречисления.Синоним), Перечисления[НаименованиеПеречисления][ЭлементПеречисления.Имя]);	
	КонецЦикла;
	
	Возврат СоответствиеЗначенийПеречисления;
	
КонецФункции
Показать

может кому-нибудь пригодится в работе
Оставьте свое сообщение

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