Обновление динамического списка, используя несохраненные данные

1. native-api 23.10.23 14:04 Сейчас в теме
На форме документа есть динамичекий список (далее -- ДС), зависящий от табличных частей текущего документа (конкретно, от того, есть в них строки или нет; на основе этого сделано условное оформление):

ВЫБРАТЬ
	СправочникМестаОсуществленияДеятельности.Ссылка КАК Ссылка,
	<...>
	КОЛИЧЕСТВО(ДокументАккредитацияПоверкаКалибровкаИспытанияСИ.НомерСтроки) > 0 КАК ЕстьСтрокиПоверкаКалибровкаИспытанияСИ,
	<...>
ИЗ
	Справочник.МестаОсуществленияДеятельности КАК СправочникМестаОсуществленияДеятельности
		ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
			АккредитацияПоверкаКалибровкаИспытанияСИ.НомерСтроки КАК НомерСтроки,
			АккредитацияПоверкаКалибровкаИспытанияСИ.МестоОсуществленияДеятельности КАК МестоОсуществленияДеятельности
		ИЗ
			Документ.Аккредитация.ПоверкаКалибровкаИспытанияСИ КАК АккредитацияПоверкаКалибровкаИспытанияСИ
		ГДЕ
			АккредитацияПоверкаКалибровкаИспытанияСИ.Ссылка = &Ссылка) КАК ДокументАккредитацияПоверкаКалибровкаИспытанияСИ
		ПО (ДокументАккредитацияПоверкаКалибровкаИспытанияСИ.МестоОсуществленияДеятельности = СправочникМестаОсуществленияДеятельности.Ссылка)
<...>
Показать


В ПриСозданииНаСервере устанавливаю параметр ДС "Ссылка" в Объект.Ссылка.

Однако, оформление в таблице ДС обновляется только после записи документа (в ПослеЗаписиНаСервере вызываю "Элементы.<Таблица ДС>.Обновить()").

Можно ли как-то заставить ДС использовать актуальные данные табличных частей из данных формы -- т.е. даже еще не записанные?

Пробовал вызывать "Элементы.<Таблица ДС>.Обновить()" в обработчике ПриИзменении таблиц табличных частей -- нет эффекта.
Найденные решения
2. Sashares 34 23.10.23 14:43 Сейчас в теме
(1)Можно. Достаточно просто.

ВЫБРАТЬ
    СправочникМестаОсуществленияДеятельности.Ссылка КАК Ссылка,
    <...>
   Выбор Когда СправочникМестаОсуществленияДеятельности.Ссылка В (&МассивМестИзДокумента) Тогда Истина Иначе Ложь Конец КАК ЕстьСтрокиПоверкаКалибровкаИспытанияСИ,
    <...>
ИЗ
    Справочник.МестаОсуществленияДеятельности КАК СправочникМестаОсуществленияДеятельности


Параметр МассивМестИзДокумента - заполнять ссылками на СправочникМестаОсуществленияДеятельности из табличных частей документа и передавать в ДС в ПриЧтенииНаСервере, при изменении значения в колонках, при удалении строк в тч.
native-api; +1 Ответить
3. native-api 23.10.23 18:57 Сейчас в теме
(2)
Выбор Когда СправочникМестаОсуществленияДеятельности.Ссылка В (&МассивМестИзДокумента) Тогда Истина Иначе Ложь Конец КАК ЕстьСтрокиПоверкаКалибровкаИспытанияСИ


Можно проще:

СправочникМестаОсуществленияДеятельности.Ссылка В (&МассивМестИзДокумента) КАК ЕстьСтрокиПоверкаКалибровкаИспытанияСИ


----

Сделал.

Смущает, что в документации "ПриНачалеРедактирования" сказано, что в ней запрещены контекстные серверные вызовы.
Попытался всё проделать на клиенте (для чего написал клиентский аналог "ВыгрузитьКолонку", см. ниже),
но отладчик показывает, что вызовы сервера все равно происходят, причем даже больше, так что плюнул.

ДС:

ВЫБРАТЬ
	СправочникМестаОсуществленияДеятельности.Ссылка КАК Ссылка,
	<...>
	СправочникМестаОсуществленияДеятельности.Ссылка В (&ТЧПоверкаКалибровкаИспытанияСИ) КАК ЕстьСтрокиПоверкаКалибровкаИспытанияСИ,
	<...>
ИЗ
	Справочник.МестаОсуществленияДеятельности КАК СправочникМестаОсуществленияДеятельности
Показать



Собственный общий модуль ОбщегоНазначенияМППКлиентСервер:
(Мне кажется, что я видел такую функцию в БСП, но в упор не нахожу.
Написал, чтобы не писать "<ДанныеФормыКоллекция>.Выгрузить(,<Колонка>).ВыгрузитьКолонку(0)"
и чтобы попробовать обойтись без серверных вызовов)
// Выгружает заданное свойство всех элементов коллекции в массив
//
// Параметры:
//  Источник  - Коллекция - коллеция произвольных объектов, поддерживающих
//                 получение свойства по имени через []
//  Свойство  - Строка - имя свойства
//
// Возвращаемое значение:
//   Массив   - Массив значений свойств
//
Функция ВыгрузитьСвойство(Знач Источник, Знач Свойство) Экспорт
	Перем Элемент, Результат;
	Результат = Новый Массив;
	
	Для Каждого Элемент Из Источник Цикл
		Результат.Добавить(Элемент[Свойство]);
	КонецЦикла;
	
	Возврат Результат;
КонецФункции
Показать


Модуль формы:
&НаСервере
Процедура ОбновитьПодсветкуСпискаМОД()
	МестаОсуществленияДеятельности.Параметры.УстановитьЗначениеПараметра(
			"ТЧПоверкаКалибровкаИспытанияСИ",
			ОбщегоНазначенияМППКлиентСервер.ВыгрузитьСвойство(
					Объект.ПоверкаКалибровкаИспытанияСИ,"МестоОсуществленияДеятельности"));
	<...>
	Элементы.МестаОсуществленияДеятельности.Обновить();
КонецПроцедуры

// Затем вызываю ОбновитьПодсветкуСпискаМОД():
// * ПриСозданииНаСервере
// * ПослеЗаписиНаСервере
// * ПриНачалеРедактирования всех задействованных ТЧ
// * ПослеУдаления всех задействованных ТЧ


Показать
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. Sashares 34 23.10.23 14:43 Сейчас в теме
(1)Можно. Достаточно просто.

ВЫБРАТЬ
    СправочникМестаОсуществленияДеятельности.Ссылка КАК Ссылка,
    <...>
   Выбор Когда СправочникМестаОсуществленияДеятельности.Ссылка В (&МассивМестИзДокумента) Тогда Истина Иначе Ложь Конец КАК ЕстьСтрокиПоверкаКалибровкаИспытанияСИ,
    <...>
ИЗ
    Справочник.МестаОсуществленияДеятельности КАК СправочникМестаОсуществленияДеятельности


Параметр МассивМестИзДокумента - заполнять ссылками на СправочникМестаОсуществленияДеятельности из табличных частей документа и передавать в ДС в ПриЧтенииНаСервере, при изменении значения в колонках, при удалении строк в тч.
native-api; +1 Ответить
3. native-api 23.10.23 18:57 Сейчас в теме
(2)
Выбор Когда СправочникМестаОсуществленияДеятельности.Ссылка В (&МассивМестИзДокумента) Тогда Истина Иначе Ложь Конец КАК ЕстьСтрокиПоверкаКалибровкаИспытанияСИ


Можно проще:

СправочникМестаОсуществленияДеятельности.Ссылка В (&МассивМестИзДокумента) КАК ЕстьСтрокиПоверкаКалибровкаИспытанияСИ


----

Сделал.

Смущает, что в документации "ПриНачалеРедактирования" сказано, что в ней запрещены контекстные серверные вызовы.
Попытался всё проделать на клиенте (для чего написал клиентский аналог "ВыгрузитьКолонку", см. ниже),
но отладчик показывает, что вызовы сервера все равно происходят, причем даже больше, так что плюнул.

ДС:

ВЫБРАТЬ
	СправочникМестаОсуществленияДеятельности.Ссылка КАК Ссылка,
	<...>
	СправочникМестаОсуществленияДеятельности.Ссылка В (&ТЧПоверкаКалибровкаИспытанияСИ) КАК ЕстьСтрокиПоверкаКалибровкаИспытанияСИ,
	<...>
ИЗ
	Справочник.МестаОсуществленияДеятельности КАК СправочникМестаОсуществленияДеятельности
Показать



Собственный общий модуль ОбщегоНазначенияМППКлиентСервер:
(Мне кажется, что я видел такую функцию в БСП, но в упор не нахожу.
Написал, чтобы не писать "<ДанныеФормыКоллекция>.Выгрузить(,<Колонка>).ВыгрузитьКолонку(0)"
и чтобы попробовать обойтись без серверных вызовов)
// Выгружает заданное свойство всех элементов коллекции в массив
//
// Параметры:
//  Источник  - Коллекция - коллеция произвольных объектов, поддерживающих
//                 получение свойства по имени через []
//  Свойство  - Строка - имя свойства
//
// Возвращаемое значение:
//   Массив   - Массив значений свойств
//
Функция ВыгрузитьСвойство(Знач Источник, Знач Свойство) Экспорт
	Перем Элемент, Результат;
	Результат = Новый Массив;
	
	Для Каждого Элемент Из Источник Цикл
		Результат.Добавить(Элемент[Свойство]);
	КонецЦикла;
	
	Возврат Результат;
КонецФункции
Показать


Модуль формы:
&НаСервере
Процедура ОбновитьПодсветкуСпискаМОД()
	МестаОсуществленияДеятельности.Параметры.УстановитьЗначениеПараметра(
			"ТЧПоверкаКалибровкаИспытанияСИ",
			ОбщегоНазначенияМППКлиентСервер.ВыгрузитьСвойство(
					Объект.ПоверкаКалибровкаИспытанияСИ,"МестоОсуществленияДеятельности"));
	<...>
	Элементы.МестаОсуществленияДеятельности.Обновить();
КонецПроцедуры

// Затем вызываю ОбновитьПодсветкуСпискаМОД():
// * ПриСозданииНаСервере
// * ПослеЗаписиНаСервере
// * ПриНачалеРедактирования всех задействованных ТЧ
// * ПослеУдаления всех задействованных ТЧ


Показать
4. Sashares 34 23.10.23 20:16 Сейчас в теме
(3)
Смущает, что в документации "ПриНачалеРедактирования" сказано, что в ней запрещены контекстные серверные вызовы.

Зачем это делать в ПриНачалеРедактирования?

Попытался всё проделать на клиенте

Если нужно на клиенте, то можете просто циклом обойти табличную часть и заполнить массив.
5. native-api 24.10.23 09:48 Сейчас в теме
(4)
Зачем это делать в ПриНачалеРедактирования?


Это событие, которое ловит добавление строки в ТЧ (Автоматическое заполнение полей при вводе новой строки табличного поля :: Формы :: ИТС). Мне нужно ловить моменты, когда число строк в ТЧ изменяется. Также пытался через ПередДобавлениемСтроки -- но в его момент новой строки еще нет; вариант "ПриОкончанииРедактирования" хуже, т.к. подсветка меняется только после окончания редактирования. И в обоих случаях документация также запрещает серверные вызовы.

(4)
Если нужно на клиенте, то можете просто циклом обойти табличную часть и заполнить массив.


Я так и сделал. Но выяснил, что серверные вызовы все равно идут (видимо, для обновления ДС), причем их даже большее количество, чем с серверной процедурой. Так что решил, что уж лучше один большой серверный вызов, в котором сделать сразу всё.
6. Sashares 34 24.10.23 11:19 Сейчас в теме
(5)
Это событие, которое ловит добавление строки в ТЧ (Автоматическое заполнение полей при вводе новой строки табличного поля :: Формы :: ИТС). Мне нужно ловить моменты, когда число строк в ТЧ изменяется. Также пытался через ПередДобавлениемСтроки -- но в его момент новой строки еще нет; вариант "ПриОкончанииРедактирования" хуже, т.к. подсветка меняется только после окончания редактирования. И в обоих случаях документация также запрещает серверные вызовы.


ПриНАЧАЛЕредактирования, ПередДобавлениемСтроки названия как бы намекают, что в этих событиях еще ничего не произошло.

Достаточно так -ПриИзменении на нужную колонку и ПослеУдаления на таблицу.
Никакие другие события таблицы не нужны.
И серверные вызовы в них можно.
Если есть процедуры автозаполнения таблиц, то и в них соответственно тоже.

Но выяснил, что серверные вызовы все равно идут (видимо, для обновления ДС), причем их даже большее количество, чем с серверной процедурой.


Серверные вызовы могут идти при обходе цикла, если таблица большая - данные подгружаются на клиент.
native-api; +1 Ответить
7. native-api 24.10.23 16:03 Сейчас в теме
(6)
Достаточно так -ПриИзменении на нужную колонку и ПослеУдаления на таблицу.


(6)
ПриНАЧАЛЕредактирования, ПередДобавлениемСтроки названия как бы намекают, что в этих событиях еще ничего не произошло


В моем конкретном случае запрос ДС зависит от реквизита ТЧ, не вынесенного на форму, так что нет нужной видимой колонки. И этот реквизит заполняется как раз в ПриНачалеРедактирования, так что в момент вызова показанного кода он уже заполнен, и строчка ДС сразу выделяется, еще до того, как я начал править видимые поля.

Но в общем случае, если запрос зависит от видимой колонки, согласен: если реквизит, от которого зависит запрос, заполняется пользователем, а не автоматически, ловить, разумеется, нужно момент его изменения.
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот