Коллеги, добрый день! Ситуация следующая - был создан простой объект, и в момент компиляции вывалилась ошибка - "ссылка на объект не указывает на экземпляр объекта" - поэтому решил удалить его, и создать заново. Подскажите пожалуйста, с каких sql таблиц надо поудалять информацию об этом объекте, чтобы можно было создавать новый с таким же именем, и как быть, если я не знаю какой у него ID (так как при нажатии "открыть метаданные" тоже вылетает ошибка как выше).
Спасибо!

Нравится

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

Нужно удалить записи из таблиц SysSchema и SysSchemaInSolution. Во второй находите все записи по названию или заголовку (для одной схемы может быть несколько версий), смотрите идентификатор SysSchemaId и по нему находите запись в первой.

Александр, Вы как обычно - выручаете!:smile: Спасибо!

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

Подскажите пожалуйста, как можно переместить CONTROL_GROUP в правую часть окна. Фото прикрепил к сообщению.

Нравится

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

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

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

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

{
	"operation": "insert",
	"parentName": "GeneralInfoTab",
	"propertyName": "items",
	"name": "TestBlock",
	"values": {
		"itemType": Terrasoft.ViewItemType.GRID_LAYOUT,
		"items": []
	}

И добавить в него нужные групы полей.

Cпробуй так

{
                "operation": "insert",
                "parentName": "GeneralInfoTab",
                "propertyName": "items",
                "name": "TestBlock",
                "values": {
                    "itemType": Terrasoft.ViewItemType.GRID_LAYOUT,
                    "items": []
                }
            },
{
                "operation": "insert",
                "name": "OptionsDepartureGroup",
                "parentName": "TestBlock",
                "propertyName": "items",
                "values": {
                    "itemType": Terrasoft.ViewItemType.CONTROL_GROUP,
                    "items": [],
                    "caption": "..."
                },
                index: 1
            },
{
                "operation": "insert",
                "name": "AdditionallyGroup",
                "parentName": "TestBlock",
                "propertyName": "items",
                "values": {
                    "itemType": Terrasoft.ViewItemType.CONTROL_GROUP,
                    "items": [],
                    "caption": "..."
                },
                index: 2
            },

Нет не работает (

Видел подобную реализацию на маркетплэйсе
https://www.terrasoft.ua/bpmonline-marketplace/cargo-logistics-powered-…
Попробуйте спросить у данного разработчика.

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

http://www.community.terrasoft.ru/forum/topic/17086

[quote="Полозюков Евгений Петрович"]Создал тему с решением. Кидайте ссылку, если будет подобный вопрос.

http://www.community.terrasoft.ru/forum/topic/17086[/quote]

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

я бы не рекомендовал решать данную задачу предлагаемым Евгением путем. Так как это не отвечает идеологии BootStrap. Так как к примеру вам требуется Отображать или скрывать по условию Как сами контрол-группы, так и поля внутри данных контролов. При скрытии или отображение к примеру требуется чтобы изменялся автоматически размер как Контрол-Группы, так и автоматически смещались поля вверх или вниз Внутри контрол-группы. Используя предлагаемое Евгением решение данную задачу не решит. Если задача для вас Александр Актуальна и вам интересно как ее можно решить правильным способом, пишите. Я тогда приведу правильный пример в рамках данного Инцидента. Спасибо!!!

Михаил, было бы интересно увидеть Ваш пример реализации. Заранее спасибо.

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

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

Нравится

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

Добрый день, коллеги.
Такой вопрос: есть ли возможность не показывать пользователю в зависимости от его прав доступа колонку "Дата создания" (CreatedOn) в DataGrid-е? В Инструменты -> Администрирование -> Права доступа к полям колонок ID, CreatedOn, CreatedByID, ModifiedOn и ModifiedByID нет. Похоже, если запретить пользователю доступ к ним то он вообще не сможет сохранять и изменять записи в таблице.
У меня только одна мысль - сделать два DataGridView, один с колонкой, другой без и переключать их при открытии реестра. Тогда другой вопрос: можно ли скрыть панельку, на которой перечисляются все DataGridView, чтобы пользователь сам не мог поменять представление.
Версия Terrasoft: TerrasoftCRM 3.3.2

Нравится

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

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

поля ID, CreatedOn, CreatedByID заполняются автоматически в момент создания записи, а поля ModifiedOn, ModifiedByID заполняются в момент изменения записи.

Доступ к этим полям должен быть всегда у всех пользователей.

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

Пример:

function wnd_AccountsGridAreaOnPrepare(Window) {
	wnd_BaseGridAreaOnPrepare(Window);
	Initialize(Window);
 
	var IsVisibleGV = false;
	if (Ваше условие) {
		IsVisibleGV = true;
	}
	gvMyAccounts.IsVisibel = IsVisibleGV;
	gvAll.IsVisibel = !IsVisibleGV;
}

Спасибо, Павел.
Что-то я проглядел, что у представлений есть свойство видимости.

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

Здравствуйте!
Возникла проблема при копировании записей.
Использую следующий конструктор:
var newEntity = new Entity (entity);
Запись корректно создается, однако события объекта не срабатывают, в чем может быть проблема?

Полный код приведен ниже:

private void copyRouteDetail(Guid TemplateId, Guid TransRequestId) {
        EntitySchema schema = UserConnection.EntitySchemaManager.GetInstanceByName("SxRouteDetailTransRequest");
        EntitySchemaQuery esq = new EntitySchemaQuery(schema);
        esq.AddAllSchemaColumns();
        esq.UseAdminRights = false;
        esq.Filters.Add(esq.CreateFilterWithParameters(FilterComparisonType.Equal,
                                                        "SxRouteOptions", TemplateId));
        EntityCollection entities = esq.GetEntityCollection(UserConnection);
         foreach (Entity entity in entities)
        {
                var newEntity = new Entity (entity);
                newEntity.SetColumnValue("SxRouteOptionsId", null);
                newEntity.SetColumnValue("SxTransRequestId", TransRequestId);
                newEntity.UseAdminRights = false;
                newEntity.Save(false);
        }
}

Нравится

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

Здравствуйте, данный вопрос будет решён в рамках Вашего обращения №0300267

"Пащенко Александр Сергеевич" написал:Запись корректно создается, однако события объекта не срабатывают, в чем может быть проблема?

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

я бы рекомендовал внимательно проанализировать все бизнес-процессы выполняемые в сохраняемом Entity, внимательно проанализировать сначало Глазами, а потом внимательно проанализировать в Дебагере, что происходит в вашей базе данных при сохранение, и найти место где возникает исключение, при котором запись создается, но не выполняются события.

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

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

Данную задачу можно решить следующим образом:

var userConnection = context.UserConnection;
var schema = UserConnection.EntitySchemaManager.GetInstanceByName("Account");
var newEntity = schema.CreateEntity(UserConnection);
newEntity.SetDefColumnValues();
//код установки значений колонок объекта
newEntity.Save();

Упростить задачу копирования значений колонок из одного объекта в другой можно используя метод public IEnumerable GetColumnValueNames(), который возвращает имена колонок объекта. Затем перебирая в foreach результат данного метода скопировать значения колонок."

При отладке, единственная разница, которую нашел - при использовании конструктора
var newEntity = new Entity(oldEntity)
у newEntity.Process=null,
у oleEntity.Process = не nulll, а ссылка на метод.

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

Данную задачу можно решить следующим образом:

var userConnection = context.UserConnection;
var schema = UserConnection.EntitySchemaManager.GetInstanceByName("Account");
var newEntity = schema.CreateEntity(UserConnection);
newEntity.SetDefColumnValues();
//код установки значений колонок объекта
newEntity.Save();

Упростить задачу копирования значений колонок из одного объекта в другой можно используя метод public IEnumerable GetColumnValueNames(), который возвращает имена колонок объекта. Затем перебирая в foreach результат данного метода скопировать значения колонок."

При отладке, единственная разница, которую нашел - при использовании конструктора
var newEntity = new Entity(oldEntity)
у newEntity.Process=null,
у oleEntity.Process = не nulll, а ссылка на метод.

"Пащенко Александр Сергеевич" написал:Данную задачу можно решить следующим образом:

var userConnection = context.UserConnection;
var schema = UserConnection.EntitySchemaManager.GetInstanceByName("Account");
var newEntity = schema.CreateEntity(UserConnection);
newEntity.SetDefColumnValues();
//код установки значений колонок объекта
newEntity.Save();

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

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

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

Спасибо за отклик!

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

вы свою задачу можете вообще решить иструментами бизнес-процесса, и поидее это будет правильно. Подглядеть к примеру можно в бизнес-процесс  CreateInvoiceFromOrder . В данном бизнес процессе как раз происходит копирование продуктов из Заказа в Счет. Я бы пошел по данному пути.

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

Дорого времени суток, коллеги.
У нас возник один интересный кейс, необходимо реализовать страницу "Политика конфиденциальности" с кучей текста, так чтобы она была доступна со страницы регистрации. Подскажите, как правильно сделать?
Я виже путь через отдельную .aspx страницу. Как ее можно правильно реализовать?

Нравится

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

Здравствуйте.
Рекомендую для начала ознакомиться с:
https://academy.terrasoft.ru/documents/technic-sdk/7-8-0/dokumentaciya-…
Вопрос очень расплывчат. Пробуйте начинать реализацию и, уже, по ходу любопытсвовать, ежели возникнут сложности.

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

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

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

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

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

Здравствуйте! Интересует вопрос как я могу отдавать запросы из системы.
Например мне нужно сделать автоматический отчет про количество заявок по продуктам на каждого менеджера. Я из внешнего приложения могу делать запрос и в параметре передавать код который соответствует менеджеру. Могу ли я както сформировать ответ на этот запрос в БП и передать результат в Json или в чемто другом? И как это сделать? Спасибо.

Нравится

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

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

Вы можете запустить процесс, передав в него нужный параметр. Также в результирующем параметре процесса Вы можете получить результат выполнения процесса, например строку JSON.
Более подробно:
https://academy.terrasoft.ru/documents/technic-sdk/7-7-0/zapusk-process…

Запускать процессы через Execute я умею. А вот отдавать результат запроса внешнему приложению - такого в этой статье нету. Это вообще возможно? Где можна посмотреть пример реализации?

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

Можно достучаться по OData.
Пример описан здесь:
https://academy.terrasoft.ru/documents/technic-sdk/7-7-0/odata

Что касается запуска процесса, Вы можете сделать следующее:
1) Создать процесс MyProcess с параметрами ContactId (идентификатор) и ContactName (строка 250 символов):

  • Начальный элемент
  • Чтение данных контакта с фильтром Id == ContactId
  • Формула: в параметр ContactName установить значение Чтение данных контакта.ФИО
  • Конец процесса

2) В адресной строке ввести ссылку:
http[s]://<адрес_приложения_bpm'online>/0/ServiceModel/ProcessEngineService.svc/MyProcess/Execute?ResultParameterName=ContactName&ContactId=410006e1-ca4e-4502-a9ec-e54d922d2c00

Посмотрите результат выполнения.

ЗЫ. Как-то небезопасно обращаться в запросах к БД, передавая все параметры. Или я не прав?

То что вы написали - мне понятно. По ContactId читаем контакт и в процессе передаем в параметр ContactName ФИО. Но я спрашивал о другом.

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

А еще лучше - могу ли я делать запросы извне прямо в Базу данных, минуя CRM систему?

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

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

Это получается что в нашей базе данных лежат еще какието чужие базы данных? Мне казалось что у вас для каждого клиента своя база данных, доступ к которой идет через порт и нужно знать логин и пароль? И таким образом есть доступ только к своей базе. Разве не так?

Здравствуйте, Николай!

Не совсем так - на одном SQL сервере размещено несколько баз (у каждого своя база). Для доступа к базам используется уникальный пользователь и свой пароль (для каждой базы свой).

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

Из соображений безопасности данных пользователей, на данный момент, мы не предоставляем прямой доступ к БД. Но, есть дополнительная услуга :Размещение на выделенных серверах.
Где доступ к БД возможен.
Обратитесь к Вашему менеджеру.

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

Задача: сформировать отчет такой же, как имеющийся, но за другой период.
По факту необходимо заменить фильтр EntitySchemaQueryMacrosType c CurrentWeek на NextWeek
Делать отчет с нуля сильно не хочется.
Есть ли возможность дублирования объекта или к.-л. другой способ упростить себе жизнь?

Нравится

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

Использован элемент БП "Отправить email". Каким образом привязать такого письмо к заказу (активностям)? В более ранних версиях можно было создавать активность вручную через "Добавление данных" и последующим использованием "Действие процесса", где выбирался процесс "Отправить сообщение". Сейчас этот функционал убрали.

Нравится

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

Здравствуйте, Александр!

Элемент "Отправить email" не создает в системе записей. В версии 770 возможность добавлять активность с типом email и отправлять письмо элементом "Задание сценарий".

Пример реализации можно посмотреть в процессе "Отправить email контакту обращения" в продуктах линейки Service.

Здравствуйте, Александр!

Элемент "Отправить email" не создает в системе записей. В версии 770 возможность добавлять активность с типом email и отправлять письмо элементом "Задание сценарий".

Пример реализации можно посмотреть в процессе "Отправить email контакту обращения" в продуктах линейки Service.

Код используемый в процессе "Отправить email контакту обращения" не работает корректно, при попытке его смоделировать и запустить на кастомном процессе.

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

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

Usings добавлены так же как в процессе "Отправить email контакту обращения"

Строки 38-40: в 770 был изменен алгоритм получение userConnection пользователя. Теперь userConnection получается так:

var userConnection = Get<UserConnection>(“UserConnection”);

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

Строка 37: Элемент переименовывался соответственно. И в коде, и сам элемент, так чтобы они совпадали. Это проблемы не решало.

Попробуйте поискать данный элемент в параметре процесса:

Думаю, элемент, на который ругается не будет отображаться.

Элемент присутствует, но кодом он не подхватывается :confused:

У элемента есть два параметра:

  • Caption (Заголовок)
  • Name (Название)

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

Самый простой способ - выделить элемент на диаграмме. Тогда его название выделится в структуре процесса.

AddDataUserTask1 - название элемента в структуре и на диаграме.
AddDataUserTask1 в коде используется тоже самое название, результата это не дает.

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

Давайте поступим следующим образом - скомпилируйте Ваш процесс. В результате появится ошибка. Предоставьте, пожалуйста, скриншот ошибки и листинг кода +- 50 строк от строки, в которой произошла ошибка (для просмотра исходного кода в диаграмме процесса необходимо открыть меню "Дополнительно" и выбрать пункт "Открыть исходный код")

namespace Terrasoft.Core.Process
{
 
	using Newtonsoft.Json;
	using Newtonsoft.Json.Linq;
	using System;
	using System.Collections.Generic;
	using System.Collections.ObjectModel;
	using System.Drawing;
	using System.Globalization;
	using Terrasoft.Common;
	using Terrasoft.Configuration;
	using Terrasoft.Core;
	using Terrasoft.Core.Configuration;
	using Terrasoft.Core.DB;
	using Terrasoft.Core.Entities;
	using Terrasoft.Core.Factories;
	using Terrasoft.Core.Process;
	using Terrasoft.Core.Process.Configuration;
	using Terrasoft.Mail;
	using Terrasoft.Mail.Sender;
 
	#region Class: UsrProcess1MethodsWrapper
 
	/// <exclude/>
	public class UsrProcess1MethodsWrapper : ProcessModel
	{
 
		public UsrProcess1MethodsWrapper(Process process)
			: base(process) {
			AddScriptTaskMethod("ScriptTask1Execute", ScriptTask1Execute);
		}
 
		#region Methods: Private
 
		private bool ScriptTask1Execute(ProcessExecutingContext context) {
			var activityId = AddDataUserTask1.RecordId;
var userConnection = Get<UserConnection>("UserConnection");
var emailClientFactory = ClassFactory.Get<EmailClientFactory>(new ConstructorArgument("userConnection", UserConnection));
var activityEmailSender = new ActivityEmailSender(emailClientFactory, UserConnection);
var entity = new Terrasoft.Configuration.Activity(UserConnection);
if (entity.FetchFromDB(activityId)) {
	entity.SetColumnValue("IsHtmlBody", true);
	entity.Save();
}
activityEmailSender.Send(activityId);
return true;
		}
 
		#endregion
 
	}
 
	#endregion
 
	#region Class: UsrProcess1
 
	/// <exclude/>
	public class UsrProcess1 : Terrasoft.Core.Process.Process
	{
 
		#region Class: ProcessLane1
 
		/// <exclude/>
		public class ProcessLane1 : ProcessLane
		{
 
			public ProcessLane1(UserConnection userConnection, UsrProcess1 process)
				: base(userConnection) {
				Owner = process;
				IsUsedParentUserContexts = false;
			}
 
		}
 
		#endregion
 
		#region Class: AddDataUserTask1FlowElement
 
		/// <exclude/>
		public class AddDataUserTask1FlowElement : AddDataUserTask
		{
 
			#region Constructors: Public
 
			public AddDataUserTask1FlowElement(UserConnection userConnection, UsrProcess1 process)
				: base(userConnection) {
				UId = Guid.NewGuid();
				Owner = process;
				Type = "ProcessSchemaUserTask";
				Name = "AddDataUserTask1";
				IsLogging = true;
				SchemaElementUId = new Guid("cb50206d-a0b9-482c-a7df-3310717b43ea");
				CreatedInSchemaUId = process.InternalSchemaUId;
				SerializeToDB = true;
			}
 
			#endregion
 
			#region Properties: Public
 
			private Guid _entitySchemaId = new Guid("c449d832-a4cc-4b01-b9d5-8a12c42a9f89");
			public override Guid EntitySchemaId {
				get {
					return _entitySchemaId;
				}
				set {
					_entitySchemaId = value;
				}
			}
 
			#endregion
 
		}
 
		#endregion
 
		public UsrProcess1(UserConnection userConnection)
			: base(userConnection) {
			InitializeMetaPathParameterValues();
			UId = Guid.NewGuid();
			Name = "UsrProcess1";
			SchemaUId = new Guid("62bbfc92-cc55-451a-afc4-a87fd1cb5433");
			SchemaManagerName = "ProcessSchemaManager";
			SerializeToDB = true;
			SerializeToMemory = true;
			IsLogging = true;
			ProcessModel = new UsrProcess1MethodsWrapper(this);
			InitializeFlowElements();
		}
<a href="/system/files/images/10.jpg" class="ts_fancybox"><img src="/system/files/images/10-thumb.jpg" alt="" /></a>

Подобная проблема возникает в любым элементом, попробовал добавить чтение данных, а в коде использовать его имя (ReadDataUserTask1) - пишет, элемент не найден

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

Пожалуйста, напишите на support@terrasoft.ru - нужно будет удаленно подключаться и анализировать. К сожалению, по коду нельзя определить в чем проблема.

А что конкретно написать?

Укажите описание проблемы и ссылку на этот топик.

"Бахматов Александр Валерьевич" написал:Использован элемент БП "Отправить email". Каким образом привязать такого письмо к заказу (активностям)? В более ранних версиях можно было создавать активность вручную через "Добавление данных" и последующим использованием "Действие процесса", где выбирался процесс "Отправить сообщение". Сейчас этот функционал убрали.

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

странно что у вас вообще возникла проблема. В версии 7.7 и 7.8 даже попробовал создал Активность, через добавление данных, и далее через "действие процесса" отправил Email сообщение и все получилось. Нужно анализировать какие зависимости есть у того пакета, где создаете свой бизнес-процесс.

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

После обновление bpmonline 7.4.1 до 7.5 выъодить ошибка в браузере:
error
помогите пж из-за чего выходить данная ошибка?

Нравится

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

Здравствуйте.
Скрин не отображается. Рекомендую обратиться в поддержку. Вопрос не совсем формата Community.

OK, napisal supporty[/quote]

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