Давно подумываю, как бы прикрутить контроль (и восстановление) версий для файлов конфигурации. И тут меня осенило). Включил логирование для таблицы tbl_Service - работает :biggrin:

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

Вопрос:
Может быть, кто-нибудь знает, как переделать триггер, чтобы десериализировать XMLStorage и сравнить по тексту прямо на сервере?

Нравится

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

Посмотрите на наше решение, возможно будет интересно:
http://www.community.terrasoft.ua/catalog/4245

спасибо Валерий, но так много мне пока не надо. Хотя демо-версию я бы посмотрел.

Ещё есть ККК. Возможно, потребуется его адаптация под 3.4.

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

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

Чтобы ускорить процесс, достаточно в код скрипта окна добавить функцию Main, где открыть это окно:

function Main() {
        // указать USI сервиса окна
        var wnd = Services.GetNewItemByUSI('wnd_MyWindow');
        wnd.Prepare();
        wnd.Show();
}

Открываем в TSAdmin скрипт окна, нажимаем клавишу F9 и это окно тут же открывается.

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

Предостережение второе: изменённые сервисы надо сохранить. Если произойдёт сбой недоделанного ещё пока скрипта, может рухнуть TSAdmin и всё несохранённое пропадёт. То же произойдёт, если начать отладку и закрыть Visual Studio.

Нравится

Поделиться

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

Добрый день!

БД Oracle, TS 3.3.2.266

После поднятия БД из бекапа заметил странную штуку: при создании в Администраторе таблицы приложение надолго (более 5 минут) задумалось. TOAD'ом решил посмотреть чем же так долго занята сессия. Каково же было мое удивление когда я увидел, что он у всех по очереди отнимает права на все таблицы и представления. Совсем не понимаю как связано создание одной таблицы с правами на остальные... Может мне кто-то дать объяснение такого поведения Администратора? Возможно, это как-то связано с темой, которую я создал чуть раньше https://community.terrasoft.ua/forum/topic/8609, но зачем было трогать нормальные права? Уже 40 минут права потихоньку исчезают у всех пользователей... Не знаю создадутся ли они вновь((

Нравится

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

У нас тоже долго сохранялись в TSAdmin севисы таблиц на базе Oracle с большим количеством пользователей . Не 40, но 10-15 минут ждать приходилось.

Ускорить процесс можно было, временно отключив логику хранимки tsp_UpdateUserRights, которая и перераздаёт права. Туда вставляли return в самом начале, чтобы ничего не выполялось.

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

Начиная с 3.4.1 сделали значительное ускорение работы с Oracle.

Ozzy, а сколько у вас пользователей? и сколько при этом групп пользователей?
Действительно с Ораклом есть проблемы в этом плане. Поначалу мне было дико, что таблица сохраняется более часа, в то время как на sql это занимает секунды. Но потом смирился)
То, что этот баг исправили в 3.4, конечно, хорошо. Только вот пользователям предыдущих версий от этого не легче.

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

Меня угнетает больше другое: при создании и сохранении новой таблицы эти глючные скрипты забрали права у всех пользователей со всех таблиц и представлений. Права были сохранены и после поднятия бекапа розданы скриптом из http://www.community.terrasoft.ua/blogs/4524, а создание нового пользователя не раздает ему права и сохранение одной таблицы вызвало потерю всех прав на таблицы.

Пользователей штук 80 заведено + 40 неактивных. Зачем неактивным пользователям права перераздавать - тоже непонятно. Кто бы в более старых версиях баги поправил бы...

Здравствуйте.
Ваш вопрос был решен в рамках обращения в службу технической поддержки. Что касается прав доступа пользователей Terrasoft 3.x на СУБД Oracle, то они значительным образом были переработаны в версии 3.4.1.
C уважением Terrasoft Support Team.

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

Коллеги,

Есть бинарники TS версии 3.3.2.249
Есть OS Windosw 7 корпоративная.

Никто не сталкивался с такой проблемой: на диаграмме перепривязываешь блоки между собой (перетаскиваешь стрелочки) - комп уходит в аут, использование памяти процессом TSAdmin увеличивается до тех пор, пока не получаем OutOfMemory Exception (один раз я этого дождался, на второй терпения не хватило, пришлось перезагружать комп)?

Какие-нибудь мысли, рекомендации?
Спасибо!

Нравится

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

Попробовали с той же операционной системой и бинарными файлами - проблему воспроизвести не удалось.

Проблема воспроизводится при каждом перетаскивании стрелочек или после определенного времени работы в системе?

Какого типа элементы Вы пытаетесь соединить?

Есть ли у Вас возможность предоставить сервис бизнес-процесса, на котором воспроизводится проблема?

Для устранения проблемы рекомендуется обновить бинарные файлы до самой новой сборки в пределах Вашей версии. Запрос на бинарные файлы мжно направить на support@terrasoft.ru

Анна, добрый день!

1) Проблема воспроизводится всегда для одного участка диаграмы (см. приложение)
Попробуйте элемент №4 соединить с выходом.
Сейчас картина немного другая: Exception + ОС автоматически закрывает приложение (т.е. сейчас хотя бы комп не виснет)

2) Это элемент типа "Окно"

3) Не уверен по поводу номеров сборки... с нами работают Ваши сотрудники (завершают проект), они что-то не говорили что есть что-то более новое чем 3.3.2.249

Спасибо!

Проблема только на одном компьютере или на всех?

Есть два варианта:
- Это системный вопрос, и стоит попробовать перерегистрацию/замену бинарных файлов, настройку некоторых функций операционной системы (если воспроизвоидтся только на одном компьютере);

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

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

В Администраторе Terrasoft CRM уже есть некоторые функции, о которых большинство пользователей знают, но кому-то они окажутся ранее неведомой полезностью.

Подсказки и дополнения

При нажатии [Ctrl] + [пробел] показывается список функций, название которой совпадают с тем, что начал водить пользователь.

список функций

При нажатии [Shift] + [пробел] происходит автодополнение популярных конструкций (if, for, function). Для этого должен быть наполнен файл AutoComplete.cfg. Пример содержимого такого файла.

Список функций в скрипте

Нажимаем [Ctrl] + [G] или выбираем пункт в меню "Поиск" и видем окно:
список методов

Туда и обратно

Чтобы перейти от вызова функции к её определению, нажимаем на название функции мышью с зажатым [Ctrl]. Чтобы после этого вернуться обратно, нажимаем [Alt] + [←] (стрелочка "влево").

Двигаем блоки

Чтобы красиво оформить код в соответствии с о структурой for-ов, if-ов и функций, нужно делать отступы. Чтобы из такого:

function GetEnumControlValue(EnumControl) {
var Item = EnumControl.Value;
var Result = (Item ? Item.Code : null)
return Result;
}
получить такое:
function GetEnumControlValue(EnumControl) {
        var Item = EnumControl.Value;
        var Result = (Item ? Item.Code : null)
        return Result;
}

выделяем мышью средние строки и нажимаем [Tab]. Они вместе сдвигаются вправо на табуляцию. Нажатие [Shift] + [Tab] сдвигает влево.

Поиск по всем скриптам проекта

Он же Grep search. О нём точно каждый пользователь знает, но мало ли. Вызывается из меню "Инструменты" или клавишами [Shift] + [Alt] + [S]:
Grep search

В версии для Oracle поиск работает очень неспешно, в MS SQL – шустрее.

Нравится

Поделиться

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

А в старых версиях (например Terrasoft 3.02 ) эти мелочи будут работать?

В 3.0.2.68 почти ничего не сработало, есть только сдвиг табом.

Не плохо-бы такие вещи отражать в документации. Особенно вот это: "Поиск по всем скриптам проекта". К тому же добавить вот это: http://www.community.terrasoft.ru/blogs/6549, а ещё вот это: http://www.community.terrasoft.ru/developer/advice/4576 и ещё много чего...
Это же так просто, даже писать ничего не надо. Берёте текст из подобного поста и вставляете в документацию.
50% ответов на возникающие вопросы я нахожу на коммьюните, 40% - прямые обращения и лишь 10% - в документации. Это неправильная ситуация.

P.S. Это я к специалистам из Terrasoft обращаюсь.

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

Речь пойдет о разных, новых механизмах ядра 3.4

1. Производительный BeginUpdate/EndUpdate

В разработке UI (User Interface) многое зависит от того, какое расположение элементов управления, цвета, подсветки и т.д. Но, также много зависит от того, что видит пользователь при динамическом изменении карточки, конролов, окна при определенных действиях. Поэтому, всегда нужно уделять внимание тому, что пользователь визуально видеть не должен. Существуют механизмы скрытия рисования при динамическом изменении содержимого. Итак, постараюсь описать существующий механизм BeginUpdate/EndUpdate в Terrasoft 3.4.x.

В Terrasoft 3.4.x+ реализовано 2 возможности запретить окну обновлять содержимое:

  • «Глобальный» Lock (далее GlobalLock). Данный метод запретит Вам обновлять все окно (используется в Terrasoft 3.3.x)
  • «Индивидуальный» Lock (далее ControlLock). Этот метод запретит обновлять только тот контрол (и все его содержимое), которому был установлен Lock

В чем же разница и как понять, какой метод использовать? Для начала немного теории. GlobalLock – это функция, написанная Microsoft на все случаи жизни еще в Windows 2000. Она, конечно же, имеет право на жизнь, но с одним НО – только одно окно в системе может быть заблокировано в одну единицу времени. Блокировка любого другого окна (даже не вашего) - приведет к автоматической разблокировке вашего окна. Что же делает ControlLock? Этот метод блокирует обновление окна до того момента, пока вы лично не скажете ему, что оно может обновляться. В каждом из этих методов есть свои плюсы и минусы. В Terrasoft 3.4.x GlobalLock используется только для окон (Window), а для всего остального используется ControlLock. Для того чтобы понять разницу какой метод и когда запускается, рассмотрим пример:

/*Припустим, что у нас имеется FrameGroup’а, в которую динамически добавляются контролы.
Поэтому, на время добавления Нам нужно запретить окну обновляться*/

function wnd_WindowOnPrepare(Window) {
        Window.BeginUpdate(); /*Будет использован GlobalLock, так как это Window*/
        CreateControls();
        Window.EndUpdate();
}
function wnd_WindowOnPrepare(Window) {
        Self.BeginUpdate(); /*Будет использован GlobalLock, так как Self всегда является окном*/
        CreateControls();
        Self.EndUpdate();
}
function wnd_WindowOnPrepare(Window) {
        FrameGroup.BeginUpdate(); /*Будет использован ControlLock*/
        CreateControls();
        FrameGroup.EndUpdate();
}

Разница заключается в том, что в первом случае обновится все окно, а во втором – только FrameGroup’а. Отсюда следует, что использовать ControlLock производительнее, нежели GlobalLock. Но, использование GlobalLock также нужно, оно используется для окон, размеры которых вы хотите изменить, или же изменить содержимое самого окна. При этом комбинированное использование разрешено. Эти методы не конфликтуют друг с другом. Рассмотрим пример:
Пример
function Lock() {
        Window.BeginUpdate();
        FrameSet.BeginUpdate(); /*FrameSet заблокирован*/
        Frame.BeginUpdate(); /*заблокировали Frame*/
        Window.EndUpdate(); /*на этом этапе окно обновит элементы управления, кроме Framе’a, FrameSet’а и их содержимого*/
        FrameSet.EndUpdate(); /*Обновится FrameSet, но Frame по прежнему заблокирован, а значит и его содержимое также не обновится*/
        Frame.EndUpdate(); /*Теперь Frame обновится*/
}

Также, в связи со спецификой GlobalLock – ведется счетчик блоков. Т.е. сколько раз был вызван BeginUpdate(), то столько же нужно вызвать и EndUpdate(). А вот при ControlLock такой счетчик отсутствут, достаточно один раз вызвать EndUpdate().
Итого:
  • GlobalLock. Используйте для окна, размеры которого меняются или меняется непосредственно его содержимое
  • ControlLock. Используйте для конкретного Frame’а/FrameGroup’ы и т.д. внутри которого будут происходить изменения

2. Button + Image
Button – один из самых используемых элементов управления. Без него практически не существует ни одного окна. Поэтому этот элемент управления просто обязан иметь какие-то дополнительные возможности для дизайна.
В Terrasoft 3.4.x добавлена возможность установить Image для Button’а. Причем, чтобы добавить изображение нужно только указать ImageList и указать имена для изображения (Normal, Hot, Pressed и Disabled). Также, изображение можно позиционировать с разных сторон от текста. Индивидуально хочется еще добавить, что, в отличие от Terrasoft 3.3.x, Button может быть любого размера (с выключенным AutoSize). Также, размеры можно ограничить минимальными значениями. Форматы изображения: *.ico, *.bmp, *.jpg, *.png (в принципе все, которые можно добавить в ImageList)
Button

3. Label. Выравнивание текста
При дизайне карточки или окна, иногда нужно сделать некий косметический момент с помощью Label. Но в то же время при его использовании испытывались некоторые трудности: как выровнять текст внутри Label’а? Эта проблема была решена в версии 3.4.1.14+. К свойствам Label была добавлена возможность позиционирования текста
Label

4. Настройка шрифтов
Наверное, каждый разработчик сталкивается с задачей настройки шрифтов: сделать Label большим шрифтом, изменить цвет фона контрола и т.д. До этого момента изменить шрифт и цвет можно было только во время выполнения (например, на OnPrepare). Для решения этого вопроса, начиная с версии Terrasoft 3.4.1.14+, были добавлены свойства, позволяющие в TSAdmin настроить шрифты и цвета. Что же можем делать?:

  1. Можем изменять шрифт и цвет Caption’а:
  2. CaptionFont

  3. Можем изменить шрифт и цвет текста
  4. TextFont

  5. Можем изменять цвет фона
  6. backgroundColor

Но, кроме элементов управления есть контролы, которые используются для группировки (FrameSet, Frame и FrameGroup). Для них также есть возможность настройки шрифтов
LayoutFont

Вот, собственно, часть того, что нового для разработки UI в Terrasoft 3.4.x я хотел рассказать.
Приятной разработки!

P.S. Напомню, что и в каких версия появилось (появится):

  • механизм BeginUpdate/EndUpdate работает во всех версиях 3.4.х;
  • возможность добавления изображения к Button – 3.4.0.x;
  • возможность позиционирования текста в Label – 3.4.1.14+;
  • возможность настройки шрифтов – 3.4.1.14+

Нравится

Поделиться

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

Спасибо, полезная информация.

А если в сервисах использовать позиционирование и шрифты и запустить на бинарниках 3.4.0 - будет валиться или просто игнорировать?

Если запустить на бинарниках 3.4.0, то будет просто игнорироваться

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

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

В продолжение блога по функциональности режима разработчика (Режим разработчика: сохранение пароля к конфигурации) следующей итерацией появится возможность открывать сервисы окон (скриптов окон) в администраторе во время работы клиентского приложения.

Пункты меню данной функциональности находятся в системном меню каждого окна:

Image
P.S. Данная функциональность доступна в версиях 3.4.0.90+ и 3.4.1.12+

P.P.S. Включение режима отладки см. блог Режим разработчика: сохранение пароля к конфигурации

Нравится

Поделиться

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

Артем, благодарю!

Очень хочется, чтобы подобный функционал был включен и в очередную сборку 3.3.2. Это возможно?

В 3.3.2 нет технической возможности для реализации данного функционала

Спасибо. Стало удобнее.

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

Добрый день.
Подскажите, где можно посмотреть список функций (actions) и их описание, которые можно выполнять с помощью метода ExecuteDesignerAction?
Например, в скрипте для открытия другого скрипта на определенной строке и позиции используется следующий код:

var ResultDataset = dlData.Dataset;
if (ResultDataset.IsEOF) {
        return;
}
var ServiceCode = ResultDataset.ValAsStr('Code');
var Line = ResultDataset.ValAsInt('LineNumber');
var Position = ResultDataset.ValAsInt('Position');;
var Designer = System.DesignService(ServiceCode);
if (Assigned(Designer)) {
        var Parameters = System.CreateObject('TSObjectLibrary.NamedValues');
        Parameters.Values('Line') = Line;
        Parameters.Values('Column') = Position;
        Designer.ExecuteDesignerAction('ScriptAction_SetCaretPos', Parameters);
}

Как видно, здесь вызывается метод ScriptAction_SetCaretPos. В SDK список этих методов я не нашел, кроме еще одного: ScriptAction_GetMethodNames.

Нравится

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

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

По поводу ExecuteDesignerAction. Это, в принципе, метод, который используется для внутренних целей.

Вот какие еще есть варианты (тут же видно с какими параметрами должны эти функции вызываться):

  ScriptAction_SetCaretPos = 'ScriptAction_SetCaretPos';
  SetCaretPosParam_Line = 'Line';
  SetCaretPosParam_Column = 'Column';
 
  ScriptAction_LocateMethodImplementation =
    'ScriptAction_LocateMethodImplementation';
  LocateMethodImplementation_MethodName = 'MethodName';
 
  ScriptAction_RenameMethod = 'ScriptAction_RenameMethod';
  RenameMethod_OldMethodName = 'OldMethodName';
  RenameMethod_NewMethodName = 'NewMethodName';
 
  ScriptAction_AddNewMethod = 'ScriptAction_AddNewMethod';
  AddNewMethod_MethodName = 'MethodName';
  AddNewMethod_MethodImplementation = 'MethodImplementation';
 
  ScriptAction_GetMethodNames = 'ScriptAction_GetMethodNames';  
  ScriptAction_GotoScriptPoint = 'ScriptAction_GotoScriptPoint';
Показать все комментарии

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

В таком случае можно в любом месте скрипта добавить код:

function Main() {
var wnd = Services.GetNewItemByUSI('wnd_**');
wnd.Prepare();
}

Вместо звездочек введите название своего окна.

illu

Затем запустите скрипт по F9. Это вызовет нужное окно на исполнение, и Вы сможете провести необходимо тестирование без запуска основной программы.

Примечание: вместо wnd.Prepare(); можно использовать wnd.Show();

Нравится

Поделиться

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

Думаю все знают, что для поиска в скриптах сервисов можно(нужно) использовать утилиту «Grep Search». Для его запуска, раньше нужно было в TSAdmin найти сервис wnd_GrepSearchScript, открыть его и запустить по кнопке F9 (Выполнить).
Теперь пользоваться Grep Search стало гораздо проще. Начиная с версии 3.3.2.153 в меню Инструменты (Tools) появился пункт «Grep search» и открыть поиск можно с помощью клавиатурного сочетания: Shift+Alt+S

Нравится

Поделиться

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

Отлично!

В версии 3.2 нет такой возможности.

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