Изменяется параметр переданный по значению в расширении

1. just_junior 19.03.21 15:55 Сейчас в теме
Всем доброго дня

Типовая УТ 11.4.13.99, платформа 8.3.18.1289. Добавлено одно расширение, в котором есть только одна процедура &После("ЗаполнитьПоЗаказуКлиента") (документ "Операции по платежной карте" или "Эквайринговые операции", модуль объекта). В типовой процедуре в последней строчке кода, параметр "ДокументОснование" имеет правильное значение - ссылка на документ, но после переходу в расширение, меняет тип на "Структура", в которой нет ссылки на документ. Между завершением типовой процедуры и началом выполнения расширяемой процедуры, ничего не выполняется (проверял через замер производительности).

Процедура ЗаполнитьПоЗаказуКлиента(
	Знач ДокументОснование,
	ДанныеЗаполнения)
	
	// Заполним данные шапки документа.
	ТекстЗапроса = "
	|ВЫБРАТЬ
	|	ВЫБОР КОГДА ДанныеДокумента.БанковскийСчет <> 

........................................
	
	// Заполнение суммы шапки документа
	СуммаДокумента = РасшифровкаПлатежа.Итог("Сумма"); //ДокументОснование здесь верный, ссылка на документ
	
КонецПроцедуры

&После("ЗаполнитьПоЗаказуКлиента")
Процедура ттт_ЗаполнитьПоЗаказуКлиента(Знач ДокументОснование, ДанныеЗаполнения)
	
          Сообщить("Стоп"); //ДокументОснование уже имеет тип структура 

КонецПроцедуры
Показать


Почему так может происходить?
По теме из базы знаний
Найденные решения
13. SlavaKron 19.03.21 16:55 Сейчас в теме
(10) Ну, в ЗаполнитьПоЗаказуКлиента и передается одно и то же значение, только одно со словом Знач, другое без.
Прикрепленные файлы:
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
12. lefthander 19.03.21 16:55 Сейчас в теме
(1)Передайте в расширение документОснование без Знач.
16. just_junior 19.03.21 17:01 Сейчас в теме
(12) Расширение не даст такое сделать, расширяемый метод просто не применится

Тест: Обычная: Ошибка применения модуля "Тест Документ.ОперацияПоПлатежнойКарте.МодульОбъекта". Список параметров метода "ттт_ЗаполнитьПоЗаказуКлиента" не соответствует методу "ЗаполнитьПоЗаказуКлиента".
2. user633533_encantado 11 19.03.21 16:19 Сейчас в теме
Почистите кэш. Такое не может быть, скорее всего все-таки между вашим модулем и типовым происходит изменение значения этого реквизита.
3. just_junior 19.03.21 16:32 Сейчас в теме
(2) Кэш чистил, пробовал на разных базах рабочей и демке этого же релиза, результат тот же
5. user633533_encantado 11 19.03.21 16:46 Сейчас в теме
(4) Неопределено, это еще как-то логично. Но не структура же.
(3) А у той структуры есть свойства ?
7. SlavaKron 19.03.21 16:47 Сейчас в теме
(5)
Неопределено, это еще как-то логично.

Не суть, может быть не так наглядно, но в Парам1 в расширении передается то, что было присвоено в Парам2 в основной конфигурации.
11. user633533_encantado 11 19.03.21 16:54 Сейчас в теме
(7) Но парам2 это парам1, так же указано в первом вызове.
14. SlavaKron 19.03.21 16:57 Сейчас в теме
(11) Одно взято по значению, другое - по ссылке, это разные переменные, в них разные значения на конец выполнения процедуры в основной конфигурации.
15. lefthander 19.03.21 17:00 Сейчас в теме
(14)А в чем разница по значению и по ссылке? В чем разница переменных? ;)
18. lefthander 19.03.21 17:04 Сейчас в теме
(17)Я то это знаю... мне было интересно как Вы это понимаете.
25. user633533_encantado 11 19.03.21 17:25 Сейчас в теме
(18) Удовлетворил ваш интерес ?
26. lefthander 19.03.21 17:28 Сейчас в теме
(25)Мне думается что Вы не до конца понимаете разницу между передачей по ссылке и по значению. Это ИМХО.;) не обращайте внимания, пятница... дописал трудный модуль... ;)
27. user633533_encantado 11 19.03.21 17:30 Сейчас в теме
(26) Ну да, ну да: "Я сам знал, просто тебя проверял".
lefthander; +1 Ответить
29. lefthander 19.03.21 17:33 Сейчас в теме
(27)
(14)
Одно взято по значению, другое - по ссылке, это разные переменные, в них разные значения на конец выполнения процедуры в основной конфигурации.
Вот как то так запутанно фраза написана... впрочем не имеет это значения. ;) Право, извините.
19. SlavaKron 19.03.21 17:04 Сейчас в теме
(15) Возможно так нагляднее будет:
Прикрепленные файлы:
28. пользователь 19.03.21 17:31
Сообщение было скрыто модератором.
...
30. spacecraft 19.03.21 17:33 Сейчас в теме
(14) в них разные значения внутри основной функции, но в расширение передается переменные, которые передавались и в основной конфигурации, а не переменные из процедуры основной конфигурации. А на момент вызова процедуры в расширение, эта переменная была изменена.
10. just_junior 19.03.21 16:51 Сейчас в теме
(5) У структуры есть свойства и такое чувство как будто эта структура копируется из другого параметра "ДанныеЗаполнения"
Прикрепленные файлы:
13. SlavaKron 19.03.21 16:55 Сейчас в теме
(10) Ну, в ЗаполнитьПоЗаказуКлиента и передается одно и то же значение, только одно со словом Знач, другое без.
Прикрепленные файлы:
20. just_junior 19.03.21 17:14 Сейчас в теме
(13) Не совсем мне понятно почему, но доработка этой процедуры действительно решила проблему. Получается При создание на основании Заказа клиента вызывается :

1) процедура "Обработка заполнения", далее она вызывает
2) процедуру "ЗаполнитьПоЗаказуКлиента"
3) далее каким то образом снова срабатывает "Обработка заполнения"
4) и только после вызывается &После("ЗаполнитьПоЗаказуКлиента")

Не совсем понятен мне только 3 пункт
22. lefthander 19.03.21 17:18 Сейчас в теме
(20)
Не совсем понятен мне только 3 пункт
Так заполнение вызывается из Обработки заполнения и первым параметром ДанныеЗаполнения, и вторым параметром данныезаполнения в конце процедуры параметры становятся одинаковые

При входе в процедуру Данные заполнения это докоснование при выходе это уже структура а затем идем в расширение

Если ТипЗнч(ДанныеЗаполнения) = Тип("ДокументСсылка.ЗаказКлиента") Тогда

ЗаполнитьПоЗаказуКлиента(
ДанныеЗаполнения,
ДанныеЗаполнения);
23. just_junior 19.03.21 17:21 Сейчас в теме
(22) Точка остановки не срабатывает на "Обработки заполнения" повторно, после того завершится "ЗаполнениеПоЗаказуКлиента" и через замер производительности не видно чтобы она повторно вызывалась
24. lefthander 19.03.21 17:23 Сейчас в теме
(23)А второго входа и не надо. Перед выполнением Заполнение по заказу клиента ДанныеЗаполнения (первый параметр - это ссылка на документ основание, после выполнения это уже структура оба параметра одинаковые, и теперь идем в расширение.
31. just_junior 19.03.21 17:39 Сейчас в теме
(24) Разобрался наконец-то, спасибо за объяснения)
21. just_junior 19.03.21 17:17 Сейчас в теме
(13) Доработанный код просто взял из ПКО и приложу скрин результата
Прикрепленные файлы:
4. SlavaKron 19.03.21 16:40 Сейчас в теме
Проверил на чистой конфигурации. Да, действительно, такое происходит.
Прикрепленные файлы:
6. user633533_encantado 11 19.03.21 16:47 Сейчас в теме
(4) И ваш вариант отрабатывает правильно.
8. SlavaKron 19.03.21 16:48 Сейчас в теме
9. just_junior 19.03.21 16:49 Сейчас в теме
Дополню, что всё работает для документа "Приходный кассовый ордер", там аналогично передаётся документ основание по значению и он в расширяемой процедуре не изменяется на структуру
Прикрепленные файлы:
32. spacecraft 19.03.21 17:42 Сейчас в теме
(1) используйте &Вместо
&Вместо("ЗаполнитьПоЗаказуКлиента")
Процедура ттт_ЗаполнитьПоЗаказуКлиента(Знач ДокументОснование, ДанныеЗаполнения)
    
    ПродолжитьВызов(ДокументОснование, ДанныеЗаполнения);
          Сообщить("Стоп"); //ДокументОснование Останется ссылкой 

КонецПроцедуры
33. lefthander 19.03.21 17:44 Сейчас в теме
(32)Не используйте вместо... это зло, даже так "ЗЛО ЗЛОСТНОЕ" ;)
34. spacecraft 19.03.21 17:46 Сейчас в теме
(33) ну, Вас никто не заставляет. Даже расширение можете не использовать.
А так, это рекомендация 1С.
35. just_junior 19.03.21 17:49 Сейчас в теме
(32) В данном случае сделал через &ИзменениеИКонтроль, думаю так лучше будет
36. lefthander 20.03.21 10:05 Сейчас в теме
Оставьте свое сообщение

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