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