Передача мутабельного значения с клиента на сервер
Исправление ошибки передачи мутабельного значения с клиента на сервер
- Описание
- Подробнее
Описание
В своей практике я сталкнулся с такой проблемой. В нашей компании была база УТ, файловый режим работы. Работала замечательно без каких либо нареканий. В один прекрачный день наш системный администратор решил файловый вариант cделать клиент-серверным. Все вроде бы работало нормально. И тут мне звоинт пользователь и говорит, что печатная форма, которой он пользовался все время, вдруг почему то перестала работать. Сообщение у пользователя выходило такое «Не удалось сформировать внешнюю печатную форму! [*]Ошибка при вызове метода контекста (ПредставлениеСерий): Попытка передачи с клиента на сервер мутабельного значения 1-го параметра метода ПредставлениеСерий ().».
Я зашел в интернет и прочитал описание мутабельного значения.
Мутабельное значение — сложный тип данных в объектно-ориентированном программировании, значения которого (как правило — объекты) после своего создания допускают изменение своих свойств.
Прочитав такое описание, я начал искать в чем проблема.Проанализиров код я увидел, что ошибка возникает в момент передачи параметра в функцию, которая получает Наименование характеристики для печатной формы. Вот код, который был в момент возникновения ошибки:
Запрос = Новый Запрос;
Запрос.УстановитьПараметр(«ТекущийДокумент», Ссылка);
Запрос.Текст =
«ВЫБРАТЬ
| Номер,
| Дата,
| Контрагент,
| Организация,
| Товары.(
| Номенклатура,
| Номенклатура.»+ ТекстКодАртикул + » КАК КодАртикул,
| Номенклатура.НаименованиеПолное КАК Товар,
| КоличествоМест,
| Количество,
| ЕдиницаИзмерения.Представление КАК ЕдиницаИзмерения,
| ЕдиницаИзмеренияМест.Представление КАК ЕдиницаИзмеренияМест,
| ХарактеристикаНоменклатуры КАК Характеристика,
| СерияНоменклатуры КАК Серия
| ),
| ВозвратнаяТара.(
| Номенклатура,
| Номенклатура.»+ ТекстКодАртикул + » КАК КодАртикул,
| Номенклатура.НаименованиеПолное КАК Товар,
| Количество,
| Номенклатура.ЕдиницаХраненияОстатков.Представление КАК ЕдиницаИзмерения
| )
|ИЗ
| Документ.ПриходныйОрдерНаТовары КАК ПриходныйОрдерНаТовары
|ГДЕ
| ПриходныйОрдерНаТовары.Ссылка = &ТекущийДокумент
|УПОРЯДОЧИТЬ ПО
| Товары.НомерСтроки,
| ВозвратнаяТара.НомерСтроки»;
Шапка = Запрос.Выполнить().Выбрать();
Шапка.Следующий();
ВыборкаСтрокТовары = Шапка.Товары.Выбрать();
Пока ВыборкаСтрокТовары.Следующий() Цикл
Если НЕ ЗначениеЗаполнено(ВыборкаСтрокТовары.Номенклатура) Тогда
Продолжить;
КонецЕсли;
Ном = Ном + 1;
ОбластьМакета.Параметры.Заполнить(ВыборкаСтрокТовары);
ОбластьМакета.Параметры.НомерСтроки = Ном;
ОбластьМакета.Параметры.Товар = ВыборкаСтрокТовары.Товар + ФормированиеПечатныхФормСервер.ПредставлениеСерий(ВыборкаСтрокТовары);
ТабДокумент.Вывести(ОбластьМакета);
КонецЦикла;
Ошибка возникала в момент когда обрабатывалась строка: «ОбластьМакета.Параметры.Товар = ВыборкаСтрокТовары.Товар + ФормированиеПечатныхФормСервер.ПредставлениеСерий(ВыборкаСтрокТовары);».
Я посмотрел еще раз описание мутабельного значения: «Передавать между клиентом и сервером (в обе стороны) можно только немутабельные значения (т.е. значения которых не могут изменяться): примитивные типы, ссылки, универсальные коллекции, значения системных перечислений, хранилище значения. При попытке передать что-либо другое – аварийное завершение клиентского приложения (даже, если передавать некорректный параметр пытается сервер). Я был удивлен универсальные коллекции можно передавать, а строку универсальной коллекции нет. Поэтому я решил воспользоваться другой универсальной коллекцией, а именно Структурой. В итоге код получился такой:
Пока ВыборкаСтрокТовары.Следующий() Цикл
Если НЕ ЗначениеЗаполнено(ВыборкаСтрокТовары.Номенклатура) Тогда
Продолжить;
КонецЕсли;
Ном = Ном + 1;
Представление = Новый Структура();
Представление.Вставить(«Характеристика», ВыборкаСтрокТовары.Характеристика);
Представление.Вставить(«Серия», ВыборкаСтрокТовары.Серия);
ОбластьМакета.Параметры.Заполнить(ВыборкаСтрокТовары);
ОбластьМакета.Параметры.НомерСтроки = Ном;
ОбластьМакета.Параметры.Товар = ВыборкаСтрокТовары.Товар + ФормированиеПечатныхФормСервер.ПредставлениеСерий(Представление);
ТабДокумент.Вывести(ОбластьМакета);
КонецЦикла;
Так что если кто то будет сталкиваться с такой же проблемой пусть знает, что строка таблицы значений является мутабельным значением и ее (строку) передавать нельзя. Нужно создать структуру.
Решение же моей проблемы было: в функции «ФормированиеПечатныхФормСервер.ПредставлениеСерий» проверялось условие:
Если ЗначениеЗаполнено(Выборка.Характеристика) и (ТипЗнч(Выборка.Характеристика) = Тип(«СправочникСсылка.ХарактеристикиНоменклатуры»)) Тогда
и условие:
Если ЗначениеЗаполнено(Выборка.Серия) Тогда
Нужно было создать структуру, где ключом выступали значения проверки условия (Характеристика и Серия), а значениями ключа — Выступали значения Строки данных свойств. Как только это было исправлено печатная форма вновь заработала так как раньше.
