Добрый день!

При сохранении импортированного процесса пугает таким

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

как убрать?

Нравится

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

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

Это стандартное сообщение предупреждение.

Вероятнее всего, убрать его совсем нельзя.

В данном случае прийдется сделать выбор))))

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

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

Подробнее о версионности процессов тут.

Алла Савельева,

Зверев Александр,

может быть, есть возможность в БД какое нибудь поле подправить?

Можно найти то место, где показывается это сообщение, и переделать логику. Но, если после этого загрузите процесс и что-то сломается, система Вас честно предупреждала.devil

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

На карточке Лида есть деталь Продуктов. Сделал эту деталь (деталью с редактируемым реестром). Добавил еще несколько полей своих.

После добавлении записи, при клику на эту запись в гриде появляется ошибка рис. 1:

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

После того как я закрываю страницу и открываю все работает отлично. Подозреваю что нужно после добавления сделать this.reloadGridData(); Но точно не знаю в каком ивенте. Подскажите пожалуйста.

Нравится

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

В предыдущей теме было описано решение для детали с множ. выбором + ред. реестром. Тут как минимум не вижу добавление LookupMultiAddMixin. Поэтому методы и не отрабатывают...

Вам не помогло то, что я ответил в своем топике? - https://community.terrasoft.ru/questions/detal-s-mnozestvennym-vyborom-0

 

 Alex Zaslavsky, Проблема в том что эти события не срабатывают рис.1



 

 

В предыдущей теме было описано решение для детали с множ. выбором + ред. реестром. Тут как минимум не вижу добавление LookupMultiAddMixin. Поэтому методы и не отрабатывают...

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

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

Можно ли как-нибудь по id раздела (записи SysModule) получить список всех входящих в него колонок с типами и названиями? Возможно, есть какой-то объект, где они хранятся?

Нашёл что-то такое: SysPackageSchemaDataColumn но не похоже, что это оно.

Нравится

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

я так понимаю хранятся в SysSchema, колонка MetaData.

скрипт глянуть из базы:

select cast(MetaData as varchar(max)) from SysSchema where caption='Account' 
order by createdOn desc

На JS колонки вытягиваюся через this.entitySchema.columns (ну или require объекта).

На С# можно перебрать колонки

var manager = UserConnection.EntitySchemaManager.GetInstanceByName("Account");
foreach (var column in manager.Columns) {
    if (column.IsValueCloneable) {
 
    }
    var fixedColumnName = column.IsLookupType ? column.Name+"Id" : column.Name;
    var uid = column.UId;
    var columnName = column.Name;
    var columnCaption = column.Caption;
}

Ну и как всегда, без сюрпризов не обошлось. Лукап колонки идут без Id-окончания. 

Не факт, что так подтянутся унаследованные из родительских объектов колонки. Можно вытянуть из системных таблиц базы, как тут:

SELECT  t.name AS [Table Name], c.name AS [Column Name], value AS [Extended Property]
FROM sys.extended_properties AS ep
INNER JOIN sys.tables AS t ON ep.major_id = t.object_id 
INNER JOIN sys.columns AS c ON ep.major_id = c.object_id AND ep.minor_id = c.column_id
WHERE class = 1 and t.name = 'ContactAddress'
AND CAST(value AS VARCHAR) LIKE 'ru-RU|%'

 

Александр, интересный пример. А есть ли аналог для JS?


 
addAllColumns: function(esq) {
	Terrasoft.each(this.columns, function(column, columnName) {
		if (column.type === Terrasoft.ViewModelColumnType.ENTITY_COLUMN) {
			if (!esq.columns.contains(columnName)) {
				esq.addColumn(columnName);
			}
		}
	}, esq);
},	

 

Нет, через JS такое невозможно. Это даже не таблицы базы bpm'online, а служебные таблицы на том же сервере БД.

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

Добрый день,подскажите пожалуйста,а в мобильном приложении есть функция автозаполнения поля ? Если да,то как это можно организовать ? Чтобы при создании новой записи в разделе,поле автоматически заполнялось значением,что то вроде счетчика записей. Например у меня в разделе есть 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.

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

Добрый день!

нужно реализовать кейс.

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

Может кто-то уже реализовывал такой кейс, подскажите как его можно сделать

 

Нравится

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

1) Сделать мальнький бп на открытие страницы редактирования. 

2) В основном - считывать записи из детали и на каждого пользователя в записи запускать бп из п.1. при помощи AppScheduler

1) Сделать мальнький бп на открытие страницы редактирования. 

2) В основном - считывать записи из детали и на каждого пользователя в записи запускать бп из п.1. при помощи AppScheduler

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

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



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

Нравится

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

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

Всем привет!

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

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

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

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

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

Нравится

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Ошибка

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

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!

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

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

Как добавить печатные формы пользователям портал?

В печатные формы добавил, установил галки "для раздела", "для карточки", но "Печать" со списком доступных печатных форм не появилfсь.

Нравится

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

Добрый день, Евгений!



На данный момент функционал печатных форм не доступен для пользователей портала.

Данная задача уже зарегистрирована у разработчиков, но к сожалению, срок ее реализации точно не известен.

Анна Журавель,

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

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

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

Коллеги, добрый день!

Нам нужно запустить интеграцию с одним сайтом, но api там нет, поэтому мы парсим страницу и забираем нужные данные. Парсер реализован как конфигурационный сервис на C#.

Чтобы нас сразу не забанили, у нас задача делать авторизацию только по факту появления ошибки что пользователь не авторизован.

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

Каким образом это можно реализовать в системе?

Заранее спасибо!)

Нравится

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

Добрый день.

Классических варианта 2:

1. Хранение на уровне приложения. Статическая переменная в вашем классе или другом отдельном классе по работе с Cookie (например можно завести класс CookieManager), в которой будет храниться получаемый вами CookieContainer.

2. Хранение на уровне Redis. В общем-то Redis позволяет хранить данные любого типа по принципу "ключ-значение". 

Добрый день.

Классических варианта 2:

1. Хранение на уровне приложения. Статическая переменная в вашем классе или другом отдельном классе по работе с Cookie (например можно завести класс CookieManager), в которой будет храниться получаемый вами CookieContainer.

2. Хранение на уровне Redis. В общем-то Redis позволяет хранить данные любого типа по принципу "ключ-значение". 

Толмачев Дмитрий Юрьевич,

Дмитрий, спасибо! будем пробовать).

 

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