Что значит мутабельное значение 1с
Что есть «мутабельное значение результата»?
Здравствуйте! Возник вопрос, пожалуйста помогите кто знает!
При вызове функции 1с 8.1 выдает ошибку «Попытка передачи мутабельного значения результата метода ПолучитьВыходныеИзделия()». Серверная версия базы. Что это значит? На файловой версии базы все работает.
Каждый мутабельный знак соответствует переходной, нестабильной и податливой фазе проявления того элемента, к которому он принадлежит. Двойственные знаки, как свидетельствует само их название, могут проявляться двояко. Они с равным успехом могут и двигаться, и стоять на месте. Они амбивалентны, непредсказуемые и переменчивы. Мутабельными знаками управляют Меркурий и Юпитер — две планеты ума. А потому эти знаки (особенно Дева и Рыбы) обладают повышенной умственной и эмоциональной чувствительностью.
Люди, принадлежащие к мутабельному типу, отличаются гибкостью и приспособляемостью. Круг их интересов широк, они наделены самыми разнообразными талантами и владеют множеством навыков и умений. Однако они нерешительны, и подчас им бывает трудно перейти от размышлений к действиям. Они предпочитают думать, просчитывать и оценивать возможные последствия своих поступков, тревожиться по поводу результатов или созерцать их в своем воображении. Многие люди этого типа страдают от психических или нервных расстройств, нарушений иммунной системы и аллергических заболеваний.
МУТАБОР )))
МУТАБОР. МУТАБОР. МУТАБОР. МУТАБОР.
И вся компания пустилась в пляс вокруг мутировавшего животного.
(Не помню, какой то старый мультик)
Мутабельные значения в 1С
При освоении языка программирования 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С проанализирует первое условие, и если типы совпадут, дальнейшее условие отработано не будет.
В некоторых случаях целесообразно сделать проверку на примитивные типы, для этого заранее создадим массив примитивных типов:
Мутабельность при записи документа, через ком соединение
Платформа 8.3 управляемое приложение. При проведении через ком вот такая бяка:
Я бы для начала обрезал руки разработчику конфигурации.
Потом разработчику обработки, которая соединяется.
И да, вы угадали. По самую голову.
В подсистеме Инструменты разработчика (и в ее портативном варианте в сочетании с БСП) http://devtool1c.ucoz.ru реализован кажется наиболее универсальный вариант обхода описанной проблемы. Сама проблема у меня описана тут http://devtool1c.ucoz.ru/forum/2-218-1#866
В общем модуле ирОбщий сделано 2 функции: ЗапистьОбъектЛкс и УдалитьОбъектЛкс, имеющих параметр НаСервере. Эти функции передают почти полное, однако не все, содержимое мутабельного объекта на сервер. Во всех инструментах, выполняющих запись данных, сделан флажок «Запись на сервере» для перенаправления записи объекта на сервер.
По сути мутабельностью называют все то, что платформа не умеет сериализовать и десериализовать при вызовах клиент-сервер, однако это еще не значит что сериализовать это невозможно. В случае объектов БД кроме содержимого, имеющего штатную сериализацию, мы имеем еще свойства ОбменДанными типа ПараметрыОбменаДанными и ДополнительныеСвойства типа Структура, но самое главное у объекта имеется модуль, допускающий объявление переменных. Поэтому для полной сериализации такого объекта потребуется сериализовать рекурсивно
1. Данные. Сериализация реализована например методом ЗаписатьXML.
2. Свойство ОбменДанными. Все используемые внутри типы просто сериализуются.
3. Свойство ДополнительныеСвойства. Тут могут быть произвольные значения. Поэтому существует риски зацикливания и прочее.
4. Все переменные модуля объекта. Тут могут быть произвольные значения. Поэтому существует риски зацикливания и прочее.
Вот п.4 и есть изначальная причина обзывания объекта данных мутабельным. Потом к нему уже добавился п.3.
В моей реализации п.4 не сериализуется, т.к. надежного способа в рантайме перечислить все переменные модуля мне неизвестно. А остальные 3 пункта у меня сериализуются при передаче на сервер и обратно.
Передача мутабельного значения с клиента на сервер
В своей практике я сталкнулся с такой проблемой. В нашей компании была база УТ, файловый режим работы. Работала замечательно без каких либо нареканий. В один прекрачный день наш системный администратор решил файловый вариант cделать клиент-серверным. Все вроде бы работало нормально. И тут мне звоинт пользователь и говорит, что печатная форма, которой он пользовался все время, вдруг почему то перестала работать. Сообщение у пользователя выходило такое «Не удалось сформировать внешнюю печатную форму! [*]Ошибка при вызове метода контекста (ПредставлениеСерий): Попытка передачи с клиента на сервер мутабельного значения 1-го параметра метода ПредставлениеСерий ().».
Я зашел в интернет и прочитал описание мутабельного значения.
Запрос = Новый Запрос;
Запрос.УстановитьПараметр(«ТекущийДокумент», Ссылка);
Запрос.Текст =
«ВЫБРАТЬ
| Номер,
| Дата,
| Контрагент,
| Организация,
| Товары.(
| Номенклатура,
| Номенклатура.»+ ТекстКодАртикул + » КАК КодАртикул,
| Номенклатура.НаименованиеПолное КАК Товар,
| КоличествоМест,
| Количество,
| ЕдиницаИзмерения.Представление КАК ЕдиницаИзмерения,
| ЕдиницаИзмеренияМест.Представление КАК ЕдиницаИзмеренияМест,
| ХарактеристикаНоменклатуры КАК Характеристика,
| СерияНоменклатуры КАК Серия
| ),
| ВозвратнаяТара.(
| Номенклатура,
| Номенклатура.»+ ТекстКодАртикул + » КАК КодАртикул,
| Номенклатура.НаименованиеПолное КАК Товар,
| Количество,
| Номенклатура.ЕдиницаХраненияОстатков.Представление КАК ЕдиницаИзмерения
| )
|ИЗ
| Документ.ПриходныйОрдерНаТовары КАК ПриходныйОрдерНаТовары
|ГДЕ
| ПриходныйОрдерНаТовары.Ссылка = &ТекущийДокумент
|УПОРЯДОЧИТЬ ПО
| Товары.НомерСтроки,
| ВозвратнаяТара.НомерСтроки»;
Шапка = Запрос.Выполнить().Выбрать();
Шапка.Следующий();
ВыборкаСтрокТовары = Шапка.Товары.Выбрать();
Пока ВыборкаСтрокТовары.Следующий() Цикл
Если НЕ ЗначениеЗаполнено(ВыборкаСтрокТовары.Номенклатура) Тогда
Продолжить;
КонецЕсли;
ОбластьМакета.Параметры.Заполнить(ВыборкаСтрокТовары);
ОбластьМакета.Параметры.НомерСтроки = Ном;
ОбластьМакета.Параметры.Товар = ВыборкаСтрокТовары.Товар + ФормированиеПечатныхФормСервер.ПредставлениеСерий(ВыборкаСтрокТовары);
Ошибка возникала в момент когда обрабатывалась строка: «ОбластьМакета.Параметры.Товар = ВыборкаСтрокТовары.Товар + ФормированиеПечатныхФормСервер.ПредставлениеСерий(ВыборкаСтрокТовары);».
Я посмотрел еще раз описание мутабельного значения: «Передавать между клиентом и сервером (в обе стороны) можно только немутабельные значения (т.е. значения которых не могут изменяться): примитивные типы, ссылки, универсальные коллекции, значения системных перечислений, хранилище значения. При попытке передать что-либо другое – аварийное завершение клиентского приложения (даже, если передавать некорректный параметр пытается сервер). Я был удивлен универсальные коллекции можно передавать, а строку универсальной коллекции нет. Поэтому я решил воспользоваться другой универсальной коллекцией, а именно Структурой. В итоге код получился такой:
Пока ВыборкаСтрокТовары.Следующий() Цикл
Если НЕ ЗначениеЗаполнено(ВыборкаСтрокТовары.Номенклатура) Тогда
Продолжить;
КонецЕсли;
Представление = Новый Структура();
Представление.Вставить(«Характеристика», ВыборкаСтрокТовары.Характеристика);
Представление.Вставить(«Серия», ВыборкаСтрокТовары.Серия);
ОбластьМакета.Параметры.Заполнить(ВыборкаСтрокТовары);
ОбластьМакета.Параметры.НомерСтроки = Ном;
ОбластьМакета.Параметры.Товар = ВыборкаСтрокТовары.Товар + ФормированиеПечатныхФормСервер.ПредставлениеСерий(Представление);
Так что если кто то будет сталкиваться с такой же проблемой пусть знает, что строка таблицы значений является мутабельным значением и ее (строку) передавать нельзя. Нужно создать структуру.
Решение же моей проблемы было: в функции «ФормированиеПечатныхФормСервер.ПредставлениеСерий» проверялось условие:
Если ЗначениеЗаполнено(Выборка.Характеристика) и (ТипЗнч(Выборка.Характеристика) = Тип(«СправочникСсылка.ХарактеристикиНоменклатуры»)) Тогда
Если ЗначениеЗаполнено(Выборка.Серия) Тогда