Будьте осторожны "Знач" больше не работает

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

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

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

Теперь приходится делать везде заплатки.
По теме из базы знаний
Найденные решения
16. spacecraft 03.07.21 21:45 Сейчас в теме
(15) вот тут хорошо все расписано: https://infostart.ru/1c/articles/388527/
dimasts; kasper076; +2 Ответить
13. dimasts 22 03.07.21 19:16 Сейчас в теме
(9)Решением проблемы стало полное копирование структуры и её уничтожение
Данные = Новый Структура;
	Для Каждого эл Из ДанныеУведомления Цикл
		Данные.Вставить(эл.Ключ, эл.Значение);
	КонецЦикла;
	ДанныеУведомления = 0;
	Уведомление.Вставить("Данные", Данные);
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
10. spacecraft 03.07.21 18:57 Сейчас в теме
(1) более подробно, желательно с кодом пример будет?
Меняете не только ключ структуры, а значение ссылочного типа по этому ключу?
Что и как меняете - не понятно.
12. dimasts 22 03.07.21 19:14 Сейчас в теме
(10) Кода очень много, поэтому пишу пример:
//В модуле Документа
Процедура ОбработкаПроведения(Отказ, РежимПроведения)
	Задача = Задачи.ЗадачаПользователя.СоздатьЗадачу();
	Задача.Тема = "Тема задачи";
	Задача.Записать()
КонецПроцедуры

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

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

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

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


После чего в исходную процедуру возвращаются искорёженные данные
2. Dmitrij-2 47 03.07.21 18:11 Сейчас в теме
А переходов между клиентом и сервером не было?
4. dimasts 22 03.07.21 18:17 Сейчас в теме
(2) Нет не было. Первая процедура вызывается из Документ.ОбработкаПроведения
5. dimasts 22 03.07.21 18:19 Сейчас в теме
Самое странное, что в последней процедуре ключ структуры содержащий эти данные вообще удаляется и к концу выполнения процедуры эти данные не существуют! Как они передаются обратно, через две процедуры в ОбработкуПроведения?
3. dimasts 22 03.07.21 18:11 Сейчас в теме
Самое смешное в том, что после отработки последней процедуры в структуре уничтожается переданный ключ.
Попробовал сделать заплатку типа
Буфер = ИсходныеДанные;
СтрктПараметров.Вставить("ИсходныеДанные",ИсходныеДанные);
ТретьсяПроцедура(СтрктПараметров);

В результате ИсходныеДанные имеют новое значение, которое присваивалось в ТретьейПроцедуре!!!
Причём в ТретьейПроцедуре происходит
СтрктПараметров.Удалить("ИсходныеДанные");
6. Dmitrij-2 47 03.07.21 18:20 Сейчас в теме
(4) Из описания сложно понять как там все устроено, но мне кажется все правильно отрабатывает. По значению ведь передается ссылка на объект структуры, а в этом объекте уже можно менять свойства
7. dimasts 22 03.07.21 18:21 Сейчас в теме
(6) Я всегда думал, что по значению передаётся полная копия структуры, но не как не ссылка. Я не прав?
11. SlavaKron 03.07.21 19:04 Сейчас в теме
(7)
Я всегда думал, что по значению передаётся полная копия структуры, но не как не ссылка. Я не прав?
Нет, не создается.
https://its.1c.ru/db/v8314doc#bookmark:dev:TI000000151
необходимо помнить следующую особенность: если параметром передается агрегатный объект, то невозможно присвоить фактическому параметру другое значение, но возможно изменить сам переданный объект.
ImHunter; vadim.semyonov.rzn; AnryMc; +3 Ответить
8. dimasts 22 03.07.21 18:23 Сейчас в теме
(6) При передаче параметра вызываемой процедуры или функции по значению, изменение значения формального параметра внутри процедуры или функции никак не влияет на фактический параметр, передаваемый при вызове процедуры или функции. Указание, что параметр нужно передавать по значению, осуществляется с помощью ключевого слова Знач.
9. dimasts 22 03.07.21 18:40 Сейчас в теме
Внутри последней процедуры скопировал все данные в новую, но это не помогло
Данные = Новый Структура;
Для Каждого эл Из ИсходныеДанные Цикл
	Данные.Вставить(эл.Ключ, эл.Значение);
КонецЦикла;
13. dimasts 22 03.07.21 19:16 Сейчас в теме
(9)Решением проблемы стало полное копирование структуры и её уничтожение
Данные = Новый Структура;
	Для Каждого эл Из ДанныеУведомления Цикл
		Данные.Вставить(эл.Ключ, эл.Значение);
	КонецЦикла;
	ДанныеУведомления = 0;
	Уведомление.Вставить("Данные", Данные);
17. Xershi 1535 04.07.21 14:37 Сейчас в теме
(13) открыли америку. Знач для простых типов.
14. echo77 1921 03.07.21 19:33 Сейчас в теме
Всегда думал, что Знач работает только для Число, строка, дата, булево
kot26rus; Leon75; +2 Ответить
15. dimasts 22 03.07.21 19:54 Сейчас в теме
(14) правильно делал :) Я вот тупанул, теперь всё переделывать. Не понимаю смысла такого положения вещей.
16. spacecraft 03.07.21 21:45 Сейчас в теме
(15) вот тут хорошо все расписано: https://infostart.ru/1c/articles/388527/
dimasts; kasper076; +2 Ответить
18. ImHunter 333 07.07.21 10:02 Сейчас в теме
Еще ПолучитьИзВременногоХранилища(...) в серверных вызовах тоже "больше не работает". Т.к. кешируется на сервере и возвращается ссылкой из кеша.
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот