Как получить ссылку на реквизит объекта метаданных?
Приветствую всех. Пишу тестовое задание, которое дали на собеседовании. Есть заминка следующего характера: имеется объект метаданных, полученный через Метаданные.НайтиПоПолномуИмени(...). Необходимо из этого объекта получить ссылку на реквизит, имя которого известно.
То есть когда я пишу Ссылка = Перечисления.ВидыОперацийРеализацияТоваров[Стр.Значение]; (где Стр.Значение = "Товары") все работает так, как нужно, но проблема в том что на месте перечисления может быть и документ и справочник. Попытался применить следующую конструкцию: Ссылка = ОбъектМетаданных[Стр.Значение]; , но к моему великому сожалению, оно не работает)
Прошу строго не судить за, возможно, глупый вопрос, с 1С только начинаю свое знакомство.
То есть когда я пишу Ссылка = Перечисления.ВидыОперацийРеализацияТоваров[Стр.Значение]; (где Стр.Значение = "Товары") все работает так, как нужно, но проблема в том что на месте перечисления может быть и документ и справочник. Попытался применить следующую конструкцию: Ссылка = ОбъектМетаданных[Стр.Значение]; , но к моему великому сожалению, оно не работает)
Прошу строго не судить за, возможно, глупый вопрос, с 1С только начинаю свое знакомство.
// МассивСтруктур - массив, содержащий реквизиты, скопированные с другого документа.
// Имеет три поля: Имя, Значение и Тип реквизита вида Перечисления.ВидыОперацийРеализацияТоваров
Для каждого Стр из МассивСтруктур Цикл
Если Стр.Тип = "Строка" или Стр.Тип = "Число" или Стр.Тип = "Булево" тогда // Если тип реквизита строка или число, то просто вставляем значение
НовыйДокумент[Стр.Имя] = Стр.Значение;
Иначе
ОбъектМетаданных = Метаданные.НайтиПоПолномуИмени(Стр.Тип);
//Ссылка = Перечисления.ВидыОперацийРеализацияТоваров[Стр.Значение];
Ссылка = ОбъектМетаданных[Стр.Значение];
НовыйДокумент[Стр.Имя] = Ссылка;
КонецЕсли;
КонецЦикла;
ПоказатьПрикрепленные файлы:
Перегрузка_документа.epf
По теме из базы знаний
- Не клади яйца в одну корзину. Как удовлетворить всех клиентов и не превратить конфигурацию в помойку
- Обзор полезных методов БСП 3.1.4
- Как читать чужой код? Часть 1. Общие вопросы. Доработка чужого кода. Code review
- Как читать чужой код? Часть 2. Доработка типовой конфигурации. Обновление доработанной типовой конфигурации
- Самые используемые методы БСП 3.1.9
Ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
(2) Да, нужно найти элемент по наименованию. Проблема в том, что наименование динамическое и берется из метаданных.
Стр - это структура, которая заполняется данными реквизита с другого документа. Стр.Имя - это имя реквизита, Стр.Значение - это его значение, а Стр.Тип - это его тип. Вообще задача стоит: реализовать выгрузку документа в .txt и загрузку из .txt. Знаю, что есть множество удачных решений, однако условия задачи их исключают. Собственно, с выгрузкой и загрузкой простых типов (Число, строка, булево) проблем нет, а вот с загрузкой объектных типов беда.
Стр - это структура, которая заполняется данными реквизита с другого документа. Стр.Имя - это имя реквизита, Стр.Значение - это его значение, а Стр.Тип - это его тип. Вообще задача стоит: реализовать выгрузку документа в .txt и загрузку из .txt. Знаю, что есть множество удачных решений, однако условия задачи их исключают. Собственно, с выгрузкой и загрузкой простых типов (Число, строка, булево) проблем нет, а вот с загрузкой объектных типов беда.
(8) Постараюсь перефразировать. Есть процедура, которая в качестве аргумента принимает массив структур, которые содержат Имя реквизита, Тип реквизита и его значение. Есть документ, на котором располагаются эти реквизиты, но они пустые. Их как раз необходимо заполнить данными, которые передаются в процедуру.
То есть, предположим, заполняемый документ имеет имя НовыйДокумент. Я циклом прохожусь по моему массиву структур:
Прошу извинить за неточности, объяснение, увы, не мой конёк.
То есть, предположим, заполняемый документ имеет имя НовыйДокумент. Я циклом прохожусь по моему массиву структур:
Для каждого Стр из МассивСтруктур Цикл
Если Стр.Тип = "Строка" или Стр.Тип = "Число" или Стр.Тип = "Булево" тогда // Если тип реквизита строка или число, то просто вставляем значение
НовыйДокумент[Стр.Имя] = Стр.Значение;
Иначе // Если тип реквизита - это объект Справочника, Перечисления и тд.
ОбъектМетаданных = Метаданные.НайтиПоПолномуИмени(Стр.Тип);
Ссылка = ОбъектМетаданных[Стр.Значение].Ссылка; // Вот тут как раз ошибка
НовыйДокумент[Стр.Имя] = Ссылка;
КонецЕсли;
КонецЦикла;
ПоказатьПрошу извинить за неточности, объяснение, увы, не мой конёк.
(3) Так Вы сами решаете, в каком виде выгружать в файл?
И если честно, от Ваших объяснений понятней не стало, извините. :) Не понял, что значит "динамическое наименование", и почему оно берется из метаданных? Может таки из данных? Как представление элемента справочника/документа?
И если честно, от Ваших объяснений понятней не стало, извините. :) Не понял, что значит "динамическое наименование", и почему оно берется из метаданных? Может таки из данных? Как представление элемента справочника/документа?
(5) Да. Задание : разработать внешнюю обработку "Перегрузка документа". В самом верхнем поле должна быть возможность выбрать любой документ из базы данных, в нижнем - путь к файлу и имя файла выгрузки. При нажатии кнопки "Выгрузить" - информация выгружается в указанный файл. Информация должна быть исчерпывающей , т.е выгружаться должны данные ,чтобы при нажатии "Загрузить " - в базе создавалась бы копия исходного документа (за искл. номера т.к он уникален для каждого документа).
Необходимо использовать метаданные,запрещено использовать ф-ии "ЗначениеВСтрокуВнутр()" ,"Уникальные Идентификатор()" и подобные ф-ии ,выгружающие уник. идентификаторы объектов , запрещается использовать выгрузку и загрузку в XML и JSON,строго txt.
Я реализовал выгрузку в txt следующего формата:
ВидОперации=Товары:Перечисление.ВидыОперацийРеализацияТоваров
Организация=Торговый дом "Комплексный" ООО:Справочник.Организации
Склад=Основной склад:Справочник.Склады
ПодразделениеОрганизации=Головное подразделение:Справочник.ПодразделенияОрганизаций
ДеятельностьНаПатенте=Нет:Булево
После чего я считываю Имя, Значение и Тип, и пытаюсь создать копию исходного документа на основе этих данных
Необходимо использовать метаданные,запрещено использовать ф-ии "ЗначениеВСтрокуВнутр()" ,"Уникальные Идентификатор()" и подобные ф-ии ,выгружающие уник. идентификаторы объектов , запрещается использовать выгрузку и загрузку в XML и JSON,строго txt.
Я реализовал выгрузку в txt следующего формата:
ВидОперации=Товары:Перечисление.ВидыОперацийРеализацияТоваров
Организация=Торговый дом "Комплексный" ООО:Справочник.Организации
Склад=Основной склад:Справочник.Склады
ПодразделениеОрганизации=Головное подразделение:Справочник.ПодразделенияОрганизаций
ДеятельностьНаПатенте=Нет:Булево
После чего я считываю Имя, Значение и Тип, и пытаюсь создать копию исходного документа на основе этих данных
(7) Уже понятнее. Вам необходимо для полученного имени объекта метаданных получить менеджер. Например:
Непонятно только, как Вы храните ссылки на документы.
Если Метаданные.Справочники.Содержит(ОбъектМетаданных) Тогда
Ссылка = Справочники[ОбъектМетаданных.Имя].НайтиПоНаименованию(Стр.Значение);
ИначеЕсли Метаданные.ПланыВидовХарактеристик.Содержит(ОбъектМетаданных) Тогда
Ссылка = ПланыВидовХарактеристик[ОбъектМетаданных.Имя].НайтиПоНаименованию(Стр.Значение);
ИначеЕсли Метаданные.ПланСчетов.Содержит(ОбъектМетаданных) Тогда
Ссылка = ПланыСчетов[ОбъектМетаданных.Имя].НайтиПоКоду(Стр.Значение);
ИначеЕсли ...
//... и т.д.
КонецЕсли
ПоказатьНепонятно только, как Вы храните ссылки на документы.
(14)
Вот так будет удобнее:
может кому-нибудь пригодится в работе
Вот так будет удобнее:
&НаСервереБезКонтекста
Функция ПолучитьСписокЗначенийПеречисления(НаименованиеПеречисления)
СоответствиеЗначенийПеречисления = Новый Соответствие;
Для каждого ЭлементПеречисления Из Метаданные.Перечисления[НаименованиеПеречисления].ЗначенияПеречисления Цикл
// в Соответствие отправляем значение с типом ПеречислениеСсылка
СоответствиеЗначенийПеречисления.Вставить(СокрЛП(ЭлементПеречисления.Синоним), Перечисления[НаименованиеПеречисления][ЭлементПеречисления.Имя]);
КонецЦикла;
Возврат СоответствиеЗначенийПеречисления;
КонецФункции
Показатьможет кому-нибудь пригодится в работе
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот