|
v7: Как установить значение свойства КОП по имени? | ☑ | ||
---|---|---|---|---|
0
tmoor
21.07.19
✎
13:52
|
Пытаюсь делать десериализацию объекта КОП из XML. Не могу нигде найти, как по имени и значению XML-атрибута установить соответствующее свойство объекта. Пока пишу длинную портянку Если ИмяАтрибута="ИмяСвойства" Тогда ИмяСвойства=ЗначениеАтрибута. А нет ли какой-нибудь функции типа "УстановитьСвойствоКОП"?
Пробовал использовать для этого объект "Структура", чтобы сохранить в ней ссылки на свойства объекта, при присвоении значений свойствам структуры свойства объекта успешно изменяются, но вот установить значение по имени так и не получилось, поскольку метод "Вставить" затирает исходную ссылку на устанавливаемое свойство, а отдельного метода "Установить"(значение по существующей ссылке) - нету... Может кто знает какое-нибудь красивое решение? |
|||
1
tmoor
21.07.19
✎
17:49
|
Да, еще пробовал через FormEx, Сервис.УстановитьПеременнуюКонтекста. Ошибок не пишет, но и свойство не устанавливает
|
|||
2
tmoor
22.07.19
✎
12:48
|
Ну что, Гуру на мисте перевелись?
|
|||
3
Arbuz
22.07.19
✎
15:34
|
//======================================================================
Функция УстАтрибут(пАтр,пЗн) пАтр = пЗн; Возврат ""; КонецФункции// УстАтрибут(пАтр,пЗн) Процедура УстановитьСвойствоКОП(пОбъект, пСвойство, пЗначение); Шаблон("[УстАтрибут("+ пОбъект + "." + пСвойство + ",пЗначение)]"); КонецПроцедуры // УстановитьСвойствоКОП(пОбъект, пСвойство, пЗначение) |
|||
4
Arbuz
22.07.19
✎
15:49
|
работает только со строками
можно доработать через Значение[В/Из]Строку[Внутр] для объектов, но будет медленней |
|||
5
Salimbek
22.07.19
✎
16:08
|
(0) А что? Встроенные механизмы сериализации плохо работают? Это читал? http://www.1cpp.ru/docum/icpp/html/classes.html#id43
|
|||
6
Salimbek
22.07.19
✎
16:22
|
+(5) Хотя от постоянного ИмяСвойства=ЗначениеАтрибута это не спасает...
Может тогда завести себе в Классе структуру ВажныеЗначения. Далее в своем коде везде меняешь ИмяСвойства на ВажныеЗначения.ИмяСвойства И сериализация и десериализация упрощается до Текст=ЗначениеВСтрокуВнутр(ВажныеЗначения) + ВажныеЗначения=ЗначениеИзСтрокиВнутр(Текст); |
|||
7
tmoor
22.07.19
✎
16:40
|
(6) Ну да, наверное действительно вместо всех свойств использовать одну структуру, и добавить динамические свойства, чтобы из этой структуры данные брались, а от фиксированных свойств отказаться... Корявенько, конечно)) Но думаю побыстрее должно работать, чем с шаблоном
А по поводу встроенной сериализации - если б примерчик, как этим пользоваться... |
|||
8
tmoor
22.07.19
✎
16:44
|
Да, и мне нужно сериализовывать в xml, а не в 1С-ную скобочно-запятную кашу, мне это потом в xml поле скуля грузить надо
|
|||
9
Salimbek
22.07.19
✎
17:04
|
(8) Куда - не особо важно, т.к. ты в своем коде просто в нужный момент вызываешь ТекстXML=ЗначениеВСтроку(ОбъектТвоегоКласса); и пишешь этот текст в базу. Потом, при обратном из базы получаешь ТекстXML и получаешь свой объект класса ОбъектТвоегоКласса=ЗначениеИзСтроки(ТекстXML);
В самом классе прописываешь //Признак того, что класс можно сериализовать Функция КлассСохраняемый() Возврат 1; КонецФункции //Сама функция Сериализации Функция СохранитьКлассВСтроку() хмл=""; + ЗначениеВСтроку(ВажныеЗначения); Возврат хмл; КонецФункции //Десериализация Процедура ЗагрузитьИзСтроки(_стрк) хмл=ИзСтроки(_стрк); ВажныеЗначения = ЗначениеИзСтроки(хмл.Свойство); КонецПроцедуры |
|||
10
ADirks
23.07.19
✎
13:30
|
(0) с помощью ВМ можно, например так
Функция ПеременнаяКонтекста(Конт, ИмяПеременной) Экспорт ТекстМодуля = " |Функция ЗначениеПеременной(Источник) | Возврат Источник."+ИмяПеременной+"; |КонецФункции |"; Модуль = Фаб.Модуль(Конт, ТекстМодуля); Возврат Модуль.ЗначениеПеременной(Конт); КонецФункции Функция УстановитьПеременную(Конт, ИмяПеременной, Значение) Экспорт ТекстМодуля = " |Функция УстЗнач(з) | "+ИмяПеременной+" = з; | Возврат "+ИмяПеременной+"; |КонецФункции |"; Модуль = Фаб.Модуль(Конт, ТекстМодуля); Возврат Модуль.УстЗнач(Значение); КонецФункции |
|||
11
tmoor
24.07.19
✎
11:53
|
(10) Ого, действительно красиво! Я правильно понимаю, в какой-то особой версии 1С++ у ФабрикиОбъектов есть метод "Модуль"? Или это производный класс?
У меня пока что заработало только в таком виде: <code> Перем ВМ; Перем Свойство1 Экспорт; Перем Свойство2 Экспорт; //====================================================================== Процедура Конструктор() ВМ=СоздатьОбъект("ВыполняемыйМодуль"); ВМ.НазначитьКонтекст(я()); КонецПроцедуры // Конструктор //====================================================================== Функция ПолучитьСвойство(ИмяПеременной) Экспорт ТекстМодуля = " |Функция ПолучитьСвойство() | Возврат "+ИмяПеременной+"; |КонецФункции |"; ВМ.УстановитьМодуль(ТекстМодуля); ВМ.КомпилироватьИВыполнитьМодуль(); Возврат ВМ.ПолучитьСвойство(); КонецФункции // ПолучитьСвойство //====================================================================== Процедура УстановитьСвойство(ИмяПеременной, Значение) Экспорт ТекстМодуля = " |Процедура УстановитьСвойство(Значение) | "+ИмяПеременной+" = Значение; |КонецПроцедуры |"; ВМ.УстановитьМодуль(ТекстМодуля); ВМ.КомпилироватьИВыполнитьМодуль(); ВМ.УстановитьСвойство(Значение); КонецПроцедуры // УстановитьСвойство </code> |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |