Мутабельное значение 1с это

Обновлено: 07.07.2024

При освоении языка программирования 1С с использованием методолических материалов со временем возникает вопрос, что же собой представляют мутабельные значения в 1С.

1. Что собой представляет мутабельные значения в 1С?

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

Мутабельный тип (в переводе с английского Mutable – изменчивый) – это сложный тип данных в 1С, который может менять свои свойства уже после создания.

К мутабельным типам в языке программирования 1С относятся:

Исходя из этого все остальные типы являются не мутабельными. К таким типам значений следует относить простые или так называемые примитивные типы, сложные, но неизменчивые типы и предопределенные типы.

Простые (примитивные) типы:

Ссылка является сложным типом, который, однако, мы не можем изменить непосредственно. Для этого требуется получение объекта через конструкцию Ссылка.ПолучитьОбъект().

Предопределенным типом является цвет.

С описанием типов разобрались. Следующий вопрос, который, думаю, заинтересует многих – как же проверить заполненность мутабельных значений в 1С.

2. Как проверить заполненные мутабельные значения в 1С?

При переходе со старой версии платформы 1С:Предприятие (до 8.2) на актуальную нередко в момент тестирования или эксплуатации возникают ошибки проверки мутабельного значения на заполненность. Это связано с особенностью глобальной функции ЗначениеЗаполнено(). Ранее использовалась гл. функция НеЗаполнено(), которая проверяла, хоть и медленнее, но более эффективно. То есть в новых версиях платформы 1С Предприятие подобная проблема может возникнуть в тот момент, когда проверяем значение, не зная его типа.

Зачастую ошибки подобного толка касаются таких типов как формы и элементы форм, списки значений (таблица, список, дерево), COM- объекты и т.д.

Для решения данной проблемы целесообразно проверять тип данных перед проверкой его заполненности, если заранее мы его не знаем. Зачастую это происходит при написании обменов данными.

Для проверки типа данных 1С мы можем использовать конструкцию типа:

проверки типа данных 1С

В данном случае 1С проанализирует первое условие, и если типы совпадут, дальнейшее условие отработано не будет.

В некоторых случаях целесообразно сделать проверку на примитивные типы, для этого заранее создадим массив примитивных типов:

(3) >>> Мутабельный тип (от англ. Mutable - изменчевый) - сложный тип данных (как правило - объекты), которые после своего создания допускают изменение своих свойств.

Ниже написано:
Проверить, что переменная Количество с типом "число" не содержит "ноль" - можно, а вот понять что такое "пустое" для СписокЗначений (то ли все значения списка равны нулю, то ли нет ни одного значения списка, или что-то иное) - однозначно нельзя.

Однако, ЗначениеЗаполнено(Массив) - сработает, и не выдаст ошибку мутабельности. Хотя для массива действует тоже самое предположение автора: (то ли все значения массива равны нулю, то ли нет ни одного значения массива, или что-то иное). Поэтому с такими выводами я не согласен.

Если СписокЗначений Мутабельный, как сопоставить этот тип данных с правилом "которые после своего создания допускают изменение своих свойств"? У структуры есть свойства, но она не мутабельная.

(3) Мне больше важны академически знания, а не эмпирические -)
Наверное это как-то связано с хранением объекта в памяти?

(7) Больше помогает What is mutable type на английском. Там больше описаний:

Some objects are mutable, meaning they can be altered. Others are immutable; they cannot be changed but rather return new objects when attempting to update.

То есть при изменении значения не мутабельного объекта создается новый, а не изменяется старый.

string_build = ""
for data in container:
string_build += str(data)
In reality, this is very inefficient. Because strings are immutable, concatenating two strings together actually creates a third string which is the combination of the previous two.

(7) Я не смог найти -(

(8) 1С вкладывает в это чуть чуть другой смысл. Смирись

Мутабельный в 1С - это для которого в клиент-серверной реализации платформы не реализована сериализация-десериализация при обмене с сервером приложений.

В режиме ОП и УП одни и те же объекты встроенного языка различаются мутабельностью. Например, табдок и СЗ в ОП мутабельные, а в УП уже нет.

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

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

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

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

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

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

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

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

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

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

При освоении языка программирования 1С с использованием методолических материалов со временем возникает вопрос, что же собой представляют мутабельные значения в 1С.

1. Что собой представляет мутабельные значения в 1С?

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

Мутабельный тип (в переводе с английского Mutable – изменчивый) – это сложный тип данных в 1С, который может менять свои свойства уже после создания.

К мутабельным типам в языке программирования 1С относятся:

Исходя из этого все остальные типы являются не мутабельными. К таким типам значений следует относить простые или так называемые примитивные типы, сложные, но неизменчивые типы и предопределенные типы.

Простые (примитивные) типы:

Ссылка является сложным типом, который, однако, мы не можем изменить непосредственно. Для этого требуется получение объекта через конструкцию Ссылка.ПолучитьОбъект().

Предопределенным типом является цвет.

С описанием типов разобрались. Следующий вопрос, который, думаю, заинтересует многих – как же проверить заполненность мутабельных значений в 1С.

2. Как проверить заполненные мутабельные значения в 1С?

При переходе со старой версии платформы 1С:Предприятие (до 8.2) на актуальную нередко в момент тестирования или эксплуатации возникают ошибки проверки мутабельного значения на заполненность. Это связано с особенностью глобальной функции ЗначениеЗаполнено(). Ранее использовалась гл. функция НеЗаполнено(), которая проверяла, хоть и медленнее, но более эффективно. То есть в новых версиях платформы 1С Предприятие подобная проблема может возникнуть в тот момент, когда проверяем значение, не зная его типа.

Зачастую ошибки подобного толка касаются таких типов как формы и элементы форм, списки значений (таблица, список, дерево), COM- объекты и т.д.

Для решения данной проблемы целесообразно проверять тип данных перед проверкой его заполненности, если заранее мы его не знаем. Зачастую это происходит при написании обменов данными.

Для проверки типа данных 1С мы можем использовать конструкцию типа:

проверки типа данных 1С

В данном случае 1С проанализирует первое условие, и если типы совпадут, дальнейшее условие отработано не будет.

В некоторых случаях целесообразно сделать проверку на примитивные типы, для этого заранее создадим массив примитивных типов:

При освоении языка программирования 1С с использованием методолических материалов со временем возникает вопрос, что же собой представляют мутабельные значения в 1С.

1. Что собой представляет мутабельные значения в 1С?

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

Мутабельный тип (в переводе с английского Mutable – изменчивый) – это сложный тип данных в 1С, который может менять свои свойства уже после создания.

К мутабельным типам в языке программирования 1С относятся:

Исходя из этого все остальные типы являются не мутабельными. К таким типам значений следует относить простые или так называемые примитивные типы, сложные, но неизменчивые типы и предопределенные типы.

Простые (примитивные) типы:

Ссылка является сложным типом, который, однако, мы не можем изменить непосредственно. Для этого требуется получение объекта через конструкцию Ссылка.ПолучитьОбъект().

Предопределенным типом является цвет.

С описанием типов разобрались. Следующий вопрос, который, думаю, заинтересует многих – как же проверить заполненность мутабельных значений в 1С.

2. Как проверить заполненные мутабельные значения в 1С?

При переходе со старой версии платформы 1С:Предприятие (до 8.2) на актуальную нередко в момент тестирования или эксплуатации возникают ошибки проверки мутабельного значения на заполненность. Это связано с особенностью глобальной функции ЗначениеЗаполнено(). Ранее использовалась гл. функция НеЗаполнено(), которая проверяла, хоть и медленнее, но более эффективно. То есть в новых версиях платформы 1С Предприятие подобная проблема может возникнуть в тот момент, когда проверяем значение, не зная его типа.

Зачастую ошибки подобного толка касаются таких типов как формы и элементы форм, списки значений (таблица, список, дерево), COM- объекты и т.д.

Для решения данной проблемы целесообразно проверять тип данных перед проверкой его заполненности, если заранее мы его не знаем. Зачастую это происходит при написании обменов данными.

Для проверки типа данных 1С мы можем использовать конструкцию типа:

проверки типа данных 1С

В данном случае 1С проанализирует первое условие, и если типы совпадут, дальнейшее условие отработано не будет.

В некоторых случаях целесообразно сделать проверку на примитивные типы, для этого заранее создадим массив примитивных типов:

Читайте также: