Здравствуйте.
Есть задача создать уведомление для пользователя, при условии, оформления 3-х заказов для одного клиента. В случае когда будет оформлено 3 заказа для одного клиента для пользователя системы будет приходить уведомление.
Помогите пожалуйста создать данный БП. Быть может уже кто-то делал такое и есть конкретные примеры?
Благодарю

Нравится

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

В объекте заказ вставляете событие после сохранения. Далее лепите процесс. Навскидку:
1) Взять клиента, относительно которого только что был создан заказ
1) проверить кол-во заказов где он указан
2) если кол-во заказов >= 3 создаём активность с напоминанием ответственному (ну или фиксированному пользователю)

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

1. Стартовый сигнал по добавлению записи в Заказ.
2. Читать данные в заказах, где Id = Пункт 1. Id
3. Читать кол-во записей в заказах, где Контрагент = Пункт 2. Контрагент.
4. Условный поток [Пункт 3. Кол-во записей] >= 3.
5. Письмо или активность.

Здравствуйте. Спасибо большое. Настроил работает данная система. Однако, активность появляется при каждом последующем заказе. Нужно чтобы уведомление приходило только при 3-х заказах. Пытаюсь прописать таким образом [Пункт 3. Кол-во записей] = 3, но выдаёт ошибку и не сохраняется

Дмитрий,

Для сравнения на равенство используйте "==" вместо "="

"Бондарь Наталия" написал:

Дмитрий,

Для сравнения на равенство используйте "==" вместо "="


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

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

Нужно во время БП выводить разные сообщения пользователям, как это сделать через компонент "Задание-сценарий"

Нравится

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

Добрый день, уважаемые коллеги!

Подскажите пжл., где можно посмотреть и/или прочитать более продвинутый материал по DCM, нежели в Академии - очень и очень мало информации?
Где можно посмотреть примеры рабочих кейсов, посмотреть как они работают, какие задачи решают?

Нравится

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

Здравствуйте, Юрий!

Отличие DCM от сквозного бизнес-процесса состоит в том, что DCM позволяет более просто создавать активности, чем по бизнес-процессу. DCM дает больше свободы.

Пример использования:
- настроить DCM таким образом, чтобы на стадии "Коммерческое предложение" создавались три активности:
1) Подготовка коммерческого предложения
2) Согласование коммерческого предложения
3) Презентация коммерческого предложения
- выбрать в разделе "Продажи" стадию презентация коммерческого предложения
- в результате будут созданы три активности. Пользователь, выполняющий активности, сможет самостоятельно выбрать активности, которые он будет выполнять.

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

Таким образом после завершения задачи "Презентация коммерческого предложения" пользователь выберет следующую стадию и незавершенные задачи автоматически завершатся.

Юрий, больше информации по DCM и примеры кейсов будут доступны на академии к концу следующей недели.

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

Нужна следующая функция в CRM: отправление ценового предложения клиенту
из CRM. или чтобы файл с ценовым предложением крепился к истории
клиента. В общем, чтобы информация о цене, которую менеджер дал клиенту,
сохранялась в CRM. Есть ли такая возможность? Версия 7.2.0.1184 bpmonline crm
Я так поняла, необходима доработка приложения, но что именно? Пожалуйста, помогите!

Нравится

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

Татьяна, добрый день!

Обе задачи требуют навыков программирования.

Для решения можно создать бизнес процесс. Логика процесса:
1) Создать активность с типом "Email". запись может быть создана элементом "Добавить данные". Обязательно нужно заполнить поля "Кому", "От кого", "Тема", "Тело"
2) Элементом "Задание-сценарий" необходимо:

  • Сформировать ценовое предложение. Для этого можно использовать методы из схемы ReportService
  • Заинсертить сформированный файл в таблицу ActivityFile, обязательно указав в поле ActivityId значение Id созданной на первом шаге активности
  • Отправить письмо

Не уверен, что в версии 7.2.0 есть пример такой отправки. Рекомендую зарегистрировать себе trial версию продукта service enterprise. В процессе "Отправка email сообщения контакту обращения" вы сможете найти пример кода.

3) Конец процесса

В случае с прикреплением ценового предложения к клиенту, можно пропустить первый пункт, поскольку активность не нужна. На втором пункте INSERT сформированного файла необходимо осуществлять в таблицу ContactFile/AccountFile (в зависимости от того контакт или контрагент является клиентом).

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

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

1
2

Нравится

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

Андрей,
Возможность быстрого добавления записи в справочник доступна для тех полей, которые не ссылаются на системный объект. В Вашем примере поле [Группа ответственных] ссылается на системный объект SysAdminUnit, поэтому быстрого добавления нет. Если взять для сравнения поле [Ответственный], оно ссылается на простой объект Contact.

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

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

Есть ли какая либо возможность сделать "копию", а не переписывать его вручную основываясь на схемах и объектах пакета "CoreForecast".

PS: Данный раздел явно не является типовым, его отличает как минимум то что у него есть только "представление раздела" и отсутствует какое либо представление записей основного объекта.
"Страница раздела" не является потомком обычных типовых страниц раздела, которые унаследованы от "Базовая схема раздела (NUI)", а является потомком "Базовая схема карточки ( NUI )".

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

Нравится

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

"Севостьянов Илья Сергеевич" написал:

Есть необходимость внедрить в систему копию штатного раздела "Планирование".

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

Есть ли какая либо возможность сделать "копию", а не переписывать его вручную основываясь на схемах и объектах пакета "CoreForecast".

PS: Данный раздел явно не является типовым, его отличает как минимум то что у него есть только "представление раздела" и отсутствует какое либо представление записей основного объекта.

"Страница раздела" не является потомком обычных типовых страниц раздела, которые унаследованы от "Базовая схема раздела (NUI)", а является потомком "Базовая схема карточки ( NUI )".

По этому его даже невозможно воссоздать на основании сгенерированного мастером нового раздела,

Даже если удается повторить схемы и объекты, как такой раздел зарегистрировать вручную ?

Подписаться на обновления этого материала

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

К сожалению, это даже не раздел в привычном понимании этого слова, и скопировать его не удастся, вы можете попробовать создать аналогичную функциональность, взяв за основу оригинальный ForecastsModule, из пакета CoreForecast, но вам, в зависимости от того, какую логику вы будете менять, может понадобится создать собственные объекты\сервисы\хелперы. В общем изучите все содержимое пакета CoreForecast, начиная с ForecastsModule. А регистрацию «раздела» делайте в:
SELECT * FROM SysModule

Да, мы уже смотрели "по аналогии",
Подскажите пожалуйста верны ли мои утверждения касаемо значений в соответствующих колонках
таблицы SysModule:
SysModuleEntityId
(Значение поля "Id" базового объекта раздела из таблицы SysModuleEntity, там регистрируются все объекты автоматически при добавлении их через конфигуратор, в нашем случае это будет копия объекта Forecast)
SectionModuleSchemaUId (Значение поля "UId" из таблицы SysSchema, аналогично - регистрируются ли там схема автоматически)

Есть так же еще некоторые связанные записи в таблице SysModuleEdit
За что она отвечает ?

Илья, думаю, что данная тема будет Вам полезна
http://www.community.terrasoft.ru/forum/topic/13357

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

Обычно если мы в ESQ используем произвольные или обратные связи то обычно строиться LEFT OUTER JOIN с наименованием колонки по которой присоединил.

Например:

SELECT CC.SpecializationId
FROM TsMarketingApplication tsma
     LEFT OUTER JOIN Activity a ON a.Id=tsma.TsActivityId

Если корневая схема TsMarketingApplication то будет

.AddColumn("[Activity:Id:TsActivityId].Имя нужной колонки");

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

SELECT CC.SpecializationId
FROM TsMarketingApplication tsma
     LEFT OUTER JOIN Activity a ON a.Id=tsma.TsActivityId
     LEFT OUTER JOIN ContactCareer CC ON CC.ContactId = A.OwnerId AND CC.AccountId=A.AccountId

Заранее признателен

Нравится

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

Виталий, здравствуйте,

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

https://academy.terrasoft.ru/documents/technic-sdk/7-9/ispolzovanie-ent…

Хорошего вечера!

С уважением,
Валерия

Но там как раз описывается пример с JOIN по одной колонке. Я правильно понимаю что ESQ такого не умеет?

Здравствуйте, Виталий.

Подробную информацию о возможностях ESQ, Вы можете найти в SDK.

Так же, для построение более сложных запросов, рекомендую Вам смотреть на более низкоуровневый класс Select. Данный класс используется внутри ESQ и позволяет построить более сложные запросы к базе данных.

SELECT

Я бы через Select брал.

Select select = new Select(userConnection)
	.Column(@"ContactCareer", @"SpecializationId").As("SpecId")
	.From(@"TsMarketingApplication")
 
	.LeftOuterJoin("Activity").On("Activity", "Id").IsEqual("TsMarketingApplication", "TsActivityId")
	.LeftOuterJoin("ContactCareer").On("ContactCareer", "ContactId").IsEqual("Activity", "OwnerId")
		.And("ContactCareer", "AccountId").IsEqual("Activity", "AccountId")
 
	as Select;
 
using (DBExecutor executor = userConnection.EnsureDBConnection())
{
	using (IDataReader reader = executor.ExecuteReader(select.GetSqlText(), select.Parameters))
	{
		while (reader.Read())
		{
			string result = reader.GetColumnValue<Guid>(@"SpecId").ToString();
                        //Обработка результатов
		}
 
		reader.Close();
	}
}

Спасибище!!!

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

Доброго времени суток всем.

Версия 7.8 sales.

Задача следующая: на странице Счёта в меню "Действия" нужно добавить дополнительный пункт "Создание заказа на основе счёта", вызывающий бизнес-процесс. В целом всё по этому кейсу: https://academy.terrasoft.ru/documents/technic-sdk/7-8/dobavlenie-deystv...

Но есть одна особенность: на странице счёта есть поле "Тип счёта" и пункт должен быть доступен только при выборе определённого типа.

Сейчас в схеме InvoicePage добавлен следующий код:

getActions: function() {
                                        var actionMenuItems = this.callParent(arguments);
                                        actionMenuItems.addItem(this.getButtonMenuItem({
                             Type: "Terrasoft.MenuSeparator",
                             Caption: ""
                        }));
                        actionMenuItems.addItem(this.getButtonMenuItem({
                              "Caption": {bindTo: "Resources.Strings.CreateOrderByInvoiceCaption"},//Название пункта в Localizablestrings
                               "Tag": "CreateOrderByInvoice",//Метод
                               "Enabled": {"bindTo": "canEntityBeOperated"},
                               "Visible": {"bindTo": "FormContractVisible"}
                        }));
                                        return actionMenuItems;
                                },
                                FormContractVisible: function(){
                                        if (this.get("UsrAccountType")){
                                                var InvType = this.get("UsrAccountType").value;
                                               
                                                if (InvType == "0266a676-9801-477d-aefd-81ae4dd978bf"){
                                return true;
                            } else {
                                return false;
                            }
                                        } else {
                                                return false;
                                        }
                                },

Дополнительно функция FormContractVisible вызывается при изменении значения UsrAccountType.

А в схеме InvoiceSection - такой:

define("InvoiceSectionV2", ["ProcessModuleUtilities","BusinessRuleModule", "ConfigurationConstants","jQuery"], function(ProcessModuleUtilities,BusinessRuleModule, ConfigurationConstants) {
        return {
                entitySchemaName: "Invoice",
                details: /**SCHEMA_DETAILS*/{}/**SCHEMA_DETAILS*/,
                diff: /**SCHEMA_DIFF*/[]/**SCHEMA_DIFF*/,
                methods: {
                        FormContractVisible: function(activeRowId) {
                activeRowId = this.get("ActiveRow");
                // Получение коллекции данных списочного представления реестра раздела [Заказы].
                var gridData = this.get("GridData");
                // Получение модели выбранного заказа по заданому значению первичной колонки.
                var selectedInvoice = gridData.get(activeRowId);
                // Получение свойства модели - статуса выбранного заказа.
                var selectedInvoiceType = selectedInvoice.get("UsrAccountType");
                // Значение статуса выбранного заказа сравнивается со значением типа "Исполнение", и в
                // зависимости от результата сравнения метод возвращает true или false.
                if (selectedInvoiceType){
                                        if (selectedInvoiceType.value == "0266a676-9801-477d-aefd-81ae4dd978bf"){
                        return true;
                    } else {
                        return false;
                    }
                                } else {
                                        return false;
                                }
            }
                }
        };
});

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

Но если мы открываем счёт в режиме с боковым реестром (из страницы списка счетов), то видимость определяется один раз в зависимости от выставленного типа, а изменение не влияет на этот параметр.

Возможно ли сделать отслеживание изменения во втором случае?

Нравится

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

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

"Роман Симута" написал:

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

Первый раз атрибут инициализировать при полной загрузке грида и выборе активной записи.

Затем значение атрибута менять при изменении поля.


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

Заранее благодарю.

Недавно обновил примеры в документации по разработке.
Наиболее подходящий пример - здесь
https://academy.terrasoft.ru/documents/technic-sdk/7-9/kak-dobavit-knop…
В примере используется атрибут, который связан со свойством доступности кнопки. Вам надо поменять привязку на видимость. Ну и выбросить лишнее.

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

Здравствуйте!
По базовой логике в детали «Контакты контрагента» отображаются только те контакты у которых стоит признаками «Основное» и «Текущее». Проблема возникает, когда один человек является руководителем нескольких компаний. У него в карьере указано, что она работает в нескольких компаниях, а вот в деталь «Контакты контрагента» эта информация уже не попадает. Где можно исправить логику системы, чтобы она выводила в делать «Контакты контрагента» все записи касающиеся этого предприятия с детали Карьера? Реализация новой деталью не очень подходит. Ведь нам нужно выбрать контакт при телефоном звонке (или когда мы вносим новые записи в Активности) с привязкой к этому контрагенту.

Нравится

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

Мы исправляли Rules для каждой страницы, где это нужно использовать (Активности, Продажи, Инциденты и т.п.)

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

Как сказал Владимир, действительно необходимо переопределить бизнес-правила на странице редактирования. Пример переопределения бизнес-правила для страницы раздела "Активности":

define("ActivityPageV2", ["BusinessRuleModule"],
   function(BusinessRuleModule) {
      return {
         entitySchemaName: "Activity",
         mixins: {},
         messages: {},
         attributes: {},
         details: /**SCHEMA_DETAILS*/{}/**SCHEMA_DETAILS*/,
         methods: {},
         diff: /**SCHEMA_DIFF*/[]/**SCHEMA_DIFF*/,
         rules: {
            "Contact": {
               "FiltrationContactByAccount": {
                  "ruleType": BusinessRuleModule.enums.RuleType.FILTRATION,
                  "autocomplete": true,
                  "autoClean": true,
                  "baseAttributePatch": "[ContactCareer:Contact].Account",
                  "comparisonType": Terrasoft.ComparisonType.EQUAL,
                  "type": BusinessRuleModule.enums.ValueType.ATTRIBUTE,
                  "attribute": "Account"
               }
            }
         }
      };
});

Спасибо за оперативный ответ.
Проблема заключается в том, что этот сотрудник появляется только в одной компании в детали «Контакты контрагента». Если менять параметры «Основное» и «Текущее», то они исчезает из первой компании и появляется во второй. Соответственно получается что в карьере у него 10 записей, а в «Контакты контрагента» он отображается только в одной компании. Возможно нужно поменять правило по которому система отображает в «Контакты контрагента» только тех у которых есть оба параметра: «Основное» и «Текущее»?

Виталий, здравствуйте!

Для решения нужно создать деталь на основании объекта "Карьера контакта". В логике детали нужно установить доп. фильтрацию - отображать только те записи, у которых признак "Текущее" - true.

Созданную деталь необходимо добавить в раздел "Контрагенты", связав деталь с разделом следующим образом:
Контрагент.Id = Карьера контакта.Контрагент.

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

Добрый день!

Можно ли для мобильного приложения добавить валидацию к полю или, например, ограничение (для даты)?

Нравится

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

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

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

"Демьяник Алексей" написал:

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

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


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

Я хочу сделать так, чтобы нельзя было выбрать дату меньше текущей.

Здравствуйте.
Есть пример реализации в MobileActivityModelConfig. В «Активностях», по умолчанию, не разрешается устанавливать дату начала больше даты завершения активности.

Terrasoft.sdk.Model.addBusinessRule("Activity", {
ruleType: Terrasoft.RuleTypes.Comparison,
triggeredByColumns: ["StartDate"],
leftColumn: "DueDate",
comparisonOperation: Terrasoft.ComparisonTypes.GreaterOrEqual,
rightColumn: "StartDate"
});

Terrasoft.sdk.Model.addBusinessRule("Activity", {
ruleType: Terrasoft.RuleTypes.Comparison,
triggeredByColumns: ["DueDate"],
leftColumn: "StartDate",
comparisonOperation: Terrasoft.ComparisonTypes.LessOrEqual,
rightColumn: "DueDate"
});

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

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

"Колебянов Виталий Романович" написал:

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

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

"Вильшанский Дмитрий" написал:
Колебянов Виталий Романович пишет:

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

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

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

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

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

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