Перевыбор значения ссылочного реквизита в документе
Доброго времени суток! Столкнулся с проблемкой программного перевыбора ссылочного реквизита документа. Есть документ Скупочная квитанция, скупка производится у Контрагента с которым заключается договор кроме того есть еще реквизит НомерСкупочнойКвитанции в котором записан уникальный номер формируемый автоматически. Клиенту нужна следующая схема работы документа: при заполнении заполняются поля Организация, Филиал, Контрагент, после заполняется ТЧ Скупочные вещи и потом документ проводится, перед проведением система автоматически определяет НомерСкупочнойКвитанции (берет последний номер по филиалу из регистра сведений и + 1) далее автоматически создается договор с номером Скупочной квитанции и названием состоящим из префикса филиала и номера скупочной квитанции. Все это реализовано и работает. Но клиент просит возможность устанавливать НомерСкупочнойКвитанции вручную (это строка). При установке номера вручную реализован механизм автоматического изменения номера Договора с контрагентом и его названия. Вот тут то и кроется засада. Номер и Наименование договора успешно меняются, но в поле договора остается старое представление Договора со старым номером. Пробовал автоматически перезаписывать договор в серверной процедуре через ДанныеФормыВЗначение() и ЗначениеВДанныеФормы(). По отладчику на сервере после ЗначениеВДанныеФормы(). в ДокументОбъект записана новая правильная ссылка в Объекте правильная ссылка, но когда идет возврат на Клиент снова возникает старая ссылка (Представление ссылки). Пробовал передавать на клиент просто код договора и потом в другой серверной функции получал по коду договор и перезаписывал в на клиенте и на сервере. И все равно в поле договор стояла старая ссылка. При переоткрытии документа снова старая ссылка, точнее Представление ссылки, ведь ссылка и старая и новая ведет к одному и тому же элементу справочника. Только при перевыборе договора вручную появляется правильное представление ссылки на измененный договор. Кто нибудь сталкивался с подобной ситуацией, и как можно ее разрешить?
Найденные решения
(6) Настаиваю :-)
&НаКлиенте
Процедура ПослеЗакрытияВопросаИзменениеСкупки(Результат, Параметры) Экспорт
Если Результат = КодВозвратаДиалога.Да Тогда
Код = СкупочнаяКвитанцияПриИзмененииНаСервере();
СсылкаДоговор = ПолучитьДоговор(Код);
ОповеститьОбИзменении(СсылкаДоговор);
КонецЕсли;
КонецПроцедуры
ПоказатьОстальные ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
Попробую, но я делал нечто подобное
В серверной процедуре ПолучитьДоговор в Объект.ДоговорКонтрагента отображается правильное представление, а на клиенте, при возврате оно все равно старое. Получается что проблема в том что на Клиенте не меняется представление
&НаКлиенте
Процедура ПослеЗакрытияВопросаИзменениеСкупки(Результат, Параметры) Экспорт
Если Результат = КодВозвратаДиалога.Да Тогда
Код = СкупочнаяКвитанцияПриИзмененииНаСервере();
СсылкаДоговор = ПолучитьДоговор(Код);
//Объект.ДоговорКонтрагента = СсылкаДоговор;
ЭтаФорма.ОбновитьОтображениеДанных();
КонецЕсли;
КонецПроцедуры
&НаСервере
Функция СкупочнаяКвитанцияПриИзмененииНаСервере()
Если ЗначениеЗаполнено(Объект.ДоговорКонтрагента) Тогда
СсылкаНаДоговор = Объект.ДоговорКонтрагента;
ИзмДоговор = СсылкаНаДоговор.ПолучитьОбъект();
ПрефиксНомера = Объект.Филиал.ПрефиксДокументов;
НомерКвитанцииСПрефиксом = "" + ПрефиксНомера + "-" + Объект.СкупочнаяКвитанция;
ИзмДоговор.Наименование = "Скупка " + НомерКвитанцииСПрефиксом;
ИзмДоговор.Номер = НомерКвитанцииСПрефиксом;
ИзмДоговор.Записать();
ДокОбъект = ДанныеФормыВЗначение(Объект, Тип("ДокументОбъект.ЛМБ_СкупкаЦенностей"));
ДокОбъект.ДоговорКонтрагента = ИзмДоговор.Ссылка;
Объект.ДоговорКонтрагента = ИзмДоговор.Ссылка;
ЗначениеВДанныеФормы(ДокОбъект, Объект);
Возврат ИзмДоговор.Код;
КонецЕсли;
КонецФункции
&НаСервере
Функция ПолучитьДоговор(Код)
СсылкаДоговор = Справочники.ДоговорыКонтрагентов.НайтиПоКоду(Код);
Объект.ДоговорКонтрагента = СсылкаДоговор;
Возврат СсылкаДоговор;
КонецФункции
ПоказатьВ серверной процедуре ПолучитьДоговор в Объект.ДоговорКонтрагента отображается правильное представление, а на клиенте, при возврате оно все равно старое. Получается что проблема в том что на Клиенте не меняется представление
(6) Настаиваю :-)
&НаКлиенте
Процедура ПослеЗакрытияВопросаИзменениеСкупки(Результат, Параметры) Экспорт
Если Результат = КодВозвратаДиалога.Да Тогда
Код = СкупочнаяКвитанцияПриИзмененииНаСервере();
СсылкаДоговор = ПолучитьДоговор(Код);
ОповеститьОбИзменении(СсылкаДоговор);
КонецЕсли;
КонецПроцедуры
Показать
(10) Всего модуля формы конечно нет, но существует подозрение что при выполнении
ОповеститьОбИзменении(СсылкаДоговор);
уже выполняется
СкупочнаяКвитанцияПриИзмененииНаСервере();
по крайней мере это было бы логично и в этом случае получаем два вызова одной и той же процедуры...
Думаю что использовать
ЭтаФорма.ОбновитьОтображениеДанных();
Всё же правильнее, поскольку само значение реквизита (ссылка на договор) не изменялось
ОповеститьОбИзменении(СсылкаДоговор);
уже выполняется
СкупочнаяКвитанцияПриИзмененииНаСервере();
по крайней мере это было бы логично и в этом случае получаем два вызова одной и той же процедуры...
Думаю что использовать
ЭтаФорма.ОбновитьОтображениеДанных();
Всё же правильнее, поскольку само значение реквизита (ссылка на договор) не изменялось
(13)
уже выполняется
СкупочнаяКвитанцияПриИзмененииНаСервере();
В сообщении, на которое я отвечал, есть реализация этого метода. И нет, там нет вызова оповещения, т.к. это серверный метод. Оповещение об изменении же доступно лишь в клиентском контексте.
СкупочнаяКвитанцияПриИзмененииНаСервере();
ЭтаФорма.ОбновитьОтображениеДанных();
Автор пробовал, ему не помогло. И также это можно увидеть в сообщении, на которое я отвечал.
(14) Он применял эту процедуру неверно и судя по вашему комментарию вы тоже не очень понимаете "что это и с чем это едят"
специально для вас продублирую
надо в процедуру "ОбновитьОтображениеДанных" указать отображение каких данных мы хотим обновить
читайте СП.
специально для вас продублирую
надо в процедуру "ОбновитьОтображениеДанных" указать отображение каких данных мы хотим обновить
читайте СП.
(17) Цитата из СП:
Ну и само описание метода:
Вызов метода ОбновитьОтображениеДанных с параметром <ОбновлятьЭлементы> имеет смысл только внутри обработчика ВнешнееСобытие, обработчиков ожидания формы и обработчика ОбработкаОповещения.
В обработчиках других событий вызов этого метода с параметром аналогичен вызову без параметра (при необходимости данные будут установлены всем элементам управления).
В коде автора не увидел ни одного из трех обработчиков. Стало быть указывать что-либо не имеет смысла.
В обработчиках других событий вызов этого метода с параметром аналогичен вызову без параметра (при необходимости данные будут установлены всем элементам управления).
Ну и само описание метода:
В принудительном порядке обновляет содержание элементов управления.
Полезен при изменении значений реквизитов формы вне формы, в тот момент, когда форма отображается на экране.
У автора не меняются значения реквизитов формы. У автора меняются объекты, ссылки на которые указаны в реквизитах формы.
Полезен при изменении значений реквизитов формы вне формы, в тот момент, когда форма отображается на экране.
(21) Не-не, давайте в этой ветке обсуждать уже Ваш совет использовать метод "ОбновитьОтображениеДанных". :-)
Что же такого я не смог вычитать в синтакс-помощнике, из-за чего не понимаю данный метод? И каков будет Ваш ответ на мои комментарии к цитатам из справки? Приведите хотя бы пример правильного использования метода "ОбновитьОтображениеДанных" в ситуации ТС, чтобы я смог провести эксперимент и подтвердить (или опровергнуть), что данный метод рабочий.
Что же такого я не смог вычитать в синтакс-помощнике, из-за чего не понимаю данный метод? И каков будет Ваш ответ на мои комментарии к цитатам из справки? Приведите хотя бы пример правильного использования метода "ОбновитьОтображениеДанных" в ситуации ТС, чтобы я смог провести эксперимент и подтвердить (или опровергнуть), что данный метод рабочий.
(18) Предложение принято.
Обратите внимание на область со стрелочкой это во-первых (особенно на фразу "такое же как при интерактивном изменении")
И что вы скажете на то что согласно СП этот метод уведомляет для динамические списки, которым реквизит документа уж точно никак не является? (вторая выделенная область)
Обратите внимание на область со стрелочкой это во-первых (особенно на фразу "такое же как при интерактивном изменении")
И что вы скажете на то что согласно СП этот метод уведомляет для динамические списки, которым реквизит документа уж точно никак не является? (вторая выделенная область)
Прикрепленные файлы:
(20) Стрелочка не то показывает, что нужно. Мы вели речь про инициацию события "ПриИзменения" и вызов соответствующих обработчиков, а здесь лишь очистка кэша, как при изменении. Это не одно и то же.
Что касается обновления динамических списков, то ничего сказать не могу. Есть фраза об "очистке закэшированных данных на клиенте". Вероятно этот же кэш используется и при отображении текста в полях формы объекта. Это предположение подтверждается экспериментом (совет помог ТС). Также мой опыт подобного использования метода не подтверждает вызов обработчиков изменения (возможно Вы перепутали с методом ОповеститьОВыборе).
В любом случае к синтакс-помощнику я предлагал Вам обратиться лишь за поиском подтверждения Ваших же слов, что будет вызвана процедура события "ПриИзменении". Не более того.
Что касается обновления динамических списков, то ничего сказать не могу. Есть фраза об "очистке закэшированных данных на клиенте". Вероятно этот же кэш используется и при отображении текста в полях формы объекта. Это предположение подтверждается экспериментом (совет помог ТС). Также мой опыт подобного использования метода не подтверждает вызов обработчиков изменения (возможно Вы перепутали с методом ОповеститьОВыборе).
В любом случае к синтакс-помощнику я предлагал Вам обратиться лишь за поиском подтверждения Ваших же слов, что будет вызвана процедура события "ПриИзменении". Не более того.
Если все делается на форме, зачем все эти реквизитВЗначение и пр, вот так разве не работает?
&НаКлиенте
Процедура ПослеЗакрытияВопросаИзменениеСкупки(Результат, Параметры) Экспорт
Если Результат = КодВозвратаДиалога.Да Тогда
Код = СкупочнаяКвитанцияПриИзмененииНаСервере();
КонецЕсли;
КонецПроцедуры
&НаСервере
Функция СкупочнаяКвитанцияПриИзмененииНаСервере()
Если ЗначениеЗаполнено(Объект.ДоговорКонтрагента) Тогда
СсылкаНаДоговор = Объект.ДоговорКонтрагента;
ИзмДоговор = СсылкаНаДоговор.ПолучитьОбъект();
ПрефиксНомера = Объект.Филиал.ПрефиксДокументов;
НомерКвитанцииСПрефиксом = "" + ПрефиксНомера + "-" + Объект.СкупочнаяКвитанция;
ИзмДоговор.Наименование = "Скупка " + НомерКвитанцииСПрефиксом;
ИзмДоговор.Номер = НомерКвитанцииСПрефиксом;
ИзмДоговор.Записать();
Объект.ДоговорКонтрагента = ИзмДоговор.Ссылка;
Возврат ИзмДоговор.Код;
КонецЕсли;
КонецФункции
Показать
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот