Конфигурация: Розница 2.0. Клиент-Сервер. Обычное приложение.
Ошибка возникает при Записи/Проведении/ОтменаПроведения документа.
СПРАВКА:
Мутабельный тип (англ. 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/НеИспользовать.
— Режим запуска: Обычное приложение. Толстый клиент.
С уважением к сообществу МА!
Под аварийным завершением процесса (клиента или сервера) ты имеешь ввиду недопустимую операцию (Problem signature и т.д.) и завершение процесса со стороны ОС?
Большинство таких ситуаций признаются производителем платформы ошибками и исправляются. Если у тебя есть пример воспроизведения такой ситуации, то отправь его в тех. поддержку 1с.
решение, конечно — оригинальное, ничего не скажешь! я и сам до этого допер… только в этом случае, как выполнения функций и процедур в таком модуле, скажется на производительности?
а что делать если конфигурация работает только в режиме управляемого приложения?
(1) tormozit,
В данном случае это не ошибка платформы.
Дело в том, что:
У Розницы 2.0 Основной режим запуска — УПРАВЛЯЕМОЕ ПРИЛОЖЕНИЕ.
В Управляемом приложении ЭТА ошибка не наблюдается.
Никаких флажков в данном конкретном случае дополнительно выставлять НЕ надо.
Конечно же, речь идет о типовой конфигурации.
(4) Дай четкий ответ на вопрос «Под аварийным завершением процесса (клиента или сервера) ты имеешь ввиду недопустимую операцию (Problem signature и т.д.) и завершение процесса со стороны ОС?»
(2) WKBAPKA,
Производительность не замерял.
Но из общих соображений, а мы говорим о ТОЛСТОМ клиенте, когда он содержит в себе весь необходимый функционал не думаю, что это как-то заметно скажется на производительности.
По своим наблюдениям, могу сказать на той же внешней обработке «КонсольАдминистратора», обычное приложение на ЛОКАЛЬНОМ SQL на хорошей машине с SSD работает шустро.
(3) w-divin,
В Управляемом приложении ЭТА ошибка не наблюдается.
(5) tormozit,
«Под аварийным завершением процесса (клиента или сервера) ты имеешь ввиду недопустимую операцию (Problem signature и т.д.) и завершение процесса со стороны ОС?»
ЗАВЕРШЕНИЕ ПРОЦЕССА ОС НЕ ПРОИСХОДИТ. 1С-КА НЕ «ОТВАЛИВАЕТСЯ».
логически можно предположить, что если установлен только флажок «Сервер», значит на клиенте при запуске этот модуль не компилируется?!
(9) WKBAPKA,
логически можно предположить, что если установлен только флажок «Сервер», значит на клиенте при запуске этот модуль не компилируется?!
Если говорить об управляемом приложении, то логически ДА, ибо в этом случае Флажок «Клиент (обычное приложение)» вообще скрыт (Установка в Конфигураторе «Сервис-Параметры-Общие» выставлено Редактирование конфигурации для режимов запуска: Управляемое приложение).
(10)
теоретически и в обычном приложении такое должно быть, иначе смысл?
т.е. если 1С мудабельное 🙂 значение не может обработать на сервере, значит обрабатывает его на клиенте
(11) WKBAPKA,
теоретически и в обычном приложении такое должно быть, иначе смысл?
Как раз в обычном приложении эта проблема и возникает (в управляемом — нет проблемы), потому что происходит ПЕРЕДАЧА значения с клиента на сервер, а передача не разрешена.
На сервере это значение может быть и должно быть обработано при условии, что оно получено сервером.
т.е. если 1С мудабельное 🙂 значение не может обработать на сервере, значит обрабатывает его на клиенте
На толстом клиенте это значение в принципе может быть обработано, но в данном конкретном случае производится передача на сервер, а передача не разрешена.
(7)
это кто тебе такое сказал?
ошибка передачи мутабельного значения одинакова что в обычном, что в управляемом приложении.
Вот только вылечить её таким неправильным способом в УП уже не получиться.
(14) w-divin,
ошибка передачи мутабельного значения одинакова что в обычном, что в управляемом приложении
Совершенно верно.
На сколько я понимаю ситуацию: в режиме Управляемого приложения вообще не происходит никакой передачи с клиента на Сервер, т.е. после того, как сказали Объект.Записать(…) (Обработка «КонсольАдминистратора» строка 662) причем делается это на Сервере НИКАКОЙ передачи с клиента на сервер в данном случае не происходит и, как следствие, ошибки не возникает.
(15)
глубокое заблуждение.
В управляемом приложении намного больше передач с клиента на сервер и обратно.
И многое из того что в обычном приложении отрабатывает на клиенте (как в твоем случае), в УП будет передаваться на сервер (либо платформой, либо разработчиком).
И на самом деле твое «решение» не решение, а разрешение выполнять операцию на клиенте, что в случае УП просто не будет работать.
Плюс выполнение операций на клиенте — ИМХО верх глупости. есть множество способов передать на сервер мутабельное значение и выполнять обработку уже на сервере.
(16) w-divin,
В управляемом приложении намного больше передач с клиента на сервер и обратно.
Совершенно верно.
Но я писал о конкретной ситуации: Внешняя обработка в Рознице 2.0 и о том, что «передачи с клиента на сервер в данном случае не происходит».
разрешение выполнять операцию на клиенте
Совершенно верно.
… что в случае УП просто не будет работать.
Ошибаетесь — работает — проверено неоднократно.
(16) w-divin,
есть множество способов передать на сервер мутабельное значение и выполнять обработку уже на сервере.
???
Можно передать ссылку и уже в процедуре получить Метаданные и прочее (см. публикация раздел проблемная ситуация).
(18)
в большинстве случаев нельзя — потому как нужно передать именно измененный объект.
самый распространенный способ — XML-сериализация.
(17)
Цитата
… что в случае УП просто не будет работать.
Ошибаетесь — работает — проверено неоднократно.
не работает. в УП на клиенте даже нет объекта как такового. всеголишь ДанныеФормыКоллекция и т.п.
и даже для того чтобы получить сам объект нужно передать управление на сервер:
РеквизитФормыВЗначение (FormAttributeToValue)
Синтаксис:
РеквизитФормыВЗначение(<ИмяРеквизита>, <Тип>)
Параметры:
<ИмяРеквизита> (обязательный)
Тип: Строка.
Имя реквизита формы, который необходимо преобразовать.
Может быть указан реквизит данных формы (см. описание параметра <Объект> метода ДанныеФормыВЗначение).
<Тип> (необязательный)
Тип: Тип.
Тип значения, получаемого из реквизита формы (данных формы). Если данный параметр не указан, то он также получается из реквизита формы. Если реквизит является составным типом и значение параметра не указано, генерируется исключение времени выполнения.
Возвращаемое значение:
Тип: Произвольный.
Описание:
Преобразует указанный реквизит формы в объект прикладного типа.
Доступность:
Сервер.
Показать
(19) w-divin,
Возможен и такой вариант.
(20) w-divin,
не работает. в УП на клиенте даже нет объекта как такового
1. Сделал контрольную проверку — Обработка работает в Управляемом приложении без каких-либо изменения в типовой конфигурации.
Никаких проблем с записью и проведением документа не возникает.
А именно это и нужно.
2. Скажите, пожалуйста, Вы какую конфигурацию смотрите ?
Розница 2.0 или что-то другое ?
Потому, что см. прикрепленный файл.
(22)
я не смотрю конфигурацию — я говорю о проблеме, озвученной в шапке:
конфа у тебя как пример.
и получается что это не решение проблемы, а «заплатка» для конретной конфы (((
(23) w-divin,
А я говорю о конкретной ситуации, т.е. Конкретная конфигурация, Конкретная обработка.
(23) w-divin,
Хорошо, если о проблеме в общем.
Что Вы имели в иду когда
в УП на клиенте даже нет объекта как такового
(23) w-divin,
А по большому счету эта «заплатка» и не нужна, т.к. Основной режим запуска Розница 2.0: Управляемое приложение.
(25)
рекомендую ознакомиться с документацией по управляемым формам. или почитать тут для начала:СсылкО
(23) w-divin,
И, следовательно, этой проблемы и не возникает.
(28) w-divin,
Читать и перечитывать всегда полезно.
Есть еще такое:infostart
Мудабельные значения …
Спасибо. Спасибо. Спасибо. (варианта-то три)
2 вар. использовать.
(30) Miha.L,
Пожалуйста. Пожалуйста. Пожалуйста. (варианта-то три)
Право на существование имеют все три, надо смотреть по конкретной ситуации.
режиме Управляемого приложения вообще не происходит никакой передачи с клиента на Сервер, т.е. после того, как сказали Объект.Записать(…) (Обработка «КонсольАдминистратора» строка 662) причем делается это на Сервере НИКАКОЙ передачи с клиента на сервер в данном случае не происходит и, как следствие, ошибки не возникает.
Почему не попользоваться парочкой ЗначениеВСтрокуВнутр / ЗначениеИзСтрокиВнутр ?
вот и в нашем Итилиуме на поддержке походу основной режим запуска — управляемое 🙁
конфа на поддержке,
ошибку сами не исправляют,
вменяемой отчетности нет, пишем сами… а сами хорошо пишем для толстого и пока плёха под тонкого
🙁
ах, да! Автору статьи спасибо!)
Проблема хорошая…автор молодец, четко и по делу и на «живом» мясе…Мое мнение — при правильной организации своего кода (ну или своего решения на базе 1С) таких проблем возникать не будет, в статье основные «проблемные» ситуации автор хорошо изложил…
Загрузка данных обработкой «Универсальный обмен данными в формате XML».
Выдало ошибку по поводу «мутабельности». Ссылка поиска привела сюда, в том числе.
Автору большое спасибо.
Попробовал предложенные варианты. Помогло только — запуск приложения в файловом режиме.
Не очень кашерно. Но, пока только этот вариант. Затем из файловой базы в SQL.
Хочется загружать сразу в SQL
Можете поменять расцветку в оформлении статьи?
Передавать между клиентом и сервером (в обе стороны) можно только немутабельные значения (т.е. значения которых не могут изменяться):
примитивные типы, ссылки, универсальные коллекции, значения системных перечислений, хранилище значения.
Насчет подчеркнутого не совсем так…
…покрайней мере под 8.1 столкнулся со следующим:
— «Структура» канает для передачи туда — суда (хотя и может быть изменена на сервере);
— а «ТаблицаЗначений» и «ДеревоЗначений» — уже не какнают.
аварийного заверщения работы клиента при этом не наблюдается,
наверное из-за того, что под 8.1 — он толстый
Так что с мутабельностью что-то намудрили разработчики платформы.
😉
(39) PS,
Кроме передачи значений на сервер есть еще такая функция
ЗначениеЗаполнено()
Она тоже не жалует «мутабельные» и завершается аварийно.
(39) yuraos, (40) yuraos,
Спасибо. Да. Все так.
(38) vladal,
Переоформил.
Меня периодически спасает значениевстрокувнутр и значениеизстрокивнутр
Столкнулся на днях с такой же пробемой в УТ3 редакция 3.0.4.3
Ошибку получаем при записи объектов (элемент справочника, новый документ) программно в обычном приложении в серверном варианте хранения БД.
Записываю примерно так:
Получаю ошибку примерно такую:
Док.Записать();
по причине:
Ошибка при выполнении обработчика — ‘ПередЗаписью’
по причине:
{Документ.ЗаказКлиента.МодульОбъекта(517)}: Ошибка при вызове метода контекста (УдалитьНеиспользуемыеСтрокиСерий)
Док.Записать();
по причине:
Попытка передачи с клиента на сервер мутабельного значения 1-го параметра метода УдалитьНеиспользуемыеСтрокиСерий ().
Решений найдено 2.
1. Если вам не критично снять конфу с поддержки то в свойствах модуля на который ругается отлажчик надо
выставить свойство(Клиент обычное приложение).
З.Ы.: <Совет от КЭПА>: Если у вас в ОМ нет такого свойства зайдите в отладчике Сервис-Параметры — установите вариант «Управляемое и Обычное приложение» и св-во появится.
2. Если снимать конфу с поддержки не позволяет религия, нужно процелуру записи переделать под управляемый вариант, примерно так:
Показать
Читал, читал, ничего не понял. Подскажите по моей проблемеРозница 2.0.8.11 обычное приложение можно ли как то безболезненно это решить?
(44) 1985Alex1985,
Да флажок или ссылка, ссылка предпочтительней.
(45) lsd_777,
Поздравляю, Вы решили проблему самостоятельно.
Только вот, что странно. У меня в Рознице 2.0.8.11 (РМК — обычное приложение) такого не было и нет.
Скидки используются. По отладчику не смотрел.
(47) У меня как пошло с версии 8.6, так и до 8.11 оставалось, пока не исправил. Времени уходит очень много на поиск решения.
«ВАРИАНТ РЕШЕНИЯ № 3:» очень помог.
Спасибо.
(8) Думаю термин «аварийное завершение» в статье применяется неверно. Вместо него следует применить «исключение» или «ошибка».
Инструменты разработчика (и в ее портативном варианте в сочетании с БСП) я реализовал более универсальный вариант метода №3. В общем модуле ирОбщий сделано 2 функции: ЗапистьОбъектЛкс и УдалитьОбъектЛкс, имеющих параметр НаСервере. Эти функции передают более полное, однако не все содержимое мутабельного объекта на сервер в отличие от описанного здесь способа через ЗаписатьXML. Во всех инструментах, выполняющих запись данных, сделан флажок «Запись на сервере» для перенаправления записи объекта на сервер.
В подсистеме
По сути мутабельностью называют все то, что платформа не умеет сериализовать и десериализовать при вызовах клиент-сервер, однако это еще не значит что сериализовать это невозможно. В случае объектов БД кроме содержимого, имеющего штатную сериализацию, мы имеем еще свойства ОбменДанными типа ПараметрыОбменаДанными и ДополнительныеСвойства типа Структура, но самое главное у объекта имеется модуль, допускающий объявление переменных. Поэтому для полной сериализации такого объекта потребуется сериализовать рекурсивно
1. Данные. Сериализация реализована например методом ЗаписатьXML.
2. Свойство ОбменДанными. Все используемые внутри типы просто сериализуются.
3. Свойство ДополнительныеСвойства. Тут могут быть произвольные значения. Поэтому существует риски зацикливания и прочее.
4. Все переменные модуля объекта. Тут могут быть произвольные значения. Поэтому существует риски зацикливания и прочее.
Вот п.4 и есть изначальная причина обзывания объекта данных мутабельным. Потом к нему уже добавился п.3.
В моей реализации п.4 не сериализуется, т.к. надежного способа в рантайме перечислить все переменные модуля мне неизвестно. А остальные 3 пункта у меня сериализуются при передаче на сервер и обратно.
Спасибо.
А чем ХранилищеЗначения не канает?
Была похожая проблема в Рознице 2.2 при вызове метода Записать() во внешней обработке через COM соединение. Причина оказалась в обработчике события при записи, код которого был в не типовом общем модуле без флага «Внешнее соединение».
(53)это сплошь и рядом, сегодня тоже наткнулся.
С Новым годом !
ЗУП КОРП 2,5 порадовали этой ошибкой , в справках 2 НДФЛ ,
применил 1 способ
Спасибо. Способ изменения свойства сработал в УПП на одном из общих модулей.
(47) Андрей М. Скажите пожалуйста, как по вашему мнению лучше всего развиваться программисту 1с? Я имею ввиду что читать, или ходить на курсы, или практиковаться? И в какой последовательности?
Понимаю, что это не в тему статьи, но там не поймешь от кого получаешь совет, от еще одного стажера или от профи. Извините, если нужно могу удалить комент