В форуме несколько раз подымался вопрос использования "Shared, DESKTOP private on first use" view (SDPFU view) как альтернативы обычным "Shared, private on first use" view (SPFU view). Как известно из практического опыта, SPFU view имеют проблемы с обновлением индексов. В этом смысле, SDPFU view более надежны, но для них актуальна проблема изменения дизайна уже существующих desktop private view.
Т.о., вопрос стоит так: как построить работу с SDPFU view таким образом, чтобы осталась возможность менять дизайн сформированных desktop private view по желанию разработчика без участия пользователя.
После некоторых экперементов я нашел решение, базирующееся на недокументированной, но известной :-) функции @UpdateViewDesign.
Итак, пусть dskViewName - имя нашего DPFU view.
Создаем в базе скрытую shared view с именем, например, "(templateViewName)" и копирум в нее дизайн DPFU view (в том числе и критерий отбора). Не страшно, если критерий отбора содержит @UserName - подразумевается, что эта view не будет использоваться.
Далее, в событие PostOpened базы помещаем следующий код (формульный):
PRIVATEVIEW_DESIGN_VERSION := "1";
Важно! Код события должен быть именно формульный. Если оформить его ввиде агента и вызвать из LS - работать не будет.
Комментарий.
Идея в следующем - при открытии базы на клиенте проверять текущую версию DPFU view. Если не совпадает с версией, указанной в дизайне базы, проводим обновление дизайна desktop private view при помощи @UpdateViewDesign, используя в качестве источника дизайна shared view, затем переоткрываем базу.
Т.о., если мы хотим изменить дизайн сущ. view, делаем следующее:
1. Вносим необходимые изменения в ОБЕ View - "dskViewName" и "(templateViewName)" (некоторое неудобство - но не сильно большое)
2. Изменяем переменную PRIVATEVIEW_DESIGN_VERSION
При следующем открытии базы на клиенте произойдет автоматическое обновление дизайна desktop private view. Пользователь отметит некоторую задержку при открытии базы :-)