Имя: Пароль:
1C
1C 7.7
v7: Обновить в форме документа вывод реквизитов справочника
0 akovpashko
 
04.03.13
14:14
Есть форма документа, в которой выводятся свойства клиента в виде Клиент.Реквизит. При выборе клиента выполняется процедура, которая изменяет реквизиты клиента. Необходимо сразу после изменения реквизитов отобразить новые данные в форме документа.
Форма.Обновить() не помогает. Есть ли какой-то "красивый" путь без повторного поиска элемента в справочнике и присваивания его как значение реквизиту документа?
1 Эльниньо
 
04.03.13
14:57
Как выводится?
Выводи текстом на форме.
2 akovpashko
 
04.03.13
16:50
(1) Выводится текстом. В формуле текста стоит например Клиент.Скидка. В формуле реквизита Клиент указана процедура ПриИзмененииКлиента(), которая если выполняются некоторые условия, увеличивает значение скидки. Выбираю клиента, у которого 10% скидки. При выборе скидка увеличивается до 15% и записывается в элемент справочника этого клиента. В форме документа по прежнему отображается скидка 10%.
3 mvk
 
04.03.13
17:08
Форма.Обновить() в проц. ПриИзмененииКлиента() после записи справочника была? Или где?
4 zladenuw
 
04.03.13
17:11
(2) ну так там же обнови реквизит скидку
5 NS
 
04.03.13
17:12
(0) Врятли. Я нигде другого способа кроме повторного поиска и присваивания не видел.
6 NS
 
04.03.13
17:18
Только зачем поиск? Верни из процедуры изменения измененного клиента, и его присвой в реквизит.
7 mvk
 
04.03.13
17:18
(5) Ну почему. Можно выводить на форму значение переменной модуля. А ее обновлять при открытии и проц. ПриИзмененииКлиента(). Тогда Форма.Обновить() точно поможет.
8 NS
 
04.03.13
17:22
(7) У тебя допустим есть реквизит документа клиент.
На форме в виде текста висят формулы клиент.договор, клиент.глубинакредита и т.д.
Если ты изменишь в клиенте договор и глубину кредита, пока ты не присвоишь новый, изменный объект клиенту - все текстовые формулы на форме будут выдавать закешированные значения.
9 NS
 
04.03.13
17:23
(7) переменные модуля, и изменять можно. Но это геммор.
10 mvk
 
04.03.13
17:25
(8) Это да. Перечитывания реквизитов в данном случае не происходит. Я же говорил о:

Перем ТекСкидка;
...
Процедура ПриОткрытии()
...
ТекСкидка = "";
Если Клиент.Выбран() = 1 Тогда
   ТекСкидка = Клиент.Скидка;
КонецЕсли
...

Процедура ПриИзмененииКлиента()
...
ТекСкидка = НоваяСкидка;
Форма.Обновить();
11 NS
 
04.03.13
17:26
(10) Да я понял. Но это гемморно. Реквизит может быть не один.
12 NS
 
04.03.13
17:27
А если клиент в ТЧ - то совсем гемморно.
13 mvk
 
04.03.13
17:29
Тогда уж прямо в
Процедура ПриИзмененииКлиента()
...
СпрКлиент.Записать();
Клиент = СпрКлиент.ТекущийЭлемент();
Форма.Обновить();

Короче, я думаю, мы ответили :)
14 akovpashko
 
04.03.13
17:29
(10) спасибо за подсказку. Правда реквизит действительно не один и в документе еще в куче мест используется. Проще наверное повторно найти и назначить клиента.
15 akovpashko
 
04.03.13
17:30
(13) как ни странно такой вариант тоже пробовал и он не сработал. До меня было написано
Процедура ПриИзмененииКлиента()
...
СпрКлиент.Записать();
СпрКлиент.НайтиЭлемент(Клиент);
Клиент = СпрКлиент.ТекущийЭлемент();
Форма.Обновить();
16 mvk
 
04.03.13
17:31
(15) Сделай как в (13).
Не надо перепозиционироваться - убери СпрКлиент.НайтиЭлемент(Клиент);
17 NS
 
04.03.13
17:38
Есть подозрение что надо делать форма.обновить(1);
18 akovpashko
 
04.03.13
17:39
(16) у меня в ПриИзмененииКлиента() вызывается функция перерассчета скидок, которой передается позиционированный объект справочника. В таком виде не работает, хотя параметр вроде как передается по ссылке.

Процедура ПриИзмененииПокупателя()    
СпрСклиенты = СоздатьОбъект("Справочник.Клиенты");
   
Если (Покупатель.Выбран() = 1) И (СпрСклиенты.НайтиЭлемент(Покупатель) = 1) Тогда                          
   ПересчитатьОсновнуюСкидкуЧБ(СпрСклиенты);
   Покупатель = СпрСклиенты.ТекущийЭлемент();
   Форма.Обновить();
КонецЕсли;


Процедура ПересчитатьОсновнуюСкидкуЧБ(Клиент)                              
// тут еще куча условий                    
   Клиент.РазмОснСкидки = Клиент.РазмОснСкидки + Константа.БонуснаяСкидкаЧБ;
   Клиент.Записать();    
КонецПроцедуры
19 NS
 
04.03.13
17:41
А если
покупатель="";
покупатель=спрСклиенты.Текущийэлемент();
20 mvk
 
04.03.13
17:47
(19) Да не, это уже шаманство и камлание :)
Остановись отладчиком на Форма.Обновить() и посмотри на Клиент.РазмОснСкидки. Что пишет?
21 akovpashko
 
04.03.13
18:00
(20) Действительно шаманство. Останавливаюсь на строке
Покупатель = СпрСклиенты.ТекущийЭлемент(); из кода (16)
В табло уже добавлено Покупатель.РазмОснСкидки и значение 10 (старое)
Смотрю значение СпрСклиенты.РазмОснСкидки - 13 (новое).
Еще раз смотрю значение Покупатель.РазмОснСкидки, а там уже 13.
Еще раз добавляю в табло, уже существующая там запись Покупатель.РазмОснСкидки меняет значение на 13.
22 akovpashko
 
04.03.13
18:01
(19) этот вариант сработал.
23 mvk
 
04.03.13
18:12
(22) Н-дя. А релиз движка какой, если не секрет?
24 akovpashko
 
04.03.13
18:23
(23) 7.70.027 - это последний вроде бы.
25 akovpashko
 
04.03.13
18:36
Вопрос решился - ну и хорошо. Всем спасибо!
26 monsterZE
 
05.03.13
10:00
было уже (тоже натыкался) про кэш 1сы.. (19) как раз и помогает
AdBlock убивает бесплатный контент. 1Сергей