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

Из документации https://academy.terrasoft.ru/docs/developer/elements_and_components/mac…

пишут что сервис доступен 

https://demo-ml.bpmonline.com/swagger/index.html#/MLService

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

Нравится

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

Добрый день!
Чтоб попасть на сервис нужно переходить по прямой ссылке

https://demo-ml.bpmonline.com/swagger/index.html#/MLService
Так же, чтоб начать использовать машинное обучение нужно прописать в системных настройках APi ключ и ServiceUrl, можно почитать в статье:

https://academy.terrasoft.ru/docs/user/razvertyvanie_onsite/nastrojka_k…
Или в чем возникает проблема, не отрабатывает машинное обучение?

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

Здравствуйте, занимаюсь обновлением, встретил ошибку Database exception: Check connection string: Keyword not supported: data source                         Parameter name: keyword

В документации описано что надо просто скопировать строку connectionstring

Нравится

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

Добрый вечер.

 

Содержимое ConnectionString должно быть без "Server=".

Вот таким образом:

<ConnectionString>Data Source=localhost;

 

Добрый вечер.

 

Содержимое ConnectionString должно быть без "Server=".

Вот таким образом:

<ConnectionString>Data Source=localhost;

 

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

Здравствуйте, собираю по инструкции с академии, единственное имя поменял
https://academy.terrasoft.ru/docs/user/ustanovka_i_administrirovanie/ra…

 

Система чистая, это была первая сборка. Содержимое Dockerfile:

FROM mcr.microsoft.com/dotnet/core/sdk:3.1 AS base
EXPOSE 5000 5002

RUN apt-get update && \
    apt-get -y --no-install-recommends install \
    libgdiplus \
    libc6-dev && \
    apt-get clean all && \
    rm -rf /var/lib/apt/lists/* /var/cache/apt/*

WORKDIR /app
COPY . ./

FROM base AS final
WORKDIR /app
ENV ASPNETCORE_ENVIRONMENT Development
ENV TZ US/Eastern
ENTRYPOINT [ "dotnet", "Terrasoft.WebHost.dll" ]

FROM mcr.microsoft.com/dotnet/core/sdk:3.1 AS base
EXPOSE 5000 5002

RUN apt-get update && \
apt-get -y --no-install-recommends install \
libgdiplus \
libc6-dev && \
apt-get clean all && \
   rm -rf /var/lib/apt/lists/* /var/cache/apt/*

WORKDIR /app
COPY . ./

FROM base AS final
WORKDIR /app
ENV ASPNETCORE_ENVIRONMENT Development
ENV TZ US/Eastern
ENTRYPOINT [ "dotnet", "Terrasoft.WebHost.dll" ]

 

Нравится

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

Евгений, здравствуйте! 

 

Ошибка "base stage name already used" говорит, что у вас компонент уже используется.

Дело в том, что у вас код продублирован:

 

FROM mcr.microsoft.com/dotnet/core/sdk:3.1 AS base
EXPOSE 5000 5002

RUN apt-get update && \
    apt-get -y --no-install-recommends install \
    libgdiplus \
    libc6-dev && \
    apt-get clean all && \
    rm -rf /var/lib/apt/lists/* /var/cache/apt/*

WORKDIR /app
COPY . ./

FROM base AS final
WORKDIR /app
ENV ASPNETCORE_ENVIRONMENT Development
ENV TZ US/Eastern
ENTRYPOINT [ "dotnet", "Terrasoft.WebHost.dll" ]

FROM mcr.microsoft.com/dotnet/core/sdk:3.1 AS base
EXPOSE 5000 5002

RUN apt-get update && \
apt-get -y --no-install-recommends install \
libgdiplus \
libc6-dev && \
apt-get clean all && \
   rm -rf /var/lib/apt/lists/* /var/cache/apt/*

WORKDIR /app
COPY . ./

FROM base AS final
WORKDIR /app
ENV ASPNETCORE_ENVIRONMENT Development
ENV TZ US/Eastern
ENTRYPOINT [ "dotnet", "Terrasoft.WebHost.dll" ]

На Академии уже исправили этот момент:

 

https://academy.terrasoft.ru/docs/user/ustanovka_i_administrirovanie/ra…

 

Для продолжения работы нужно выполнить

FROM mcr.microsoft.com/dotnet/core/sdk:3.1 AS base
EXPOSE 5000 5002
RUN apt-get update && \
apt-get -y --no-install-recommends install \
libgdiplus \
libc6-dev && \
apt-get clean all && \
rm -rf /var/lib/apt/lists/* /var/cache/apt/*
WORKDIR /app
COPY . ./
FROM base AS final
WORKDIR /app
ENV ASPNETCORE_ENVIRONMENT Development
ENV TZ US/Eastern
ENV COMPlus_ThreadPool_ForceMinWorkerThreads 100
ENTRYPOINT ["dotnet", "Terrasoft.WebHost.dll"]

Вильшанский Дмитрий, здравствуйте подскажите в чем может быть проблема, ошибка вида:
Unhandled exception. System.Exception: Could not resolve a service of type 'Terrasoft.WebHost.IApplication' for the parameter 'application' of method 'Configure' on type 'Terrasoft.WebHost.Startup'.
 ---> Autofac.Core.DependencyResolutionException: An error occurred during the activation of a particular registration. See the inner exception for details. Registration: Activator = Application (ReflectionActivator), Services = [Terrasoft.WebHost.IApplication], Lifetime = Autofac.Core.Lifetime.RootScopeLifetime, Sharing = Shared, Ownership = OwnedByLifetimeScope ---> An error occurred during the activation of a particular registration. See the inner exception for details. Registration: Activator = RedisSessionSynchronizationService (ReflectionActivator), Services = [Terrasoft.WebHost.Session.ISessionSynchronizationService], Lifetime = Autofac.Core.Lifetime.RootScopeLifetime, Sharing = Shared, Ownership = OwnedByLifetimeScope ---> An error occurred during the activation of a particular registration. See the inner exception for details. Registration: Activator = RedisSessionSynchronizer (ReflectionActivator), Services = [Terrasoft.Redis.ISessionSynchronizer], Lifetime = Autofac.Core.Lifetime.RootScopeLifetime, Sharing = Shared, Ownership = OwnedByLifetimeScope ---> An error occurred during the activation of a particular registration. See the inner exception for details. Registration: Activator = IRedisClientsManager (DelegateActivator), Services = [Terrasoft.Redis.Abstractions.IRedisClientsManager], Lifetime = Autofac.Core.Lifetime.RootScopeLifetime, Sharing = Shared, Ownership = OwnedByLifetimeScope ---> No connection is available to service this operation: INFO; UnableToConnect on localhost:6379/Interactive, Initializing/NotStarted, last: NONE, origin: BeginConnectAsync, outstanding: 0, last-read: 0s ago, last-write: 0s ago, keep-alive: 60s, state: Connecting, mgr: 10 of 10 available, last-heartbeat: never, global: 0s ago, v: 2.0.601.3402; IOCP: (Busy=0,Free=1000,Min=4,Max=1000), WORKER: (Busy=0,Free=32767,Min=256,Max=32767), Local-CPU: n/a (See inner exception for details.) (See inner exception for details.) (See inner exception for details.) (See inner exception for details.)
 ---> Autofac.Core.DependencyResolutionException: An error occurred during the activation of a particular registration. See the inner exception for details. Registration: Activator = RedisSessionSynchronizationService (ReflectionActivator), Services = [Terrasoft.WebHost.Session.ISessionSynchronizationService], Lifetime = Autofac.Core.Lifetime.RootScopeLifetime, Sharing = Shared, Ownership = OwnedByLifetimeScope ---> An error occurred during the activation of a particular registration. See the inner exception for details. Registration: Activator = RedisSessionSynchronizer (ReflectionActivator), Services = [Terrasoft.Redis.ISessionSynchronizer], Lifetime = Autofac.Core.Lifetime.RootScopeLifetime, Sharing = Shared, Ownership = OwnedByLifetimeScope ---> An error occurred during the activation of a particular registration. See the inner exception for details. Registration: Activator = IRedisClientsManager (DelegateActivator), Services = [Terrasoft.Redis.Abstractions.IRedisClientsManager], Lifetime = Autofac.Core.Lifetime.RootScopeLifetime, Sharing = Shared, Ownership = OwnedByLifetimeScope ---> No connection is available to service this operation: INFO; UnableToConnect on localhost:6379/Interactive, Initializing/NotStarted, last: NONE, origin: BeginConnectAsync, outstanding: 0, last-read: 0s ago, last-write: 0s ago, keep-alive: 60s, state: Connecting, mgr: 10 of 10 available, last-heartbeat: never, global: 0s ago, v: 2.0.601.3402; IOCP: (Busy=0,Free=1000,Min=4,Max=1000), WORKER: (Busy=0,Free=32767,Min=256,Max=32767), Local-CPU: n/a (See inner exception for details.) (See inner exception for details.) (See inner exception for details.)
 ---> Autofac.Core.DependencyResolutionException: An error occurred during the activation of a particular registration. See the inner exception for details. Registration: Activator = RedisSessionSynchronizer (ReflectionActivator), Services = [Terrasoft.Redis.ISessionSynchronizer], Lifetime = Autofac.Core.Lifetime.RootScopeLifetime, Sharing = Shared, Ownership = OwnedByLifetimeScope ---> An error occurred during the activation of a particular registration. See the inner exception for details. Registration: Activator = IRedisClientsManager (DelegateActivator), Services = [Terrasoft.Redis.Abstractions.IRedisClientsManager], Lifetime = Autofac.Core.Lifetime.RootScopeLifetime, Sharing = Shared, Ownership = OwnedByLifetimeScope ---> No connection is available to service this operation: INFO; UnableToConnect on localhost:6379/Interactive, Initializing/NotStarted, last: NONE, origin: BeginConnectAsync, outstanding: 0, last-read: 0s ago, last-write: 0s ago, keep-alive: 60s, state: Connecting, mgr: 10 of 10 available, last-heartbeat: never, global: 0s ago, v: 2.0.601.3402; IOCP: (Busy=0,Free=1000,Min=4,Max=1000), WORKER: (Busy=0,Free=32767,Min=256,Max=32767), Local-CPU: n/a (See inner exception for details.) (See inner exception for details.)
 ---> Autofac.Core.DependencyResolutionException: An error occurred during the activation of a particular registration. See the inner exception for details. Registration: Activator = IRedisClientsManager (DelegateActivator), Services = [Terrasoft.Redis.Abstractions.IRedisClientsManager], Lifetime = Autofac.Core.Lifetime.RootScopeLifetime, Sharing = Shared, Ownership = OwnedByLifetimeScope ---> No connection is available to service this operation: INFO; UnableToConnect on localhost:6379/Interactive, Initializing/NotStarted, last: NONE, origin: BeginConnectAsync, outstanding: 0, last-read: 0s ago, last-write: 0s ago, keep-alive: 60s, state: Connecting, mgr: 10 of 10 available, last-heartbeat: never, global: 0s ago, v: 2.0.601.3402; IOCP: (Busy=0,Free=1000,Min=4,Max=1000), WORKER: (Busy=0,Free=32767,Min=256,Max=32767), Local-CPU: n/a (See inner exception for details.)
 ---> StackExchange.Redis.RedisConnectionException: No connection is available to service this operation: INFO; UnableToConnect on localhost:6379/Interactive, Initializing/NotStarted, last: NONE, origin: BeginConnectAsync, outstanding: 0, last-read: 0s ago, last-write: 0s ago, keep-alive: 60s, state: Connecting, mgr: 10 of 10 available, last-heartbeat: never, global: 0s ago, v: 2.0.601.3402; IOCP: (Busy=0,Free=1000,Min=4,Max=1000), WORKER: (Busy=0,Free=32767,Min=256,Max=32767), Local-CPU: n/a
 ---> StackExchange.Redis.RedisConnectionException: UnableToConnect on localhost:6379/Interactive, Initializing/NotStarted, last: NONE, origin: BeginConnectAsync, outstanding: 0, last-read: 0s ago, last-write: 0s ago, keep-alive: 60s, state: Connecting, mgr: 10 of 10 available, last-heartbeat: never, global: 0s ago, v: 2.0.601.3402
   --- End of inner exception stack trace ---
   at StackExchange.Redis.RedisServer.ExecuteSync[T](Message message, ResultProcessor`1 processor, ServerEndPoint server) in C:\projects\stackexchange-redis\src\StackExchange.Redis\RedisServer.cs:line 589
   at StackExchange.Redis.RedisServer.Info(RedisValue section, CommandFlags flags) in C:\projects\stackexchange-redis\src\StackExchange.Redis\RedisServer.cs:line 258
   at Terrasoft.Redis.StackExchangeAdapters.RedisClientAdapter.get_Info() in /opt/buildagent/work/ApplicationCoreLinux/TSBpm/Src/Lib/Terrasoft.Redis.StackExchangeAdapters/RedisClientAdapter.cs:line 64
   at Terrasoft.Redis.RedisValidator.GetVersion(IRedisClientsManager redisClientsManager) in /opt/buildagent/work/ApplicationCoreLinux/TSBpm/Src/Lib/Terrasoft.Redis/RedisValidator.cs:line 28
   at Terrasoft.Redis.RedisValidator.CheckVersion(IRedisClientsManager redisClientsManager) in /opt/buildagent/work/ApplicationCoreLinux/TSBpm/Src/Lib/Terrasoft.Redis/RedisValidator.cs:line 42
   at Terrasoft.Redis.RedisClientsManager..ctor(String connectionStringName, IRedisValidator redisValidator) in /opt/buildagent/work/ApplicationCoreLinux/TSBpm/Src/Lib/Terrasoft.Redis/RedisClientsManager.cs:line 57
   at Terrasoft.Redis.RedisClientsManager..ctor() in /opt/buildagent/work/ApplicationCoreLinux/TSBpm/Src/Lib/Terrasoft.Redis/RedisClientsManager.cs:line 39
   at Terrasoft.Redis.RedisClientsManager.<>c.<.cctor>b__21_1() in /opt/buildagent/work/ApplicationCoreLinux/TSBpm/Src/Lib/Terrasoft.Redis/RedisClientsManager.cs:line 75
   at System.Lazy`1.ViaFactory(LazyThreadSafetyMode mode)
   at System.Lazy`1.ExecutionAndPublication(LazyHelper executionAndPublication, Boolean useDefaultConstructor)
   at System.Lazy`1.CreateValue()
   at System.Lazy`1.get_Value()
   at Terrasoft.Redis.RedisClientsManager.get_Instance() in /opt/buildagent/work/ApplicationCoreLinux/TSBpm/Src/Lib/Terrasoft.Redis/RedisClientsManager.cs:line 80
   at Terrasoft.Redis.RedisExtensions.<>c.<AddRedis>b__0_0(IServiceProvider container) in /opt/buildagent/work/ApplicationCoreLinux/TSBpm/Src/Lib/Terrasoft.Redis/RedisExtensions.cs:line 15
   at Terrasoft.Core.DI.ServiceProvider.ServiceProviderAutofacModule.<>c__DisplayClass15_0.<ConfigureFactoryBinding>b__0(IComponentContext context, IEnumerable`1 parameters) in /opt/buildagent/work/ApplicationCoreLinux/TSBpm/Src/Lib/Terrasoft.Core.DI/ServiceProvider/ServiceProviderAutofacModule.cs:line 216
   at Autofac.Core.Activators.Delegate.DelegateActivator.ActivateInstance(IComponentContext context, IEnumerable`1 parameters)
   at Autofac.Core.Resolving.InstanceLookup.Activate(IEnumerable`1 parameters, Object& decoratorTarget)
   --- End of inner exception stack trace ---
   at Autofac.Core.Resolving.InstanceLookup.Activate(IEnumerable`1 parameters, Object& decoratorTarget)
   at Autofac.Core.Resolving.InstanceLookup.<>c__DisplayClass5_0.<Execute>b__0()
   at Autofac.Core.Lifetime.LifetimeScope.GetOrCreateAndShare(Guid id, Func`1 creator)
   at Autofac.Core.Resolving.InstanceLookup.Execute()
   at Autofac.Core.Resolving.ResolveOperation.GetOrCreateInstance(ISharingLifetimeScope currentOperationScope, IComponentRegistration registration, IEnumerable`1 parameters)
   at Autofac.Core.Resolving.InstanceLookup.ResolveComponent(IComponentRegistration registration, IEnumerable`1 parameters)
   at Autofac.Core.Activators.Reflection.AutowiringParameter.<>c__DisplayClass0_0.<CanSupplyValue>b__0()
   at Autofac.Core.Activators.Reflection.ConstructorParameterBinding.Instantiate()
   at Autofac.Core.Activators.Reflection.ReflectionActivator.ActivateInstance(IComponentContext context, IEnumerable`1 parameters)
   at Autofac.Core.Resolving.InstanceLookup.Activate(IEnumerable`1 parameters, Object& decoratorTarget)
   --- End of inner exception stack trace ---
   at Autofac.Core.Resolving.InstanceLookup.Activate(IEnumerable`1 parameters, Object& decoratorTarget)
   at Autofac.Core.Resolving.InstanceLookup.<>c__DisplayClass5_0.<Execute>b__0()
   at Autofac.Core.Lifetime.LifetimeScope.GetOrCreateAndShare(Guid id, Func`1 creator)
   at Autofac.Core.Resolving.InstanceLookup.Execute()
   at Autofac.Core.Resolving.ResolveOperation.GetOrCreateInstance(ISharingLifetimeScope currentOperationScope, IComponentRegistration registration, IEnumerable`1 parameters)
   at Autofac.Core.Resolving.InstanceLookup.ResolveComponent(IComponentRegistration registration, IEnumerable`1 parameters)
   at Autofac.Core.Activators.Reflection.AutowiringParameter.<>c__DisplayClass0_0.<CanSupplyValue>b__0()
   at Autofac.Core.Activators.Reflection.ConstructorParameterBinding.Instantiate()
   at Autofac.Core.Activators.Reflection.ReflectionActivator.ActivateInstance(IComponentContext context, IEnumerable`1 parameters)
   at Autofac.Core.Resolving.InstanceLookup.Activate(IEnumerable`1 parameters, Object& decoratorTarget)
   --- End of inner exception stack trace ---
   at Autofac.Core.Resolving.InstanceLookup.Activate(IEnumerable`1 parameters, Object& decoratorTarget)
   at Autofac.Core.Resolving.InstanceLookup.<>c__DisplayClass5_0.<Execute>b__0()
   at Autofac.Core.Lifetime.LifetimeScope.GetOrCreateAndShare(Guid id, Func`1 creator)
   at Autofac.Core.Resolving.InstanceLookup.Execute()
   at Autofac.Core.Resolving.ResolveOperation.GetOrCreateInstance(ISharingLifetimeScope currentOperationScope, IComponentRegistration registration, IEnumerable`1 parameters)
   at Autofac.Core.Resolving.InstanceLookup.ResolveComponent(IComponentRegistration registration, IEnumerable`1 parameters)
   at Autofac.Core.Activators.Reflection.AutowiringParameter.<>c__DisplayClass0_0.<CanSupplyValue>b__0()
   at Autofac.Core.Activators.Reflection.ConstructorParameterBinding.Instantiate()
   at Autofac.Core.Activators.Reflection.ReflectionActivator.ActivateInstance(IComponentContext context, IEnumerable`1 parameters)
   at Autofac.Core.Resolving.InstanceLookup.Activate(IEnumerable`1 parameters, Object& decoratorTarget)
   --- End of inner exception stack trace ---
   at Autofac.Core.Resolving.InstanceLookup.Activate(IEnumerable`1 parameters, Object& decoratorTarget)
   at Autofac.Core.Resolving.InstanceLookup.<>c__DisplayClass5_0.<Execute>b__0()
   at Autofac.Core.Lifetime.LifetimeScope.GetOrCreateAndShare(Guid id, Func`1 creator)
   at Autofac.Core.Resolving.InstanceLookup.Execute()
   at Autofac.Core.Resolving.ResolveOperation.GetOrCreateInstance(ISharingLifetimeScope currentOperationScope, IComponentRegistration registration, IEnumerable`1 parameters)
   at Autofac.Core.Resolving.ResolveOperation.ResolveComponent(IComponentRegistration registration, IEnumerable`1 parameters)
   at Autofac.Core.Resolving.ResolveOperation.Execute(IComponentRegistration registration, IEnumerable`1 parameters)
   at Autofac.Core.Lifetime.LifetimeScope.ResolveComponent(IComponentRegistration registration, IEnumerable`1 parameters)
   at Autofac.ResolutionExtensions.TryResolveService(IComponentContext context, Service service, IEnumerable`1 parameters, Object& instance)
   at Autofac.ResolutionExtensions.ResolveService(IComponentContext context, Service service, IEnumerable`1 parameters)
   at Autofac.ResolutionExtensions.Resolve(IComponentContext context, Type serviceType, IEnumerable`1 parameters)
   at Autofac.ResolutionExtensions.Resolve(IComponentContext context, Type serviceType)
   at Autofac.Extensions.DependencyInjection.AutofacServiceProvider.GetRequiredService(Type serviceType)
   at Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetRequiredService(IServiceProvider provider, Type serviceType)
   at Microsoft.AspNetCore.Hosting.ConfigureBuilder.Invoke(Object instance, IApplicationBuilder builder)
   --- End of inner exception stack trace ---
   at Microsoft.AspNetCore.Hosting.ConfigureBuilder.Invoke(Object instance, IApplicationBuilder builder)
   at Microsoft.AspNetCore.Hosting.ConfigureBuilder.<>c__DisplayClass4_0.<Build>b__0(IApplicationBuilder builder)
   at Microsoft.AspNetCore.Hosting.GenericWebHostBuilder.<>c__DisplayClass13_0.<UseStartup>b__2(IApplicationBuilder app)
   at Microsoft.AspNetCore.Mvc.Filters.MiddlewareFilterBuilderStartupFilter.<>c__DisplayClass0_0.<Configure>g__MiddlewareFilterBuilder|0(IApplicationBuilder builder)
   at Microsoft.AspNetCore.HostFilteringStartupFilter.<>c__DisplayClass0_0.<Configure>b__0(IApplicationBuilder app)
   at Microsoft.AspNetCore.Hosting.GenericWebHostService.StartAsync(CancellationToken cancellationToken)
   at Microsoft.Extensions.Hosting.Internal.Host.StartAsync(CancellationToken cancellationToken)
   at Microsoft.Extensions.Hosting.HostingAbstractionsHostExtensions.RunAsync(IHost host, CancellationToken token)
   at Microsoft.Extensions.Hosting.HostingAbstractionsHostExtensions.RunAsync(IHost host, CancellationToken token)
   at Microsoft.Extensions.Hosting.HostingAbstractionsHostExtensions.Run(IHost host)
   at Terrasoft.WebHost.Program.StartWebApplication(String[] args) in /opt/buildagent/work/ApplicationCoreLinux/TSBpm/Src/Lib/Terrasoft.WebHost/Program.cs:line 28
   at Terrasoft.WebHost.Program.<>c__DisplayClass2_0.<Main>b__0(StartOptions _) in /opt/buildagent/work/ApplicationCoreLinux/TSBpm/Src/Lib/Terrasoft.WebHost/Program.cs:line 61
   at CommandLine.ParserResultExtensions.MapResult[T1,T2,TResult](ParserResult`1 result, Func`2 parsedFunc1, Func`2 parsedFunc2, Func`2 notParsedFunc)
   at Terrasoft.WebHost.Program.Main(String[] args) in /opt/buildagent/work/ApplicationCoreLinux/TSBpm/Src/Lib/Terrasoft.WebHost/Program.cs:line 64

Евгений Шевченко,Это ошибка при сборке images*

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

Добрый день! Поставили sales 7.17.3 1377 релиз. Проблема с кнопками видна на скрине,  в системе язык русский и у пользователя то же

Нравится

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

Проверьте доступы на папку Terrasoft.WebApp\ClientApp\assets\i18n

Полозюков Евгений Петрович,Да права полные разданы в т.ч. и пользователю iis

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

Привет. 
Нудно создать редактируемый грида в DataView (по аналогии с "Расписанием" в активностях) из отдельной таблицы.
Насколько я понимаю все сводиться к созданию своего аналога GridData, возможно с логикой из схема "Деталь с редактируемым реестром". Но опять же интересуют детали.

Есть идеи или примеры кода по реализации?

Нравится

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

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

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

Создание редактируемой детали на странице не проблема, проблема доставание этого грида и помещение его в схему раздела (Section) по соседству с основным.

По соседству — это как? Он должен выводить с фильтром по записи в основном реестре? Так такое уже есть в любом разделе с редактируемой деталью, если в карточке слева открыть панель с вертикальным реестром. Например, раздел «Заказы»:

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

по соседству с базовым DataView, а именно на новом(DataView), мной созданным.
Пример что имею ввиду под этим показано на скрине, это раздел Активности: 
 

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

Андреев Андрей Сергеевич,

Возможно, раздел "Планирование" похож на ваши задачи?

Андрей, таких не видел. Есть разные дополнения, добавляющие в разделы ещё одну кнопку, включающую режим с каким-то необычным видом, например, бесплатное «Канбан-доска» или два вида «Диаграммы Гантта» (но те платные). Установив, можно увидеть, как происходит добавление компонента и работа в нём с данными в таблице раздела.

Владимир Соколов пишет:
Возможно, раздел "Планирование" похож на ваши задачи?

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

Зверев Александр пишет:

Кстати, планируется в интерфейсе пользователя появление новых контролов на Angular? Или всё останется в конфигураторе? 

А есть какие-то конкретные пожелания по недостающим компонентам в мастере раздела или главное, чтобы новые и именно на Angular?

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

Есть необходимость перенести данные справочника Tax , включая id,на препрод
Я спросил как это правильно сделать, и мне посоветовали создать замещающий объект, но при попытке публикации пишет , что Элемент с именем "Tax" не найден
Для исправления ошибки, пробовал советы из этой темы  https://community.terrasoft.ru/questions/oshibka-sokhraneniya-element-n…
А именно генерацию исходных кодов, просто вылетает страница с ошибкой
А при компиляции всего, вылетает Элемент с именем "Tax" не найден

Нравится

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

Не совсем понял, что Вы собирались сделать: перенести записи в справочнике или его схему?

Если первое, то нужно, чтобы на базе, куда переностите, уже была такая схема и создавшаяся по ней после публикации таблица в БД. Или же схема создавалась или дополнялась в том же пакете, что и данные в неё. А наполнение справочника затем переносить при помощи привязки данных к пакету.

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

Объект Tax — стандартный, у Вас в нём есть какие-то доработки?

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

Коллеги, не нашла описания, подскажите или ссылкой.

Версия 7.15, sale. В карточке создала поле Дата. Где поставить признак, чтобы по умолчанию - отображать текущую дату. Т.е. карточка открывается для создания новой записи - и дата текущая уже проставлена.

Спасибо.

Нравится

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

Открыть объект через конфигурацию. Выбрать в дереве элементов (слева) свою колонку. В свойствах колонки (справа) выбрать "Значение по умолчанию" -> "Установить из системной переменной" - > "Текущее значение даты". После чего опубликовать объект.

Открыть объект через конфигурацию. Выбрать в дереве элементов (слева) свою колонку. В свойствах колонки (справа) выбрать "Значение по умолчанию" -> "Установить из системной переменной" - > "Текущее значение даты". После чего опубликовать объект.

Добрый день.

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

Ознакомиться с пошаговой инструкцией можно в этой статье.

Коллеги, огромное спасибо. Не ожидала, что Аналитик теперь и в конфигурации работает :)))

Милова Марина,

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

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

Добрый день!

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

EntitySchema schema = _userConnection.EntitySchemaManager.FindInstanceByName("Account");

в результате schema == null

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

Нравится

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

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

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

Добрый день!

Необходимо выделить лиды которые не были открыты пользователем. 

Есть следующий код:

define("LeadSectionV2", [], function() {
	return {
		entitySchemaName: "Lead",
		details: /**SCHEMA_DETAILS*/{}/**SCHEMA_DETAILS*/,
		diff: /**SCHEMA_DIFF*/[]/**SCHEMA_DIFF*/,
		methods: {
			prepareResponseCollectionItem: function(item) {
				this.callParent(arguments);
				var scope = this;
				var esq = Ext.create("Terrasoft.EntitySchemaQuery", {
					rootSchemaName: "UsrLeadStatusByUser"
				});
				esq.addColumn("Id");
				var esqFirstFilter = esq.createColumnFilterWithParameter(Terrasoft.ComparisonType.EQUAL, "UsrLead", item.get("Id"));
				var esqSecondFilter = esq.createColumnFilterWithParameter(Terrasoft.ComparisonType.EQUAL, "UsrContact", Terrasoft.SysValue.CURRENT_USER_CONTACT.value);
				esq.filters.logicalOperation = Terrasoft.LogicalOperatorType.AND;
				esq.filters.add("esqFirstFilter", esqFirstFilter);
				esq.filters.add("esqSecondFilter", esqSecondFilter);
				esq.getEntityCollection(function (result) {
					if (result.success &amp;&amp; result.collection.collection.items.length &gt; 0) {
						//Лид уже был просмотрен
						item.customStyle = null;
					}else{
						//Лид еще ни разу не открывали
						item.customStyle = {
							"color": "white",
							"background": "#8ecb60",
							"font-weight": "bold"
						};
					}
				}, scope);
			}
		}
	};
});

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

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

Нравится

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

В объектной модели Лида, добавьте например булево значения IsViewed, в момент открытия карточки, обновляйте это значение.
А подкрашивание грида, делайте уже от этого параметра IsVewed (true/false).

В объектной модели Лида, добавьте например булево значения IsViewed, в момент открытия карточки, обновляйте это значение.
А подкрашивание грида, делайте уже от этого параметра IsVewed (true/false).

Спасибо, Павел! Скорее всего так и поступлю. Хотел сделать по пользователям, но откажусь от этой затеи.

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

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

Путем использования сообщений, вызовите в разделе метод this.refreshGridData();

Примерно так:
 

init: function() {
	this.callParent(arguments);
	this.sandbox.subscribe("NeedReloadLeadGrid", this.customMethod, this);
},
customMethod: function() {
	//если нужно что-то еще сделать, то делаете, а потом:
	this.refreshGridData();
}
 
messages: {
	"NeedReloadLeadGrid": {
		"mode": Terrasoft.MessageMode.PTP,
		"direction": Terrasoft.MessageDirectionType.SUBSCRIBE
	}
}
 
 
На карточке лида, по сохранению/закрытии/изменении параметра, в общем там, где вам нужно, вызываете публикацию данного сообщения.
 
messages: {
	"NeedReloadLeadGrid": {
		"mode": Terrasoft.MessageMode.PTP,
		"direction": Terrasoft.MessageDirectionType.PUBLISH
	}
}
 
callPublish_YourCustomMethod: function() {
	this.sandbox.publish("NeedReloadLeadGrid", null, ["_NeedReloadLeadGrid"]);
}
 
//вместо null можете передать объектом параметры, при необходимости

 

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

Добрый день

в наличии bpmonline, куплен Terrasoft Messaging Service.

Подскажите каким образом осуществляется связь  с asterisk.

Насколько я понял Terrasoft Messaging Service осуществляет связь bpmonline по ami . Каким образом осуществляется проброс звонка на ответственного ? (получается нужно при помощи  апи  и телефона звонящего узнать  из bpmonline ответственного и перенаправить звонок ему. Что будет ему карточку всплывашку показывать.???)

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

спасибо. 

Нравится

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

sandal пишет:
Литвинко Павел,Спасибо за ответ. Ситуация - звонит клиент , астер принял звонок необходимо направить на ответственного за данный номер ? (по идее надо выдернуть номер ответственного из bpmonline и средствами астера направить на ответственного ). тут же вопросы по как сделать всплывашку для ответственного в bpmonline. Может есть коннектор платный который может перенаправлять на ответственного , показывать всплывашку..... спасибо

Вам нужно делать интеграцию по средствам веб-сервисов с Астериском, где в BPM найдете ответственного, узнаете его номер линии и передадите Астериску, а Астериск на своей стороне уже осуществит перенаправление на нужную линию. Без интеграции никак. Либо давать доступ в БД, для Астериска, чтобы они сами делали запросы в нужные таблицы и искали нужного человека и уже потом распределяли.
Со стороны BPM например сделать табличку, в которую будут записываться Номера линий и их связанные записи, для упрощения поиска Астериску и для уменьшения доступа в БД. 

Вы при настройки BPM, выбираете тип интеграции, в вашем случае Asterisk, затем в профиле, вы указываете номер линии пользователя.
На этот номер уже и распределяется звонок. Операторы используют приложение "софтфон", в котором настраивается подключение к Астериску, по этому же номеру линии, через софтфон оператор и разговаривает с клиентами.
Связка с TMS, уже позволяет дублировать звонок в саму BPM. Ответсвенным по звонку соответственно является текущий пользователя софтфона, который указан в настройках BPM

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

Если в движке телефонии есть возможность запуска скриптов, можно на стороне 7.13 сделать веб-сервис (анонимный или с авторизацией), который по номеру клиента возвращает номер сотрудника, а далее работать с ним.

Литвинко Павел,

Спасибо за ответ. Ситуация - звонит клиент , астер принял звонок необходимо направить на ответственного за данный номер ? (по идее надо выдернуть номер ответственного из bpmonline и средствами астера направить на ответственного ). тут же вопросы по как сделать всплывашку для ответственного в bpmonline. Может есть коннектор платный который может перенаправлять на ответственного , показывать всплывашку..... спасибо

sandal пишет:
Литвинко Павел,Спасибо за ответ. Ситуация - звонит клиент , астер принял звонок необходимо направить на ответственного за данный номер ? (по идее надо выдернуть номер ответственного из bpmonline и средствами астера направить на ответственного ). тут же вопросы по как сделать всплывашку для ответственного в bpmonline. Может есть коннектор платный который может перенаправлять на ответственного , показывать всплывашку..... спасибо

Вам нужно делать интеграцию по средствам веб-сервисов с Астериском, где в BPM найдете ответственного, узнаете его номер линии и передадите Астериску, а Астериск на своей стороне уже осуществит перенаправление на нужную линию. Без интеграции никак. Либо давать доступ в БД, для Астериска, чтобы они сами делали запросы в нужные таблицы и искали нужного человека и уже потом распределяли.
Со стороны BPM например сделать табличку, в которую будут записываться Номера линий и их связанные записи, для упрощения поиска Астериску и для уменьшения доступа в БД. 

Литвинко Павел,

авторизация на php проходит. попытка выдернуть номер ответственного не удается. смотрел как https://docs.webitel.com/pages/viewpage.action?pageId=73793602 . на выходе 

[3] => {"rowConfig":{"Id":{"dataValueType":0},"Name":{"dataValueType":1},"OwnerLogin":{"dataValueType":1},"Photo":{"dataValueType":16,"isLookup":true,"referenceSchemaName":"SysImage"}},"rows":[{"Name":"-","OwnerLogin":"","Id":"6dbd0b03-fb20-49a6-b3bd-0bb56d5dc8a0","Photo":""}],"notFoundColumns":[],"rowsAffected":1,"nextPrcElReady":false,"success":false}

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

в запросе не могу понять куда вставить ( наверное по этому и не возвращает то что надо.)

"exportVariables": { "Contact": "rows.0.Name",
"owner_caller_id_number": "rows.0.OwnerLogin"
            }

Может есть примеры общения с апи ?

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

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

Добрый день. а как это все посмотреть?. все это я пытаюсь запихнуть в curl php.

из примера 

{
    "httpRequest": {
        "exportCookie": "my_cookie",
        "url": "https://my.bpmonline.com/ServiceModel/AuthService.svc/Login",
        "method": "POST",
        "headers": {
            "Content-Type": "application/json"
        },
        "data": {
            "UserName": "Supervisor",
            "UserPassword": "Supervisor"
        }
    }
}

преобразовывается в php curl

$url = "https://bpm.xxxx.com/ServiceModel/AuthService.svc/Login";
$requestData["UserName"] = "xxx";
$requestData["UserPassword"] = "yyy";
echo $jcres = json_encode($requestData);
echo "\n";
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_COOKIEJAR,'cookie.txt');
curl_setopt($ch, CURLOPT_COOKIEFILE, 'cookie.txt');
curl_setopt($ch, CURLOPT_HEADER,1);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");
curl_setopt($ch, CURLOPT_POSTFIELDS, $jcres);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
'Content-Type: application/json',
'Content-Length: ' . strlen($jcres))
);
$result = curl_exec($ch);
echo $result;
echo "\n";

curl_close($ch);
 

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

{
    "httpRequest": {
        "url": "https://my.bpmonline.com/0/dataservice/json/reply/SelectQuery",
        "method": "POST",
        "headers": {
            "Cookie": "${my_cookie}",
            "Accept": "application/json;odata=verbose"
        },
        "exportVariables": {
            "effective_caller_id_name": "rows.0.Name",
            "owner_caller_id_number": "rows.0.OwnerLogin"
        },
        "data": {
            "QueryType": 0,
            "Columns": {
                "Items": {
                    "Name": {
                        "OrderDirection": 0,
                        "OrderPosition": 0,
                        "Caption": null,
                        "Expression": {
                            "ExpressionType": 0,
                            "ColumnPath": "Name"
                        }
                    },
                    "OwnerLogin": {
                        "OrderDirection": 0,
                        "OrderPosition": 0,
                        "Caption": null,
                        "Expression": {
                            "ExpressionType": 0,
                            "ColumnPath": "[WSysAccount:Contact:Owner].Login"
                        }
                    }
                }
            },
            "AllColumns": false,
            "IsDistinct": false,
            "RowCount": 1,
            "Filters": {
                "FilterType": 6,
                "ComparisonType": 0,
                "LogicalOperation": 0,
                "IsNull": true,
                "IsEnabled": true,
                "IsNot": false,
                "Items": {
                    "FilterByPhone": {
                        "FilterType": 1,
                        "ComparisonType": 9,
                        "LogicalOperation": 0,
                        "IsNull": true,
                        "IsEnabled": true,
                        "IsNot": false,
                        "LeftExpression": {
                            "ExpressionType": 0,
                            "ColumnPath": "[ContactCommunication:Contact].SearchNumber"
                        },
                        "RightExpression": {
                            "ExpressionType": 2,
                            "ColumnPath": null,
                            "Parameter": {
                                "DataValueType": 1,
                                "Value": "${reverted_caller_id_number}"
                            }
                        }
                    }
                }
            },
            "RootSchemaName": "Contact",
            "OperationType": 0
        }
    }
}

вот с этим не понятно что делать ? в  "Value": "${reverted_caller_id_number}" мы поместим среверсированый номер телефона.

и в post data вставим  "data": и даже что то возвращает запрос.

{"rowConfig":{"Id":{"dataValueType":0},"Name":{"dataValueType":1},"OwnerLogin":{"dataValueType":1},"Photo":{"dataValueType":16,"isLookup":true,"referenceSchemaName":"SysImage"}},"rows":[{"Name":"-","OwnerLogin":"","Id":"6dbd0b03-fb20-49a6-b3bd-0bb56d5dc8a0","Photo":""}],"notFoundColumns":[],"rowsAffected":1,"nextPrcElReady":false,"success":false}
 

но я не пойму как вставить в запрос

        "exportVariables": {
            "effective_caller_id_name": "rows.0.Name",
            "owner_caller_id_number": "rows.0.OwnerLogin"
        },

как вообще дебажить эти запросы??? которые идут как "httpRequest": {

 

 

Смотреть и вручную отправлять нужные запросы к веб-сервисам можно при помощи Fiddler. А смотреть, что выбирается при выполнении и какой текст запросов в базу, можно в SQL-профайлере. Учтите, приведенный код предназначен для интеграции с другой телефонией Webitel, а не Asterisk, используемый набор полей в них может отличаться.

Парни вы трезвые тут!!!

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

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

Есть запрос есть ответ, но в ответе ничего внятного нет, и нету никакого понимания что с этим ответом можно сделать дальше. 
Направте пожалуйста в нужное русло. Если вы смотрели АПИ других CRM систем там такое есть могу показать что надо. 

 

 

Нужное русло для трезвых: разработать веб-сервис в конфигурации, который получает на вход один номер и возвращает другой по нужному заказчику алгоритму, далее из телефонии работать с ним. Либо, если уже нашли подходящий пример работы со стандартным сервисом dataservice, отладить работу с ним в fiddler, убедиться, что в ответ на запрос приходит нужный ответ, затем уже работать с веб-сервисом из телефонии.

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