Передача мутабельного значения с клиента на сервер

06.08.14

Разработка - Механизмы платформы 1С

Исправление ошибки передачи мутабельного значения с клиента на сервер
В своей практике я сталкнулся с такой проблемой. В нашей компании была база УТ, файловый режим работы. Работала замечательно без каких либо нареканий. В один прекрачный день наш системный администратор решил файловый вариант cделать клиент-серверным. Все вроде бы работало нормально. И тут мне звоинт пользователь и говорит, что печатная форма, которой он пользовался все время, вдруг почему то перестала работать. Сообщение у пользователя выходило такое "Не удалось сформировать внешнюю печатную форму! [*]Ошибка при вызове метода контекста (ПредставлениеСерий): Попытка передачи с клиента на сервер мутабельного значения 1-го параметра метода ПредставлениеСерий ().".
Я зашел в интернет и прочитал описание мутабельного значения.
Мутабельное значение - сложный тип данных в объектно-ориентированном программировании, значения которого (как правило - объекты) после своего создания допускают изменение своих свойств.

Прочитав такое описание, я начал искать в чем проблема.Проанализиров код я увидел, что ошибка возникает в момент передачи параметра в функцию, которая получает Наименование характеристики для печатной формы. Вот код, который был в момент возникновения ошибки:
        Запрос = Новый Запрос;
        Запрос.УстановитьПараметр("ТекущийДокумент", Ссылка);
        
        Запрос.Текст =
        "ВЫБРАТЬ
        |    Номер,
        |    Дата,
        |    Контрагент,
        |    Организация,
        |    Товары.(
        |        Номенклатура,
        |        Номенклатура."+ ТекстКодАртикул + " КАК КодАртикул,
        |        Номенклатура.НаименованиеПолное КАК Товар,
        |        КоличествоМест,
        |        Количество,
        |        ЕдиницаИзмерения.Представление  КАК ЕдиницаИзмерения,
        |        ЕдиницаИзмеренияМест.Представление  КАК ЕдиницаИзмеренияМест,
        |        ХарактеристикаНоменклатуры КАК Характеристика,
        |        СерияНоменклатуры КАК Серия
        |    ),
        |    ВозвратнаяТара.(
        |        Номенклатура,
        |        Номенклатура."+ ТекстКодАртикул + " КАК КодАртикул,
        |        Номенклатура.НаименованиеПолное КАК Товар,
        |        Количество,
        |        Номенклатура.ЕдиницаХраненияОстатков.Представление КАК ЕдиницаИзмерения
        |    )
        |ИЗ
        |    Документ.ПриходныйОрдерНаТовары КАК ПриходныйОрдерНаТовары
        |ГДЕ
        |    ПриходныйОрдерНаТовары.Ссылка = &ТекущийДокумент
        |УПОРЯДОЧИТЬ ПО
        |    Товары.НомерСтроки,
        |    ВозвратнаяТара.НомерСтроки";
        
        Шапка = Запрос.Выполнить().Выбрать();
        Шапка.Следующий();
        ВыборкаСтрокТовары = Шапка.Товары.Выбрать();

        Пока ВыборкаСтрокТовары.Следующий() Цикл
            
            Если НЕ ЗначениеЗаполнено(ВыборкаСтрокТовары.Номенклатура) Тогда
                Продолжить;
            КонецЕсли;
            
            Ном = Ном + 1;
            
            ОбластьМакета.Параметры.Заполнить(ВыборкаСтрокТовары);
            ОбластьМакета.Параметры.НомерСтроки = Ном;
            ОбластьМакета.Параметры.Товар       = ВыборкаСтрокТовары.Товар + ФормированиеПечатныхФормСервер.ПредставлениеСерий(ВыборкаСтрокТовары);
            
            ТабДокумент.Вывести(ОбластьМакета);
        КонецЦикла;

Ошибка возникала в момент когда обрабатывалась строка: "ОбластьМакета.Параметры.Товар       = ВыборкаСтрокТовары.Товар + ФормированиеПечатныхФормСервер.ПредставлениеСерий(ВыборкаСтрокТовары);".
Я посмотрел еще раз описание мутабельного значения: "Передавать между клиентом и сервером (в обе стороны) можно только немутабельные значения (т.е. значения которых не могут изменяться): примитивные типы, ссылки, универсальные коллекции, значения системных перечислений, хранилище значения. При попытке передать что-либо другое – аварийное завершение клиентского приложения (даже, если передавать некорректный параметр пытается сервер). Я был удивлен универсальные коллекции можно передавать, а строку универсальной коллекции нет. Поэтому я решил воспользоваться другой универсальной коллекцией, а именно Структурой. В итоге код получился такой:
        Пока ВыборкаСтрокТовары.Следующий() Цикл
            
            Если НЕ ЗначениеЗаполнено(ВыборкаСтрокТовары.Номенклатура) Тогда
                Продолжить;
            КонецЕсли;
            
            Ном = Ном + 1;
            
            Представление = Новый Структура();
            Представление.Вставить("Характеристика", ВыборкаСтрокТовары.Характеристика);
            Представление.Вставить("Серия", ВыборкаСтрокТовары.Серия);
            
            ОбластьМакета.Параметры.Заполнить(ВыборкаСтрокТовары);
            ОбластьМакета.Параметры.НомерСтроки = Ном;
            ОбластьМакета.Параметры.Товар       = ВыборкаСтрокТовары.Товар + ФормированиеПечатныхФормСервер.ПредставлениеСерий(Представление);
            
            ТабДокумент.Вывести(ОбластьМакета);
        КонецЦикла;

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

     Если ЗначениеЗаполнено(Выборка.Характеристика)  и (ТипЗнч(Выборка.Характеристика) = Тип("СправочникСсылка.ХарактеристикиНоменклатуры")) Тогда

и условие:

    Если ЗначениеЗаполнено(Выборка.Серия) Тогда

Нужно было создать структуру, где ключом выступали значения проверки условия (Характеристика и Серия), а значениями ключа - Выступали значения Строки данных свойств. Как только это было исправлено печатная форма вновь заработала так как раньше.  

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

См. также

Поинтегрируем: сервисы интеграции – новый стандарт или просто коннектор?

Обмен между базами 1C Администрирование СУБД Механизмы платформы 1С Платформа 1С v8.3 Бесплатно (free)

В платформе 8.3.17 появился замечательный механизм «Сервисы интеграции». Многие считают, что это просто коннектор 1С:Шины. Так ли это?

11.03.2024    4484    dsdred    53    

71

Как готовить и есть массивы

Механизмы платформы 1С Платформа 1С v8.3 Бесплатно (free)

Все мы используем массивы в своем коде. Это один из первых объектов, который дают ученикам при прохождении обучения программированию. Но умеем ли мы ими пользоваться? В этой статье я хочу показать все методы массива, а также некоторые фишки в работе с массивами.

24.01.2024    5284    YA_418728146    25    

63

Планы обмена VS История данных

Обмен между базами 1C Механизмы платформы 1С Платформа 1С v8.3 Бесплатно (free)

Вы все еще регистрируете изменения только на Планах обмена и Регистрах сведений?

11.12.2023    6401    dsdred    36    

111

1С-ная магия

Механизмы платформы 1С Бесплатно (free)

Язык программирования 1С содержит много нюансов и особенностей, которые могут приводить к неожиданным для разработчика результатам. Сталкиваясь с ними, программист начинает лучше понимать логику платформы, а значит, быстрее выявлять ошибки и видеть потенциальные узкие места своего кода там, где позже можно было бы ещё долго медитировать с отладчиком в поисках источника проблемы. Мы рассмотрим разные примеры поведения кода 1С. Разберём результаты выполнения и ответим на вопросы «Почему?», «Как же так?» и «Зачем нам это знать?». 

06.10.2023    18466    SeiOkami    46    

118

Дефрагментация и реиндексация после перехода на платформу 8.3.22

Механизмы платформы 1С Платформа 1С v8.3 Бесплатно (free)

Начиная с версии платформы 8.3.22 1С снимает стандартные блокировки БД на уровне страниц. Делаем рабочий скрипт, как раньше.

14.09.2023    12086    human_new    27    

74

Валидация JSON через XDTO (включая массивы)

WEB-интеграция Универсальные функции Механизмы платформы 1С Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

При работе с интеграциями рано или поздно придется столкнуться с получением JSON файлов. И, конечно же, жизнь заставит проверять файлы перед тем, как записывать данные в БД.

28.08.2023    8804    YA_418728146    6    

141

Внешние компоненты Native API на языке Rust - Просто!

Механизмы платформы 1С Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Внешние компоненты для 1С можно разработывать очень просто, пользуясь всеми преимуществами языка Rust - от безопасности и кроссплатформенности до удобного менеджера библиотек.

20.08.2023    6273    sebekerga    54    

94

Все скопируем и вставим! (Буфер обмена в 1С 8.3.24)

Механизмы платформы 1С Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Рассмотрим новую возможность 8.3.24 и как её можно эффективно использовать

27.06.2023    15974    SeiOkami    31    

103
Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. awk 741 06.08.14 14:04 Сейчас в теме
Более правильно:

Представление = Новый Структура();
Представление.Вставить("Характеристика", ВыборкаСтрокТовары.Характеристика);
Представление.Вставить("Серия", ВыборкаСтрокТовары.Серия);



Заменить на:


Представление = Новый Структура("Характеристика, Серия");
ЗаполнитьЗначениеСвойств(Представление, ВыборкаСтрокТовары);
kako1toxren; Anchoret; de0nis; AlexPNov; +4 1 Ответить
6. de0nis 444 15.07.16 15:59 Сейчас в теме
(1) awk, Там опечаточка только:
ЗаполнитьЗначениЯСвойств(), а не значениЕ. А то скопировал и не работает, не пойму где ошибка в двух строках :))
adhocprog; +1 Ответить
2. igo1 266 06.08.14 14:38 Сейчас в теме
обойти это по быстрому можно было с помощью функции ЗначениеВСтрокуВнутр(<Значение>) и ЗначениеИзСтрокиВнутр(<Строка>)

Доступность:
Сервер, толстый клиент, внешнее соединение.

<Значение> (обязательный)
Тип: Произвольный.
Преобразуемое значение.
3. awk 741 06.08.14 16:11 Сейчас в теме
(2) igo1, Тогда править в двух местах, что не всегда возможно.
4. kbjy 21 07.08.14 00:37 Сейчас в теме
5. Патриот 450 13.08.14 14:35 Сейчас в теме
судя по первым предложениям, автор очень спешил поделиться открытием с общественностью))))))
сталкнулся
каких либо
прекрачный
звоинт
почему то
9. alul 11.03.20 09:11 Сейчас в теме
(5) Есть такой тип людей "троль", когда добавить по теме не чего...
11. Патриот 450 12.03.20 11:42 Сейчас в теме
(9) Смысл моего комментария: чтобы инфостарт не превратился в помойку, неплохо бы соблюдать элементарные правила русского языка.
А пустопорожней болтовнёй, занимаетесь вы, оставляя комментарии к ответам шестилетней давности. или вы сейчас что-то по теме добавили? Всего хорошего.
Yakud3a; user809597; +2 Ответить
7. de0nis 444 15.07.16 16:01 Сейчас в теме
А всё таки из внешней обработки серверный вызов никак не сделать? Что б не тащить лишние процедуры в неё..
8. adhocprog 1139 07.06.17 16:02 Сейчас в теме
Спасибо. Я раньше функции переносил. Как оказалось, не всегда это требуется )
10. alul 11.03.20 09:16 Сейчас в теме
Кто-нибудь сталкивался с такой же проблемой при создании документа в COM-соединении?
12. wau8824ru 22 29.06.20 11:32 Сейчас в теме
(10)
Кто-нибудь сталкивался с такой же проблемой при создании документа в COM-соединении?

Не при создании, а при проведение через COM-соединение, Подписка на событие - проведение ругается на Источник - которы ДокументОбъект.
Как побороли?
13. wau8824ru 22 29.06.20 11:40 Сейчас в теме
(10)
через COM-соединение

В модуле который выполнялся по Подписке на событие не было галки - "Внешнее соединение", добавил и всё заработало!
dnikolaev; demon642@mail.ru; www2007; alexey-simf; user809597; +5 Ответить
14. dnikolaev 177 09.12.22 21:55 Сейчас в теме
(13) wau8824ru, Спасибо тебе большое!
15. wau8824ru 22 10.12.22 02:10 Сейчас в теме
Оставьте свое сообщение