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

1. srub 84 24.03.20 10:15 Сейчас в теме
Доброго времени суток! Столкнулся с проблемкой программного перевыбора ссылочного реквизита документа. Есть документ Скупочная квитанция, скупка производится у Контрагента с которым заключается договор кроме того есть еще реквизит НомерСкупочнойКвитанции в котором записан уникальный номер формируемый автоматически. Клиенту нужна следующая схема работы документа: при заполнении заполняются поля Организация, Филиал, Контрагент, после заполняется ТЧ Скупочные вещи и потом документ проводится, перед проведением система автоматически определяет НомерСкупочнойКвитанции (берет последний номер по филиалу из регистра сведений и + 1) далее автоматически создается договор с номером Скупочной квитанции и названием состоящим из префикса филиала и номера скупочной квитанции. Все это реализовано и работает. Но клиент просит возможность устанавливать НомерСкупочнойКвитанции вручную (это строка). При установке номера вручную реализован механизм автоматического изменения номера Договора с контрагентом и его названия. Вот тут то и кроется засада. Номер и Наименование договора успешно меняются, но в поле договора остается старое представление Договора со старым номером. Пробовал автоматически перезаписывать договор в серверной процедуре через ДанныеФормыВЗначение() и ЗначениеВДанныеФормы(). По отладчику на сервере после ЗначениеВДанныеФормы(). в ДокументОбъект записана новая правильная ссылка в Объекте правильная ссылка, но когда идет возврат на Клиент снова возникает старая ссылка (Представление ссылки). Пробовал передавать на клиент просто код договора и потом в другой серверной функции получал по коду договор и перезаписывал в на клиенте и на сервере. И все равно в поле договор стояла старая ссылка. При переоткрытии документа снова старая ссылка, точнее Представление ссылки, ведь ссылка и старая и новая ведет к одному и тому же элементу справочника. Только при перевыборе договора вручную появляется правильное представление ссылки на измененный договор. Кто нибудь сталкивался с подобной ситуацией, и как можно ее разрешить?
Найденные решения
10. dhurricane 24.03.20 10:55 Сейчас в теме
(6) Настаиваю :-)
&НаКлиенте
Процедура ПослеЗакрытияВопросаИзменениеСкупки(Результат, Параметры) Экспорт
    
    Если Результат = КодВозвратаДиалога.Да Тогда
        Код = СкупочнаяКвитанцияПриИзмененииНаСервере();
        СсылкаДоговор = ПолучитьДоговор(Код);
        ОповеститьОбИзменении(СсылкаДоговор);
    КонецЕсли;
    
КонецПроцедуры
Показать
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. VmvLer 24.03.20 10:22 Сейчас в теме
прочел первые три строки и стало тоскливо...
мда, заголовок был так заманчив, а по факту какая-то малопонятная чушь.

почти как на первом свидании вслепую

можно, описать неполадку в три строки и без мусорных деталей?
3. srub 84 24.03.20 10:24 Сейчас в теме
(2)
Попробую))) При изменении и перезаписи реквизита документа ДоговорКонтрагента, в поле остается старое представление ссылки. Программно решить не получается, помогает только перевыбор этого элемента справочника в ручном режиме.
4. VmvLer 24.03.20 10:30 Сейчас в теме
(3) Реквизит можно изменить согласен, а вот перезаписать реквизит это шта?

Чтобы окончательно вернуть мне веру в существование разума на этой планете я бы хотел увидеть рисунок, хотя бы наскальный.
5. dhurricane 24.03.20 10:30 Сейчас в теме
(3) ОповеститьОбИзменении(ИзмененныйОбъектСсылка)
6. srub 84 24.03.20 10:35 Сейчас в теме
Попробую, но я делал нечто подобное

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

&НаСервере
Функция СкупочнаяКвитанцияПриИзмененииНаСервере()
	
	Если  ЗначениеЗаполнено(Объект.ДоговорКонтрагента) Тогда	
		СсылкаНаДоговор = Объект.ДоговорКонтрагента;	
		ИзмДоговор = СсылкаНаДоговор.ПолучитьОбъект();
		
		ПрефиксНомера = Объект.Филиал.ПрефиксДокументов;
		НомерКвитанцииСПрефиксом = "" + ПрефиксНомера + "-" + Объект.СкупочнаяКвитанция;
		ИзмДоговор.Наименование = "Скупка " + НомерКвитанцииСПрефиксом;
		ИзмДоговор.Номер = НомерКвитанцииСПрефиксом;
		ИзмДоговор.Записать();
		
		ДокОбъект = ДанныеФормыВЗначение(Объект, Тип("ДокументОбъект.ЛМБ_СкупкаЦенностей"));	
		ДокОбъект.ДоговорКонтрагента = ИзмДоговор.Ссылка;
		Объект.ДоговорКонтрагента = ИзмДоговор.Ссылка;		
		ЗначениеВДанныеФормы(ДокОбъект, Объект);
		
		Возврат ИзмДоговор.Код;
	КонецЕсли;
	
КонецФункции 



&НаСервере
Функция ПолучитьДоговор(Код)
	
	СсылкаДоговор = Справочники.ДоговорыКонтрагентов.НайтиПоКоду(Код);
	Объект.ДоговорКонтрагента = СсылкаДоговор;
	
	Возврат  СсылкаДоговор;
	
КонецФункции 
Показать


В серверной процедуре ПолучитьДоговор в Объект.ДоговорКонтрагента отображается правильное представление, а на клиенте, при возврате оно все равно старое. Получается что проблема в том что на Клиенте не меняется представление
7. VmvLer 24.03.20 10:43 Сейчас в теме
(6) &НаСервере заюзать надо

СсылкаДоговор = ПолучитьДоговор(Код);
 Объект.ДоговорКонтрагента = СсылкаДоговор;


, пока сервак спит клиент отморожен - есть такой "глюк"
это как в молодости
Солдат спит - служба идет
10. dhurricane 24.03.20 10:55 Сейчас в теме
(6) Настаиваю :-)
&НаКлиенте
Процедура ПослеЗакрытияВопросаИзменениеСкупки(Результат, Параметры) Экспорт
    
    Если Результат = КодВозвратаДиалога.Да Тогда
        Код = СкупочнаяКвитанцияПриИзмененииНаСервере();
        СсылкаДоговор = ПолучитьДоговор(Код);
        ОповеститьОбИзменении(СсылкаДоговор);
    КонецЕсли;
    
КонецПроцедуры
Показать
11. srub 84 24.03.20 11:02 Сейчас в теме
(10)
Настаиваю :-)

Спасибо!!! Сработало. Возьму на вооружение))))
13. DanDy 51 24.03.20 12:20 Сейчас в теме
(10) Всего модуля формы конечно нет, но существует подозрение что при выполнении

ОповеститьОбИзменении(СсылкаДоговор);

уже выполняется

СкупочнаяКвитанцияПриИзмененииНаСервере();

по крайней мере это было бы логично и в этом случае получаем два вызова одной и той же процедуры...
Думаю что использовать

ЭтаФорма.ОбновитьОтображениеДанных();

Всё же правильнее, поскольку само значение реквизита (ссылка на договор) не изменялось
14. dhurricane 24.03.20 12:25 Сейчас в теме
(13)
уже выполняется

СкупочнаяКвитанцияПриИзмененииНаСервере();
В сообщении, на которое я отвечал, есть реализация этого метода. И нет, там нет вызова оповещения, т.к. это серверный метод. Оповещение об изменении же доступно лишь в клиентском контексте.
ЭтаФорма.ОбновитьОтображениеДанных();
Автор пробовал, ему не помогло. И также это можно увидеть в сообщении, на которое я отвечал.
17. DanDy 51 24.03.20 15:40 Сейчас в теме
(14) Он применял эту процедуру неверно и судя по вашему комментарию вы тоже не очень понимаете "что это и с чем это едят"

специально для вас продублирую

надо в процедуру "ОбновитьОтображениеДанных" указать отображение каких данных мы хотим обновить
читайте СП.
19. dhurricane 24.03.20 16:14 Сейчас в теме
(17) Цитата из СП:
Вызов метода ОбновитьОтображениеДанных с параметром <ОбновлятьЭлементы> имеет смысл только внутри обработчика ВнешнееСобытие, обработчиков ожидания формы и обработчика ОбработкаОповещения.
В обработчиках других событий вызов этого метода с параметром аналогичен вызову без параметра (при необходимости данные будут установлены всем элементам управления).
В коде автора не увидел ни одного из трех обработчиков. Стало быть указывать что-либо не имеет смысла.

Ну и само описание метода:
В принудительном порядке обновляет содержание элементов управления.
Полезен при изменении значений реквизитов формы вне формы, в тот момент, когда форма отображается на экране.
У автора не меняются значения реквизитов формы. У автора меняются объекты, ссылки на которые указаны в реквизитах формы.
21. DanDy 51 24.03.20 16:43 Сейчас в теме
И что вы скажете на то что согласно СП предлагаемый вами метод уведомляет динамические списки, которым реквизит документа, собственно как и форма документа уж точно никак не является?
23. dhurricane 24.03.20 20:59 Сейчас в теме
(21) Не-не, давайте в этой ветке обсуждать уже Ваш совет использовать метод "ОбновитьОтображениеДанных". :-)

Что же такого я не смог вычитать в синтакс-помощнике, из-за чего не понимаю данный метод? И каков будет Ваш ответ на мои комментарии к цитатам из справки? Приведите хотя бы пример правильного использования метода "ОбновитьОтображениеДанных" в ситуации ТС, чтобы я смог провести эксперимент и подтвердить (или опровергнуть), что данный метод рабочий.
15. dhurricane 24.03.20 12:27 Сейчас в теме
(13)
Всё же правильнее, поскольку само значение реквизита (ссылка на договор) не изменялось
Нет. Правильнее как раз таки обновить представление договора во всех открытых формах пользователя, а не только в одной.
16. DanDy 51 24.03.20 15:38 Сейчас в теме
(15) ваш вариант кода вызовет ко всему прочему еще и обработчики события изменения данных
то есть процедуру события при изменении, что может повлечь изменение других объектов, чего не требовалось...
18. dhurricane 24.03.20 16:00 Сейчас в теме
(16) Встречное предложение: почитать в СП описание метода "ОповеститьОбИзменении" и найти там упоминание событий "ПриИзменении".
20. DanDy 51 24.03.20 16:30 Сейчас в теме
(18) Предложение принято.

Обратите внимание на область со стрелочкой это во-первых (особенно на фразу "такое же как при интерактивном изменении")

И что вы скажете на то что согласно СП этот метод уведомляет для динамические списки, которым реквизит документа уж точно никак не является? (вторая выделенная область)
Прикрепленные файлы:
22. dhurricane 24.03.20 20:54 Сейчас в теме
(20) Стрелочка не то показывает, что нужно. Мы вели речь про инициацию события "ПриИзменения" и вызов соответствующих обработчиков, а здесь лишь очистка кэша, как при изменении. Это не одно и то же.

Что касается обновления динамических списков, то ничего сказать не могу. Есть фраза об "очистке закэшированных данных на клиенте". Вероятно этот же кэш используется и при отображении текста в полях формы объекта. Это предположение подтверждается экспериментом (совет помог ТС). Также мой опыт подобного использования метода не подтверждает вызов обработчиков изменения (возможно Вы перепутали с методом ОповеститьОВыборе).

В любом случае к синтакс-помощнику я предлагал Вам обратиться лишь за поиском подтверждения Ваших же слов, что будет вызвана процедура события "ПриИзменении". Не более того.
12. DanDy 51 24.03.20 12:16 Сейчас в теме
(6) тут надо в процедуру "ОбновитьОтображениеДанных" указать отображение каких данных мы хотим обновить
читайте СП.
8. karamazoff 96 24.03.20 10:44 Сейчас в теме
Если все делается на форме, зачем все эти реквизитВЗначение и пр, вот так разве не работает?
&НаКлиенте
Процедура ПослеЗакрытияВопросаИзменениеСкупки(Результат, Параметры) Экспорт
    
    Если Результат = КодВозвратаДиалога.Да Тогда
        Код = СкупочнаяКвитанцияПриИзмененииНаСервере();
    КонецЕсли;
    
КонецПроцедуры

&НаСервере
Функция СкупочнаяКвитанцияПриИзмененииНаСервере()
    
    Если  ЗначениеЗаполнено(Объект.ДоговорКонтрагента) Тогда    
        СсылкаНаДоговор = Объект.ДоговорКонтрагента;    
        ИзмДоговор = СсылкаНаДоговор.ПолучитьОбъект();
        
        ПрефиксНомера = Объект.Филиал.ПрефиксДокументов;
        НомерКвитанцииСПрефиксом = "" + ПрефиксНомера + "-" + Объект.СкупочнаяКвитанция;
        ИзмДоговор.Наименование = "Скупка " + НомерКвитанцииСПрефиксом;
        ИзмДоговор.Номер = НомерКвитанцииСПрефиксом;
        ИзмДоговор.Записать();
        
        Объект.ДоговорКонтрагента = ИзмДоговор.Ссылка;        
        
        Возврат ИзмДоговор.Код;
    КонецЕсли;
    
КонецФункции
Показать
9. srub 84 24.03.20 10:49 Сейчас в теме
(8)
Если все делается на форме, зачем все эти реквизитВЗначение и пр, вот так разве не работает?

Оно никак не работает. Это я для примера оставил несколько вариантов того, как пробовал перезаполнить ДоговорКонтрагента. Ни один успеха не принес
Оставьте свое сообщение

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