Ошибка «проверка мутабельных значений» при обмене заказами
При попытке настройки обмена заказами с сайтом вылезло сообщение в 1С "проверка мутабельных значений на заполненность не поддерживается"
1С 8.3.5.183 УТ 11.1.9.44 Hostcms: Бизнес 6.1.7
Никто не подскажет на какие переменные ругается? Может кто сталкивался?
Проверка мутабельных значений на заполненность не поддерживается — эта ошибка может возникнуть в том случае, если разработчик пытается проверить мутабельную переменную на заполненность.
Мутабельная переменная — эта такая переменная, составляющие которой могут быть изменены в процессе обработки. Например, мутабельной является переменная СправочникОбъект. Ее нельзя передавать с клиента на сервер и обратно. Ведь из-за этого может возникнуть ситуация, когда переменная изменена и на сервере и на клиенте, что является нежелательным из-за невозможности определить какая версия является актуальной и необходимости синхронизировать эти данные.
Проверка мутабельных значений на заполненность
Данная ошибка характерна для 1С 8 версии, преимущественно проявлялась при переходе с версии 8.1. Раньше в типовых конфигурациях была встроенная глобальная функция НеЗаполнено(), которая умела проверять более продумано, но не медленнее и не так универсально. Замена ее на встроенную провоцировало такие ошибки.
Сейчас ошибка возникает, когда переменной неопределенного(произвольного) типа, присваивается значение, которое невозможно проверить на заполненность.
Полное сообщение ошибки:
Проверка мутабельных значений на заполненность не поддерживается
Причина этой ошибки кроется в некорректном типе переменных:
- Имя общего модуля (в моём случае совпадало с именем переменной)
- Форма
- Элементы формы
- ТаблицаЗначений, СписокЗначений, ДеревоЗначений
- Com-объект
- Другие сложные типы, не связанные с данными системы кроме примитивных (дата, строка, число)
Исправление ошибки
Заключается изменении программного кода для отсутствии такой проверки:
- отсутствие такого типа для данной переменной
- добавление дополнительной проверки на тип: например
Если ТипЗнч(МояПеременная)<>Тип(«ОбщийМодуль») и ЗначениеЗаполнено(МояПеременная) Тогда
Реклама — двигатель торговли: сотня двигает, один торгует.
— Хенрик Ягодзиньский
Ошибка «Проверка мутабельных значений на заполненность не поддерживается»
Ошибка возникает при попытке использования функции ЗначениеЗаполнено() для проверки заполнения объекта агрегатного типа.
К таким объектам относятся программные объекты типа:
- СправочникОбъект, СправочникСписок, СправочникВыборка, ДокументОбъект, ДокументСписок, ДокументВыборка и т.п.;
- ОбработкаОбъект, ОтчетОбъект и т.п.
- ТабличныйДокумент, ТекстовыйДокумент, ДиаграммаГанта и т.п.;
Указанные объекты поддерживают только сравнение со значением Неопределено :
1с мутабельные значения что это
Иногда в технической документации встречается понятие “мутабельный тип”. Например, в описании функции ЗначениеЗаполнено (ValueIsFilled) мы встречаем:
Функция проверяет, отличается ли переданное значение от значения по умолчанию того же типа.
Не работает с мутабельными значениями. При передаче мутабельного значения функция вызывает исключение.
И возникает вопрос, а что такое “мутабельное значение”?
Мутабельный тип (от англ. Mutable – изменчевый) – сложный тип данных (как правило – объекты), которые после своего создания допускают изменение своих свойств.
Ошибка возникает при попытке использования функции ЗначениеЗаполнено() для проверки заполнения объекта агрегатного типа.
К таким объектам относятся программные объекты типа:
- СправочникОбъект, СправочникСписок, СправочникВыборка, ДокументОбъект, ДокументСписок, ДокументВыборка и т.п.;
- ОбработкаОбъект, ОтчетОбъект и т.п.
- ТабличныйДокумент, ТекстовыйДокумент, ДиаграммаГанта и т.п.;
Указанные объекты поддерживают только сравнение со значением Неопределено :
Возникла такая задачка — перенести выполнение функции на сервер, но эта функция в исходном варианте сидела в общем модуле, который был серверным и клиентским одновременно. При запуске исходной функции из серверного куска кода все срабатывает как надо, а при запуске из клиенткого приложения — ошибка "Попытка передачи с клиента на сервер мутабельного значения".
СПРАВКА:
Мутабельный тип (англ. 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: Клиент- серверные вызовы: //v8book.ru/public/86838/
Допустим, в нашем случае имеется проблема — нужно передать структуру. Структура эта изменяется функцией, в которую передается как параметр, плюс ко всему, 1С считает этот тип мутабельным по определению. И, чтобы уж совсем соответствовать реальной задаче, передаваемая структура, после изменения в функции, приобретает гигантский размер, т.к. в своем составе содержит поле, в которое помещается колоссальный результат запроса.
Решаем эту проблему через помещение структуры во временное хранилище.
Конкретный пример:
Бухгалтерия 2.0, общий модуль учета НДС, нужно добиться того, чтобы книги покупок и продаж учитывали самописные документы, при этом сохранилась возможность относительно нетрудоемкого обновления конфигурации.
Есть функция, в которую передается СтруктураПараметров. Попытка передачи на сервер структуры приводит к ошибке передачи мутабельного значения.
Далее, в чисто серверный модуль (в конкретном случае АС_УЧЕТ_НДС) копируем исходную процедуру (модифицируем функционал при желании).
Если в ходе работы процедуры/функции на сервере передаваемое мутабельное значение должно быть изменено — помещаем его во временное хранилище по тому же адресу АдресМутабельногоЗначенияВоВременномХранилище и после выполнения функции/процедуры в исходном модуле считываем из временного хранилища.
Проверка мутабельных значений на заполненность
Данная ошибка характерна для 1С 8 версии, преимущественно проявлялась при переходе с версии 8.1. Раньше в типовых конфигурациях была встроенная глобальная функция НеЗаполнено(), которая умела проверять более продумано, но не медленнее и не так универсально. Замена ее на встроенную провоцировало такие ошибки.
Сейчас ошибка возникает, когда переменной неопределенного(произвольного) типа, присваивается значение, которое невозможно проверить на заполненность.
Полное сообщение ошибки:
Проверка мутабельных значений на заполненность не поддерживается
Причина этой ошибки кроется в некорректном типе переменных:
- Имя общего модуля (в моём случае совпадало с именем переменной)
- Форма
- Элементы формы
- ТаблицаЗначений, СписокЗначений, ДеревоЗначений
- Com-объект
- Другие сложные типы, не связанные с данными системы кроме примитивных (дата, строка, число)
Исправление ошибки
Заключается изменении программного кода для отсутствии такой проверки:
- отсутствие такого типа для данной переменной
- добавление дополнительной проверки на тип: например
Если ТипЗнч(МояПеременная)<>Тип(«ОбщийМодуль») и ЗначениеЗаполнено(МояПеременная) Тогда
Люди глупо доверчивы… Вся реклама мира основана на трех принципах: «Хорошо, много и даром». Поэтому можно давать скверно, мало и дорого.
— Александр Грин
Почему в файловой базе работает, а в клиент-серверной возникает ошибка «Попытка передачи с клиента на сервер мутабельного значения 1-го параметра. »?
1С 8.3, УПП 1.3 (обычное приложение), база клиент-серверная.
Имеется подписка на событие Обработка проведения документа Требование-накладная. Обработчик данной подписки находится в общем модуле.
При проведении документа Требование-накладная возникает следующая ошибка:
, которая отсутствовала в файловом варианте данной базы.
Как её исправить?
Ошибка появляется до начала выполнения тела процедуры:
- Вопрос задан более трёх лет назад
- 2873 просмотра
- Вконтакте
1) При работе в файловой базе все находится в памяти вашего компьютера — тут нет никаких проблем. Но когда дело касается взаимодействия вашего компьютера-клиента с компьютером-сервером, то сервер уже не имеет доступа к вашей оперативке — передаваемая в обработку информация пакуются в контейнеры и отправляются по сети. Пока все понятно?
2) При программировании на платформе 1С при работе с базой данных мы работаем или с Ссылками, или с полученными с их помощью Объектами. Ссылка отличается от Объекта своей неизменностью — это просто адрес с указанием типа данных и уникального идентификатора. Но Объект в отличии от Ссылки можно изменить и записать назад в базу по адресу этой Ссылки. Думаю это тоже понятно.
3) Что вы пытаетесь сделать? У вас локально в памяти есть измененный Объект (в переменной Источник) и вы хотите передать его на сервер для дальнейшей параллельной обработки и тут и там. К сожалению мы работаем не на квантовых компьютерах и потому эффект запутанности нам недоступен. Мы можем править Объект или локально, или на сервере. Но не одновременно в двух местах!
Итого. Судя по тексту вашей процедуры, вам вообще Источник передавать не нужно — передавайте сразу ДокументОснования. Но если предполагается, что на сервере Объект нужно изменить, то а) запишите его локально, б) передайте на него Ссылку, в) на сервере прочитайте по Cсылке, г) после изменения на сервере запишите Объект в базу, д) после возвращения потока управления на клиент, прочитайте Объект из базы по Ссылке.
1с мутабельные значения что это
Иногда в технической документации встречается понятие «мутабельный тип». Например, в описании функции ЗначениеЗаполнено (ValueIsFilled) мы встречаем:
Функция проверяет, отличается ли переданное значение от значения по умолчанию того же типа.
Не работает с мутабельными значениями. При передаче мутабельного значения функция вызывает исключение.
И возникает вопрос, а что такое «мутабельное значение»?
Мутабельный тип (от англ. Mutable — изменчивый) — сложный тип данных (как правило — объекты), который после своего создания допускает изменение своих свойств.