Добрый день
Подскажите, пожалуйста
Можно ли как-то очистить дисковый кэш террасофта не через батник, а из клиента?!

Нравится

3 комментария

Здравствуйте, Иван!

Из клиента Terrasoft кэш удалить нельзя.

спасибо
не додумался там поискать

Показать все комментарии

Добрый вечер!
Друзья, может кто-нибудь пытался как-то заставить террасофт обновить весь кэш и настройки форм\сервисов?

Периодически, когда пишешь что-то совсем новое (новую форму и сразу целый ряд скриптов к ней), приходится очень часто перезаходить в клиент, чтобы проверить, что получается

Может можно как-то сделать какую-нибудь кнопочку на форме для администратора, чтобы она обновляла подкаченные сервисы?!

Заранее благодарен за потраченное время

Нравится

18 комментариев

Я в таких случаях запускаю карточку прямо из админа. При этом изменения в сохранённых скриптах учитываются.

К сожалению, зачастую окна являются детальками и т.п. окнами, которые очень тесно связаны с тем, что выбрано в справочнике в основном гриде

может как-то все же возможно принудительно обновить кеш всего ТС клиента?
( пробовал удалять папки с кешем - никакого эффекта )

как вы это себе представляете? Если сервис окна (или чего угодно) уже загружен - с ним ничего не сделать. Это нужно в ядро добавлять возможность динамической загрузки и обновления сервисов, но еще большой вопрос можно ли это адекватно сделать

День добрый всем!
К сожалению без перезапуска никак, так как сервисы уже загружены, создана масса объектов, при этом в определенно заданной последовательности, согласно написанным скриптам. Если же вы измените только один сервис, который изменяет дальнейшую логику работы, создает совершенно другие объекты, то как вы думаете по какому принципу уничтожить все лишнее, создать новое? А если в этот момент эти объекты используются в Outlook/Word/Excel, JobManager? Если данную функциональность все же рассмотреть, то помимо выше сказанного, нужно реализовывать нотификацию между всеми пользователями, которые работают в данный момент, чтобы у них очистились все кэши + обновились сервисы из базы. Но тут масса вопросов, например, если у этого пользователя в данный момент открыта карточка, скрипт которой нужно обновить, то как это делать, ведь набор функций, обработчиков, контролов мог измениться.

В общем, функциональность такого рода породит гигантское количество ошибок, утечек памяти и т.д.

Спасибо за крайне развернутые ответы
Но вы немного не так меня поняли

Я не хочу пользоваться данным функционалом (если бы он был, конечно же) со стороны пользователей
Он нужен исключительно для тестирования администратором только что написанного им кода на той же машине, на которой пишется код

И я не вижу особых технических проблем в полном обновлении всего. За исключением, конечно же, невозможности залезть в ядро

Интеграцию с аутлуком и т.п. в расчет я не беру, так как они чаще не важны в таких тестах. Да и даже если и нужны - всегда можно библиотеку выключить и включить снова.
А на счет открытых форм и окон.. - при перезаходе в ТС, они, как бы, тоже не остаются открытыми :) Т.е. вполне можно их грохнуть всех и даже и не открывать снова. Нужно будет - сам открыть всегда могу.

Т.е. можно было бы просто убить все объекты, переменные, оставить только чистую форму ТС wnd_Main и снова аккуратненько подобрать все из базы

"Калинин Иван" написал:Я не хочу пользоваться данным функционалом (если бы он был, конечно же) со стороны пользователей
Он нужен исключительно для тестирования администратором только что написанного им кода на той же машине, на которой пишется код

В вашем случае вы не будет пользоваться, а кто-то будет и будут нарекания, поэтому если такое реализовывать - необходимо учесть абсолютно все

"Калинин Иван" написал:А на счет открытых форм и окон.. - при перезаходе в ТС, они, как бы, тоже не остаются открытыми :) Т.е. вполне можно их грохнуть всех и даже и не открывать снова. Нужно будет - сам открыть всегда могу.

Как объяснить пользователю, что все данные в форме, которую он редактировал, не сохранились, потому что ее "грохнули". А если пользователь делал важный звонок, а карточка с объектом грохнулась...

В общем, в вашем случае предлагаю написать скрипт, в которм будет функция main() и пользоваться из TSAdmin'а кнопкой F9. А в этой функции вы можете сделать все чтот хотите. Например, если нужно запустить с главного окна, то:

function Main() {
  var MainWindow = Services.GetNewItemByUSI('scr_Main');
  MainWindow.Prepare();
  MainWindow.Show();
}

Я что-то, честно говоря, не понимаю вашего подхода
В данной теме я спрашиваю для себя, а не для кого-то
Конкретно в моем случае совершенно не важно, что будет с данными и карточками
Мне важно учесть лишь смены кода в карточке\скрипте
И я прошу помощи в решении именно моей проблемы, а не кого-то, кто может случайно забрести в этот пост и, применив совет из поста (даже не посмотрев, как он работает и не вчитавшись в вопрос) на своей рабочей версии террасофта, получит сброшенные данные из карточек

Я прошу лишь рассказать мне, как это можно сделать в клиенте
Заметьте, пожалуйста, именно в клиенте

Собственно, к сожалению, вопрос за эти два дня никуда не исчез и, даже больше, остался прежним.

Как обновить кэш клиента из этого же клиента посредством нажатия кнопки\галки\чего-угодно иного ?

И, не забывайте пожалуйста, что грамотный программист никогда не пишет на боевой базе.
Т.е. новый модуль, тестирование которого и происходит собственно, пишется на тестовой базе\сервере\версии террасофта.

Таким образом ситуация, когда

"Артем Гура" написал:Как объяснить пользователю, что все данные в форме, которую он редактировал, не сохранились, потому что ее "грохнули". А если пользователь делал важный звонок, а карточка с объектом грохнулась...
просто невозможна

есть кеш, а есть загруженные данные - стек приложения. Обнулив кеш (закешированные сервисы, хранящиеся в папке кеша на диске) во время работы вы получите только некоторе количество ошибок без обновления уже загруженных в память сервисов.
Если вы каким-то образом обнулите стек - чем это будет отличаться от перезапуска? Разве что пароль вводить не надо - но это и так можно автоматизировать

"Андросов Дмитрий" написал:Если вы каким-то образом обнулите стек - чем это будет отличаться от перезапуска? Разве что пароль вводить не надо - но это и так можно автоматизировать

сымитировать перезапуск будет, как минимум, быстрее

Иван, давайте конструктивно:
1. Что значит кэш?
Кэш в Terrasoft'е хранит сервис, который не отличается от сервиса в базе
2. Как происходит считываение из кэша?
При создании объекта этого сервиса. Кэш сверяется с базой и выдается решение откуда грузить.
3. Если хотите нажать на кнопку "вычитать из базы", то вам нужно "пересоздать" все нужные объекты, а перед этим просто удалить их из папки cache. С удалением проблем нет, а вот как искать что пересоздать? А пересоздавать нужно все. Если у вас где-то будет хранится ссылка на какойто-то Dataset и вы пересоздадите, скажем окно с этим Dataset'ом, то в памяти у вас будет 2 Dataset'а, так как старый имеет ссылку и по технологии COM не уничтожится. С этим может быть связан ряд проблем.

Я описывал функционал, который может попасть всем, если реализацию делать в ядре. Если же вы сделаете это все в конфигурации, то да, оно будет только у вас.

Итого, просто сделать кнопочку - не получится, сложно - может уйти много времени. Алгоритм пересоздания прост:
1. Удалаем с папки cache нужные файлы (можете все)
2. Пересоздаете объект

Т.е. теоретически, форма должна обновиться, если я
1. удалю весь кэш
2. после этого сохраню измененную форму
и после этого открою форму в клиенте - она будет соответствовать той, которую я сохранил в п. 2 ?!

К сожалению, так не работает
Форма, сохраненная до входа в ТС, отображается независимо от того, что я делаю с кэшом

Вы сожете посмотреть в сервисе scr_WindowUtils функцию WinCache_Get
При открытии окна идет вызов этой функции. Она ищет окно так:
1. Среди созданных в памяти
2. Если не найдено то идет создание
3. При создании пытается считаться с локального кэша (с винчестера)
4. Если не нашло что считать, то идет загрузка из базы

Т.е. вам нужно:
1. Удалить весь кэш с диска
2. В функции WinCache_Get вам нужно, грубо говоря, запретить поиск в памяти, чтобы зашло на строку
Item.Instance = Services.GetNewItemByUSI(USI);
А при вызове этой функции ядро увидит, что локального кэша нет, поэтому считает из базы

Спасибо огромное, обязательно попробую в ближайшее время

К сожалению, не помогает
Уже даже все удалил из функции WinCache_Get, кроме двух строк :

WinCache_Clear();
return WinCache_Add(USI, RecordID); 

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

Вам нужно, грубо говоря, в функции оставить только

return Services.GetNewItemByUSI(USI);

WinCache_Clear() очищает cache в памяти, но не на диске. Перед вызовом

return Services.GetNewItemByUSI(USI);

вам нужно удалить файлы c дериктории %appdata%\Terrasoft\<версия продукта>\Cache

К сожалению, не помогло
Оставил только

return Services.GetNewItemByUSI(USI);
Показать все комментарии

Здравствуйте!

В версии 3.3.2.109 встретился такой баг:

На форме редактирования добавлены два edit поля.
Все значения заполняются, форма сохраняется. Дальше, если открыть форму создания новой записи эти два поля уже заполнены предыдущими значениями.

Если отключить кэширование, то поля перестают заполняться. Но время загрузки значительно увеличивается.

Нравится

2 комментария

повесьте на событие OnAfterAppend для dlData на карточке очистку значения этих полей
это не баг, кстати:smile:

Понятно, спасибо Александр :)

Показать все комментарии

В версии 3.3.2 текст скриптов хранится в формате CDATA, т.е. не в blob-поле как было раньше. Поэтому в кэше сервисов становится доступен код скриптов. В частности доступен он становится для любознательных антивирусов. После очередного обновления антивирус Avira начала "ругаться" на один из файлов кэша. Выяснил, что это сервис scr_FileUtils. Пробным путем докопался, что если в js-файле написать:

Stream.SaveToFile
Shell.ShellExecute

то Avira говорит, что это HTML/Rce.Gen:

В scr_FileUtils эти две строчки встречаются: первая в функции SaveNodeAttributeAsBinaryToFile, а вторая - PrintFile. Код последней приведу здесь, т.к. уже не вижу ее в базовой версии.
function PrintFile(FileName) {
        try {
                var Shell = System.CreateObject("Shell.Application");
                var FilePath = FileName;
                Shell.ShellExecute(FilePath, "", "", "print", 1);
        } catch(e) {
                Log.Write(2, e.Message);
        }
}

Вот собственно и все. Поэтому, если столкнетесь с такой проблемой, то просто разнесите эти две строки в разные скрипты :)
Приятного программирования!

Нравится

Поделиться

1 комментарий

Какая бдительная Avira оказалась:smile:

Показать все комментарии