Имя: Пароль:
1C
1С v8
Корректное отображение табличной части реквизита. Как организовать?
↓ (Волшебник 17.10.2025 20:09)
0 Beduin
 
17.10.25
07:17
Что-то не то делаю похоже.
Проблема простая. Есть 2 справочника.
К примеру Справочник1 и Справочник2
В Справочник1 есть табличная часть с произвольными данными.
Ну пусть будет также Реквизит1 и Реквизит2, строковые.
В Справочник2 есть реквизит "ТестРеквизит" со ссылкой на Справочник1.
В Справочник2 я на форму добавил табличную часть из реквизита Справочник1.
Справочник 1, программно изменяется в части табличной части по кнопке из Справочника2.
Проблема. Данные на форме Справочник2 по табличной части Справочник1 не обновляются даже после переоткрытия формы.
Методы Прочитать() и Обновить() у элемента или формы также не помогают.
Только полный перезапуск программы.
При этом если добавить записи в табличную часть Справочник1 через обычное редактирование, то на форме Справочник2 все отобразится.
Упустил какую-то базовую вещь, поясните чтобы понял. Без закидывания тапками.
1 Маленький Вопросик
 
17.10.25
07:38
Чето много появляется вопросов тех характера от юзеров со стажем от 15-17 лет….. на форуме

Время просиживания штанов прошло? Пытаетесь доказать свою профпригодность?

А по вопросу - табличная часть - это часть записи реквизитов…

Используй динамический список!
2 Beduin
 
17.10.25
07:44
(1) Тапок все равно прилетел)
Я знаю, что динамический список нужно. Почему именно я не могу через ОповеститьОбИзменении сделать?
3 Garykom
 
гуру
17.10.25
07:46
(1) Их просто выгнали с их синекуры
Приходится начинать работать...
4 Маленький Вопросик
 
17.10.25
07:47
Сделай обработку оповещения на клиенте… но даже вопрос задан не правильно «отображение табличной части реквизита»

Что за зверь???

Напиши простыми словами, что нужно - без привязки к коду?
5 Beduin
 
17.10.25
07:48
(4) Отобразить табличную часть реквизита другого объекта.
Почему для этого нужно динамический список использовать?
6 Маленький Вопросик
 
17.10.25
07:52
Тебе в «реальном времени» ? - оповещение тогда, чтобы считывал без «событий»
7 Beduin
 
17.10.25
07:55
(6) ОповеститьОбИзменении и потом прочитать на форме. Это работает.
Я просто концепцию этих событий не понимаю. В джавах я расслыю сообщения и потом отлавливаю там, где это необходимо.
8 Garykom
 
гуру
17.10.25
07:55
Телепатирую... Вероятно речь идет об использовании "ОповеститьОбИзменении"
9 Garykom
 
гуру
17.10.25
07:56
(7) Ну вот, теперь осталось только правильные параметры передать внутрь ОповеститьОбИзменении
10 Beduin
 
17.10.25
07:58
(9) Там один параметр всего, с двумя разными типами.
11 Garykom
 
гуру
17.10.25
07:59
Хотя если ты из формы Справочник2 программно меняешь (записываешь) Справочник1
И хочешь чтобы сразу онлайн на форме обновилось

Ну логично что нужен промежуток/пауза между вызовами .Записать и ОповеститьОбИзменении
Например через ПодключитьОбработчикОжидания
12 Маленький Вопросик
 
17.10.25
08:00
(10) у меня нет примеров с обработчиком ожидания... почему-то...
13 Beduin
 
17.10.25
08:01
(11) Вот. Тоесть я должен организовать цикл, который будет в определенное время выполнять действия. Это не событийная модель.
14 Garykom
 
гуру
17.10.25
08:01
(12) Просто правильная архитектура и алгоритмы
Без лишнего изврата
К сожалению не всегда получается красиво и приходится костылить
15 Garykom
 
гуру
17.10.25
08:04
(13) Не обязательно
16 Маленький Вопросик
 
17.10.25
08:05
нет, ну реально стало много таких "пациентов" с большим стажем просиживания штанов... посмотрите темы форума)))))
17 Garykom
 
гуру
17.10.25
08:07
(16) Аналогично было с 77, после отказа и переход на 8-ку
Сча походу волна перехода с ОФ на сложный УФ с клиент-сервером и отказом от модальности и синхронности
18 Beduin
 
17.10.25
08:10
(16) Как итог. Спросил на форуме про 1С, базовую вещь. Вопрос больше теоретический на поговорить о модели.
1.Напомнили про стаж
2.Назвали пациентом
3.Отправили штудировать форум.
19 Ненавижу 1С
 
гуру
17.10.25
08:09
"Справочник 1, программно изменяется в части табличной части по кнопке из Справочника2." Вот здесь и кроется проблема архитектуры
20 Маленький Вопросик
 
17.10.25
08:10
(17) сейчас, скорее всего, фирмы экономят на услугах франчей, если держат своих 1с-ников.... и задачи перекидывают на них... ну и невольно видим результат этих решений
21 Маленький Вопросик
 
17.10.25
08:11
(18) тебе дали ответ в (1) и (8)
22 Мультук
 
гуру
17.10.25
08:29
(0)

Так ? Тогда всё работает и обновляет "прямо сразу"

&НаСервере
Процедура ДобавитьСтрокуВСправочник1НаСервере()
	если ЗначениеЗаполнено(Объект.Справочник1) Тогда
		об = Объект.Справочник1.ПолучитьОбъект();
		НоваяСтрока = об.ТабличнаяЧасть1.Добавить();
		НоваяСтрока.ДатаВремя = ТекущаяДата();
		об.Записать();
		
	КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура ДобавитьСтрокуВСправочник1(Команда)
	ДобавитьСтрокуВСправочник1НаСервере();

	ОповеститьОбИзменении(Объект.Справочник1);  
КонецПроцедуры


(4) "Табличная часть реквизита" см рис 1, 2
23 Beduin
 
17.10.25
08:36
(22) Да, все так. А в случае динамического списка с произвольным запросом его отдельно надо обновить.
24 Маленький Вопросик
 
17.10.25
08:36
(22) а может так:

ОбщегоНазначенияКлиент.ОповеститьОбИзмененииОбъекта(Источник.Ссылка)
25 Ненавижу 1С
 
гуру
17.10.25
08:41
(20) можно подумать все франчи это эталон качества кода и архитектуры
26 spiller26
 
17.10.25
08:52
(23) Элементы.ТвойДинамСписок.Обновить();
на клиенте если что. Примерно так...

//в модуле формы со списком
...
...
...
&НаКлиенте
Процедура ОбработкаОповещения(ИмяСобытия, Параметр, Источник)      
Если ИмяСобытия = "ОбновитьДС" Тогда      
Элементы.Список.Обновить();      
КонецЕсли;      
....
КонецПроцедуры


//оповещение из другого клиентского модуля, где происходит запись или изменения
&НаКлиенте
Процедура ОбработатьЗадачу()
.....
.....
.....
   Оповестить("ОбновитьДС");
....
КонецПроцедуры
27 Garykom
 
гуру
17.10.25
09:06
(23) А у твоего ДС основная таблица задана?
28 Мультук
 
гуру
17.10.25
09:16
(23)

Извини бро, в (0) была беда-печаль
Я написал код, который показывает что ни беды, ни печали нет.

Теперь вы решили играть в ДС.
Зачем ? Если и так всё работает.
Но тут же уже сами.
29 Beduin
 
17.10.25
09:19
(28) Все норм. Спасибо. Здесь тема больше рассуждения.
30 Beduin
 
17.10.25
09:26
(27)
ВЫБРАТЬ
    НоменклатураТабличнаяЧасть1.НомерСтроки КАК НомерСтроки,
    НоменклатураТабличнаяЧасть1.Реквизит1 КАК Реквизит1,
    НоменклатураТабличнаяЧасть1.Реквизит2 КАК Реквизит2
ИЗ
    Справочник.Номенклатура КАК Номенклатура
        ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Номенклатура.ТабличнаяЧасть1 КАК НоменклатураТабличнаяЧасть1
        ПО Номенклатура.Ссылка = НоменклатураТабличнаяЧасть1.Ссылка
ГДЕ
    Номенклатура.Ссылка = &СсылкаПар


Основную табличку если указать Справочник.Номенклатура то ругается. На дублирование полей ссылка
31 Ёпрст
 
гуру
17.10.25
09:29
(30) ясен пень, при левом соединении то с табличной частью..
32 Garykom
 
гуру
17.10.25
09:48
(30) Ты походу и в запросах не очень
Ну изврат же

В данном случае никакого смысла от левого соединения нет
Еще и лишние строки с null получишь для пустых ТЧ
33 Beduin
 
17.10.25
11:20
(31)(32) Это пример запроса был, чтобы таб.часть в динамический список воткнуть. Переверните соединение наоборот и null не будет. Проблема как указать табчасть в динамическом списке и чтобы основная таблица была спр.номенклатура.
Давайте свое решение.
34 Мультук
 
гуру
17.10.25
11:25
(33)

Не дадим (с)
35 Garykom
 
гуру
17.10.25
11:36
(33) внутреннее сделать вместо левого
у тебя всегда если есть строка в ТЧ - значит есть и элемент справочника
и вероятно нафик не нужны только элементы справочника без строк ТЧ
36 Beduin
 
17.10.25
11:49
(35) А теперь этот запрос с указаним основной таблицей, попробуй использовать в динамическом списке
37 Garykom
 
гуру
17.10.25
12:46
(36) Ну да ибо в ДС строки связанные с основной таблицей должны быть уникальны
38 Garykom
 
гуру
17.10.25
12:48
Так что если ДС с произвольным запросом без основной таблицы то (26)
39 Beduin
 
17.10.25
12:49
(37) Тогда про что ты в (27) спрашивал?
40 Garykom
 
гуру
17.10.25
12:57
(39) Уточнял
Ибо ОповеститьОбИзменении работает только если задана основная таблица

Согласен что в случае ДС с произвольным запросом к ТЧ засада выходит
Или дергать/обновлять по таймауту через обработку ожидания
Или размещать на форме второй ДС привязанный к справочнику через основную таблицу
И у него использовать обработчик ПриПолученииДанныхНаСервере(), из которого делать Элементы.Список.Обновить()

Хз можно ли его сделать невидимым и будет ли работать обработчик
41 Garykom
 
гуру
17.10.25
12:59
(40)+ Т.е. изменение элемента справочника вызывает обновление одного ДС, а его обработчик обновляет нужный тебе ДС

Но по таймауту надежней, ибо изменить ТЧ может другой пользователь в другом сеансе же
42 Мультук
 
гуру
17.10.25
13:35
Если таб.часть маленькая, то ДС не нужен.
Можно примитивно читать в таблицу значений или (22)

Если таб.часть большая (от тысяч строк), то наверное лучше сразу делать РС.

Но опять таки нам неизвестно, что за верблюда велосипед изобретает ТС.
43 Fish
 
гуру
17.10.25
13:41
(19) +100500. Не нужно так делать.
44 Beduin
 
17.10.25
13:46
(43) А что необычного? Программно поменяли данные, из любого места возможно. И на форме нужно эти данные обновить.
45 Garykom
 
гуру
17.10.25
14:25
(44) Архитектура кривая
Обычно делают отдельную обработку аля АРМ
46 Eiffil123
 
17.10.25
14:38
(45) ну какая разница, обработка поменяет данные, все равно они не перерисуются в форме справочника 2. Изначальная проблема же в этом
47 Garykom
 
гуру
17.10.25
14:46
(46) Форму переоткроет и перерисуются
48 maxab72
 
17.10.25
14:51
(47) это не интересно... надо добавить план обмена, с подчиненными узлами для каждого пользователя системы. В план обмена будем писать те объекты конфигурации, которые кто-то изменил, и которые должны обновляться автоматически. И у каждого пользователя запустить периодическую проверку. Если форма измененного объекта открыта у текущего пользователя, обновляем ее, и все записи об изменениях в объектах очищаем.
49 АгентБезопасной Нацио
 
17.10.25
15:05
(48) >>все записи об изменениях в объектах очищаем
а приоритеты? :-)
50 Eiffil123
 
17.10.25
15:05
(48) зачем план обмена. давайте регистры расчета лучше
51 Beduin
 
17.10.25
15:05
(47) Если сделать оповеститьобизменении для таблицы или обновить для динамического списка.
А так при открытии/закрытии формы не обновляются данные. Если программно менять.
52 АгентБезопасной Нацио
 
17.10.25
15:07
(50) Правильно! С вытеснением!
53 maxab72
 
17.10.25
15:09
(49) приоритеты - это первоочередное!
(50) это слишком тривиально. задача для бизграматных нубов.
54 Eiffil123
 
17.10.25
15:28
(51) проведите на копии базы эксперимент: при записи справочника 1 из спр.2 меняйте не только табчасть, но и наименование (например точку добавьте). Проверьте, обновиться ли при этом табличная часть на форме спр.2 или также не будет обновляться?
55 Beduin
 
17.10.25
15:36
(54) Также не обновляется.
56 takefive
 
17.10.25
16:04
&НаСервере
Процедура Команда1НаСервере()
    ТекущееВремя = Прав(СокрЛП(ТекущаяДата()), 8);
    СпрОбъект = Объект.ТестРеквизит.ПолучитьОбъект();
    СпрОбъект.Наименование = ТекущееВремя;
    СпрОбъект.ТабличнаяЧасть1[0].Реквизит1 = ТекущееВремя;
    СпрОбъект.Записать();
КонецПроцедуры

&НаКлиенте
Процедура Команда1(Команда)
    Команда1НаСервере();
    ОповеститьОбИзменении(Объект.ТестРеквизит);
    ЭтаФорма.ОбновитьОтображениеДанных();    
КонецПроцедуры