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

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

Мутабельный тип (англ. 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: Клиент- серверные вызовы: //infostart.ru/public/86838/

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

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

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

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

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

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

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

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

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

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

МО: : Ошибка при вызове метода контекста (Записать): Ошибка при выполнении обработчика - 'ПередЗаписью':: Ошибка при вызове метода контекста (ДатаИлиОрганизацияОбъектаИзменена): Попытка передачи с клиента на сервер мутабельного значения 2-го параметра метода ДатаИлиОрганизацияОбъектаИзменена().

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

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

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

ВАРИАНТ РЕШЕНИЯ № 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/НеИспользовать. - Режим запуска: Обычное приложение. Толстый клиент.

📎📎📎📎📎📎📎📎📎📎