gifts2017

Попытка передачи мутабельного значения

Опубликовал Андрей М. (StepByStep) в раздел Программирование - Практика программирования

Варианты решения проблемы на примере работы обработки 1С:Администратор.
Конфигурация: Розница 2.0. Клиент-Сервер. Обычное приложение.
Ошибка возникает при Записи/Проведении/ОтменаПроведения документа.

СПРАВКА:

Мутабельный тип (англ. Mutable type) - сложный тип данных в объектно-ориентированном программировании, значения которого (как правило - объекты) после своего создания допускают изменение своих свойств.
1С: Подробнее о типах данных 1С:Предприятие: http://v8.1c.ru/overview/CommonCommTypes.htm
1С: XML-сериализация, механизм (XML Serialization, Mechanism): http://v8.1c.ru/overview/Term_000000318.htm
tanka495: Клиент- серверные вызовы: http://infostart.ru/public/86838/


Немного теории:

Попытка передачи мутабельного значения - это попытка передачи объекта на сервер(клиент), данные которого могут быть изменены на клиенте(сервере).
Попытка передачи мутабельного значения с клиента на сервер, с сервера на клиент 1С:Предприятия возникает только в клиент-серверной версии (SQL).

Передача параметров

Передача параметров функции (процедуре), выполняемой на сервере достаточно тонкий вопрос. Это в первую очередь связано с необходимостью передачи их между процессом сервера приложений и клиента. При переходе управления с клиентской части на серверную все передаваемые параметры сериализуются, передаются на сервер, где "распаковываются" и используются. При переходе с серверной части на клиентскую – обратный процесс. Здесь необходимо отметить, что данная схема корректно обрабатывает передачу параметров по ссылке и по значению. При передаче параметров действуют следующие отграничения:

Передавать между клиентом и сервером (в обе стороны) можно только немутабельные значения (т.е. значения которых не могут изменяться): примитивные типы, ссылки, универсальные коллекции, значения системных перечислений, хранилище значения. При попытке передать что-либо другое – аварийное завершение клиентского приложения (даже, если передавать некорректный параметр пытается сервер).

Не рекомендуется при передаче параметров передавать большие объёмы данных (например, строки более 1 миллиона символов), это может негативно сказаться на производительности сервера.

Нельзя передавать параметры, содержащие циклическую ссылку, причем как с сервера на клиент, так и обратно.При попытке передать такой параметр – аварийное завершение клиентского приложения (даже если передавать некорректный параметр пытается сервер).

Не рекомендуется передавать очень сложные коллекции данных. При попытке передачи параметра с очень большим уровнем вложения происходит аварийное завершение сервера.


Проблемная ситуация:

"Розница 2.0". Клиент-Сервер. Обычное приложение.
Обработка "1С:Администратор": http://infostart.ru/public/100967/

МО: {ВнешняяОбработка.КонсольАдминистратора.МодульОбъекта(658)}:
Ошибка при вызове метода контекста (Записать):
Ошибка при выполнении обработчика - 'ПередЗаписью':{ОбщийМодуль.ПрефиксацияОбъектовСобытия.Модуль(215)}:
Ошибка при вызове метода контекста (ДатаИлиОрганизацияОбъектаИзменена):
Попытка передачи с клиента на сервер мутабельного значения 2-го параметра метода ДатаИлиОрганизацияОбъектаИзменена().

Обработка 1С:Администратор.МодульОбъекта

     ОбъектИЗМ.Записать(?(РежимЗаписи = Неопределено, РежимЗаписиДокумента.Запись, РежимЗаписи));

ОбщийМодуль.ПрефиксацияОбъектовСобытия.Модуль(215):

Процедура ПроверитьНомерОбъектаПоДатеИОрганизации(Объект)

     Если ПрефиксацияОбъектов.ДатаИлиОрганизацияОбъектаИзменена(Объект.Ссылка, Объект.Метаданные(), Объект.Дата, Объект.Организация) Тогда


ВАРИАНТ РЕШЕНИЯ № 1: (возможный, но неоптимальный):
УСТАНОВКА СВОЙСТВА ОБЩЕГО МОДУЛЯ.

В конфигураторе:

В Свойствах ОбщийМодуль.ПрефиксацияОбъектов активизировать флажок "Клиент обычное приложение".


ВАРИАНТ РЕШЕНИЯ № 2: (рекомендуемый):
ПЕРЕДАЧА ССЫЛКИ.

В конфигураторе:

ОбщийМодуль.ПрефиксацияОбъектовСобытия

Процедура ПроверитьНомерОбъектаПоДатеИОрганизации(Объект)

// БЫЛО.
// Если
ПрефиксацияОбъектов.ДатаИлиОрганизацияОбъектаИзменена(Объект.Ссылка, Объект.Метаданные(), Объект.Дата, Объект.Организация) Тогда
// СТАЛО.
Если
ПрефиксацияОбъектов.ДатаИлиОрганизацияОбъектаИзменена(Объект.Ссылка, Объект.Дата, Объект.Организация) Тогда

ОбщийМодуль.ПрефиксацияОбъектов

Процедура ДатаИлиОрганизацияОбъектаИзменена(Ссылка, Знач ДатаПослеИзменения, Знач ОрганизацияПослеИзменения) Экспорт

// СТРОКА ДОБАВЛЕНА.
МетаданныеОбъекта = Ссылка.Метаданные();


ВАРИАНТ РЕШЕНИЯ № 3: (возможный, но не в данном случае):
ИСПОЛЬЗОВАНИЕ XML-СЕРИАЛИЗАЦИИ (предложено w-divin).

Сериализация не работает, если в качестве записываемого объекта выступают Метаданные.
(Ошибка при вызове метода контекста (ЗаписатьXML): Значения данного типа не могут быть представлены в XML).

Рекомендуется использовать при необходимости передать Объект (СправочникОбъект, ДокументОбъект и т.д.).

Использовать функции типа:

// Выгрузка ХОбъекта в XML-строку:
Функция ЗаписатьВXML(ХОбъект)
     ЗаписьXML = Новый ЗаписьXML;                            // Тонкий клиент, сервер, толстый клиент, внешнее соединение.
     ЗаписьXML.УстановитьСтроку();
     ЗаписатьXML(ЗаписьXML, ХОбъект);                      // Сервер, толстый клиент, внешнее соединение.
     Возврат ЗаписьXML.Закрыть();
КонецФункции

// Загрузка ХОбъекта из XML-строки:
Функция ПрочитатьИзXML(СтрокаXML)
     ЧтениеXML = Новый ЧтениеXML;                           // Тонкий клиент, сервер, толстый клиент, внешнее соединение.
     ЧтениеXML.УстановитьСтроку(СтрокаXML);
     ХОбъект = ПрочитатьXML(ЧтениеXML);                 // Сервер, толстый клиент, внешнее соединение.
     Возврат ХОбъект;
КонецФункции


Тестовая среда:
Операционная система: Windows XP SP3, Windows 7 SP1.
Сервер баз данных: MS SQL Server 2008 R2.
1С:Предприятие (Клиент-Сервер):
   -
Платформа 8.2.15.
   -
Конфигурация: Розница 2.0.3.17.
   -
Режим совместимости: 8.2.13/НеИспользовать.
   -
Режим запуска: Обычное приложение. Толстый клиент.

МА! С уважением к сообществу МА!


См. также

Подписаться Добавить вознаграждение
Комментарии
1. Сергей Старых (tormozit) 09.04.12 23:51
Под аварийным завершением процесса (клиента или сервера) ты имеешь ввиду недопустимую операцию (Problem signature и т.д.) и завершение процесса со стороны ОС?
Большинство таких ситуаций признаются производителем платформы ошибками и исправляются. Если у тебя есть пример воспроизведения такой ситуации, то отправь его в тех. поддержку 1с.
2. Ярослав Радкевич (WKBAPKA) 10.04.12 09:26
решение, конечно - оригинальное, ничего не скажешь! я и сам до этого допер... только в этом случае, как выполнения функций и процедур в таком модуле, скажется на производительности?
3. Дмитрий Елисеев (w-divin) 10.04.12 09:56
а что делать если конфигурация работает только в режиме управляемого приложения?
4. Андрей М. (StepByStep) 10.04.12 10:56
(1) tormozit,

В данном случае это не ошибка платформы.

Дело в том, что:

У Розницы 2.0 Основной режим запуска - УПРАВЛЯЕМОЕ ПРИЛОЖЕНИЕ.

В Управляемом приложении ЭТА ошибка не наблюдается.
Никаких флажков в данном конкретном случае дополнительно выставлять НЕ надо.
Конечно же, речь идет о типовой конфигурации.
5. Сергей Старых (tormozit) 10.04.12 11:11
(4) Дай четкий ответ на вопрос "Под аварийным завершением процесса (клиента или сервера) ты имеешь ввиду недопустимую операцию (Problem signature и т.д.) и завершение процесса со стороны ОС?"
6. Андрей М. (StepByStep) 10.04.12 11:14
(2) WKBAPKA,

Производительность не замерял.

Но из общих соображений, а мы говорим о ТОЛСТОМ клиенте, когда он содержит в себе весь необходимый функционал не думаю, что это как-то заметно скажется на производительности.

По своим наблюдениям, могу сказать на той же внешней обработке "КонсольАдминистратора", обычное приложение на ЛОКАЛЬНОМ SQL на хорошей машине с SSD работает шустро.
7. Андрей М. (StepByStep) 10.04.12 11:14
(3) w-divin,

В Управляемом приложении ЭТА ошибка не наблюдается.
8. Андрей М. (StepByStep) 10.04.12 11:18
(5) tormozit,


"Под аварийным завершением процесса (клиента или сервера) ты имеешь ввиду недопустимую операцию (Problem signature и т.д.) и завершение процесса со стороны ОС?"


ЗАВЕРШЕНИЕ ПРОЦЕССА ОС НЕ ПРОИСХОДИТ. 1С-КА НЕ "ОТВАЛИВАЕТСЯ".
9. Ярослав Радкевич (WKBAPKA) 10.04.12 11:31
логически можно предположить, что если установлен только флажок "Сервер", значит на клиенте при запуске этот модуль не компилируется?!
10. Андрей М. (StepByStep) 10.04.12 11:40
(9) WKBAPKA,


логически можно предположить, что если установлен только флажок "Сервер", значит на клиенте при запуске этот модуль не компилируется?!


Если говорить об управляемом приложении, то логически ДА, ибо в этом случае Флажок "Клиент (обычное приложение)" вообще скрыт (Установка в Конфигураторе "Сервис-Параметры-Общие" выставлено Редактирование конфигурации для режимов запуска: Управляемое приложение).
11. Ярослав Радкевич (WKBAPKA) 10.04.12 11:49
(10) StepByStep,

теоретически и в обычном приложении такое должно быть, иначе смысл?
12. Ярослав Радкевич (WKBAPKA) 10.04.12 11:49
т.е. если 1С мудабельное :) значение не может обработать на сервере, значит обрабатывает его на клиенте
13. Андрей М. (StepByStep) 10.04.12 12:02
(11) WKBAPKA,


теоретически и в обычном приложении такое должно быть, иначе смысл?


Как раз в обычном приложении эта проблема и возникает (в управляемом - нет проблемы), потому что происходит ПЕРЕДАЧА значения с клиента на сервер, а передача не разрешена.
На сервере это значение может быть и должно быть обработано при условии, что оно получено сервером.


т.е. если 1С мудабельное :) значение не может обработать на сервере, значит обрабатывает его на клиенте

На толстом клиенте это значение в принципе может быть обработано, но в данном конкретном случае производится передача на сервер, а передача не разрешена.
14. Дмитрий Елисеев (w-divin) 10.04.12 14:50
(7) StepByStep,

это кто тебе такое сказал?
ошибка передачи мутабельного значения одинакова что в обычном, что в управляемом приложении.
Вот только вылечить её таким неправильным способом в УП уже не получиться.
15. Андрей М. (StepByStep) 10.04.12 15:06
(14) w-divin,


ошибка передачи мутабельного значения одинакова что в обычном, что в управляемом приложении

Совершенно верно.

На сколько я понимаю ситуацию: в режиме Управляемого приложения вообще не происходит никакой передачи с клиента на Сервер, т.е. после того, как сказали Объект.Записать(...) (Обработка "КонсольАдминистратора" строка 662) причем делается это на Сервере НИКАКОЙ передачи с клиента на сервер в данном случае не происходит и, как следствие, ошибки не возникает.
16. Дмитрий Елисеев (w-divin) 10.04.12 15:48
(15) StepByStep,
На сколько я понимаю ситуацию: в режиме Управляемого приложения вообще не происходит никакой передачи с клиента на Сервер

глубокое заблуждение.
В управляемом приложении намного больше передач с клиента на сервер и обратно.
И многое из того что в обычном приложении отрабатывает на клиенте (как в твоем случае), в УП будет передаваться на сервер (либо платформой, либо разработчиком).
И на самом деле твое "решение" не решение, а разрешение выполнять операцию на клиенте, что в случае УП просто не будет работать.

Плюс выполнение операций на клиенте - ИМХО верх глупости. есть множество способов передать на сервер мутабельное значение и выполнять обработку уже на сервере.
17. Андрей М. (StepByStep) 10.04.12 16:22
(16) w-divin,

В управляемом приложении намного больше передач с клиента на сервер и обратно.

Совершенно верно.

Но я писал о конкретной ситуации: Внешняя обработка в Рознице 2.0 и о том, что "передачи с клиента на сервер в данном случае не происходит".


разрешение выполнять операцию на клиенте

Совершенно верно.


... что в случае УП просто не будет работать.

Ошибаетесь - работает - проверено неоднократно.
18. Андрей М. (StepByStep) 10.04.12 16:27
(16) w-divin,


есть множество способов передать на сервер мутабельное значение и выполнять обработку уже на сервере.

???

Можно передать ссылку и уже в процедуре получить Метаданные и прочее (см. публикация раздел проблемная ситуация).
19. Дмитрий Елисеев (w-divin) 10.04.12 16:42
(18) StepByStep,
Можно передать ссылку


в большинстве случаев нельзя - потому как нужно передать именно измененный объект.
самый распространенный способ - XML-сериализация.
20. Дмитрий Елисеев (w-divin) 10.04.12 16:44
(17) StepByStep,

Цитата

... что в случае УП просто не будет работать.

Ошибаетесь - работает - проверено неоднократно.


не работает. в УП на клиенте даже нет объекта как такового. всеголишь ДанныеФормыКоллекция и т.п.
и даже для того чтобы получить сам объект нужно передать управление на сервер:

УправляемаяФорма (ManagedForm)
РеквизитФормыВЗначение (FormAttributeToValue)
Синтаксис:

РеквизитФормыВЗначение(<ИмяРеквизита>, <Тип>)
Параметры:

<ИмяРеквизита> (обязательный)

Тип: Строка.
Имя реквизита формы, который необходимо преобразовать.
Может быть указан реквизит данных формы (см. описание параметра <Объект> метода ДанныеФормыВЗначение).
<Тип> (необязательный)

Тип: Тип.
Тип значения, получаемого из реквизита формы (данных формы). Если данный параметр не указан, то он также получается из реквизита формы. Если реквизит является составным типом и значение параметра не указано, генерируется исключение времени выполнения.
Возвращаемое значение:

Тип: Произвольный.

Описание:

Преобразует указанный реквизит формы в объект прикладного типа.

Доступность:

Сервер.
21. Андрей М. (StepByStep) 10.04.12 17:22
(19) w-divin,

Возможен и такой вариант.
22. Андрей М. (StepByStep) 10.04.12 17:31
(20) w-divin,


не работает. в УП на клиенте даже нет объекта как такового


1. Сделал контрольную проверку - Обработка работает в Управляемом приложении без каких-либо изменения в типовой конфигурации.
Никаких проблем с записью и проведением документа не возникает.
А именно это и нужно.

2. Скажите, пожалуйста, Вы какую конфигурацию смотрите ?
Розница 2.0 или что-то другое ?
Потому, что см. прикрепленный файл.
Прикрепленные файлы:
23. Дмитрий Елисеев (w-divin) 10.04.12 18:00
(22) StepByStep,

я не смотрю конфигурацию - я говорю о проблеме, озвученной в шапке:

Попытка передачи мутабельного значения

Решение проблемы


конфа у тебя как пример.
и получается что это не решение проблемы, а "заплатка" для конретной конфы (((
24. Андрей М. (StepByStep) 10.04.12 18:04
(23) w-divin,
А я говорю о конкретной ситуации, т.е. Конкретная конфигурация, Конкретная обработка.
25. Андрей М. (StepByStep) 10.04.12 18:04
(23) w-divin,
Хорошо, если о проблеме в общем.

Что Вы имели в иду когда

в УП на клиенте даже нет объекта как такового
26. Андрей М. (StepByStep) 10.04.12 18:11
(23) w-divin,

А по большому счету эта "заплатка" и не нужна, т.к. Основной режим запуска Розница 2.0: Управляемое приложение.
27. Андрей М. (StepByStep) 10.04.12 18:12
(23) w-divin,
И, следовательно, этой проблемы и не возникает.
28. Дмитрий Елисеев (w-divin) 10.04.12 18:12
(25) StepByStep,

рекомендую ознакомиться с документацией по управляемым формам. или почитать тут для начала: СсылкО
29. Андрей М. (StepByStep) 10.04.12 18:17
(28) w-divin,
Читать и перечитывать всегда полезно.

Есть еще такое: infostart
30. Михаил Лыков (Miha.L) 13.04.12 00:59
Мудабельные значения ...
Спасибо. Спасибо. Спасибо. (варианта-то три)
2 вар. использовать.
31. Андрей М. (StepByStep) 13.04.12 09:38
(30) Miha.L,
Пожалуйста. Пожалуйста. Пожалуйста. (варианта-то три)
Право на существование имеют все три, надо смотреть по конкретной ситуации.
32. Алекс Смирнов (goodwin12) 13.04.12 17:55
режиме Управляемого приложения вообще не происходит никакой передачи с клиента на Сервер, т.е. после того, как сказали Объект.Записать(...) (Обработка "КонсольАдминистратора" строка 662) причем делается это на Сервере НИКАКОЙ передачи с клиента на сервер в данном случае не происходит и, как следствие, ошибки не возникает.
33. Борис Скворцов (gaglo) 18.04.12 11:20
Почему не попользоваться парочкой ЗначениеВСтрокуВнутр / ЗначениеИзСтрокиВнутр ?
34. olga pt (pt_olga) 20.06.12 17:51
У Розницы 2.0 Основной режим запуска - УПРАВЛЯЕМОЕ ПРИЛОЖЕНИЕ.


вот и в нашем Итилиуме на поддержке походу основной режим запуска - управляемое :(

конфа на поддержке,
ошибку сами не исправляют,
вменяемой отчетности нет, пишем сами... а сами хорошо пишем для толстого и пока плёха под тонкого
:(

ах, да! Автору статьи спасибо!)
35. John Bolshakov (soulsteps) 21.06.12 00:11
Проблема хорошая...автор молодец, четко и по делу и на "живом" мясе...Мое мнение - при правильной организации своего кода (ну или своего решения на базе 1С) таких проблем возникать не будет, в статье основные "проблемные" ситуации автор хорошо изложил...
37. OBEH (OBEH) 09.07.12 08:18
Загрузка данных обработкой "Универсальный обмен данными в формате XML".
Выдало ошибку по поводу "мутабельности". Ссылка поиска привела сюда, в том числе.
Автору большое спасибо.
Попробовал предложенные варианты. Помогло только - запуск приложения в файловом режиме.
Не очень кашерно. Но, пока только этот вариант. Затем из файловой базы в SQL.
Хочется загружать сразу в SQL
38. vladal (Vladal) 17.07.12 13:40
Можете поменять расцветку в оформлении статьи?
39. Юрий Осипов (yuraos) 29.01.13 09:31

Передавать между клиентом и сервером (в обе стороны) можно только немутабельные значения (т.е. значения которых не могут изменяться):
примитивные типы, ссылки, универсальные коллекции, значения системных перечислений, хранилище значения.

Насчет подчеркнутого не совсем так...
...покрайней мере под 8.1 столкнулся со следующим:
- "Структура" канает для передачи туда - суда (хотя и может быть изменена на сервере);
- а "ТаблицаЗначений" и "ДеревоЗначений" - уже не какнают.
аварийного заверщения работы клиента при этом не наблюдается,
наверное из-за того, что под 8.1 - он толстый

Так что с мутабельностью что-то намудрили разработчики платформы.
;)
the1; StepByStep; +2 Ответить 2
40. Юрий Осипов (yuraos) 29.01.13 09:33
(39) PS,
Кроме передачи значений на сервер есть еще такая функция
ЗначениеЗаполнено()
Она тоже не жалует "мутабельные" и завершается аварийно.
StepByStep; +1 Ответить 1
41. Андрей М. (StepByStep) 26.03.13 19:53
(39) yuraos, (40) yuraos,
Спасибо. Да. Все так.
42. Андрей М. (StepByStep) 26.03.13 22:45
43. diver.sun diver.sun (diver.sun) 21.05.13 17:29
Меня периодически спасает значениевстрокувнутр и значениеизстрокивнутр
44. Alex Azarnin (1985Alex1985) 18.10.13 00:13
Столкнулся на днях с такой же пробемой в УТ3 редакция 3.0.4.3

Ошибку получаем при записи объектов (элемент справочника, новый документ) программно в обычном приложении в серверном варианте хранения БД.

Записываю примерно так:
Процедура КнопкаВыполнитьНажатие(Кнопка)
	Док = Документы.ЗаказКлиента.СоздатьДокумент(); 
    Док.Дата = ТекущаяДата();
    Док.Записать();
КонецПроцедуры
...Показать Скрыть

Получаю ошибку примерно такую:
Скрытый текст


Решений найдено 2.

1. Если вам не критично снять конфу с поддержки то в свойствах модуля на который ругается отлажчик надо
выставить свойство(Клиент обычное приложение).
З.Ы.: <Совет от КЭПА>: Если у вас в ОМ нет такого свойства зайдите в отладчике Сервис-Параметры - установите вариант "Управляемое и Обычное приложение" и св-во появится.

2. Если снимать конфу с поддержки не позволяет религия, нужно процелуру записи переделать под управляемый вариант, примерно так:

&НаКлиенте
Процедура ВыполнитьКлиент(Команда)
	
	ВыполнитьСервер();
	Ссылка = ВыполнитьСервер();
	ОповеститьОбИзменении(Ссылка);
	
КонецПроцедуры

&НаСервере
Функция ВыполнитьСервер();
	
	Док = Документы.ЗаказКлиента.СоздатьДокумент(); 
    Док.Дата = ТекущаяДата();
    Док.Записать();
	
	Возврат Док.Ссылка;
	
КонецФункции
...Показать Скрыть
45. Andrey ivanov (lsd_777) 28.10.13 17:03
Читал, читал, ничего не понял. Подскажите по моей проблеме Розница 2.0.8.11 обычное приложение можно ли как то безболезненно это решить?
46. Андрей М. (StepByStep) 29.10.13 21:56
(44) 1985Alex1985,
Да флажок или ссылка, ссылка предпочтительней.
47. Андрей М. (StepByStep) 29.10.13 22:06
(45) lsd_777,
Поздравляю, Вы решили проблему самостоятельно.
Только вот, что странно. У меня в Рознице 2.0.8.11 (РМК - обычное приложение) такого не было и нет.
Скидки используются. По отладчику не смотрел.
48. Andrey ivanov (lsd_777) 30.10.13 07:08
(47) StepByStep, У меня как пошло с версии 8.6, так и до 8.11 оставалось, пока не исправил. Времени уходит очень много на поиск решения.
49. Билигма Чимитдоржиева (bagirma) 08.04.15 09:10
"ВАРИАНТ РЕШЕНИЯ № 3:" очень помог.
Спасибо.
50. Сергей Старых (tormozit) 12.06.15 10:20
(8) Думаю термин "аварийное завершение" в статье применяется неверно. Вместо него следует применить "исключение" или "ошибка".
В подсистеме Инструменты разработчика (и в ее портативном варианте в сочетании с БСП) я реализовал более универсальный вариант метода №3. В общем модуле ирОбщий сделано 2 функции: ЗапистьОбъектЛкс и УдалитьОбъектЛкс, имеющих параметр НаСервере. Эти функции передают более полное, однако не все содержимое мутабельного объекта на сервер в отличие от описанного здесь способа через ЗаписатьXML. Во всех инструментах, выполняющих запись данных, сделан флажок "Запись на сервере" для перенаправления записи объекта на сервер.

По сути мутабельностью называют все то, что платформа не умеет сериализовать и десериализовать при вызовах клиент-сервер, однако это еще не значит что сериализовать это невозможно. В случае объектов БД кроме содержимого, имеющего штатную сериализацию, мы имеем еще свойства ОбменДанными типа ПараметрыОбменаДанными и ДополнительныеСвойства типа Структура, но самое главное у объекта имеется модуль, допускающий объявление переменных. Поэтому для полной сериализации такого объекта потребуется сериализовать рекурсивно
1. Данные. Сериализация реализована например методом ЗаписатьXML.
2. Свойство ОбменДанными. Все используемые внутри типы просто сериализуются.
3. Свойство ДополнительныеСвойства. Тут могут быть произвольные значения. Поэтому существует риски зацикливания и прочее.
4. Все переменные модуля объекта. Тут могут быть произвольные значения. Поэтому существует риски зацикливания и прочее.
Вот п.4 и есть изначальная причина обзывания объекта данных мутабельным. Потом к нему уже добавился п.3.

В моей реализации п.4 не сериализуется, т.к. надежного способа в рантайме перечислить все переменные модуля мне неизвестно. А остальные 3 пункта у меня сериализуются при передаче на сервер и обратно.
Nelli_A86; SirYozha; AndreykO; programteh; +4 Ответить