Вход | Регистрация
 
1С:Предприятие :: 1С:Предприятие 7.7 и ранее

v7: Как установить значение свойства КОП по имени?

v7: Как установить значение свойства КОП по имени?
Я
   tmoor
 
21.07.19 - 13:52
Пытаюсь делать десериализацию объекта КОП из XML. Не могу нигде найти, как по имени и значению XML-атрибута установить соответствующее свойство объекта. Пока пишу длинную портянку Если ИмяАтрибута="ИмяСвойства" Тогда ИмяСвойства=ЗначениеАтрибута. А нет ли какой-нибудь функции типа "УстановитьСвойствоКОП"?
Пробовал использовать для этого объект "Структура", чтобы сохранить в ней ссылки на свойства объекта, при присвоении значений свойствам структуры свойства объекта успешно изменяются, но вот установить значение по имени так и не получилось, поскольку метод "Вставить" затирает исходную ссылку на устанавливаемое свойство, а отдельного метода "Установить"(значение по существующей ссылке) - нету...
Может кто знает какое-нибудь красивое решение?
 
 
   tmoor
 
1 - 21.07.19 - 17:49
Да, еще пробовал через FormEx, Сервис.УстановитьПеременнуюКонтекста. Ошибок не пишет, но и свойство не устанавливает
   tmoor
 
2 - 22.07.19 - 12:48
Ну что, Гуру на мисте перевелись?
   Arbuz
 
3 - 22.07.19 - 15:34
//======================================================================

Функция УстАтрибут(пАтр,пЗн)
    пАтр = пЗн;
    Возврат "";
КонецФункци// УстАтрибут(пАтр,пЗн)


Процедура УстановитьСвойствоКОП(пОбъект, пСвойство, пЗначение);
    Шаблон("[УстАтрибут("+ пОбъект + "." + пСвойство + ",пЗначение)]");
КонецПроцедуры// УстановитьСвойствоКОП(пОбъект, пСвойство, пЗначение)
   Arbuz
 
4 - 22.07.19 - 15:49
работает только со строками
можно доработать через Значение[В/Из]Строку[Внутр] для объектов, но будет медленней
   Salimbek
 
5 - 22.07.19 - 16:08
(0) А что? Встроенные механизмы сериализации плохо работают? Это читал? http://www.1cpp.ru/docum/icpp/html/classes.html#id43
   Salimbek
 
6 - 22.07.19 - 16:22
+(5) Хотя от постоянного ИмяСвойства=ЗначениеАтрибута это не спасает...
Может тогда завести себе в Классе структуру ВажныеЗначения.
Далее в своем коде везде меняешь
ИмяСвойства
на ВажныеЗначения.ИмяСвойства
И сериализация и десериализация упрощается до
Текст=ЗначениеВСтрокуВнутр(ВажныеЗначения) + ВажныеЗначения=ЗначениеИзСтрокиВнутр(Текст);
   tmoor
 
7 - 22.07.19 - 16:40
(6) Ну да, наверное действительно вместо всех свойств использовать одну структуру, и добавить динамические свойства, чтобы из этой структуры данные брались, а от фиксированных свойств отказаться... Корявенько, конечно)) Но думаю побыстрее должно работать, чем с шаблоном

А по поводу встроенной сериализации - если б примерчик, как этим пользоваться...
   tmoor
 
8 - 22.07.19 - 16:44
Да, и мне нужно сериализовывать в xml, а не в 1С-ную скобочно-запятную кашу, мне это потом в xml поле скуля грузить надо
   Salimbek
 
9 - 22.07.19 - 17:04
(8) Куда - не особо важно, т.к. ты в своем коде просто в нужный момент вызываешь ТекстXML=ЗначениеВСтроку(ОбъектТвоегоКласса); и пишешь этот текст в базу. Потом, при обратном из базы получаешь ТекстXML и получаешь свой объект класса ОбъектТвоегоКласса=ЗначениеИзСтроки(ТекстXML);

В самом классе прописываешь

//Признак того, что класс можно сериализовать

Функция КлассСохраняемый()
Возврат 1;
КонецФункции

//Сама функция Сериализации

Функция СохранитьКлассВСтроку()
  хмл=""; + ЗначениеВСтроку(ВажныеЗначения);
  Возврат хмл;
КонецФункции

//Десериализация

Процедура ЗагрузитьИзСтроки(_стрк)
  хмл=ИзСтроки(_стрк);
  ВажныеЗначения = ЗначениеИзСтроки(хмл.Свойство);
КонецПроцедуры
   ADirks
 
10 - 23.07.19 - 13:30
(0) с помощью ВМ можно, например так

Функция ПеременнаяКонтекста(Конт, ИмяПеременной) Экспорт
    ТекстМодуля = "
    |Функция ЗначениеПеременной(Источник)
    |    Возврат Источник."+ИмяПеременной+";
    |КонецФункции
    |";
    
    Модуль = Фаб.Модуль(Конт, ТекстМодуля);
    
    Возврат Модуль.ЗначениеПеременной(Конт);
КонецФункции


Функция УстановитьПеременную(Конт, ИмяПеременной, Значение) Экспорт
    ТекстМодуля = "
    |Функция УстЗнач(з)
    |    "+ИмяПеременной+" = з;
    |    Возврат "+ИмяПеременной+";
    |КонецФункции
    |";
    
    Модуль = Фаб.Модуль(Конт, ТекстМодуля);
    
    Возврат Модуль.УстЗнач(Значение);
КонецФункции
   tmoor
 
11 - 24.07.19 - 11:53
(10) Ого, действительно красиво! Я правильно понимаю, в какой-то особой версии 1С++ у ФабрикиОбъектов есть метод "Модуль"? Или это производный класс?

У меня пока что заработало только в таком виде:
<code>
Перем ВМ;
Перем Свойство1 Экспорт;
Перем Свойство2 Экспорт;

//======================================================================

Процедура Конструктор()
    ВМ=СоздатьОбъект("ВыполняемыйМодуль");
    ВМ.НазначитьКонтекст(я());
КонецПроцедуры// Конструктор


//======================================================================

Функция ПолучитьСвойство(ИмяПеременной) Экспорт
    ТекстМодуля = "
    |Функция ПолучитьСвойство()
    |    Возврат "+ИмяПеременной+";
    |КонецФункции
    |";
    ВМ.УстановитьМодуль(ТекстМодуля);
    ВМ.КомпилироватьИВыполнитьМодуль();
    Возврат ВМ.ПолучитьСвойство();
КонецФункции// ПолучитьСвойство


//======================================================================

Процедура УстановитьСвойство(ИмяПеременной, Значение) Экспорт
    ТекстМодуля = "
    |Процедура УстановитьСвойство(Значение)
    |    "+ИмяПеременной+" = Значение;
    |КонецПроцедуры
    |";
    ВМ.УстановитьМодуль(ТекстМодуля);
    ВМ.КомпилироватьИВыполнитьМодуль();
    ВМ.УстановитьСвойство(Значение);
КонецПроцедуры// УстановитьСвойство

</code>

Список тем форума
Рекламное место пустует  Рекламное место пустует
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.