Имя: Пароль:
1C
 
Обновить отображение реквизита формы через точку в другом сеансе.
0 CepeLLlka
 
04.08.25
10:12
Есть к примеру форма документа с ТЧ "Товары" и колонкой "Номенклатура", дополнительно через точку в эту таблицу выведена колонка "Номенклатура.Артикул".

Если открыть форму этого документа в одном сеансе и одновременно во втором, затем в первом сеансе карточку номенклатуры открыть и изменить артикул, то отображение поля Артикул в форме документа во втором сеансе никак не меняется,  даже если закрыть форму и открыть. Помогает только перезапустить сеанс.

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


Это не помогает. Подскажите как обновить отображение реквизита в форме второго сеанса?

1С 8.3.24.1586
1 CepeLLlka
 
04.08.25
10:24
Проблема достаточно старая, вот в далеком 2014 году аналогичная тема была.
Проблема с кэшированием данных формы
2 Fedor-1971
 
04.08.25
10:25
(0) Вот тут посмотри
https://forum.mista.ru/topic.php?id=764068&ysclid=mdws6x8f9g365317961
3 CepeLLlka
 
04.08.25
10:26
(2)Там речь идёт об одном сеансе, а не о разных
4 Fedor-1971
 
04.08.25
10:29
2+ По факту, предлагают использовать динамический список + ОповеститьОбИзменении(), такая связка работает между сеансами
просто Оповестить только в одном сеансе
5 arsik
 
гуру
04.08.25
10:32
6 Fedor-1971
 
04.08.25
10:32
(3) как вариант, добавить колонку формы и заполнять её по событию (например, при чтении), только останется вопрос: как оповестить то другой сеанс?
т.е. тупо при чтении данных для формы заполняем новые данные минуя стандартное кэширование
7 CepeLLlka
 
04.08.25
10:34
(4)У меня табличная часть документа, вместо ТЧ документа дин. список юзать или что?
8 CepeLLlka
 
04.08.25
10:39
(6)Это в крайнем случае, да. Ну тут хоть переоткрытие формы поможет или обработчик ожидания.
9 Fedor-1971
 
04.08.25
10:44
(7) в таком раскладе ДС не вариант, тогда (6) или давить 1С с кэшированием данных формы
10 CepeLLlka
 
04.08.25
10:46
Пока что пробую решение из (1), но какое-то оно костыльное. Но это лучше чем перезапускать сеанс
11 craxx
 
04.08.25
10:48
(0) старый баг. Видать до сих пор не поправили
12 ldo6
 
04.08.25
13:05
ОбработчикОжидания можно попробовать.
13 CepeLLlka
 
04.08.25
11:12
(12)И что в обработчике написать?
14 timurhv
 
04.08.25
11:17
(5) Интересно, колом сервер встанет или нет, если запустить групповую обработку на перезаполнение 10тыс элементов справочника при условных 100 пользователях в базе)
15 youalex
 
04.08.25
11:30
В каком-то сочетании работают

ОповеститьОбИзменении(стр.Номенклатура) (на клиенте)
ОбновитьПовторноИспользуемыеЗначения() (на сервере)
16 ldo6
 
04.08.25
11:21
(13) Перезаполнение твоих динамически обновляемых реквизитов руками.
17 Fedor-1971
 
04.08.25
11:27
(15) Тут важен момент - как узнать в другом сеансе, что изменился реквизит? (либо, тупо кнопкой обновлять всё, что использовано в документе)

(16) на УФ нет доступа к колонкам с данными через "." (например, Номенклтура.Артикул)
18 youalex
 
04.08.25
11:30
(17) тут речь  о другом. Не о том, чтобы в другом сеансе породить событие, а в том, что эти значения кэшируются намертво, и даже переоткрытие формы не помогает
19 CepeLLlka
 
04.08.25
11:43
(15)Я делаю как в (1), только не перечитываю форму, в этом нет необходимости, а обновляю отображение только одной ТЧ.
Делаю это при открытии и ещё отдельную кнопку вывел для обновления.
Через обработчик ожидания как-то не хочется пока что делать, хоть и размер ТЧ у меня игрушечный будет. Если уж пользюки завоют что неудобно, то попробуем.

&НаКлиенте
Процедура ПриОткрытии(Отказ)
	ОчиститьКешНоменклатурыИОбновитьОтображение();
КонецПроцедуры

&НаКлиенте
Процедура Обновить(Команда)
	ОчиститьКешНоменклатурыИОбновитьОтображение();
КонецПроцедуры

&НаКлиенте
Процедура ОчиститьКешНоменклатурыИОбновитьОтображение()
	ОповеститьОбИзменении(Тип("СправочникСсылка.Номенклатура"));
	Элементы.Товары.Обновить();	
КонецПроцедуры
20 Fedor-1971
 
04.08.25
11:44
(18) Это понятно, обновлять все данные для документа при каждом открытии не смысл, т.к. непонятно, есть ли изменения в справочниках, например, номенклатуры
потому, сносить кэш нужно дозированно, т.к. документ может иметь тысячи позиций
21 Fedor-1971
 
04.08.25
11:46
(19) только не весь справочник чисти, а конкретную номенклатуру из ТЧ как в (15)
22 CepeLLlka
 
04.08.25
14:05
(21)Как я в другом сеансе узнаю, какая номенклатура изменилась?
23 arsik
 
гуру
04.08.25
12:36
(14) Вряд ли.
1) скуль результат на эти 10тыс. положит в свой кеш
2) Не нужно на каждый элемент ОповеститьОбИзменении, можно просто передать тип справочника. Тогда все кеши этого справочника очистятся.
3) Ну не все же 100 юзеров затребуют сразу эти 10 тысяч. Там порционно будет.
24 lEvGl
 
гуру
04.08.25
13:33
вообще прикольно будет: сидишь такой с открытой таблицей, а в ней номенклатура все время скачет вверх-вниз, потому что кто-то там меняет наименования ссылок
25 CepeLLlka
 
04.08.25
14:05
(23) Насколько я понимаю, ОповеститьОбИзменении() работает только в рамках одного сеанса.
Ну, в моём примере, если в первом сеансе ОповеститьОбИзменении(), то во втором никакой реакции нет.
26 Fedor-1971
 
04.08.25
13:46
(25) не совсем, динамические списки всех сеансов получают оповещение об изменении (этим ОповеститьОбИзменении отличается от Оповестить - оно чисто в одном сеансе), если вызвать в локальном сеансе, то просто почистишь кэш сохранённых реквизитов
Как-то так
27 CepeLLlka
 
04.08.25
13:49
(26)хз, тут про это не написано https://its.1c.ru/db/pubv8devui#content:229:hdoc

Ну и у меня не динамические списки.

К тому же проблема ещё в том, что метод для всех открытых форм, а если форма закрыта, в ней кеш не почистится насколько я понимаю.
28 Fedor-1971
 
04.08.25
15:56
(27) проведи эксперимент:
1. Добавь кнопку с очисткой кэша для всего справочника номенклатура (как в (19)) - открой ломаную форму
2. такую же кнопку положи в форму

по результатам будет понятно, где достаточно вызывать
Чтобы обнаруживать ошибки, программист должен иметь ум, которому доставляет удовольствие находить изъяны там, где, казалось, царят красота и совершенство. Фредерик Брукс-младший