1. srub 62 24.03.20 10:15 Сейчас в теме

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

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

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

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

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

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

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



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


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

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


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Вакансии

Product Owner (Менеджер по продукту 1С)
Москва
зарплата от 100 000 руб. до 170 000 руб.
Полный день

Тим лид по разработке 1С (Team Lead 1С)
Москва
зарплата от 100 000 руб. до 200 000 руб.
Полный день

Программист, аналитик, эксперт 1С
Санкт-Петербург
По совместительству

Программист 1С
Новосибирск
зарплата от 30 000 руб.
Временный (на проект)

Программист 1С
Москва
зарплата от 100 000 руб. до 150 000 руб.
Полный день