Имя: Пароль:
1C
1C 7.7
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>
Требовать и эффективности, и гибкости от одной и той же программы — все равно, что искать очаровательную и скромную жену... по-видимому, нам следует остановиться на чем-то одном из двух. Фредерик Брукс-младший