На Сервере процедура вызывается с одним параметром ИсходныеДанные типа структура, который при объявлении процедуры задаётся по Знач-ению

В вызываемой процедуре этот параметр помещается в новую структуру, которая передаётся в другую процедуру тоже по Знач-ению, там значение ключя меняется и что вы думаете?

После вызова переменная ИсходныеДанные, которая сначала был передана по Знач-ению, потом помещёна в структуру, которая была передана по Знач-ению в другую функцию ИЗМЕНИЛАСЬ на то что было присвоено ключу в последней процедуре.

Теперь приходится делать везде заплатки.
---
вот тут хорошо все расписано: https://infostart.ru/1c/articles/388527/
---
Решением проблемы стало полное копирование структуры и её уничтожение

```1c
    Данные = Новый Структура;
    Для Каждого эл Из ДанныеУведомления Цикл
    Данные.Вставить(эл.Ключ, эл.Значение);
    КонецЦикла;
    ДанныеУведомления = 0;
    Уведомление.Вставить("Данные", Данные);
```
---
более подробно, желательно с кодом пример будет?
Меняете не только ключ структуры, а значение ссылочного типа по этому ключу?
Что и как меняете - не понятно.
---
Кода очень много, поэтому пишу пример:
```1c
    //В модуле Документа
    Процедура ОбработкаПроведения(Отказ, РежимПроведения)
    Задача = Задачи.ЗадачаПользователя.СоздатьЗадачу();
    Задача.Тема = "Тема задачи";
    Задача.Записать()
    КонецПроцедуры

    //В модуле ЗадачиПользователя
    Процедура ПриЗаписи(Отказ)
    ДанныеУведомления = Новый Структура("Тема,Содержание,Дата....");
    ЗаполнитьЗначениеСвойств(ДанныеУведомления, ЭтотОбъект);
    УведомленияВызовСервере.ОтправильУведомление(ДанныеУведомления);
    КонецПроцедуры

    //В модуле УведомленияВызовСервере
    Процедура ОтправитьИлиЗапланироватьУведомление(Знач ДанныеУведомления) Экспорт
    _УведомленияFCM.ОтправитьУведомление(ДанныеУведомления);
    КонецПроцедуры

    //В модуле _УведомленияFCM
    Процедура ОтправитьУведомление(Знач ДанныеУведомления);
    Уведомление = _УведомленияFCM.СтруктураУведомления();
    Уведомление.Данные = ДанныеУведомления;
    Для Каждого Элемент Из Уведомление.Данные Цикл
    Если ТипЗнч(Элемент.Значение) = Тип ("Строка") ИЛИ ТипЗнч(Элемент.Значение) = Тип ("Число") ИЛИ ТипЗнч(Элемент.Значение) = Тип ("Дата") Тогда
    Уведомление.Данные[Элемент.Ключ] = Элемент.Значение;
    ИначеЕсли ТипЗнч(Элемент.Значение) = Тип ("ФорматированнаяСтрока") Тогда
    Уведомление.Данные[Элемент.Ключ] = Строка(Элемент.Значение);
    Иначе
    Уведомление.Данные[Элемент.Ключ] = ЗначениеВСтрокуВнутр(Элемент.Значение);
    КонецЕсли;

    КонецЦикла;

    Уведомление.Удалить("Данные");
    КонецПроцедуры
```

После чего в исходную процедуру возвращаются искорёженные данные
---
А переходов между клиентом и сервером не было?
---
Нет не было. Первая процедура вызывается из Документ.ОбработкаПроведения
---
Самое странное, что в последней процедуре ключ структуры содержащий эти данные вообще удаляется и к концу выполнения процедуры эти данные не существуют! Как они передаются обратно, через две процедуры в ОбработкуПроведения?
---
Самое смешное в том, что после отработки последней процедуры в структуре уничтожается переданный ключ.
Попробовал сделать заплатку типа

```1c
    Буфер = ИсходныеДанные;
    СтрктПараметров.Вставить("ИсходныеДанные",ИсходныеДанные);
    ТретьсяПроцедура(СтрктПараметров);
```

В результате ИсходныеДанные имеют новое значение, которое присваивалось в ТретьейПроцедуре!!!
Причём в ТретьейПроцедуре происходит
```1c
    СтрктПараметров.Удалить("ИсходныеДанные");
```
---
Из описания сложно понять как там все устроено, но мне кажется все правильно отрабатывает. По значению ведь передается ссылка на объект структуры, а в этом объекте уже можно менять свойства
---
Я всегда думал, что по значению передаётся полная копия структуры, но не как не ссылка. Я не прав?
---
Я всегда думал, что по значению передаётся полная копия структуры, но не как не ссылка. Я не прав? Нет, не создается.
https://its.1c.ru/db/v8314doc#bookmark:dev:TI000000151
необходимо помнить следующую особенность: если параметром передается агрегатный объект, то невозможно присвоить фактическому параметру другое значение, но возможно изменить сам переданный объект.
---
При передаче параметра вызываемой процедуры или функции по значению, изменение значения формального параметра внутри процедуры или функции никак не влияет на фактический параметр, передаваемый при вызове процедуры или функции. Указание, что параметр нужно передавать по значению, осуществляется с помощью ключевого слова Знач.
---
Внутри последней процедуры скопировал все данные в новую, но это не помогло

```1c
    Данные = Новый Структура;
    Для Каждого эл Из ИсходныеДанные Цикл
    Данные.Вставить(эл.Ключ, эл.Значение);
    КонецЦикла;
```
---
Решением проблемы стало полное копирование структуры и её уничтожение

```1c
    Данные = Новый Структура;
    Для Каждого эл Из ДанныеУведомления Цикл
    Данные.Вставить(эл.Ключ, эл.Значение);
    КонецЦикла;
    ДанныеУведомления = 0;
    Уведомление.Вставить("Данные", Данные);
```
---
открыли америку. Знач для простых типов.
---
Всегда думал, что Знач работает только для Число, строка, дата, булево
---
правильно делал :) Я вот тупанул, теперь всё переделывать. Не понимаю смысла такого положения вещей.
---
вот тут хорошо все расписано: https://infostart.ru/1c/articles/388527/
---
Еще ПолучитьИзВременногоХранилища(...) в серверных вызовах тоже "больше не работает". Т.к. кешируется на сервере и возвращается ссылкой из кеша.