Отладка скриптов без перезапуска клиента

В процессе разработки в ТС мне нужно поменять логику отображения-скрывания контролов в карточке документа,
в зависимости от того, что там выбрано, и ещё от того, кто откуда и зачем её вызвал и т.д.
Перезапускать клиент для проверки внесённых изменений - долго выходит. Вариант открывать карточку програмно -
так и делаю как правило, но не всегда всё получается проверить.

Нашёл следующий подход: в 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;
}

Конечно, это не продакшен - вариант, хотя если читать из базы то можно пробовать...
Ещё таким образом можно подсмотреть из внешнего скрипта состояние переменных в карточке у заказчика -
сделать ему кнопку "вызвать скрипт", и по ситуации скрипт можно быстро сваять на месте.
Снова таки актуально только в процессе доводки системы, иначе это уже дырка.

Нравится

Поделиться

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

Сергей, а почему не использовать функцию Main в самом скрипте?
Пишите там код по созданию экземпляра карточки, заполняете нужные атрибуты, вызываете Show(), Prepare(), нажимаете F9 и получаете работающую карточку в администраторе.

Александр, я раньше так и делал...
У нас в этой карточке логика зависит от того, как её создавали (есть несколько вариантов действий, в результате которых вызывается эта карточка в разных режимах - обычный, массовое копирование, изменение, вызов из детали)

Соответственно, я создавал из main весь workspace. Это занимает больше 10 секунд, и при этом не всё работало (возможно, я не до конца корректно его создавал, хотя больше похоже на то, что для корректного создания нужен ещё сервис основного окна). А так - при запущеном клиенте проверить новую функциональность несколько секунд.

Я понял. Да иногда самое сложное - это как раз подготовить параметры для отладки окна. Тогда Ваш способ действительно облегчает отладку.

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