Попытка передачи мутабельного значения
Мутабельный тип (англ. 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/НеИспользовать. - Режим запуска: Обычное приложение. Толстый клиент.