Добрый час суток! Имеется деталь,в таблице есть 1 запись при загрузке детали - все ок отображается. Когда добавляется новая запись в таблицу,нужно,чтобы это (вторая) запись тоже появилась(первая остается). Подскажите как это можно сделать? пока привязался к 

    this.getView().fireEvent("startrefresh", this); Но работает оно не совсем так,как нужно(не затрагивается все методы,при просто заходе на детали и много чего теряется). Переопределять все это дело довольно таки долго. Подскажите пожалуйста,какая альтернатива этому? Деталь своя. Пока пробую искать подобный функционал на стандартной детали,но пока не нахожу события,которое необходимо.(динамически добавлять запись ). Спасибо!

Нравится

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

me.fireAction('refresh', [me], 'doRefresh'); вот это тоже не совсем помогло... оно добавило новую запись(которая появилась в базе),но предыдущая информация введенная(на старой,самой первой записи) не подтягивается,генерируется просто новая такая запись по шаблону и добавляется та,которая добавилась в базу. они оба "чистые"(при том что в базе информация хранится).

Никита, здравствуйте!

А чем Вам не нравится свайп вниз? Я правильно понял, что Вы хотите автообновление детали при добавлении новой записи?

Вильшанский Дмитрий пишет:

Никита, здравствуйте!

А чем Вам не нравится свайп вниз? Я правильно понял, что Вы хотите автообновление детали при добавлении новой записи?

 Добрый! Дело в том,что мне нужно чтобы при нажатии на клавишу добавлялась запись в бд,и сразу же появлялась на странице,добавлять то она добавляется но свайпить вниз не хочется,я попробовал "взять" функционал оттуда,но он не емулируется.. А вообще да,автообновление детали при добавлении новой записи. Деталь кодом добавлял свою,не стандартная(+GridPage+ PreviewPage так же

)

Вильшанский Дмитрий,А есть другая альтернатива ?

Никита Гальченко,

В базовой версии уже реализовано обновление записи при базовых действиях (например, сохранение или удаление).

Для примера можете посмотреть как реализовано при сохранении (нужный "кусок" кода выделил): 

 

completeDataSaving: function(operation) {

   this.callParent(arguments);

   var pageHistoryItem = this.getPageHistoryItem();

   var pageConfig = pageHistoryItem.getRawConfig();

   var record = this.record;

   var operationConfig = this.createPageOperationConfig(operation);

   var useOptimisticEditing = this.useOptimisticEditing();

   if (useOptimisticEditing) {

      Terrasoft.PageNavigator.refreshPreviousPages(operationConfig, pageHistoryItem);

   } else {

      Terrasoft.PageNavigator.markPreviousPagesAsDirty(operationConfig);

   }


   var shouldOpenPreviewPageOnSave = this.shouldOpenPreviewPageOnSave();

   if (shouldOpenPreviewPageOnSave) {

      Terrasoft.util.openPreviewPage(this.self.Model, {recordId: record.getId(), isStartRecord: true,

         direction: "right", operationConfig: operationConfig});

   } else {

      Terrasoft.Router.back();

   }

   if (pageConfig) {

      Ext.callback(pageConfig.onDataSaved, this, [record]);

   }

},

Вильшанский Дмитрий,

Спасибо большое! Буду разбираться!

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

Не могу нигде найти, каким образом возможно получить top N в запросе на JavaScript.

Везде только примеры на С#.

Нравится

2 комментария
sales
mobile
ESQ
клиентский ESQ
SDK_Mobile
7.12

Добрый день,подскажите пожалуйста,а в мобильном приложении есть функция автозаполнения поля ? Если да,то как это можно организовать ? Чтобы при создании новой записи в разделе,поле автоматически заполнялось значением,что то вроде счетчика записей. Например у меня в разделе есть 10 записей - запись 1,запись 2,запись 3 ... 10. При создании новой чтобы поле Название сразу заполнялось как запись 11. Подскажите примерный ход действий(на данный момент беру запросом с базы,сортируя и беру следующее число,но такой подход не очень хороший). Может быть есть более правильный вариант ? Спасибо!

Нравится

4 комментария
Лучший ответ

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

Что касается автоматической установки значений, то есть несколько вариантов. Можно сделать, например, на уровне событий объекта мобильного приложения:

Terrasoft.sdk.Model.setModelEventHandler("ActivitySKU", 
    Terrasoft.ModelEvents[Terrasoft.ModelEventKinds.Before].update,
    function(config) {
        var record = config.scope.eventConfig.records[0];
        record.set("UsrIsChecked", true);
        Ext.callback(config.success, config.scope);
});

Или с помощью Custom бизнес правила:

Terrasoft.sdk.Model.addBusinessRule("ModelName", {
    name: "RuleName",
    ruleType: Terrasoft.RuleTypes.Custom,
    events: [Terrasoft.BusinessRuleEvents.Load, Terrasoft.BusinessRuleEvents.ValueChanged],
    executeFn: function(record, rule, column, customData, callbackConfig) {
        record.set("UsrColumn", "some value");
        Ext.callback(callbackConfig.success, callbackConfig.scope);
    }
})

Третий вариант - в кастомной странице повесить на загруженную запись дополнительный обработчик на изменение записи:

onLoadRecord: function(loadedRecord) {
    this.callParent(arguments);
    loadedRecord.on("columnchanged", this.onRecordColumnChanged, this);
},

Но я ещё столкнулся проблемой, что при изменении значения в записи не обновляется значение в соотвествующем поле на странице, приходилось доставать контрол и вручную в нём дублировать значение.

var control = Ext.getCmp("control_id");
control.setValue("some value");

 

Такое есть смысл на стороне сервера. Есть специальное действие в БП для получения номера по порядку.

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

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

Что касается автоматической установки значений, то есть несколько вариантов. Можно сделать, например, на уровне событий объекта мобильного приложения:

Terrasoft.sdk.Model.setModelEventHandler("ActivitySKU", 
    Terrasoft.ModelEvents[Terrasoft.ModelEventKinds.Before].update,
    function(config) {
        var record = config.scope.eventConfig.records[0];
        record.set("UsrIsChecked", true);
        Ext.callback(config.success, config.scope);
});

Или с помощью Custom бизнес правила:

Terrasoft.sdk.Model.addBusinessRule("ModelName", {
    name: "RuleName",
    ruleType: Terrasoft.RuleTypes.Custom,
    events: [Terrasoft.BusinessRuleEvents.Load, Terrasoft.BusinessRuleEvents.ValueChanged],
    executeFn: function(record, rule, column, customData, callbackConfig) {
        record.set("UsrColumn", "some value");
        Ext.callback(callbackConfig.success, callbackConfig.scope);
    }
})

Третий вариант - в кастомной странице повесить на загруженную запись дополнительный обработчик на изменение записи:

onLoadRecord: function(loadedRecord) {
    this.callParent(arguments);
    loadedRecord.on("columnchanged", this.onRecordColumnChanged, this);
},

Но я ещё столкнулся проблемой, что при изменении значения в записи не обновляется значение в соотвествующем поле на странице, приходилось доставать контрол и вручную в нём дублировать значение.

var control = Ext.getCmp("control_id");
control.setValue("some value");

 

Спасибо!

 

Бершеда Д. Н. пишет:

Но я ещё столкнулся проблемой, что при изменении значения в записи не обновляется значение в соотвествующем поле на странице, приходилось доставать контрол и вручную в нём дублировать значение.

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

 

Данная проблема, скорее всего, решается передачей в метод .set третьего параметра true.

Показать все комментарии
функциональная роль
права доступа
7.12
sales

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



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

Нравится

6 комментариев
Лучший ответ

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

with tempRecursive(Id, Name, ParentRoleId, level) as (

    select Id, Name, ParentRoleId, 0 as level

    from SysAdminUnit

    where id = '5905BE45-DFF1-4756-AF7C-92C6182F4602'

    Union All

    Select SysAdminUnit.Id, SysAdminUnit.Name, SysAdminUnit.ParentRoleId, (level+1) as level

    from tempRecursive join SysAdminUnit on tempRecursive.ParentRoleId = SysAdminUnit.Id

)

select * from tempRecursive

order by level

Варианта два:

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

2. Проверить в БД таблицы SysAdminUnitInRole и SysUserInRole.

В 5.Х была C#-функция UserConnection.DBSecurityEngine.GetUserAdminUnitCollection. Возможно, и в 7.Х есть такая же. В качестве параметра — Id пользователя или без параметров для текущего.

Антон Малий пишет:

Таким образом он показывает только 1-е и прямое вхождение пользователя в роль. И никакие унаследованные роли так не видны.



Очевидно, нужно писать рекурсивный Select с разными проверками. Но я подозреваю, что уже такой функционал существует

Владимир Соколов,

К сожалению, готового скрипта нет. Можно воспользоваться функцией, предложенной Александром.

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

with tempRecursive(Id, Name, ParentRoleId, level) as (

    select Id, Name, ParentRoleId, 0 as level

    from SysAdminUnit

    where id = '5905BE45-DFF1-4756-AF7C-92C6182F4602'

    Union All

    Select SysAdminUnit.Id, SysAdminUnit.Name, SysAdminUnit.ParentRoleId, (level+1) as level

    from tempRecursive join SysAdminUnit on tempRecursive.ParentRoleId = SysAdminUnit.Id

)

select * from tempRecursive

order by level

Действительно, в итоге оказалось, что все права можно найти в SysAdminUnitInRole

Показать все комментарии
7.12
sales
метаданные
пакет
Custom

Всем привет!

Немного предыстории. По неопытности долгое время доработка системы производилась в облаке, на продуктивной среде. Соответственно все изменения попали в пакет Custom.

Сейчас стоит задача перенести все схемы и данные из объекта Custom в отдельный пакет, выгрузить его и дальше работать в отдельном пакете на локальной среде.

Погрузивший в структуру БД было выяснено, что принадлежность схемы к пакеты находится в БД, таблица SysSchema, поле SysPackageId, данные хранятся в соседней таблице SysPackageSchemaData. Был написан нехитрый sql скрипт, который переопределяет ссылку на на новый пакет. И вроде даже все работает, но вот беда, в метаданных схемы осталась ссылка на старый пакет, т.е. в БД уже новый, а в метаданных старый.

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

Просто вручную тыкать в каждый объект как-то не очень хочется (объектов больше 200)

Нравится

5 комментариев
Лучший ответ

Владимир Соколов пишет:

Может, просто переименовать Custom? И создать новый Custom

 + Помимо переименования необходимо будет почистить системную настройку "Идентификатор пользовательского пакета" [CustomPackageUId], т.к. именно эта настройка отвечает за указание системного пакета.

Также хорошо бы было вычистить после этого зависимости этого пакета, т.к. по умолчанию "Custom" собирает в себе зависимости от всех пакетов.

Может, просто переименовать Custom? И создать новый Custom

Владимир Соколов пишет:

Может, просто переименовать Custom? И создать новый Custom

 + Помимо переименования необходимо будет почистить системную настройку "Идентификатор пользовательского пакета" [CustomPackageUId], т.к. именно эта настройка отвечает за указание системного пакета.

Также хорошо бы было вычистить после этого зависимости этого пакета, т.к. по умолчанию "Custom" собирает в себе зависимости от всех пакетов.

И на продуктовой среде, наверное, нужно установить CurrentPackageId на новый кастомный пакет, чтобы настройки пользователей туда попадали?

Клиент столкнулся с такой же ситуацией, начав разработку в Custom. Но переименование не помогает - при переносе пакета на production получаем ошибку, что такой Uid уже существует

Может, там действительно существует с таким же UId? Без подробностей сложно подсказать, где искать.

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

При потыке вернуть изменения назад:

Ошибка

При работе с хранилищем произошла ошибка

Failed to run the WC DB work queue associated with '\icl_package', work item 162 (file-install Resources/ICLCars1Section.ClientUnit/resource.ru-RU.xml 1 0 1 1)

SvnErrorCode: SVN_ERR_WC_BAD_ADM_LOG

RootCause: ������� �� ������� ����� ��������� ����.

 

При попытке ее удалить:

При работе с хранилищем произошла ошибка

Previous operation has not finished; run 'cleanup' if it was interrupted

SvnErrorCode: SVN_ERR_WC_CLEANUP_REQUIRED

 

При сохранении схемы:

Ошибка

Ошибка сохранения: При работе с хранилищем произошла ошибка

 

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

Как вариант пока работаю через файловую систему.. но ошибка не ушла.

Нравится

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

Тут обсуждают причины такого же поведения SVN и дают советы:

Thanks to this reference for a solution that worked on Mac with svn installed via brew.

cd {work-dir-base}
sqlite3 .svn/wc.db "delete from work_queue"

Here is another blog entry dealing with this issue.

Found a solution. That is to delete the folder through svn on the windows box that contained the badly named file. This must tell svn to not bother updating that folder if it sees a local delete that has not yet been committed. If you do this be sure to back up your files first so you can recreate the folder and add all the files again (named properly of course).

I have also faced a similar problem:

I have deleted a local folder (for which svn files were checked out). After this none of the svn commands were working fine, even from cmd prompt(admin), also svn cleanup was not working.

Fix:

  1. I have created a dummy file, for which the error 'svn: E155009: Failed to run the WC DB work queue associated with' is coming.
  2. Then I have run svn cleanup in cmd line, found the same error in that a file couldn't be read
  3. Repeated the above steps for the file not found in step2.
  4. svn cleanup, it works!

и ещё ряд других возможных причин и способов решения.

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

Всем доброго времени суток. Версия 7.12.

Есть ли возможность как-то отключить возможность выбора процессов по кнопке "Другой процесс", или хотя бы ограничить доступ к процессам, которые возможно запустить через панель быстрого запуска?

Изображение удалено.

Или только через переопределение модуля LeftPanelTopMenuModule и соответствующие правки в loadMenu?

Нравится

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

Добрый день, Денис!



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

 

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

Добрый день! Подскажите, пожалуйста, а имеется ли возможность с помощью командой строки искать по другим разделам, а не по разделу «Контакты»/«Контрагенты»? Как в этот выпадающий список добавить новый раздел?

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

Нравится

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

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

В базовой версии продукта доступен функционал глобального поиска по всей системе. 

Более детально Вы можете ознакомиться с статье Академии: https://academy.terrasoft.ru/documents/studio/7-12/globalnyy-poisk

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

Если же сайт находится на Ваших серверах, в статье есть инструкция по настройке.

День добрый! Сайт развернут на серверах и глобальный поиск уже работает. Вопрос в том как поднастроить его таким образом чтобы добавить поиск еще по одному разделу: Сейчас поиск идет по Контактам и Контрагентам. Мне необходимо чтобы появилась еще строка "Найти Вакансию Тест"

Подозреваю, что это не глобальный поиск, а обычный. Выдача выглядит как тут?

Александр, выдача выдана просто списком с фильтром в выбранном разделе. 

Значит, глобальный не включен.

А без глобального поиска такое возможно реализовать? Просто как таковой глобальный поиск не нужен. Нужен быстрый доступ к поиску по разделу.

Как настраивать командную строку, описано здесь.

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

В таком случае воспользуйтесь советом выше и включите глобальный поиск. Или же доработайте старый механизм для поддержки нового раздела. Логика реализована в схеме CommandLineModule, см. там упоминания Contact и Account.

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

Всем доброго времени суток. Версия 7.12.

Есть бизнес-процесс, запускающийся вручную. Необходимо в процессе отловить пользователя, запустившего процесс. Подходит ли для этого переменная "Контакт текущего пользователя"/"Текущий пользователь"?

Второй случай. Бизнес-процесс запускается по сигналу от объекта (изменение какой-либо колонки). Можно ли в процессе отловить пользователя, изменившего колонку в объекте, т.е. запустившего процесс?

В более общем смысле вопрос - что есть "Контакт текущего пользователя" в бизнес-процессах? Если у нас показывается "Контакту текущего пользователя" страница редактирования какого-либо объекта, и одновременно в системе сидит несколько пользователей - она будет показана всем?

Нравится

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

1) Да

2) Тут надо тестить, но я думаю нет (если, конечно, при запуске события не прокидывается UserConnection пользователя)

В общих чертах: есть UserConnection. Подключение пользователя, которое инициируется в момент вашего логина в СРМ. Соответственно "Контакт текущего пользователя" — контакт из UserConnection.

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

А все сервисы/бп по расписанию инициируются под userconnection от Supervisor-а.

2) Если в объекте в записи менялась колонка и по изменению запустился процесс, то сразу после запуска в поле ModifiedById этой записи и будет тот, кто поменял.

Варфоломеев Данила пишет:

А все сервисы/бп по расписанию инициируются под userconnection от Supervisor-а

а как определяется пользователь Supervisor, если он в системе не активный? 

Владимир Соколов пишет:

если он в системе не активный?

 AppConnection.SystemUserConnection всегда можно вытащить

Да и да. Пользователь, изменивший объект является инициатором триггерного процесса

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

Всем доброго времени суток.

Вопрос, наверно, простой - где определяется функция recalculateServiceTerms, в какой схеме?

Версия 7.12.

Нашёл несколько мест, где вызывается, нужно найти определение.

Нравится

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

Если есть доступ в базу, поискать можно запросом:

SELECT (SELECT [Name] FROM [SysSchema] WHERE [Id] = [SysSchemaId])
FROM [SysSchemaContent]
WHERE CAST([Content] AS VARCHAR(MAX)) LIKE '%recalculateServiceTerms%'

И среди трёх результатов будет искомая схема CaseServiceUtility:

/**
 * Recalculates scheduled dates by service item.
 * @protected
 */
recalculateServiceTerms: function() {
	var config = this.getIsFeatureEnabled("ServiceTerms")
			? this.getCaseTermCalculatorServiceConfig()
			: this.getCallTermCalculationServiceConfig();
	if (config) {
		if (this.getIsFeatureEnabled("ServiceTerms")){
			this.callService(config, this.onRecalculateCaseTerms, this);
		} else {
			this.callService(config, this.onRecalculateServiceTerms, this);
		}
	} else if (this.get("ResponseDate")) {
		this.set("ResponseDate", null);
		this.set("SolutionDate", null);
	}
},

 

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