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

Возник следующий вопрос.

Необходимо в реестр справочника, например Статусы обращения, вывести значения колонки IsFinal аналогично методу setSubtitleColumns согласно SDK

https://academy.terrasoft.ru/documents/technic-sdkmob/7-12/sdk-reestra

В коробочном решении грид справочника выглядит следующим образом:

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

 

 

 

 

 

Пример необходимой реализации, колонка контакт:

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

 

 

 

 

 

 

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

Попытки задания Subtitle через дополнительный модуль, подключённый в манифесте для раздела Case, не дал результата. Что-то делаю не так.

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

Спасибо!

 

Нравится

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

Примеры использования этого свойства есть в «коробке» в схемах MobileLookupGridPageConfig, MobileLookupGridOpportunityPageConfig, MobileCaseMessageHistoryModuleConfig и MobileCaseMessageHistoryModuleConfig. Судя по названию, вторая схема как раз может использоваться для окна выбора из справочника. Её код:

Terrasoft.sdk.LookupGridPage.setSubtitleColumns("Opportunity", ["Account"]);

 

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

Здравствуйте! Нужно добавить одна текстовое поля на странице генерация отчета.

Задача состоит в добавление фильтраций по текстовое значение, но когда я пробовал добавить новое поле, оно не появляется. Я попробовал добавить: "Text", "SHORT_TEXT", "LONG_TEXT", все из данный link: https://academy.terrasoft.ru/api/jscoreapi/7.12.0/#!/api/Terrasoft.core…, добавляются только "INTEGER","LOOKUP","ENUM", и "DATE". Как я могу добавить это поле что бы оно было видно? Может для этого поле мне нужно указать другие параметры.

P.S: Отчет создан через "BPMonlineReportDesigner"

Прикрепленные файлы

Нравится

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

Добрый день!

1) Проверьте, что в локализируемых строках есть строка "Name".

2) Попробуйте тип "TEXT" (заглавными буквами).

3) Что VBName - есть такая колонка.

4) Может есть ошибки в консоли. И они могут подсказать вам

Добрый день Александр, я проверил все эти пункты, все колонки есть и локализированная строка тоже есть.  Сделал debugg, и нашёл что он использует модуль ReportFilterModule, и в коде, в switch  нет такой тип TEXT, но когда я пробовал замещать, вышло ошибка, что запрещено замещение модулей.  Может подсказать если есть другие способы, что бы добавить там это поле

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

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

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

 

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

Нравится

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

Добрый день!

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

 

Этот параметр по операциям администрируется, вроде. Возможно, где-то в режиме администратора есть настройка? 

Нашёл вот такую статью, но решение не помогает.

https://community.terrasoft.ru/articles/cto-delat-esli-cast-menedzerov-perestala-videt-soobsenia-drugih-menedzerov

Sunrise challenge,

По умолчанию все пользователи видят все сообщения. Ограничения накладываются на правах объектов. Это можно увидеть, взяв чистую демо версию Service Enterprice.

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

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

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

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

Привет,

Столкнулся с проблемой:

Версия: 7.13.4.638_SalesEnterprise_Marketing

Действие: Отладка бизнес процесса

Описание:

Версия Visual Studio - 2017 Pro

В процессе отладки серверного кода бизнес процесса столкнулся с проблемой, уже ранее описанной в теме https://community.terrasoft.ua/taxonomy/term/7738. Хотелось бы понять, для версии 7.13 возможно ли каким либо образом решить проблему просмотра переменных в режиме дебага без ошибки Cannot obtain value of the local variable or argument because it is not available at this instruction pointer, possibly because it has been optimized away, либо это невозможно. Дело в том, что невозможность посмотреть значение переменных замедляет разработку.

Так же не везде удается установить breakpoints. Возможно эти проблемы связаны между собой.

Что не помогло:

1. Заново выполнить Attach to Process.

2. Установка Suppress JIT optimization on module load в настройках дебага.

3. В Build проекта снята галка Optimize code и Debugging information = Full

Нравится

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

Alex, здравствуйте!



Вам необходимо в Options-Debugging-General также отключить флаг Enable Just My Code.

Илья,

Спасибо за ответ, 

Данная опция помогла мне чтобы устанавливались breakpoints. Я задавал ранее вопрос, https://community.terrasoft.ru/questions/neaktivnye-breakpoints-pri-otladke-biznes-processa

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

Alex, добрый день! Скажите, пожалуйста, смогли ли Вы справиться с проблемой? После обновления с 7.12 до 7.15 столкнулся с тем же самым, ничего не помогает

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

Добавить комментарий

Иван Небеддаг,

Да, справиться удалось.

Я отказался от работы с Workspace. Enable Just My Code у меня включена. Конфигурационный проект содержит только разрешенные assemblies, например Terrasoft.Common, Terrasoft.Core и тд.

Алгоритм работы, при котором работает отладка у меня:

1. Если есть изменения в гите, то забрать их, это действие обновит часть содержимого из папки Pkg. Далее в конфигурации забрать изменения из файловой системы, компилировать измененное. Если изменений нет, то не нужно.

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

3. Написать в студии логику, нажать на сохранить все.

4. Нажать на компилировать измененное в конфигураторе. 

5. Подключиться дебаггером к процессу IIS, установить точки останова.

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

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

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

Надеюсь, помог. Если не помог, и Ваше решение отличается от моего, напишите его суда, пожалуйста. Для истории будет полезно.

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

Привет,

Столкнулся с проблемой:

Версия: 7.13.4.638_SalesEnterprise_Marketing

Действие: Отладки бизнес процесса

Описание:

Создал бизнес процесс. В нем определил задание-сценарий. Мне нужно его отладить. Для этих целей выполнил все шаги, описанные в инструкции https://academy.terrasoft.ua/documents/technic-sdk/7-13/otladka-servernogo-koda

Столкнулся с проблемой, - все установленные мной точки останова неактивны The breakpoint will not currently be hit. 

No symbols have been loaded for this document.

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

Так же:

Версия IDE - vs2017 pro.

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

Для старта БП отправляю POST запрос при помощи postman. Запрос вида:

http://{адрес}/0/ServiceModel/ProcessEngineService.svc/RunProcess

JSON:

{

  "parameterValues": 

  [

      {"name": "IdString", "value": "A9CF364A-CE81-453E-B85D-001F788A41ED"},

      {"name": "TypeString", "value": "68E23EAE-62A2-43FE-AE33-8F41376AFBED"},

      {"name": "ID_Boss", "value": "123"}, 

      {"name": "ID_Navision", "value": "88706"},

      {"name": "DeliveryAddress", "value": "TEST"},

      {"name": "SearchName", "value": "6"},

      {"name": "name", "value": "улица, 6"},

      {"name": "OwnerId", "value": "center"}

  ],

  "schemaUId": "e18ae725-4f32-44c1-ba33-3ae749c40ed0",

  "schemaName": "UsrImportOrUpdateAccount"

}

Подключаюсь для отладки к правильному w3wp.exe. В пуле 1 поток, пул запускается из под моей учетки.

pdb файлы находятся в той же папке, где и *.cs файлы.

UPD1: при открытии в IDE .cs файла бизнес процесса подсказчик IDE указывает на то, что многие классы не определены, к примеру, почеркивается ProcessSchemaManager, using Terrasoft.Core.Entities; и тд, но, как я понял, при данном виде отладки это ок и мне не нужно делать build проекта с прикрепленными к нему файлами, которые нужно отладить.

Проект использует .NET Framework 4.7

Нравится

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

Для решения проблемы попробуйте в Visual Studio изменить следующие настройки:

1) в Options->Debugging->General: Enable Just My Code - выключить

2) Suppress JIT optimization - включить

Для решения проблемы попробуйте в Visual Studio изменить следующие настройки:

1) в Options->Debugging->General: Enable Just My Code - выключить

2) Suppress JIT optimization - включить

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

Большое спасибо!

Мне помог пункт 1. Пункт 2 был выполнен по документации ранее.

AlexMatveev,

Рада была помочь!

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

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

 

Подскажите, пожалуйста, как  изменить цвет фона и шрифтов сообщений и комментариев во вкладке "обработка" в обращениях? 

 

 

Нравится

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

Посмотрите эту тему и эту статью. Для деталей тоже должно работать

Посмотрите эту тему и эту статью. Для деталей тоже должно работать

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

Добрый день!

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

actionMenuItems.addItem(this.getButtonMenuItem({

                    "Caption": {"bindTo": "Resources.Strings.EditRightsCaption"},

                    "Tag": "editRights",

                    "Visible": {"bindTo": "getSchemaAdministratedByRecords"}

                }));

метод же найти не могу.

Нужно для назначения прав на страницу контрагента в БП без использования Terrasoft.Core.DB

Нравится

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

По нажатию на кнопку действия 'Настроить права доступа' вызывается окно для редактирования прав, в котором пользователь вручную раздает права доступа, и его вызов реализован в методе editRights (указан в свойстве 'Tag').

В БП в элементе 'Задание-сценарий' можно реализовать произвольный запрос, в котором выполнять добавление/изменение/удаление данных напрямую в базу данных без использования Terrasoft.Core.DB:

var customQuery = new CustomQuery(context.UserConnection);
customQuery.SqlText = @"insert into Cases (Id) values (newid())";
using (DBExecutor dbExecutor = context.UserConnection.EnsureDBConnection())
{
	var datareader = customQuery.ExecuteReader(dbExecutor);
}
return true;

Вот ещё другой пример:

var userConnection = context.UserConnection;
var dr = new CustomQuery(userConnection, String.Format(
"update case set SolutionProvidedOn = null where Id = 974ca9fc-c066-4a7a-ac65-7ec91a44a067")).ExecuteReader(dbExecutor);
return true;

 

По нажатию на кнопку действия 'Настроить права доступа' вызывается окно для редактирования прав, в котором пользователь вручную раздает права доступа, и его вызов реализован в методе editRights (указан в свойстве 'Tag').

В БП в элементе 'Задание-сценарий' можно реализовать произвольный запрос, в котором выполнять добавление/изменение/удаление данных напрямую в базу данных без использования Terrasoft.Core.DB:

var customQuery = new CustomQuery(context.UserConnection);
customQuery.SqlText = @"insert into Cases (Id) values (newid())";
using (DBExecutor dbExecutor = context.UserConnection.EnsureDBConnection())
{
	var datareader = customQuery.ExecuteReader(dbExecutor);
}
return true;

Вот ещё другой пример:

var userConnection = context.UserConnection;
var dr = new CustomQuery(userConnection, String.Format(
"update case set SolutionProvidedOn = null where Id = 974ca9fc-c066-4a7a-ac65-7ec91a44a067")).ExecuteReader(dbExecutor);
return true;

 

Спасибо, Алла.

В БП этот код вызывает ошибку компиляции "The name dbExecutor does not exist in the current context"

Либо "The type or namespace name 'IDataReader' coul not be found" в первом варианте.

То есть это работает только для неинтерпетируемого процесса? 

Естественно, использование в БП блоков скриптов на C# требует компиляции процесса.

Виталий Егоров,

Если Вы используете второй вариант, попробуйте вместо UserConnection написать context.UserConnection.

 

Если первый вариант, то приблизительно такой код:

var userConnection = context.UserConnection;
var customQuery = new CustomQuery(userConnection);
customQuery.SqlText = @"insert into Cases (Id) values (newid())"; 
using (DBExecutor dbExecutor = userConnection.EnsureDBConnection())
{
	var reader = customQuery.ExecuteReader(dbExecutor);
}
return true;

 

Виталий Егоров пишет:

В БП этот код вызывает ошибку компиляции "The name dbExecutor does not exist in the current context"

Нужно обернуть в using, как и в первом фрагменте. 

 Либо "The type or namespace name 'IDataReader' coul not be found" в первом варианте.

А тут нужно включить нужную библиотеку System.Data в Usings (в дизайнере БП справа на вкладке «Методы»).

Спасибо, Алла, все работает.

Александр, спасибо, попробую добавить DataReader.

Добавил в этот же БП еще один сценарий с кодом:

foreach (string accountId in accountIdList){

    try {

        var update = new Update(UserConnection, "Account")

               .Set("OwnerId", Column.Parameter(newOwner))

               .Where ("Id").IsEqual(Column.Parameter(accountId));

        update.Execute();

    }

    catch (SqlException ex){

        errorsList.Add(ex.Message);

    }

    finally {

        var sel = new Select(UserConnection)

            .Column("Name")

            .From("Account")

            .Where ("Id").IsEqual(Column.Parameter(accountId));

             using (DBExecutor dbExecutor = context.UserConnection.EnsureDBConnection()) {

            using (IDataReader dataReader = sel.ExecuteReader(dbExecutor)){

                       accountName = CreateJson(dataReader);

            }

        }

        accountNameList.Add(accountName);

    }

}

На выходе получаю ошибку:

'Query' does not contain a definition for 'ExecuteReader' and no extension method 'ExecuteReader' accepting a first argument of type 'Query' could be found (are you missing a using directive or an assembly reference?)

 

 

Может, дело в забытом «as Select» в конце объявления sel? Как тут:

Select select = 
	new Select(UserConnection)
		.Column("Id")
		.From("ActivityStatus")
		.Where("Finish").IsEqual(Column.Parameter(true))
		as Select;
using (var dbExecutor = UserConnection.EnsureDBConnection()) {
	using (IDataReader dr = select.ExecuteReader(dbExecutor)) {
		while (dr.Read()) {
			finishActivityStatuses.Add(UserConnection.DBTypeConverter.DBValueToGuid(dr[0]));
		}
	}
}

 

Спасибо, добрый человек! :)

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

Привет,

Есть вопрос

Версия: 7.13.4.638_SalesEnterprise_Marketing

Место: LDAP интеграция

Описание: Пишу интеграцию со сторонней системой.

Система передает набор данных в бизнес процесс. Среди данных есть SID формата S-1-5-21-1507001333-1204550764-1011284298-1003. В BPM настроена интеграция LDAP. В свойствах интеграции идентификатор пользователя задан как objectSid. Однако в БД в [LDAPElement].[LDAPEntryId] записана строка, по формату отличающаяся от SID. Я предполагаю, что в данное поле пишется SID, но перед этим он проходит обработку.

Вопрос: Есть ли в backend api Terrasoft метод/класс, позволяющий получить корректный SID пользователя? И если нет, то каким образом я могу выполнить преобразование из значения LDAPElement].[LDAPEntryId] в SID?

Нравится

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

Логика работы с LDAP реализована в БП SyncWithLDAPProcess, схемах LDAPSysSettingsService, SyncWithLDAPProcessHelper, LDAPUtility, LDAPUtilities. В последней встречается функция, вызывающая подозрение, что обработка заключается в банальном взятии хэша MD5:

private string GetEntryIdentityAttribute(SearchResultEntry entry, string attributeName) {
	object attributeValue = entry.Attributes[attributeName][0];
	if (!(attributeValue is byte[])) {
		return Convert.ChangeType(attributeValue, typeof(string)).ToString();
	}
	var hasher = MD5.Create();
	byte[] data = hasher.ComputeHash(attributeValue as byte[]);
	var sb = new StringBuilder(512);
	for (int i = 0; i < data.Length; i++) {
		sb.Append(data[i].ToString("x2"));
	}
	return sb.ToString();
}

Соответственно, получить обратно objectSid в описанном формате по нему не получится.

Логика работы с LDAP реализована в БП SyncWithLDAPProcess, схемах LDAPSysSettingsService, SyncWithLDAPProcessHelper, LDAPUtility, LDAPUtilities. В последней встречается функция, вызывающая подозрение, что обработка заключается в банальном взятии хэша MD5:

private string GetEntryIdentityAttribute(SearchResultEntry entry, string attributeName) {
	object attributeValue = entry.Attributes[attributeName][0];
	if (!(attributeValue is byte[])) {
		return Convert.ChangeType(attributeValue, typeof(string)).ToString();
	}
	var hasher = MD5.Create();
	byte[] data = hasher.ComputeHash(attributeValue as byte[]);
	var sb = new StringBuilder(512);
	for (int i = 0; i < data.Length; i++) {
		sb.Append(data[i].ToString("x2"));
	}
	return sb.ToString();
}

Соответственно, получить обратно objectSid в описанном формате по нему не получится.

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

Спасибо!

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

Добрый день, 

Добавили в объект Product поле PriceVAT тип FLOAT. Также было добавлено аналогичное поле в объект ProductPrice. В базовой логике, при изменении поля Price объекта Product делается update/insert поля Price объекта ProductPrice и наоборот. Подскажите, в каких схемах и/или событиях вызывается этот метод? Мне нужно для своего поля PriceVAT добавить такой же механизм синхронизации. Спасибо

Нравится

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

Доброе утро!

Данная логика реализована в методе synchronizePrice в схеме ProductPageV2 пакета ProductCatalogue.

Доброе утро!

Данная логика реализована в методе synchronizePrice в схеме ProductPageV2 пакета ProductCatalogue.

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

Добрый день!

Столкнулся со следующей ошибкой во время билда/ребилда через WorkSpaceConsole, настроенный в VS.

Error: Dependency 'TripUsefulConfigurationService' of package 'Business_Trip_Objects' was not found.

Нашел статью, параметры в консоли и WebConfig значение флага CompileByManagerDependencies совпадает и равняется true.

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

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

Нравится

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

Добрый день! Дело в том, что не сгенерировался файл указанный в ошибке. У меня были подобные случаи, помогало компилирование всего приложения из интерфейса конфигурации. При компиляции должны сгенерироваться недостающие файлы.

Добрый день! Дело в том, что не сгенерировался файл указанный в ошибке. У меня были подобные случаи, помогало компилирование всего приложения из интерфейса конфигурации. При компиляции должны сгенерироваться недостающие файлы.

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