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

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

Может у кого есть опыт с данным типом справочника?

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

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

Нравится

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

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

https://prnt.sc/vo7c2d

Если мне не изменяет память, делал так, создал деталь со страницей редактирования(через мастер раздела) и привязал ее к объекту справочника. Попробуйте так.

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

https://prnt.sc/vo7c2d

Если мне не изменяет память, делал так, создал деталь со страницей редактирования(через мастер раздела) и привязал ее к объекту справочника. Попробуйте так.

Через мастер деталей только.

Спасибо за ответы! Сам бы не за что не догадался

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

Здравствуйте, подскажите пожалуйста.

Есть стандартный элемент "AccountProfile", который отображает данные контакта, работает отлично, но когда блокируешь поля страницы с использованием "IsModelItemsEnabled" то кнопка очистки в контейнере  "AccountProfile" не пропадает.

Саму кнопку нашел, сделал замещение родителя, поставил bind на "visible", написал метод который попадает в bind, там читаю свойство "hideClearButton"

define("BaseProfileSchema", [], function() {
		return {
			methods: {
				isHideClearButton: function(){
					return this.get("hideClearButton");
				}
			},
			diff: [
				{
					"operation": "merge",
					"name": "ClearButton",
					"values": {
						"visible": {
							"bindTo": "isHideClearButton"
						}
					}
				}
			]
		};
	}
);

на странице Page в секцию "modules" поместил модель, в котором "viewModelConfig" положил "hideClearButton"

"AccountProfile": {
	"config": {
		"schemaName": "AccountProfileSchema",
		"isSchemaConfigInitialized": true,
		"useHistoryState": false,
		"parameters": {
			"viewModelConfig": {
				"masterColumnName": "KtAccount",
				"hideClearButton": "checkIsModelItemsEnabled"
			}
		}
	}
},

но если я передаю на прямую true или false тогда все отлично, но мне надо передать туда значение атрибута "IsModelItemsEnabled".

Пробовал создать метод

checkIsModelItemsEnabled: function(){
	return this.get("IsModelItemsEnabled").value;
},

но тогда this.get("hideClearButton") приходит строка "checkIsModelItemsEnabled", а если передать {"bindTo": "isHideClearButton"} тогда приходит строка bindTo: "isHideClearButton"

Нравится

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

Александр, видимо, нужно не напрямую в параметр передавать, а работать через атрибуты. Так сделано в схеме ServiceParameterGrid:

  modules: {
 
   ServiceParameterPage: {
    moduleId: "ServiceRequestParameterPage",
    moduleName: "ConfigurationModuleV2",
    config: {
     isSchemaConfigInitialized: false,
     schemaName: "ServiceParameterPage",
     parameters: {
      viewModelConfig: {
       ServiceSchemaUId: {
        attributeValue: "ServiceSchemaUId"
       },
       MethodUId: {
        attributeValue: "MethodUId"
       },
       ParameterUId: {
        attributeValue: "ParameterUId"
       },
       CanEditSchema: {
        attributeValue: "CanEditSchema"
       }
      }
     },
     useHistoryState: false
    }
   }
 
  },
  attributes: {
 
   /**
    * UId of schema in ServiceSchemaManager.
    */
   ServiceSchemaUId: {
    dataValueType: Terrasoft.DataValueType.GUID
   },
 
   /**
    * Is allow edit fields.
    */
   CanEditSchema: {
    dataValueType: Terrasoft.DataValueType.BOOLEAN
   },
 
 
   /**
    * UId of method in ServiceSchemaManager.
    */
   MethodUId: {
    dataValueType: Terrasoft.DataValueType.GUID
   },
 
   /**
    * UId of parameter in ServiceSchemaManager.
    */
   ParameterUId: {
    dataValueType: Terrasoft.DataValueType.GUID
   }
 
  },

И далее программно взаимодействовать уже с ними.

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

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

Александр, пример для кнопки есть тут, биндинг метода к видимости работает, к доступности тоже должно, по идее. Попробуйте аналогично примерам оттуда.

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

Есть запрос в базу данных, по ответу поддержки "классы EntitySchemaQuery, Select, Insert, Update, Delete это СУБД-независимое API ", исходя из этого был использован InsertSelect. На PostgreSQL запрос отрабатывает отлично, но в Oracle выдает ошибку при использовании TOP в запросе.

Код запроса:

Query selectQuery = new Select(UserConnection)
    .Top(numberCountForNumberPool)
    .Column(Column.Parameter(request))
    .Column(Column.Parameter(currentUserContactId))
    .Column(Column.Parameter(currentUserContactId))
    .Column("KtSimManagementInitialPoolNumbers", "KtIccid")
    .Column("KtSimManagementInitialPoolNumbers", "KtImsi")
    .Column("KtSimManagementInitialPoolNumbers", "KtMsisdn")
    .Column("KtSimManagementInitialPoolNumbers", "KtName")
    .Column(Column.Parameter(cityAndCountNumbersEntity.GetTypedColumnValue<Guid>(city.Name)))
    .Column(Column.Parameter(cityAndCountNumbersEntity.GetTypedColumnValue<string>(note.Name)))
    .Column(Column.Parameter(DateTime.UtcNow.Date))
    .Column(Column.Parameter(DateTime.UtcNow.Date
        .AddDays((int)Core.Configuration.SysSettings.GetValue(UserConnection,
            "DayCountForDedicatedPoolNumbers") + 1).AddSeconds(-1)))
    .From("KtSimManagementInitialPoolNumbers")
    .OrderByAsc("KtSimManagementInitialPoolNumbers", "KtName")
    .Join(JoinType.LeftOuter, "KtJasperFullNumberPool")
    .On("KtSimManagementInitialPoolNumbers", "KtName")
    .IsEqual("KtJasperFullNumberPool", "KtName")
    .Where("KtJasperFullNumberPool", "KtName")
    .IsNull()
    .And("KtSimManagementInitialPoolNumbers", "KtMarketCodeId")
    .IsEqual(Column.Parameter(cityForMarketCode));
 
InsertSelect insertSelectQuery = new InsertSelect(UserConnection)
    .Into("KtJasperFullNumberPool")
    .Set("KtRequestId", "ModifiedById", "CreatedById", "KtIccid", "KtImsi", "KtMsisdn", "KtName", "KtCityId", "KtNote", "KtReserveDate", "KtReserveToDate")
    .FromSelect(selectQuery);
int numberCountInserted = insertSelectQuery.Execute();

Подскажите, есть ли возможность использовать в Select для Oracle - TOP для выборки необходимого количества записей в запросе?

Нравится

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

Проверил, на запросе с Top, OrderByAsc,  Join, On, IsEqual, Where отрабатывает нормально. А если добавить колонки с числом и датой из параметра, получим такую же ошибку, как у Вас. Но если, как я выше предложил, дописать «.As», она исчезнет:

			var query = new Select(UserConnection)
				.Top(2)
				.Column("Contact", "Dear")
    			.Column(Column.Parameter("test")).As("SomeString")
    			.Column(Column.Parameter(DateTime.UtcNow.Date)).As("SomeDate")
				.From("Contact")
				.OrderByAsc("Contact", "Dear")
		    	.Join(JoinType.LeftOuter, "Account")
    			.On("Contact", "AccountId")		
				.IsEqual("Account", "Id")
    			.Where("Account", "AnnualRevenueId")
    			.IsNull()				;
var text =  query.GetSqlText();

Код генерируется:

SELECT  "Dear", "SomeString",   "SomeDate"FROM (SELECT  "Contact"."Dear",       :P1 "SomeString",       :P2 "SomeDate"FROM      "название_базы"."Contact""название_базы"."Account"WHERE      ("Account"."AnnualRevenueId" IS NULL)   AND "Contact"."AccountId" = "Account"."Id"(+)ORDER BY   "Contact"."Dear" ASC NULLS FIRST)WHERE  (ROWNUM &lt;= 2)

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

Александр, какая именно выдаётся ошибка? Только в Insert Select или просто в Select с Top тоже?

Если перед последней строчкой считать insertSelectQuery.GetSqlText(), что там будет?

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

 в Select тоже, пишет что "

Terrasoft.Common.NullOrEmptyException: Псевдоним колонки запроса не может быть пустым

   в Terrasoft.Core.DB.DBEngine.BuildSelectColumnAliasesSqlText(StringBuilder sb, QueryColumnExpressionCollection columnExpressions)

   в Terrasoft.DB.Oracle.OracleEngine.BuildSelectQuerySqlText(StringBuilder sb, Select select)

   в Terrasoft.Core.DB.DBEngine.BuildQuerySqlText(StringBuilder sb, Select selectQuery)

   в Terrasoft.Core.DB.DBEngine.GetQuerySqlText(Select selectQuery)

   в Terrasoft.Core.DB.Select.GetSqlText()

   в Terrasoft.Configuration.KtReserveNumbersService.ReserveNumbers(Guid request)

   в SyncInvokeReserveNumbers(Object , Object[] , Object[] )

   в System.ServiceModel.Dispatcher.SyncMethodInvoker.Invoke(Object instance, Object[] inputs, Object[]& outputs)

   в Terrasoft.Web.Common.ServiceModel.ThreadContextInitializer.Invoke(Object instance, Object[] inputs, Object[]& outputs)

   в System.ServiceModel.Dispatcher.DispatchOperationRuntime.InvokeBegin(MessageRpc& rpc)

"

Проверил без TOP - такой ошибки нет

А если без этой колонки?

    .Column(Column.Parameter(DateTime.UtcNow.Date
        .AddDays((int)Core.Configuration.SysSettings.GetValue(UserConnection,
            "DayCountForDedicatedPoolNumbers") + 1).AddSeconds(-1)))

Или с ней, но сразу после после дописать псевдоним:

.As("MyColumnName")

Она самая подозрительная, но если дело не в ней, проверьте и предыдущие.

Зверев Александр, Проверил - при закоментировании колонок разницы нет, но заметил закономерность:

1) если использовать Top без OrderByAsc и Join (ну вчесте с его on, IsEqual, Where) - тогда работает

2) если использовать OrderByAsc или Join (ну вчесте с его on, IsEqual, Where) без Top - тогда работает

3) если использовать Top с OrderByAsc или Join (ну вчесте с его on, IsEqual, Where) - тогда не работает, ошибка

Проверил, на запросе с Top, OrderByAsc,  Join, On, IsEqual, Where отрабатывает нормально. А если добавить колонки с числом и датой из параметра, получим такую же ошибку, как у Вас. Но если, как я выше предложил, дописать «.As», она исчезнет:

			var query = new Select(UserConnection)
				.Top(2)
				.Column("Contact", "Dear")
    			.Column(Column.Parameter("test")).As("SomeString")
    			.Column(Column.Parameter(DateTime.UtcNow.Date)).As("SomeDate")
				.From("Contact")
				.OrderByAsc("Contact", "Dear")
		    	.Join(JoinType.LeftOuter, "Account")
    			.On("Contact", "AccountId")		
				.IsEqual("Account", "Id")
    			.Where("Account", "AnnualRevenueId")
    			.IsNull()				;
var text =  query.GetSqlText();

Код генерируется:

SELECT  "Dear", "SomeString",   "SomeDate"FROM (SELECT  "Contact"."Dear",       :P1 "SomeString",       :P2 "SomeDate"FROM      "название_базы"."Contact""название_базы"."Account"WHERE      ("Account"."AnnualRevenueId" IS NULL)   AND "Contact"."AccountId" = "Account"."Id"(+)ORDER BY   "Contact"."Dear" ASC NULLS FIRST)WHERE  (ROWNUM &lt;= 2)

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

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

 да, именно Ваша рекомендация с .As("SomeString") помогла когда прописал данный алиас во все колонки где используется "Column.Parameter". Так же в поддержке ответили. Не понял только почему в PostgreSQL это работает без алиаса, а в Oracle без него не так. Но видимо это специфика запросов СУБД, главное что с алиасом работает и там, и там.

Спасибо за помощь!

Передал информацию об этой особенности для освещения в академии.

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

Коллеги, добрый день. Может есть у кого-нибудь нарисованная в Visio инфраструктура Creatio (по максимуму)  

Нравится

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

Рустем, в статье есть такая схема:

 

deployment_infrastructure_fault-tolerant.png

Если нужно, могу запросить её исходник, но не уверен, что её делали именно в Visio, а не каком-то графическом редакторе.

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

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

Спасибо за подробное описание, потребность зафиксировал.

Думаю, такие схемы могут быть у компаний-партнёров, реализующих крупные проекты внедрения Creatio.

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

При запуске WorkspaceConsole в самом начале лога выполнения операции появляется ошибка. При этом запрошенная операция проходит успешно:

[09:46:11] Error has occurred during the loading of workspace build System.IO.DirectoryNotFoundException: Could not find a part of the path 'C:\Creatio_7.14\Terrasoft.WebApp\DesktopBin\WorkspaceConsole\Terrasoft.WebApp\Terrasoft.Configuration\bin\Terrasoft.Configuration.dll'.
   at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath)
   at System.IO.FileStream.Init(String path, FileMode mode, FileAccess access, Int32 rights, Boolean useRights, FileShare share, Int32 bufferSize, FileOptions options, SECURITY_ATTRIBUTES secAttrs, String msgPath, Boolean bFromProxy, Boolean useLongPath, Boolean checkHost)
   at System.IO.FileStream..ctor(String path, FileMode mode, FileAccess access, FileShare share, Int32 bufferSize, FileOptions options, String msgPath, Boolean bFromProxy, Boolean useLongPath, Boolean checkHost)
   at System.IO.File.InternalReadAllBytes(String path, Boolean checkHost)
   at Terrasoft.Common.IO.FileWrapper.ReadAllBytes(String path)
   at Terrasoft.Core.DesignMode.FileSystemWorkspaceAssemblyLoader.LoadAssemblyToWorkspace(SysWorkspace workspace, String assemblyPath)
   at Terrasoft.Core.AppConnection.GetWorkspaceAssembly(SysWorkspace workspace)

В чем может быть проблема? Вижу, что путь не верный, но как попросить WorkspaceConsole обращаться по правильному пути, не понял.



Команда запуска:

 

C:\Creatio_7.14\Terrasoft.WebApp\DesktopBin\WorkspaceConsole\Terrasoft.Tools.WorkspaceConsole.exe ^
-operation=BuildWorkspace ^
-workspaceName=Default ^
-webApplicationPath="C:\Creatio_7.14\Terrasoft.WebApp" ^
-confRuntimeParentDirectory="C:\Creatio_7.14\Terrasoft.WebApp"

 

Нравится

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

Александр. Да, я видел этот пост, но видимо не очень внимательно прочитал.



Добавление параметра -configurationPath, указывающего на конфигурацию проекта ничего не дало.



Помогло добавление этого пути (к конфигурации) в параметр ConfigurationProjectPath файла: Terrasoft.Tools.WorkspaceConsole.exe.config



Ошибки теперь нет, всё работает как надо :-)



Добавлять ли это решение в документацию или нет, решайте сами. Какая то не очевидная штука. И, что характерно, видимо не частая, раз люди о ней не пишут.

Дмитрий, а в config-файле программы-консоли, который находится рядом с exe ничего подозрительного нет? Имею в виду неправильный путь, не прописан ли он там.

Александр, спасибо за вопрос! :-)

Нет, в Terrasoft.Tools.WorkspaceConsole.exe.config никаких подозрительных путей нет.

По сути видно, что путь в логах состоит из двух частей

1. Путь к WorkspaceConsole: 

 

C:\Creatio_7.14\Terrasoft.WebApp\DesktopBin\WorkspaceConsole\



2. Путь от корня проекта к Terrasoft.Configuration.dll:

 

\Terrasoft.WebApp\Terrasoft.Configuration\bin\Terrasoft.Configuration.dll



Т.е. WorkspaceConsole использует для поиска Terrasoft.Configuration.dll не корень проекта, а собственную домашнюю папку. 

Каких то параметров у WorkspaceConsole относительно такого поведения я не нашел. Может тут тоже есть какая то хитрость с путями в параметрах? Хотя, всё сделано строго в соответствии с документацией.

Дмитрий, кажется, нашёлся аналогичный случай:

Решил указать параметр "configurationPath" и переменная "Assembly" стала инициализироваться.

Александр. Да, я видел этот пост, но видимо не очень внимательно прочитал.



Добавление параметра -configurationPath, указывающего на конфигурацию проекта ничего не дало.



Помогло добавление этого пути (к конфигурации) в параметр ConfigurationProjectPath файла: Terrasoft.Tools.WorkspaceConsole.exe.config



Ошибки теперь нет, всё работает как надо :-)



Добавлять ли это решение в документацию или нет, решайте сами. Какая то не очевидная штука. И, что характерно, видимо не частая, раз люди о ней не пишут.

Спасибо за решение, Дмитрий. Зафиксировал информацию об отсутствии этих тонкостей в документации.

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

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

Собственно вопрос можно ли стандратную карту в Creatio заменить на другую, гугл карты, например?

Нравится

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

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

Собственно, поэтому в «коробке» с Google Maps переключились на OSM.

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

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

А где в Creatio можно сменить на Google карту отображение в адресе (на детале) и в активностях при включенном модуле Field Sales, где мы планируем визиты? Можно ли вообще там подменить карту, в сис настройках каких-то?

Нужно ставить дополнение. Специально для Field Sales есть ещё одно с Yandex, других разработчиков. Как именно настраивать, лучше спросить у их авторов.

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

Добрый день.

По документации настроил приложение для разработки в файловой системе. При запуске WorkspaceConsole с ключом BuildWorkspace возникает ошибка:



Compilation started

--> ESN_Entity

--> Case_Case

Error: One or more errors occurred.

Utility finished working.



Запускаю так:

C:\SandboxCreatio\Terrasoft.WebApp\DesktopBin\WorkspaceConsole\Terrasoft.Tools.WorkspaceConsole.exe ^

--operation=BuildWorkspace ^

--workspaceName=Default ^

--webApplicationPath="C:\SandboxCreatio\Terrasoft.WebApp" ^

--confRuntimeParentDirectory="C:\SandboxCreatio\Terrasoft.WebApp"



Интересно, что тот же вызов с ключом RebuildWorkspace работает нормально.



В чем может быть проблема?

Как включить более подробное логирование ошибки?



Заметил один момент в документации:

Описание ключа webApplicationPath в документации WorkspaceConsole говорит о том, что здесь надо прописывать корневую папку приложения, где лежит ConnectionStrings.config. Однако в описании настройки IDE, тут надо указывать папку \Terrasoft.WebApp. Где правда?

 

Нравится

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

Отвечу сам )

1. Ошибка вылечилась копированием файлов из Terrasoft.WebApp\bin в папку WorkspaceConsole. Где то тут нашел решение;

2. Оказалось в документации это есть, типо примечания, что при использовании ключа BuildWorkplace параметр confRuntimeParentDirectory должен принимать значение отличное от описанного в основной документации по утилите. Оптимизация, экономим на параметрах ))

Отвечу сам )

1. Ошибка вылечилась копированием файлов из Terrasoft.WebApp\bin в папку WorkspaceConsole. Где то тут нашел решение;

2. Оказалось в документации это есть, типо примечания, что при использовании ключа BuildWorkplace параметр confRuntimeParentDirectory должен принимать значение отличное от описанного в основной документации по утилите. Оптимизация, экономим на параметрах ))

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

Как правильно создать деталь в детали?

Почему-то во вторую деталь не передается Id-шник родительской детали.

Пробовал сделать добавлением  - "useRelationship": true . Но все равно не работает. В качестве примера использовал вот этот эту статью:

https://community.terrasoft.ru/questions/peredaca-id-v-samopisnuu-detal

Нравится

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

Не забудьте установить в объекте главной детали поле для отображения.

Не забудьте установить в объекте главной детали поле для отображения.

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

 Что вы имеете в виду установить поле для отображения? Добавить в объект первой детали поле с ссылкой на объект второй детали? Или же в карточке первой детали прописать?

Евгений, речь об этом, настраивается на уровне объекта:

Спасибо. Да, действительно помогло. Получается решение с помощью строки "useRelationship": true  не дает ничего

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

Уважаемая колеги!

Обращаюсь к вам со следующей задачей: 

1.Надо произвести запрос к внешнему API-сервису с конкретными входными параметрами. 

2. В ответ получаем данные в формате XML․ 

3.В качестве результата вывести данные из полученного файла на странице пользователя. 

4. Следующим шагом сохранить эти данные в БД. 

 Есть у вас шаблон для реализации описанной задачи или какие-либо рекомендации по ее выполнению?  

 

Нравится

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

Nerses, в дизайнере бизнес-процессов есть элемент вызова веб-сервиса, но в нынешней реализации он поддерживает только JSON, а не XML.

То есть Вам нужно будет обращаться к сервису и получать XML-ответ кодом. Пример есть тут.

 

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

 

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

 

Поскольку работа с XML будет выполнятся на C# из блока-скрипта, сохранение в базу можно сделать там же, используя класс Insert или Entity.Save. Второй вариант позволит при сохранении запустить какую-то дополнительную логику на объекте или в БП на событии создания, первый сохраняет в обход срабатывания событий.

 

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

 

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

В системе для пунктов 1-3 нет специальных классов, вы реализуете эту функциональность используя либо стандартные классы .net, либо подключая любые библиотеки которыми вы хотите пользоваться.

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

Возникла такая необходимость.

Как сделать возможным редактирование детали в плиточном представлении?

Есть ли решение? Подскажите.

Нравится

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

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

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

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