Доброго дня!

Приведу пример на стандартных объектах. В карточке Контрагента есть поле Страна. В справочник Страна добавлено поле Источник. Нужно в поле Источник записывать информацию о том, из какого объекта (контрагента) была создана эта запись. 

Сценарий такой:

- Пользователь через лукап в поле Страна открывает окно поиска

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

 

Вопрос. Как сохранить сведения об источнике добавления записи...что она добавлена именно из этого контрагента?

Есть похожая тема: https://community.terrasoft.ru/questions/zapolnenie-polei-v-kartocke-pr… там нет решения.. и новых ответов тоже.

 

Спасибо!

 

Нравится

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

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

Думаю простого решения нет, как вариант сохранить в сессии пользователя источник (название страницы редактирования) переопределить добавление записи в LookupPage (заполнять источник из сессии)

Если делать свою страницу выбора со справочника (наследник LookupPage), то потом можно его подключить добавив в атрибут (Пример для страницы выбора из справочника городов): 

"City": {
	"dataValueType": Terrasoft.DataValueType.LOOKUP,
	"lookupListConfig": {
		lookupPageName: "MyBaseLookup",
	}
}

Подробнее тут

Так же похожий вопрос обсуждался тут

 

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

Тогда можно ещё проще: при сохранении контрагента во встроенном или отдельном БП проверять значение «Страна.Источник» и если там пусто, заполнять Id этого контрагента.

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

 

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

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

Пытаюсь синхронизировать Организационные роли с AD, при запуске синхронизации пользователи перемещаются, но в журнале появляется ошибка "Terrasoft.Common.DbOperationException: The UPDATE statement conflicted with the FOREIGN KEY constraint "FKMpbRxbvqMdsx1Iial2kKB1MywA". The conflict occurred in database "TerrasoftDB", table "dbo.Account", column 'Id'."

FK связывает столбец AccountId в таблице Contact и Id в Account.

Id в таблице проверил, пустых и битых нет.

Не подскажете, куда копать?

Нравится

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

В синхронизации с АД в лоб был зашит контрагент с именем Наша компания и id="E308B781-3C5B-4ECB-89EF-5C1ED4DA488E"

Проверьте что в базе (таблица Account) есть такой Id. Если нет создайте запись. Контрагента наша компания не рекомендуется удалять лучше  его переименовать в название вашей компании!

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

Посмотрите sql-профайлером, на каком именно запросе происходит свал и проанализируйте его значения.

В синхронизации с АД в лоб был зашит контрагент с именем Наша компания и id="E308B781-3C5B-4ECB-89EF-5C1ED4DA488E"

Проверьте что в базе (таблица Account) есть такой Id. Если нет создайте запись. Контрагента наша компания не рекомендуется удалять лучше  его переименовать в название вашей компании!

Спасибо, Алла, нашел ошибку с помощью Профайлера.

Спасибо, Григорий, вы правы, контрагента с таким Id в таблице нет, но и в свойствах контакта указан другой контрагент с именем Восток Запад и типом "Наша компания", который существует. Не пойму откуда взялся Id E308B781-3C5B-4ECB-89EF-5C1ED4DA488E? Создать конечно могу, но разобраться бы как это работает.

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

Если наткнулись на E308B781-3C5B-4ECB-89EF-5C1ED4DA488E, то как я и писал в лоб зашито в интеграции с АД :) Лучше востановите контрагента

Спасибо, Григорий.

А не помните случайно, в какой схеме это можно увидеть?

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

Увы нет, но она в нескольких местах вылазила недавно вот всплыла в формировании счета на оплату.

Например, если поискать через базу по коду, в схеме AccountConsts и в БП объекта Invoice упомянут этот GUID.

select *
from SysSchemaSource
where source like '%E308B781-3C5B-4ECB-89EF-5C1ED4DA488E%'

 

Всем огромное спасибо, ошибка устранена.

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

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

Создал по аналогии с CreateInvoiceFromOrder создание счета из договора - CreateInvoiceFromContract

Все работает отлично, за исключением одного момента

В новом счете не заполняется поле Supplier (подразумевается, что это наша компания), всегда пустое после открытия карточки.

Ранее обнаружил, что и CreateInvoiceFromOrder не работал, ибо что то там foreign key в таблице Account, оказалось, что в в объекте Invoice по умолчанию стояло заполнять это поле каким то левым гуидом e308b781-3c5b-4ecb-89ef-5c1ed4da488e. Я это дело исправил в одном из своих пакетов, но видно все равно это как то сказывается.

Прошу помощи.

Нравится

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

Борис Леонов,

namespace Terrasoft.Configuration

{

    public static class AccountConsts

    {

        public static readonly Guid OurCompanyAccountId = new Guid("E308B781-3C5B-4ECB-89EF-5C1ED4DA488E");

    }

}

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

В чем вы просите помощи?

Добрый день!

В БП  CreateInvoiceFromOrder есть метод

public virtual void CreateInvoice() {
	OrderInvoiceHelper helper = Factories.ClassFactory.Get<OrderInvoiceHelper>(new Factories.ConstructorArgument("userConnection", UserConnection));
CreatedInvoiceId = helper.CreateEntity("Order", "Invoice", CurrentOrder, new Dictionary<string, string> {
	{"Currency", "Currency"},
	{"CurrencyRate", "CurrencyRate"},
	{"Contact", "Contact"},
	{"Account", "Account"},
	{"Owner", "Owner"},
	{"Amount", "Amount"},
	{"Opportunity", "Opportunity"}
}, new Dictionary<string, object> { { "Order", CurrentOrder } });
}

который создает Invoice по Order. 3им параметром идет словарь-маппинг полей Invoice по Order, 4ым параметром (new Dictionary<string, object> { { "Order", CurrentOrder } }) предустановленные параметры. Вот ваш Supplier надо добавить туда

Григорий Чех пишет:

В чем вы просите помощи?

Победить глюк с незаполнением Supplier в новом счете.

Сидоров Александр В.,

Александр, мой вариант сейчас выглядит так:

public virtual void CreateInvoice() {
	OrderInvoiceHelper helper = Factories.ClassFactory.Get&lt;OrderInvoiceHelper&gt;(new Factories.ConstructorArgument("userConnection", UserConnection));
	var createdInvoiceId = helper.CreateEntity(
		"Contract", "Invoice", Get&lt;Guid&gt;("CurrentContract"), new Dictionary&lt;string, string&gt; {
			{"Currency", "Currency"},
			{"CurrencyRate", "CurrencyRate"},
			{"Contact", "Contact"},
			{"Account", "Account"},
			{"CustomerBillingInfo","CustomerBillingInfo"},
			{"OurCompany", "Supplier"},
			{"SupplierBillingInfo", "SupplierBillingInfo"},
			{"Owner", "Owner"},
			{"Amount", "Amount"},
			{"Order","Order"},
			{"Opportunity", "Opportunity"}
		},
		new Dictionary&lt;string, object&gt; {
			{"Contract", Get&lt;Guid&gt;("CurrentContract")},
			{"ZLPaymentType", Get&lt;Guid&gt;("PaymentType")}
		});
	Set("CreatedInvoiceId", createdInvoiceId);
}

 

Про левый Guid в значении по умолчанию для Supplier в Invoice имею в виду это:

я переопределил это безобразие на "не устанавливать значение по умолчанию" в своем пакете, CreateInvoiceFromOrder заработал, но лишь потому, что  в Заказе нет полей с нашей компанией (поставщиком), нечем в счете заполнять.

откуда лезет этот e308b781-3c5b-4ecb-89ef-5c1ed4da488e, причем у объектов в залоченных фирменных террасофтовских пакетах?

Борис Леонов,

namespace Terrasoft.Configuration

{

    public static class AccountConsts

    {

        public static readonly Guid OurCompanyAccountId = new Guid("E308B781-3C5B-4ECB-89EF-5C1ED4DA488E");

    }

}

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

Борис Леонов,

{"OurCompany", "Supplier"}, - это значит значение из поля OurCompany объекта Contract скопировать в поле Supplier объекта Invoice.
Если вам надо именно одно и то же значение всегда записывать, то вам надо добавить параметр в словарь 
new Dictionary<string, object> {
			{"Contract", Get<Guid>("CurrentContract")},
			{"ZLPaymentType", Get<Guid>("PaymentType")}
		}

Да, ни в коем случае не удаляйте эту "Нашу компанию". Она ещё в некоторых местах жёстко зашита. Например, в интеграции с AD

Григорий Чех,

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

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

Если я руками создам Account с нужным Id и объединю его с существующей «нашей компанией», проблема решится?

Да должно

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

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

В БП созданы 2 параметра AccountType(справочник) и AccountId(уникальный идентификатор). Создал задание-сценарий с текстом 

AccountType = Guid.Parse(TypeString);

AccountId = Guid.Parse(IdString);

Компиляция проходит без ошибок, но при запуске получаю ошибку "The name 'AccountId' does not exist in the current context", при этом с AccountType все в порядке.

В случае интерпретируемого процесса ошибка аналогичная.

Предполагаю, что это особенность типа, но как исправить?

Нравится

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

Проверьте в параметрах что AccountId это именно не название а код параметра и для интерпритируемых используйте

var accountId = Get<Guid>("AccountId");

Проверьте в параметрах что AccountId это именно не название а код параметра и для интерпритируемых используйте

var accountId = Get<Guid>("AccountId");

Григорий Чех,

Спасибо.

Имена копировал, ошибка оставалась, пока не переименовал параметр.

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

Сейчас все работает.

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

Добрый день!

Подскажите, где (в каком месте) заполняется параметр БП [#Id созданного счета#] в БП CreateInvoice?

В этот параметр попадает Id вновь созданного счета, на каком этапе, не могу понять, помогите разобраться

Нравится

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

Заполняется в методе CreateInvoice БП CreateInvoiceFromOrder

public virtual void CreateInvoice() {
	OrderInvoiceHelper helper = Factories.ClassFactory.Get&lt;OrderInvoiceHelper&gt;(new Factories.ConstructorArgument("userConnection", UserConnection));
CreatedInvoiceId = helper.CreateEntity("Order", "Invoice", CurrentOrder, new Dictionary&lt;string, string&gt; {
	{"Currency", "Currency"},
	{"CurrencyRate", "CurrencyRate"},
	{"Contact", "Contact"},
	{"Account", "Account"},
	{"Owner", "Owner"},
	{"Amount", "Amount"},
	{"Opportunity", "Opportunity"}
}, new Dictionary&lt;string, object&gt; { { "Order", CurrentOrder } });
}

 

Заполняется в методе CreateInvoice БП CreateInvoiceFromOrder

public virtual void CreateInvoice() {
	OrderInvoiceHelper helper = Factories.ClassFactory.Get&lt;OrderInvoiceHelper&gt;(new Factories.ConstructorArgument("userConnection", UserConnection));
CreatedInvoiceId = helper.CreateEntity("Order", "Invoice", CurrentOrder, new Dictionary&lt;string, string&gt; {
	{"Currency", "Currency"},
	{"CurrencyRate", "CurrencyRate"},
	{"Contact", "Contact"},
	{"Account", "Account"},
	{"Owner", "Owner"},
	{"Amount", "Amount"},
	{"Opportunity", "Opportunity"}
}, new Dictionary&lt;string, object&gt; { { "Order", CurrentOrder } });
}

 

Вот я слепошарый! Спасибо!

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

Добрый день!

Подскажите, есть ли возможность отобразить идентификатор контрагента (dbo.Account.Id) например на странице контрагента? Почему-то колонка Id в мастере раздела не отображается и в БП в справочнике контрагента её использовать не получается.

Нравится

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

Добрый день!

Только кодом. Пример замещенной схемы контрагента:

define("AccountPageV2", [], function() {
	return {
		entitySchemaName: "Account",
		attributes: {
			"AccountId": {
				dataValueType: this.Terrasoft.DataValueType.TEXT,
				value: "",
				caption: "Id"
			},
		},
		modules: /**SCHEMA_MODULES*/{}/**SCHEMA_MODULES*/,
		details: /**SCHEMA_DETAILS*/{}/**SCHEMA_DETAILS*/,
		businessRules: /**SCHEMA_BUSINESS_RULES*/{}/**SCHEMA_BUSINESS_RULES*/,
		methods: {
			onEntityInitialized: function() {
				this.callParent(arguments);
				this.set("AccountId", this.get("Id"));
			},
		},
		dataModels: /**SCHEMA_DATA_MODELS*/{}/**SCHEMA_DATA_MODELS*/,
		diff: /**SCHEMA_DIFF*/[
			{
				"operation": "insert",
				"name": "AccountId",
				"parentName": "ProfileContainer",
				"propertyName": "items",
				"values": {
					"bindTo": "AccountId",
					"layout": {
						"column": 0,
						"row": 1,
						"colSpan": 24
					},
					"enabled": false
				}
			},
		]/**SCHEMA_DIFF*/
	};
});

Результат:

Добрый день!

Только кодом. Пример замещенной схемы контрагента:

define("AccountPageV2", [], function() {
	return {
		entitySchemaName: "Account",
		attributes: {
			"AccountId": {
				dataValueType: this.Terrasoft.DataValueType.TEXT,
				value: "",
				caption: "Id"
			},
		},
		modules: /**SCHEMA_MODULES*/{}/**SCHEMA_MODULES*/,
		details: /**SCHEMA_DETAILS*/{}/**SCHEMA_DETAILS*/,
		businessRules: /**SCHEMA_BUSINESS_RULES*/{}/**SCHEMA_BUSINESS_RULES*/,
		methods: {
			onEntityInitialized: function() {
				this.callParent(arguments);
				this.set("AccountId", this.get("Id"));
			},
		},
		dataModels: /**SCHEMA_DATA_MODELS*/{}/**SCHEMA_DATA_MODELS*/,
		diff: /**SCHEMA_DIFF*/[
			{
				"operation": "insert",
				"name": "AccountId",
				"parentName": "ProfileContainer",
				"propertyName": "items",
				"values": {
					"bindTo": "AccountId",
					"layout": {
						"column": 0,
						"row": 1,
						"colSpan": 24
					},
					"enabled": false
				}
			},
		]/**SCHEMA_DIFF*/
	};
});

Результат:

Спасибо, Александр!

Значение отображается.

А что нужно сделать, чтобы оно отображалось в списке значений справочника Контрагент?

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

А что нужно сделать, чтобы оно отображалось в списке значений справочника Контрагент?

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

Да, неясно выразился. Если точнее - нужно создать переменную в БП (как я понимаю типа справочник), чтобы прочитать значение Id и сравнить с полученным извне.

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

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

Элемент БП 'Чтение данных' позволяет выбрать значение поля Id того объекта, из которого Вы вычитываете данные. Точно также значение Id записи можно получить и из сигнала.

А потом в элементе формула Вы можете Вашему параметру БП присвоить это значение.

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

Алла Савельева пишет:

Спасибо, Алла! А есть ли возможность задать Id при создании нового контрагента процессом? 

Все, разобрался.

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

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

О компании

Компания ALTIS-LIFT специализируется на лифтовом оборудовании: лифты, подъемники, эскалаторы и траволаторы от лучших мировых производителей SJEC, IGV, HIDRAL. Компания осуществляет полный спектр услуг - от поставки и монтажа до обслуживания оборудования.

Предпосылки внедрения bpm’online

За длительное время работы на рынке подъемного оборудования у компании ALTIS-LIFT сформировалась большая база клиентов. Очень важно хранить историю переговоров и запланированные активности с каждым застройщиком, чтобы не пропустить ни одной потенциальной сделки. Фиксировать потребности клиентов – вот одна из основных задач CRM-системы.

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

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

Выполненные настройки

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

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

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

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

После получения технического задания от клиента менеджер меняет стадию лида на «Перевод в продажу» — и в системе автоматически создается продажа по данному лиду. В рамках продажи формируется коммерческое предложение и отправляется клиенту. На стадии продажи «Формирование и презентация КП» менеджер коммуницирует с клиентом и защищает коммерческое предложение. В зависимости от решения клиента менеджер меняет стадию продажи.

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

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

Результат

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

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

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

Руководители получили инструмент для контроля менеджеров в виде настроенных дашбордов по активностям, которые ежедневно выполняют менеджеры

Нравится

Поделиться

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

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

Нравится

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

Попробуйте настроить работу с SVN для обоих сред. Подробнее смотрите здесь.

Попробуйте настроить работу с SVN для обоих сред. Подробнее смотрите здесь.

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

то есть разработка далее будет идти только в файловой системе?

Линар Аминев,

А что Вас смущает в разработке в файловой системе?

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

да в целом ничего. будем значит в файловой системе. спасибо за ответ)

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

Добрый день!

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

 

Нравится

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

Используйте не браузер смартфона, а мобильное приложение. Там упоминания в ленте работают.

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

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

Вероятно, это зависит от самого браузера, поддерживаемые ОС и браузеры перечислены в системных требованиях.

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

Пробовали через различные браузеры, не помогает(

Значит, все они или ОС устройства не из списка поддерживаемых:

 

Операционная система Microsoft Windows (Windows 7; Windows 8; Windows 10):

  • Google Chrome последней официальной версии на дату релиза bpm’online
  • Mozilla Firefox последней официальной версии на дату релиза bpm’online
  • Microsoft Internet Explorer версии 11 и выше;
  • Microsoft Edge

Операционная система OS Х последней официальной версии

  • Apple Safari последней официальной версии на дату релиза bpm’online

В принципе, это логично, у смартфонов другие ОС и браузеры.

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

Коллеги, доброго дня! Возникла потребность выдать права на чтение всех разделов системы. Логично подумала, что выдав права к системной операции [Просмотр любых данных] я полностью ее покрою, но нет. Раздел [Журнал процессов] оказался недоступен.

Это нормальное поведение системы? И если да, то что порекомендуете?

Нравится

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

Здравствуйте! Что касается журнала процессов попробуйте данную настройку - http://prntscr.com/nafckz&nbsp;

Включите пользователя, которому нужны права на чтение всего, в группу [Системных администраторов].

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

Здравствуйте! Что касается журнала процессов попробуйте данную настройку - http://prntscr.com/nafckz&nbsp;

Алексей, спасибо! Это то, что нужно

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