Доброго времени суток. Возникла необходимость в настройке глобального поиска версии 2.0. Выполнил все действия по инструкции https://academy.terrasoft.ru/documents/administration/7-16/nastroyka-se…

В ходе настройки ошибок не возникло, но поиск не работает. Решил запустить переиндексацию сайта PUT запросом вида:

http://[GS-WEB-API]:81/indexation/{siteName}/reindex/full

и получил ошибку:

{"code":500,"status":"error","message":"System.ArgumentException: Format of the initialization string does not conform to specification starting at index 66.\n  

at System.Data.Common.DbConnectionOptions.GetKeyValuePair(String connectionString, Int32 currentPosition, StringBuilder buffer, Boolean useOdbcRules, String& keyname, String& keyvalue)\n  

at System.Data.Common.DbConnectionOptions.ParseInternal(Dictionary`2 parsetable, String connectionString, Boolean buildChain, Dictionary`2 synonyms, Boolean firstKey)\n  

at System.Data.Common.DbConnectionOptions..ctor(String connectionString, Dictionary`2 synonyms)\n  

at System.Data.SqlClient.SqlConnectionString..ctor(String connectionString)\n  

at System.Data.SqlClient.SqlConnectionFactory.CreateConnectionOptions(String connectionString, DbConnectionOptions previous)\n  

at System.Data.ProviderBase.DbConnectionFactory.GetConnectionPoolGroup(DbConnectionPoolKey key, DbConnectionPoolGroupOptions poolOptions, DbConnectionOptions& userConnectionOptions)\n  

at System.Data.SqlClient.SqlConnection.ConnectionString_Set(DbConnectionPoolKey key)\n  

at System.Data.SqlClient.SqlConnection.set_ConnectionString(String value)\n  

at ServiceStack.OrmLite.SqlServer.SqlServerOrmLiteDialectProvider.CreateConnection(String connectionString, Dictionary`2 options)\n  

at ServiceStack.OrmLite.OrmLiteConnection.get_DbConnection()\n  

at ServiceStack.OrmLite.OrmLiteConnection.Open()\n  

at ServiceStack.OrmLite.OrmLiteConnectionFactory.OpenDbConnection()\n  

at GlobalSearch.WebApp.HealthCheck.BaseChecker.GetFeatures(List`1 featuresCodes, String dbConnectionString, String dbType) in /src/Src/GlobalSearch.WebApp/HealthCheck/BaseChecker.cs:line 89\n  

at GlobalSearch.WebApp.HealthCheck.FeaturesChecker.Check(Site site) in /src/Src/GlobalSearch.WebApp/HealthCheck/FeaturesChecker.cs:line 24\n  

at GlobalSearch.WebApp.HealthCheck.SiteHealthChecker.CheckSite(Site site, ICollection`1 checkList) in /src/Src/GlobalSearch.WebApp/HealthCheck/SiteHealthChecker.cs:line 53\n  

at GlobalSearch.WebApp.ServiceModel.Requests.Handlers.SearchManagement.GetSearchStateRequestHandler.GetCheckResult(GetSearchStateRequest request) in /src/Src/GlobalSearch.WebApp/ServiceModel/Requests.Handlers/SearchManagement/GetSearchStateRequestHandler.cs:line 34\n  

at GlobalSearch.WebApp.ServiceModel.Requests.Handlers.SearchManagement.GetSearchStateRequestHandler.InternalHandle(GetSearchStateRequest request) in /src/Src/GlobalSearch.WebApp/ServiceModel/Requests.Handlers/SearchManagement/GetSearchStateRequestHandler.cs:line 46\n  

at GlobalSearch.WebApp.ServiceModel.Requests.Handlers.BaseRequestHandler`1.Handle(TRequest request) in /src/Src/GlobalSearch.WebApp/ServiceModel/Requests.Handlers/BaseRequestHandler.cs:line 38"}

 

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

 

Нравится

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

Кирилл, похоже, ошибка происходит при попытке работать с базой, причём, не сайта 7.Х, а сайта глобального поиска. Проверьте правильность databaseConnectionString, который посылают через curl при регистрации сайта в глобальном поиске.

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

Спасибо за ответ. Есть подозрение, что проблема в том, что для подключения к БД в databaseConnectionString я прописал  учетку с указанием домена (т.е. domain\user)  и судя по всему знак "\" недопустим. Подскажите, пожалуйста, какой командой удалить сайт глобального поиска , чтобы передобавить его с корректными реквизитами ?

Кирилл, имеете в виду это?

Важно

Чтобы изменить шаблон поиска, выполните DELETE запрос на /sites/{siteName}/search и  действие AddSearch, описанное выше, после чего будет выполнена полная переиндексация сайта.

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

да, с api разобрался)  , спасибо

 

Kirill Polushin,

Кирилл, здравствуйте. А у вас Глобальный поиск развернут в одной локальной сети с SQL севером creatio?

при выполнении команды: 

curl -v -X POST -d '{"templateName": "[TEMPLATE_NAME]"}' -H "Content-Type: application/json" http://[SERVER2_IP_ADDRESS]:81/sites/[SITE_NAME]/search
Я получаю ответ: "code":500,"status":"error","message":"System.Exception: Could not check index 'hi7z0wyxvi3leufyv8rlaa5aeokhyvharozf3hqlxn1zh8xzthuyawswuw0dcdmn' exists

Не понял с индексацией. Куда вводить PUT запрос? 

curl -v -X POST -d '{"templateName": "default.json"}' -H "Content-Type: application/json" http://[SERVER2_IP_ADDRESS]:81/sites/my-test-site/search  - это я понял, а вот DELETE запрос без примера и действие AddSearch не описано, что куда. Не подскажите по подробнее   

Максим, вводить PUT запрос необходимо на втором сервере в консоли. 

Пример DELETE запроса можно найти в документации curl:

curl -X DELETE http://localhost:8080/user/100 

После его выполнения необходимо также сделать http-запрос на подключение поиска.

Его пример в документации:

curl -v -X POST -d '{"templateName": "default.json"}' -H "Content-Type: application/json" http://[SERVER2_IP_ADDRESS]:81/sites/my-test-site/search

Рекомендую также ознакомится с более новой версией этой документации тут.

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

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

Вопрос не о том, как исправить эту ошибку. Интересно бы повторить логику элемента Визирование на основе базовых элементов чтения/записи.

Элемент визирования работает так:

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

Где посмотреть в коде механизм логики работы элемента визирования? Может быть логика у вас есть в виде какой-нибудь диаграммы? Может быть базовый элемент визирования кто-нибудь успешно дублировал сам?

Нравится

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

Там очень странная логика - надо указать роль или конкретного пользователя.   В элементе визирования тип Approver'а важен (хотя, данные в любом случае берутся из System Administration Object) и самого пользователя надо читать из Users (view)



Мы в итоге сделали так:

Там очень странная логика - надо указать роль или конкретного пользователя.   В элементе визирования тип Approver'а важен (хотя, данные в любом случае берутся из System Administration Object) и самого пользователя надо читать из Users (view)



Мы в итоге сделали так:

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

В публикации 2 РАЗДЕЛА ОТ ОДНОГО ОБЪЕКТА рассказано как вывести объекты другого раздела.

А мне бы хотелось в новом разделе выводить записи старого в Состояние="Завершено". Есть ли способ это сделать ? Например на раздел выводить содержимое не table БД, а собственного view ?  

Нравится

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

Добрый день.

Я так делала именно через view, то есть создаете нужное представление и его используете в качестве источника данных для раздела.

Из минусов:

1) раздел пришлось регистрировать вручную, так как используется представление, а не таблица

2) некоторые функции раздела пришлось отключить или изменить.

За пример можете взять ещё базовый раздел 'Библиотека процессов' ('Process library').

Добрый день.

Я так делала именно через view, то есть создаете нужное представление и его используете в качестве источника данных для раздела.

Из минусов:

1) раздел пришлось регистрировать вручную, так как используется представление, а не таблица

2) некоторые функции раздела пришлось отключить или изменить.

За пример можете взять ещё базовый раздел 'Библиотека процессов' ('Process library').

Для данной задачи достаточно быстрого фильтра, как мне кажется

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

Добрый день!

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

Контейнер под левую панель есть, даже отображаются кнопки действий при наведении на них, но самих разделов на панели нет.

В консоль при авторизации под новой ОР выкидывает: 

user: (Имя пользователя)/(ID Роли в БД) file: .../content/ModuleUtils.js

line: 32

column: 26

message: Uncaught TypeError: Cannot read property 'sectionModule' of undefined

в этом фрагменте кода: 

if (moduleStructure.sectionModule) {

         tag = moduleStructure.sectionModule + "/";

}

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

Нравится

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

Судя по тексту ошибки, у Вас при заходе под пользователем с этими правами не заполнилась структура Terrasoft.configuration.ModuleStructure. При нормальной работе там должен быть массив с информацией о разделах, это можно увидеть, введя название в консоли:

У Вас под этим пользователем что выдаёт?

Она, в свою очередь генерируется на серверной стороне в схеме ConfigurationSectionHelper.

Почему именно так с новой ролью, непонятно, ведь в серверном коде идёт считывание при помощи Select, не учитывающей права.

Проверьте, не поможет ли вызов действия «Актуализировать роли»?

 

Наконец, просто попробуйте очистить Redis, перезапустить сайт. Возможно, в ходе настроек ролей что-то неверно закешировалось.

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

Добрый день коллеги

 

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

 

К примеру если сотрудник зашёл в раздел контакты и сотрудник из региона "New York", то у него в раздел подтянуться только контакты у которых в поле Регион проставлен "New York"

 

Вот пример кода, нужна помощь с фильтром "RegionFilter"

filterGroup.add("ClientTypeFilter", this.Terrasoft.createColumnFilterWithParameter(

                        this.Terrasoft.ComparisonType.EQUAL, "ClientType", "15796DCC-EC99-4D1D-A270-37EC8CB26A07"));

                    filterGroup.add("RegionFilter", this.Terrasoft.createColumnFilterWithParameter(

                        this.Terrasoft.ComparisonType.EQUAL, "[Contact:Region]",

                        Terrasoft.core.enums.SysValue.CURRENT_USER_CONTACT.value));

Нравится

13 комментариев
Лучший ответ
esq.filters.add("RegionFilter", this.Terrasoft.createColumnFilterWithParameter(
       this.Terrasoft.ComparisonType.EQUAL, "Region.[Contact:Region].Id",
        Terrasoft.core.enums.SysValue.CURRENT_USER_CONTACT.value));

 

esq.filters.add("RegionFilter", this.Terrasoft.createColumnFilterWithParameter(
       this.Terrasoft.ComparisonType.EQUAL, "Region.[Contact:Region].Id",
        Terrasoft.core.enums.SysValue.CURRENT_USER_CONTACT.value));

 

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

 

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

Зверев Александр, тут доработок было много до нас пока не будем рисковать. Но согласен, в идеале будет корректнее делать так

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

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

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

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

Да, действительно, Александр, Вы недавно писали.

 

Уточнил у разработчиков ядра по результатам, проблема не подтвердилась, актуализация не затирает права, а вставляет новые, не трогая те, которые раздавались вручную либо через БП. Там дело немного в другом, то, что в системе все ещё есть запрещающие права, и при актуализации могут раздаваться разрешающие, и в итоге получается 2 противоречащих права. С этим вопросом пока не разбирались.

 

То есть, если не используете запрещающие права, должно работать корректно.

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

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

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

Добрый день, Александр!



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



Вы верно заметили, что при актуализации прав доступа все изменения прав бизнес процессом затираются.



По сути актуализация прав удаляет и заново добавляет права доступа согласно настроек. 



Однако, бизнес процессом изменяются только права доступа по записям. 

Вы можете учесть этот момент в вашем кейсе. 



Права но операциям и на колонки, бизнес процессом не изменяются, на текущий момент. 



На текущий момент права доступа хранятся в таких таблицах:

Доступ по операциям

SysEntitySchemaOperationRight



Доступ по записям

Настройки прав хранятся в таблице: SysEntitySchemaRecordDefRight

Права хранятся в таблице: Sys[Объект]Right

Происхождение прав хранится в таблице: SysEntitySchemaRecRightSource



Доступ по колонкам

Настройки прав хранятся в таблице: SysEntitySchemaColumnRight

Уровень прав хранится в таблице: SysEntitySchemaColRightLevel



Я создам задачу на отдел разработки, по описанному кейсу для рассмотрения её решения в будущих версиях приложения.

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

как видно из ответа "Вы верно заметили, что при актуализации прав доступа все изменения прав бизнес процессом затираются." все же затираются

Уточнял, нет, не подтвердилось.

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

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

"

Все что она делает, удаляет права которые выданы дефолтной раздачей (права выданые вручную или БП отсекаются по источнику) 

" - можно подробнее, так как не совсем понял Вас?

У записи в таблице прав есть справочное поле SourceId, оно ссылается на справочник SysEntitySchemaRecRightSource со значениями: Owner, Author, Manual, Default.

 

Возможно, ранее в БП раздали не с тем значением, вот их и удалило заодно.

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

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

 

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

Если забирать права на объект Очереди, то в Едином Окне у операторов ничего не отображается.

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

Если не настраивать права на объект очереди, то у операторов работает всё корректно, НО они получают доступ так же к Настройкам очередей.

И бывает такое, что иногда случайно на автомате выбирают Завершить, думая, что завершают работу с Обращением, а завершают саму Очередь.

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

 

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

Нравится

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

Доброго времени суток, Коллеги!

 

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

 

Например, если настроить права доступа так (см. вложение). Пользователь сможет видеть очередь, но не сможет с ними что-то сделать.

 

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

Гриценко Игорь,

Здравствуйте, Игорь,

 

К сожалению, если забираю права на Изменение к объекту Очередь, то операторы в Едином Окне не могут взять запись в работу, выходит ошибка будто процесса не существует.

 

Версия 7.13

Тимур, здравствуйте! 

 

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

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

 

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

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

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

 

Для бизнес-процесса создал служебный справочник с настройками.

В ходе бизнес процесса читается данный справочник и если записей, соответствующих параметрам нет, то добавляется новая строка процессом. Если запись есть, то в одном из полей добавляется порядковый номер +1.

Процесс валится у пользователей в связи с тем, что у них нет прав доступа на операцию CanManageLookups.

Как можно продолжить процесс с изменением/добавлением значений только в этом справочнике, не раздавая при этом доступ к CanManageLookups?

Нравится

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

Добрый день.

 

Проверка по правам доступа на операцию CanManageLookups выполняется для всех объектов, которые унаследованы от BaseLookup (Базовый справочник).

 

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

В этом случае не забудьте добавить поля Name и Description, которые есть в базовом справочнике, но нет в базовом объекте.

 

Внесение таких изменений лучше выполнять на тестовой версии.

Алла, зачем менять родителя, просто во встроенном БП справочника перезатереть пустой функцию проверки CheckCanManageLookups.

public override void CheckCanManageLookups() {
}

Так сделано у ряда коробочных справочников, например, у Department.

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

Да, согласна. В данном случае твое решение является оптимальным.

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

Александр, спасибо за ответ. Буду пробовать в это направлении.

 

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

Алла, ваш вариант тоже подходит, так как использование справочника было лишь номинальным и для удобства администрирования - поля Name и Desc мне не нужны, так как используются поля других справочников: Account + 2 поля Int.

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

Доброго дня.

 

Помогите, пожалуйста разобраться, пытаюсь вывести на портал раздел коробочный раздел "Сотрудники". Получаю уведомление:

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

Раньше такого сообщения никогда не получал.

Раздел в рабочее место не добавляется, на портале его нет. В мастере раздела вкладки "Портал" тоже нет.

Также как и нет в списке разделов для выбора в настройке рабочего места раздела "Сотрудник портала"

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

Нравится

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

Константин, я начал смотреть в коде, почему так.

 

Логика этой проверки и показа сообщения в SysModuleInWorkplaceDetailV2 в функции:

 

/**
* Processed receiving general and portal sections from service.
* @overridden
* @param {Object} result General and portal sections.
* @param {Object} selectedRows Selected rows in section lookup page.
*/
processedGeneralAndSspSections: function(result, selectedRows) {
                var generalAndSspSections = result.GetGeneralAndSspSectionsResult;
                if (generalAndSspSections) {
                                var sectionId = selectedRows.getByIndex(0).value;
                                if (generalAndSspSections.length === 2) {
                                                var isSelectedSectionSSP = Ext.Array.findBy(generalAndSspSections, function(item) {
                                                                var selectedSection = JSON.parse(item);
                                                                var sectionTypes = this.$SectionTypes || {};
                                                                return selectedSection.Id === sectionId && selectedSection.Type === sectionTypes.SSP;
                                                }, this);
                                                if (isSelectedSectionSSP) {
                                                                this._addSectionsToWorkplace(selectedRows);
                                                } else {
                                                                this.showInformationDialog(
                                                                                this.get("Resources.Strings.SelectedSectionAlreadyRegisteredAsSSP"));
                                                }
                                } else {
                                                this.openSectionWindow(sectionId, "SspMainSettings", null,
                "/AddSsp/" + this.get("MasterRecordId"));
                                }
                }
},

 

Тут в GetGeneralAndSspSectionsResult — результат запроса к /0/rest/SectionService/GetGeneralAndSspSections, на вход подают Id EBF36756-7854-4169-B2CC-8BC0EA25F391 этого раздела в SysModule, на выходе получаем две строки:

{
   "GetGeneralAndSspSectionsResult":[
      "{\r\n  \"Id\": \"ebf36756-7854-4169-b2cc-8bc0ea25f391\",\r\n  \"Type\": 0,\r\n  \"Caption\": \"Employees\",\r\n  \"SysModuleEntityId\": \"adfb879a-7065-4416-9379-3a0d63295dba\",\r\n  \"Code\": \"Employee\",\r\n  \"SchemaName\": \"EmployeeSection\",\r\n  \"EntityUId\": \"fb1c2bed-91d4-4b06-a28c-621a3d187008\",\r\n  \"TypeColumnName\": \"\",\r\n  \"SysModuleVisaEntityUId\": \"00000000-0000-0000-0000-000000000000\"\r\n}",
      "{\r\n  \"Id\": \"b3c1469a-26b2-4b76-a4c6-f6f0056c9972\",\r\n  \"Type\": 0,\r\n  \"Caption\": \"HR\",\r\n  \"SysModuleEntityId\": \"adfb879a-7065-4416-9379-3a0d63295dba\",\r\n  \"Code\": \"HR\",\r\n  \"SchemaName\": null,\r\n  \"EntityUId\": \"fb1c2bed-91d4-4b06-a28c-621a3d187008\",\r\n  \"TypeColumnName\": \"\",\r\n  \"SysModuleVisaEntityUId\": \"00000000-0000-0000-0000-000000000000\"\r\n}"
   ]
}

Вместе с искомым разделом Employees получаем какой-то раздел HR, которого я в интерфейсе нигде не вижу и нет в лукапе выбора раздела для добавления.

Проверка идёт по той верхней ветке, где 2 результата, не находит из них ни одного портального и выдаёт ответ, что добавить нельзя, поскольку уже зарегистрирован.

 

Если добавлять обычный раздел (например, «Продукты»), то либо в результате будет 1 строка и пойдёт по нижней ветке добавления портального раздела для этого раздела, либо в результате запроса к GetGeneralAndSspSections будет 2 записи по одному и тому же разделу, обычная и портальная, и если пользователь в лукапе выбрал портальную, она успешно добавится.

 

А так, из-за раздела HR логика отрабатывает не так, как ожидалось.

 

Судя по дате создания записи в 2013 году, он мог остаться от старых версий и не использоваться. Но это не точно.

 

Удалил в таблице SysModule запись с Caption, равным «HR»,  после чего портальный раздел сотрудников создался. После выбора раздела в мастере заполнил свойства и поля в портальной карточке, сохранил и он появился:

Добрый день! Тоже столкнулись с данной проблемой. Подскажите  прямой URL-адрес страницы пока разработчики не исправили данный Баг.

Максим, какую страницу Вы имели в виду? Я предложил удалить запись из SysModule.

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

В статье простейшее модальное окно разъяснено как создать и использовать окно в схеме страницы. У меня такой вопрос. Возврат результата из модального окна выполнен в subscribeSandboxEvents страницы ContactPageV2. При обработке в методе подписки не доступны атрибуты страницы привязанные к контенту на странице. Какой есть способ присвоить значение по закрытию окна в поле на странице?

Нравится

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

Есть ли возможность в диалоговом окне применить свои методы? В моих методах сложная логика заполнения полей асинхронно вызванным апи.

А пример модального окна по ссылке выше присвоения arg.test какому нибудь контролу не содержит. У меня this.set... выдает ошибку 'this.Set is not a function' из метода subscribe.SanboxEvents

В качестве модального окна можно применять любое, но с ограничениями (например,нельзя открывать другие модальные окна, поэтому выбор из справочника реализован только в выпадающих списках). По поводу set, сложно сказать, не видя того, что Вы делали. Например, в WizardWarningModalBoxPage для этого создали атрибуты, прибиндили их к визуальным компонентам и меняли значения уже им:

 

"AdditionalInfo": {
	dataValueType: Terrasoft.DataValueType.TEXT,
	size: 500,
	value: ""
}
...
this.set("AdditionalInfo", moduleInfo.additionalInfo);
...
"items": [
			{
		"name": "AdditionalInfo",
		"itemType": Terrasoft.ViewItemType.LABEL,
		"caption": {
			"bindTo": "AdditionalInfo"
		},
		"isMultiline": true
	}
]

 

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

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

Не могу сравнить два значения времени в процессе.

Задача для примера, есть ещё другие похожие задачи с этой же темой.

В текстовый параметр бизнес-процесса подставляется текст "Доброе утро", "Добрый день" и т.д. в зависимости от текущего времени. Время проверяется в соответствии с созданным справочником (унаследованный от базового), где используются колонки [Название], [Время от] (тип время) и [Время до] (тип время). Наполнение:

Доброе утро | 07:00 | 11:30

Добрый день | 11:30 | 17:30

Добрый вечер | 17:30 | 22:00

 

Что я хочу сделать: процессом Читаем данные справочника, где [Текущее время] => [Время от] И [Текущее время] < [Время до], вычитать текстовое поле Название.

В чём моя проблема: в процессе, в элементе Чтение данных, в фильтре у полей с типом Время нет параметров < = или >. Есть только = или !=, Заполнено или Не заполнено. У полей Дата/Время всё нормально есть любой вид сравнения.

Вопрос-бонус: поле с типом Время могу сравнивать только с заранее записанным Параметром процесса, а динамически указать Текущее время не могу, как это с Дата/Время указывается Текущая дата и время.

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

Версия 7.13.0, Sales, Marketing, CustomerCenter Enterprise OnSite.

Нравится

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

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

 

Данную задачу можно решить через элемент "Задание-сценарий", в котором построить select или esq запрос с необходимыми Вам фильтрами. 

 

UserConnection userConnection = Get&lt;UserConnection&gt;("UserConnection");
var esq = new EntitySchemaQuery(UserConnection.EntitySchemaManager, "UsrTestLookUp");
esq.AddColumn("Name");
esq.AddColumn("UsrTimeOn");
esq.AddColumn("UsrTimeTo");
var esqTimeOnFilter = esq.CreateFilterWithParameters(FilterComparisonType.Less, "UsrTimeOn", DateTime.Now.TimeOfDay);
var esqTimeToFilter = esq.CreateFilterWithParameters(FilterComparisonType.Greater, "UsrTimeTo", DateTime.Now.TimeOfDay);
esq.Filters.Add(esqTimeOnFilter);
esq.Filters.Add(esqTimeToFilter);
EntityCollection entityCollection = esq.GetEntityCollection(UserConnection);
if (entityCollection.IsNotEmpty()) {
        foreach (var name in entityCollection) {
        	var param1 = name.GetTypedColumnValue&lt;string&gt;("Name");
        	Set ("ProcessSchemaParameter1", param1);
        }
    }
/* или через select 
var select =
    (Select)new Select(userConnection)
        .Column("Name").As("Text")
    .From("UsrTestLookUp").WithHints(Hints.NoLock)
    .Where("UsrTimeOn").IsLess(Column.Parameter(DateTime.Now.TimeOfDay))
    .And("UsrTimeTo").IsGreater(Column.Parameter(DateTime.Now.TimeOfDay));
 
string sql = select.GetSqlText();
Set ("ProcessSchemaParameter1", sql);
using (var dbExecutor = userConnection.EnsureDBConnection()) {
    using (IDataReader dataReader = select.ExecuteReader(dbExecutor)) {
        while (dataReader.Read()) {
            string Name = dataReader.GetColumnValue&lt;string&gt;("Text");
            Set ("ProcessSchemaParameter1", Name);
        }
    }
}*/
return true;

 

Заричный Антон,

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

 

Спасибо за предложенный вами вариант, он подошёл и отработал как и была поставлена задача.

Для тех, кто вдруг ещё ищет, итоговый вариант у меня получился следующим:

UserConnection userConnection = Get&lt;UserConnection&gt;("UserConnection");
var timenow = Get&lt;DateTime&gt;("CurrentTime"); // Параметр в процессе с типом Дата/Время
var esq = new EntitySchemaQuery(UserConnection.EntitySchemaManager, "TsiCCCustomerGreetingOnDaytime"); // Название справочника
esq.AddColumn("Name"); // Колонка "Название" в справочнике (где написано Добрый день/утро/вечер и т.п.)
esq.AddColumn("TsiCCCustomerGreetingTimeFrom"); // Колонка справочника Время от
esq.AddColumn("TsiCCCustomerGreetingTimeTo"); // Колонка справочника Время до
 
var esqTimeOnFilter = esq.CreateFilterWithParameters(FilterComparisonType.Less, "TsiCCCustomerGreetingTimeFrom", timenow); // Колонка справочника Время от.
var esqTimeToFilter = esq.CreateFilterWithParameters(FilterComparisonType.Greater, "TsiCCCustomerGreetingTimeTo", timenow); // Колонка справочника Время до
// В одном из двух фильтров желательно указать равенство, чтобы не было ошибок, т.е. LessOrEqual или GreaterOrEqual соответственно, в зависимости от ваших потребностей
 
esq.Filters.Add(esqTimeOnFilter);
esq.Filters.Add(esqTimeToFilter);
EntityCollection entityCollection = esq.GetEntityCollection(UserConnection);
if (entityCollection.IsNotEmpty()) {
	foreach (var name in entityCollection) {
		var paramValue = name.GetTypedColumnValue&lt;string&gt;("Name");  // Колонка "Название"
		Set ("TimeOfDayText", paramValue);  // Название параметра в процессе для записи текста сообщения
	}
}
return true;

 

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