Здравствуйте. Скажите пожалуйста, можно ли убрать из воронки продаж определенные стадии?
Стандартный функционал фильтрации не подходит, т.к. стадия в воронке все-равно присутствует, но со значением 0.
Как отфильтровать воронку,чтобы осталось всего 5 нужных стадий?
Если необходимо минимум вмешательства, а стадии используются не совсем как задумано, то можно их отфильтровать следующим образом: в воронке не отображаются конечные не успешные стадии. То есть, можно всем тем, которые не должны отображаться, установить поле End = 1, а поле Successful = 0.
Если же этот функционал используется, то фильтрацию можно добавить только вмешательством в код. Необходимо замещать модуль OpportunityFunnelDrillDownProvider, полностью копировать его код в новый модуль, и вносить необходимые изменения в метод getFunnelAllowedStagesFilters (для версии 7.6) либо в initOpportunityStage (для версии 7.5).
"Антон Кравченко" написал:а разве это не решается через Справочники - Стадии продаж?
не совсем корректное решение, в случае, если пользователь использует референтный процесс. Предложение решение позволяет регулировать вывод нужных стадий в воронке не нарушая базовую логику работы системы.
Изначально был сделан новый процесс продаж и лишние стадии были удалены, но они снова появились после очередного обновления системы и установки данных, привязанных к пакетам.
"Пащенко Александр Сергеевич" написал:Изначально был сделан новый процесс продаж и лишние стадии были удалены, но они снова появились после очередного обновления системы и установки данных, привязанных к пакетам.
Лишние стадии мешают не только в воронке продаж, но и в самой карточке продажи
"Пащенко Александр Сергеевич" написал:Изначально был сделан новый процесс продаж и лишние стадии были удалены, но они снова появились после очередного обновления системы и установки данных, привязанных к пакетам.
если используется свой доработанный процесс, то вариант с удалением значений из справочника вполне подойдет, так как ненужные стадии не используются.
Стоит следующая задача: связать состояния обращений, проблем и конфигурационных единиц так, чтобы закрытии обращения/проблемы закрывались и связанные с ними проблемы/обращения. А между конфигурационными единицами устанавливалась степень воздействия друг на друга (Полностью выводит из строя, частично выводит из строя, не влияет на КЕ), так чтобы при выводе из строя одной КЕ, так же выходили из строя (менялись состояния) КЕ, на которую влияет данная.
Связь между КЕ построена на основе детали «Влияет на конфигурации» и поля «Родительская КЕ» с пометками о степени влияния.
Для этого в объект Конфигурационная единица добавлены следующие логические поля:
1. «Полностью выводит из строя КЕ» FullInfluence
2. «Не влияет на КЕ» NotInfluence
3. «Частично выводит из строя КЕ» PartInfluence
И поле InheritStatus – справочник «ConfigItemStatus». В это поле будут записываться состояния, полученные КЕ в результате применения БП автоматизации.
И добавляем новую деталь «Влияет на конфигурации»:
Далее создаем БП, запускающийся при изменении состояния КЕ:
Автоматизация изменения состояний КЕ построена на основе алгоритма рекурсивного обхода дерева:
В скрипте вызываем метод рекурсивного обхода дерева КЕ:
var confItem =new Terrasoft.Configuration.ConfItem(UserConnection);
confItem.FetchFromDB(StartSignal1.RecordId);
ListGuid> confItemIds =new ListGuid>();// здесь сохраняем Id пройденных узлов
ListGuid> changedIds =new ListGuid>();// здесь Id КЕ с измененным состоянием
RecursiveUp(confItemIds, confItem, changedIds);
В переменные БП добавляем уникальные идентификаторы, в которые записываем идентификаторы состояний КЕ (эти состояния должны быть добавлены в справочник ConfigItemStatus):
1) PartWorkId
2) NotWorkId
3) WorkId
В бизнес-процесс добавляем метод:
var updateTemplate ="Update ConfItem Set InheritStatusId = '{0}' Where Id = '{1}'";// шаблон запроса обновления статуса КЕ //Находим КЕ, указанные на детали «Влияние», на которые влияет КЕ текущего узла дерева:
var esq =new EntitySchemaQuery(UserConnection.EntitySchemaManager, "ConfItemInfluence");
esq.AddAllSchemaColumns();
esq.Filters.Add(esq.CreateFilterWithParameters(FilterComparisonType.Equal, "ParentConfItem", confItem.Id));
esq.Filters.Add(esq.CreateFilterWithParameters(FilterComparisonType.Equal, "NotInfluence", 0));
var entities = esq.GetEntityCollection(UserConnection);
//Обходим все найденные КЕ: foreach(var entity in entities) {
var confItemInfluenceDetail = entity as Terrasoft.Configuration.ConfItemInfluence;
var confItemInfluence = confItemInfluenceDetail.ConfItem;
//Далее в зависимости от состояния КЕ текущего узла, меняем статус КЕ, указанной на детали: if(confItem.InheritStatusId== NotWorkId) { if(confItemInfluenceDetail.FullInfluence) { (new CustomQuery(UserConnection, String.Format(updateTemplate, NotWorkId, confItemInfluenceDetail.ConfItemId))).Execute();
confItemInfluence.InheritStatusId= NotWorkId; } elseif(confItemInfluence.InheritStatusId!= NotWorkId) { (new CustomQuery(UserConnection, String.Format(updateTemplate, PartWorkId, confItemInfluenceDetail.ConfItemId))).Execute();
confItemInfluence.InheritStatusId= PartWorkId; } } elseif(confItem.InheritStatusId== PartWorkId) { if(confItemInfluenceDetail.FullInfluence&& confItemInfluence.InheritStatusId!= NotWorkId) { (new CustomQuery(UserConnection, String.Format(updateTemplate, PartWorkId, confItemInfluence.Id))).Execute();
confItemInfluence.InheritStatusId= PartWorkId; } } elseif(confItem.InheritStatusId== WorkId) { (new CustomQuery(UserConnection, String.Format( updateTemplate, WorkId, confItemInfluenceDetail.ConfItemId))).Execute();
confItemInfluence.InheritStatusId= WorkId; }
//Проверяем наличие КЕ, которые влияют на КЕ текущего узла:
var notWorkingCount =(new CustomQuery(UserConnection, String.Format("Select Count(1) from ConfItemInfluence ci join ConfItem c on c.Id = ci.ParentConfItemId Where ConfItemId = '{0}' and ci.NotInfluence = 0 and c.InheritStatusId = '{1}' and ci.FullInfluence = 1", confItemInfluence.Id, NotWorkId))).ExecuteScalarint>();
//Если такие КЕ найдены, то меняем состояния КЕ текущего узла: if(notWorkingCount >0) { (new CustomQuery(UserConnection, String.Format(updateTemplate, NotWorkId, confItemInfluence.Id))).Execute();
CompareStatus(confItemInfluence, NotWorkId, changedIds);
confItemInfluence.StatusId= NotWorkId;
confItemIds.Add(confItemInfluence.Id); } elseif((new CustomQuery(UserConnection, String.Format("Select Count(1) from ConfItemInfluence ci join ConfItem c on c.Id = ci.ParentConfItemId Where ConfItemId = '{0}' and ci.NotInfluence = 0 and ( (c.InheritStatusId = '{1}') or (c.InheritStatusId = '{2}' and ci.FullInfluence = 0) )", confItemInfluence.Id, PartWorkId, NotWorkId))).ExecuteScalarint>()>0) { (new CustomQuery(UserConnection, String.Format updateTemplate, PartWorkId, confItemInfluence.Id))).Execute();
confItemInfluence.StatusId= PartWorkId;
confItemIds.Add(confItemInfluence.Id); }
//Переходим к следующему узлу дерева:
RecursiveUp(confItemIds, confItemInfluence, changedIds);
} } }
Алгоритм состоит в следующем: Для имеющейся КЕ находим все те КЕ, на которые она оказывает частичное или полное влияние и изменяем состояние связанной КЕ. Вместе с этим запоминаем идентификаторы КЕ, которые мы прошли или состояние которых изменилось (confItemIds /changedIds). Это помогает решить две задачи: по списку измененных КЕ можно отослать уведомления об их изменении, либо, если мы предполагаем, что в дереве могут быть циклические зависимости, не обходить уже пройденные узлы.
Изменения состояний КЕ производятся через CustomQuery, т.к. процесс автоматизации запускается по сигналу изменения состояния и нельзя чтобы при изменении состояния КЕ при обходе дерева процесс снова запускался.
Автоматизация связей проблем/обращений/КЕ происходит с помощью следующего бизнес-процесса:
В данном случае алгоритм простой:
Читаем данные обращения
caseItem.FetchFromDB(recordId);
var problemId = caseItem.ProblemId;
var statusId = caseItem.StatusId;
var closeCaseStatus =new Guid("3E7F420C-F46B-1410-FC9A-0050BA5D6C38");
var newCaseStatus =new Guid("AE5F2F10-F46B-1410-FD9A-0050BA5D6C38");
var workCaseStatus =new Guid("7E9F1204-F46B-1410-FB9A-0050BA5D6C38");
var closeProblemStatus =new Guid("459361BE-C3B5-4D6B-9DEC-C8DCB49AE5B3");
var newProblemStatus =new Guid("340A7737-3CFF-4BED-A292-B83CD25DA3DA");
var workProblemStatus =new Guid("1B79DF4C-17AB-4A75-95E3-C53E3793F1C6");
var workConfItemStatus =new Guid("742E7BCE-6191-4AA5-9D16-DB26CF87BC98");
var notWorkConfItemStatus =new Guid("5C97181E-090F-4893-9A21-DEF3161F2347");
var newProblemStatusId = Guid.Empty;
var newConfItemStatusId = Guid.Empty;
var confItemList =new ListGuid>();
var esq =new EntitySchemaQuery(UserConnection.EntitySchemaManager, "ConfItemInCase");
...
var entities = esq.GetEntityCollection(UserConnection);
foreach(var entity in entities) {
var confItemInCase = entity as Terrasoft.Configuration.ConfItemInCase;
confItemList.Add(confItemInCase.ConfItemId); }
new CustomQuery(UserConnection, String.Format("Update Problem Set StatusId = '{0}' Where Id = '{1}'", newProblemStatusId, problemId)).Execute(); if(statusId == closeCaseStatus) { new CustomQuery(UserConnection, String.Format("delete from Reminding Where SubjectId = '{0}'", problemId)).Execute(); } } }
Проходим все зависимые КЕ и меняем их статус, инициируя процесс автоматизации состояний КЕ:
В итоге получаем механизм, позволяющий следить за состоянием конфигурационных единиц и автоматически изменять их в соответствии с обращениями и проблемами в системе.
Добрый день, подскажите где можно почитать или как алгоритмический вставить в левую панель свои кнопки? Вроде подобного:
Задача стоит следующая - добавить кнопку, привязать к ней метод который будет изменять системную переменную, в зависимости от значения true или false кнопка изменяет внешний вид.
Покопался в файлах нашел CTIBase.CtiLeftPanelUtilities думаю это верное направление, но никак не могу структурировать это все
Это не битый файл, это временное хранилище, через сутки ссылка становится битой
Продублирую еще раз
В общем да, LeftPanelTopMenuModule это то что надо, но можно пояснений что там происходит?
Попробовал наследоваться от этой схемы чтобы попробовать для начала добавить туда элемент, но пропали иконки, открыл стандартную, чтобы иконки достать, в ней они есть но не отображаются
Олег, Вы же можете прикрепить изображение как вложенный файл. Необязательно же хранить на хостинге.
В модуле описан функционал верхнего меню.
А что консоль говорит? Отладку делали?
Вы правильно заместили? Так как это модуль, то необходимо его замещать полностью со всеми стрингами и методами.
Изображения в модулях недоступны для скачивания или для просмотра. Как я понял, то можно только загружать файлы в приложение.
В процессе работы с Sales 7.6 возник вопрос, как изменить количество знаков после запятой в курсе валют (по умолчанию 2 знака(хх,хх), нужно сделать 4 знака(хх,хххх)). Как это сделать?
Для изменения количества знаков после запятой в курсе валют необходимо редактировать код карточки "Страница редактирования валюты", а так же проверить на совместимость все сущности, которые используют пересчет по курсу.
Добрый день!
У Вас есть объект CurrencyRate, который содержит колонку Rate. Эта колонка имеет тип Currency, который имеет Precision = 2. Чтобы вы могли использовать 4 знака после запятой, то у Вас есть 2 варианта:
1. Добавить свой объект CurrencyRateEx (к примеру) и создать в нем поле Rate как decimal (0.0001)
Далее по всей конфигурации заменить имя схемы CurrencyRate на CurrencyRateEx (во всех клиентских модулях)
2. Расширить объект CurrenctRate и добавить свое поле RateEx (к примеру), которое будет decimal (0.0001). Далее заменить по всех конфигурации использование поля Rate на RateEx, а в расширяющем объекте для старого поля Rate установить режим использования "никогда".
Также, не зависимо от этих двух вариантов Вам нужно будет изменять страницу редактирования справочника (CurrencyRateEditPage)
У Вас есть объект CurrencyRate, который содержит колонку Rate. Эта колонка имеет тип Currency, который имеет Precision = 2. Чтобы вы могли использовать 4 знака после запятой, то у Вас есть 2 варианта:
1. Добавить свой объект CurrencyRateEx (к примеру) и создать в нем поле Rate как decimal (0.0001)
Далее по всей конфигурации заменить имя схемы CurrencyRate на CurrencyRateEx (во всех клиентских модулях)
2. Расширить объект CurrenctRate и добавить свое поле RateEx (к примеру), которое будет decimal (0.0001). Далее заменить по всех конфигурации использование поля Rate на RateEx, а в расширяющем объекте для старого поля Rate установить режим использования "никогда".
Также, не зависимо от этих двух вариантов Вам нужно будет изменять страницу редактирования справочника (CurrencyRateEditPage)
Как в bpm'online 7.x можно поменять формат даты на dd.MM.yyyy (с точками вместо косой черты)? И поменять разделитель тысяч с запятой на пробел в числах? И десятичную точку на запятую?
Американский формат - это хорошо, но у локальных пользователей вызывает некоторое отторжение.
Здравствуйте! Форматы вывода прописаны в локализации.
Формат даты, можно изменить если в приложении присутствует английская локализация.
Локализация меняется в профиле пользователя:
Для локализации «en-GB» формат даты выглядит как ДД/ММ/ГГГГ (Рис. 2).
Для локализации «en-US» формат даты выглядит как ММ/ДД/ГГГГ (Рис. 3).
Для локалицазии "ru-RU" используется как раз "." в качестве разделителя для дат (ДД.ММ.ГГГГ), а также " " в качестве разделителя для чисел (пример 1 000 000).
Алексей, вот ни разу не видел продукт линейки bpmonline, где после переключения en-US / ru-RU весь интерфейс отображается с другим языком, все же как правило в поставке язык один :wink:
А никак это по другому не подлечить? Так как "плюсанул" тему не зря - имею от пользователей eng версии такой же вопрос про формат даты, ну не нравится им буржуйский mm/dd/yyyy, хотят dd.mm.yyyy
"Демьяник Алексей Олегович" написал:Для локалицазии "ru-RU" используется как раз "." в качестве разделителя для дат (ДД.ММ.ГГГГ), а также " " в качестве разделителя для чисел (пример 1 000 000).
В результате дата будет отображаться как 01.01.0001 (если убрать комментарий и закомментировать предыдущую строчку, то дата будет отображаться как 01/01/0001).
Больше особо и нечего. Остальное касается дней недели и месяцев. Ещё можно изменить первый день недели и для чисел количество знаков, входящих в группу тысяч (если это вдруг кому-то понадобится):
Всем добрый день!
Данные "внедрения" приведут к ошибкам обновления.
Мы настоятельно не рекомендуем это делать!
Также, мы не можем оставить данную информацию для "передачи опыта"
"Артем Гура" написал:Всем добрый день!
Данные "внедрения" приведут к ошибкам обновления.
Мы настоятельно не рекомендуем это делать!
Также, мы не можем оставить данную информацию для "передачи опыта"
То есть, пока Terrasoft не научит систему менять формат даты и чисел, можно забыть про обновления?
Здравствуйте, Владимир!
Данные изменения могут повлиять на корректность обновления, так как изменяются системные переменные ядра. Функционал, предусматривающий пользовательские изменения формата дат/чисел, разделителей пока что не планируется.
Начинаю изучать BPM'Online(Версия 7.6.0.1114). Нужно создать действие которое запускает БП в разделе лид(нужно передать параметр), поискав немного я нашел вот что: http://www.terrasoft.ua/bpmonlinesdk/CreateActionForStandartSection.html https://community.terrasoft.ua/forum/topic/11626
сделал все как книжка пишет, создал новый Замещающий клиентский модуль, выбрал родительский объект LeadPageV2, вставил код, сохранил.
в клиенте перезалогинился перехожу в раздел Лиды, нажимаю на лид и открыть, вот что вижу:
Думаю мой модуль чет напартачил, удаляю его, ничего не поменялось. Кто сталкивался с подобной проблемой прошу помочь.
Вы использовали инструкцию по добавлению действия, которая неактуальна для версии 7.6 (она используется для версий bpm'online 7.0 - 7.2).
В более поздних версиях, в том числе и в 7.6, алгоритм создания действий претерпел изменения. Актуальную документацию по разработке в 7.6 вы можете найти на нашем сайте Академии - http://academy.terrasoft.ru/documents/?product=SDK&ver=7.6.0.
В частности, инструкции по добавлению действий в раздел и на страницы редактирования расположены в блоке [SDK bpm'online] >[Примеры решения типовых задач] > [Разработка клиентского интерфейса].
Виталий, обновите страницу браузера с очисткой кэша страницы. Для этого нажмите F12 для открытия консоли, после чего правой кнопкой мыши нажмите на кнопке обновления страницы, выберите последний пункт.
Если данное действие не поможет, сообщите, точно ли удалена страница LeadPageV2, выполнено действие "Компилировать все" и очищен кэш страницы по инструкции выше.
Что касается ошибки в консоли браузера на Вашем скриншоте выше, она говорит о том, что в замещающей схеме не определен entitySchemaName.
Пример можно посмотреть в любой схеме из базовых пакетов:
Также пропала страница (case)... Но даже после удаления всех своих объектов и пакета кастомного, обновления редис, аппаратной очистки кэша, компиляции конфигурации страница не вернулась.
Трудно определить точную причину ошибки. Судя по скриншоту в странице редактирования не определен entitySchemaName. Если выполнение выше указанных рекомендаций не принесло результат, обратитесь в службу технической поддержки.
Скажите, пожалуйста, можно ли в BPMonline 7.6 создавать объекты программным образом, используя MS VS, язык C# и API, описанный в SDK? Например используя классы из пространства имён Terrasoft.Core.Entities? И если можно, то дайте ссылку на хороший пример. Заранее благодарен.
В карточке звонка, добавил вкладку "История обращений контактов". Настроил фильтрацию при открытии карточки, по аналогии с деталями. Но есть ли возможность настроить фильтрацию так, что бы она срабатывала только при переходе на эту вкладку?
Для фильтрации использовал следующий код:
var ClHistory = wndClHistory.Window.ComponentsByName('dlData').Dataset;
ApplyDatasetFilter(ClHistory, 'ContactID', ContactID, true);
У набора вкладок (компонент, который по умолчанию называется pcPages) есть события OnChangeActivePage и OnChangedActivePage, можно привязаться к какому-то из них.
При этом в обработчике добавить проверку, чему равно свойство ActivePage, нужной вкладке или другой.
Александр, получилось сделать фильтрацию на событие OnChangeActivePage, но возникла проблема.
При открытии карточки звонка (основной вкладки), сохранить её можно, но если сменить вкладку на вторую, фильтрация срабатывает, но сохранить уже звонок нельзя. Нажимаю на кнопку "Ок", но результата никакого. В чем может быть проблема? что я не так сделал?
Вы можете поставить отладчик внутри btnOKOnClick и посмотреть, запускается ли он и куда идёт исполнение. Возможно, там проверяется какое-то условие и происходит выход без сохранения.
Здравствуйте.
Источники этой проблемы могут быть самые разные.
Один из них – подобная ошибка возникала на ранних сборках в случае использования 64-разрядной операционной системы.
Как вариант, попробуйте очистить кэш приложения (%appdata%\Terrasoft\версия\Cache), после чего перезайти и проверить актуальность ошибки. Второй момент - это перерегистрировать библиотеки:
- переименовать папку с Террасофт;
- запустить Террасофт от имени администратора;
- вернуть исходное имя директории;
- перезапустить приложение.
Если проблема не решится нужно подробнее её анализировать:
1. Воспроизводится ли ошибка на других операционных системах (например, Windows 7 x32, Windows XP x32).
2. Воспроизводится ли ошибка под всеми пользователями или под кем-то конкретно?
3. Зависит ли ситуация от прав доступа (админ\неадмин)?
4. Можно ли стабильно воспроизвести?
5. Что за синхронизация (чего с чем)?
6. Были ли изменения в конфигурации?
Таким образом можно сузить место поиска.
Здравствуйте.
Действительно, если на окне баг-репорта нажать на кнопку "Детали", то там можно ознакомиться с детализацией ошибки. Если не получится определить причину, тогда нужно отлаживаться. Так очень сложно установить причину.
Добрый вечер, Создал процесс добавил в него элемент "Открыть страницу редактирования" передаю туда ID записи, отрабатывало все нормально, после добавления логики в БП - процесс запускается и останавливается на шаге Открыть страницу редактирования, причем в журнале он отображается как "Выполняется"
Кнопка "Выполнить элемент" при этом не активна, т.е. после клика по ней ничего не происходит, никаких ошибок в консоле не появляется.
Подскажите в какой стороне вообще искать проблему? Этот элемент не изменялся с тех пор как работал нормально, что могло привести к подобному поведению?
Скорее всего, на одном сервере развернуто несколько сайтов, которые "смотрят" на один порт. По умолчанию это 2011 порт. У каждого сайта должен быть свой уникальный порт. Указанные порты должны быть открыты в фаерволе.
Вы правы, несколько сайтов развернуты на одном сервере, но у всех уникальные порты.
Следующая проблема, в БП добавил таймер, чтобы через промежуток времени повторить действия,
условие стоит
т.е. если выборка пустая, то ждать время и повторять, но когда условие срабатывает, процесс просто зависает со статусом "Выполняется", на таймере стоит значение 60
1) Порты должны быть уникальными файле web.config приложения, а не в IIS
2) Уточните, пожалуйста, продукт и версию (по вопросу того, что процесс не запускается в указанное в таймере время).