|   |   | 
| 
 | 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) как раз и помогает     | 
| Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |