В процессе разработки в ТС мне нужно поменять логику отображения-скрывания контролов в карточке документа,
в зависимости от того, что там выбрано, и ещё от того, кто откуда и зачем её вызвал и т.д.
Перезапускать клиент для проверки внесённых изменений - долго выходит. Вариант открывать карточку програмно -
так и делаю как правило, но не всегда всё получается проверить.
Нашёл следующий подход: в jscript есть функция eval, позволяющая динамически выполнить блок кода.
Пишем кусок скрипта в текстовом файле (я пишу в своей любимой Visual Studio), в терасофте добавляем его
загрузку и выполнение в нужное место, и вуаля - поменяли скрипт, нажали кнопку в клиенте - отработала новая логика,
никаких перезапусков!
К примеру, я добавил такой блок в функцию, которая перестраивает карточку документа при смене значения
в комбобоксе "тип документа". Получается, чтоб увидеть как отработал мой скрипт, мне достаточно выбрать
новое значение в списке - сразу загружается новая версия и выполняется в контексте текущего состояния карточки.
Вариант кода:
//В администраторе
//Глобальная переменная - чтоб убедиться, что загруженный скрипт видит всё, что видно в функции, из которой вызван eval
var testMessage = 'Printed from loaded script';
function OnEvent()
{
eval(GetExtScriptText('C:\\Prj\\Terrasoft\\ExtScripts\\DocScripts.js')); // Получили текст скрипта и выполнили его, теперь все функции оттуда нам доступны
processTestMessage(); //Эта функция описана в скрипте DocScripts.js
}
//Файл DocScripts.js
function oneMoreFunction(messageText){
return messageText + ' ok.';
}
//Эту функцию мы и вызываем из террасофт. Ей доступна, среди прочего, переменная testMessage
function processTestMessage() {
var tempString = oneMoreFunction(testMessage);
ShowInformationDialog(tempString);
}
//Функция, которая читает тексовый файл
function GetExtScriptText(scriptFile)
{
var StringsList = System.CreateObject('TSObjectLibrary.StringsList');
var FileSystemObject = new ActiveXObject('Scripting.FileSystemObject');
var File = FileSystemObject.GetFile(scriptFile);
//Open for reading in default encoding
var Stream = File.OpenAsTextStream(1, -2);
try
{
while (!Stream.AtEndOfStream)
{
StringsList.Add(Stream.ReadLine());
}
}
finally
{
Stream.Close();
}
return StringsList.Text;
}
Конечно, это не продакшен - вариант, хотя если читать из базы то можно пробовать...
Ещё таким образом можно подсмотреть из внешнего скрипта состояние переменных в карточке у заказчика -
сделать ему кнопку "вызвать скрипт", и по ситуации скрипт можно быстро сваять на месте.
Снова таки актуально только в процессе доводки системы, иначе это уже дырка.