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

Нравится

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

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

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

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

Доброго времени суток!
Нужна информация о том способна ли BPM на сие деяние.
Итак возьмем раздел Контрагенты.

В нем мы создали деталь - "Команда контрагента".
В этой детали находятся пользователи которые относятся к данному контрагенту.

Итак вопрос, каким образом можно ограничить количество полей/сущностей на карточке по условию, что пользователь не находится в команде контрагента?
Необходимо чтобы в карточке отображалось максимум 3-4 поля и 1 вкладка - Основная информация и самое главное, необходимо чтобы как только грузится карточка не было никаких задержек.

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

На данный момент скрытие происходит при вызове моей функции, и видимость основных перводоступных полей зависит от аттрибута.

        hideAccountCard: function(_item) {
                if (_item !== 1) {
                        this.Ext.select("#AccountPageV2TabsTabPanel-tabpanel-items li[data-item-index=1]").setStyle("display", "none");
                        this.Ext.select("#AccountPageV2TabsTabPanel-tabpanel-items li[data-item-index=2]").setStyle("display", "none");
                        this.Ext.select("#AccountPageV2TabsTabPanel-tabpanel-items li[data-item-index=3]").setStyle("display", "none");
                        this.Ext.select("#AccountPageV2TabsTabPanel-tabpanel-items li[data-item-index=4]").setStyle("display", "none");
                        this.Ext.select("#AccountPageV2TabsTabPanel-tabpanel-items li[data-item-index=5]").setStyle("display", "none");
                        this.Ext.select("#AccountPageV2TabsTabPanel-tabpanel-items li[data-item-index=6]").setStyle("display", "none");
                        this.Ext.select("#AccountPageV2TabsTabPanel-tabpanel-items li[data-item-index=6]").setStyle("display", "none");
                        this.showInformationDialog("Вы не входите в команду контрагента!");
                } else {
                        his.Ext.select("#AccountPageV2TabsTabPanel-tabpanel-items li[data-item-index=1]").setStyle("display", "");
                        this.Ext.select("#AccountPageV2TabsTabPanel-tabpanel-items li[data-item-index=2]").setStyle("display", "");
                        his.Ext.select("#AccountPageV2TabsTabPanel-tabpanel-items li[data-item-index=3]").setStyle("display", "");
                        this.Ext.select("#AccountPageV2TabsTabPanel-tabpanel-items li[data-item-index=4]").setStyle("display", "");
                        this.Ext.select("#AccountPageV2TabsTabPanel-tabpanel-items li[data-item-index=5]").setStyle("display", "");
                        this.Ext.select("#AccountPageV2TabsTabPanel-tabpanel-items li[data-item-index=6]").setStyle("display", "");
                                }
                        },

Нравится

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

а чем вам фильтрация записей в детали-то не угодила? esq долго выполняется?

Просто от момента открытия карточки до времени скрытия 2-3 секунды.
Такой фриз клиента не устраивает.
Вот я и ищу другие выходы из ситуации.

Хммм... это вообще ненормально. У меня у одного клиента такое настроено, так изменение мнговенное почти. Фриз более полсекунды явно свидетельствует о наличии проблем технического свойства. Онсайт?

"Дмитрий Степанов" написал: У меня у одного клиента такое настроено, так изменение мнговенное почти

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

"Владимир Соколов" написал:
Дмитрий Степанов пишет:

У меня у одного клиента такое настроено, так изменение мнговенное почти

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


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

"Владимир Соколов" написал:
Дмитрий Степанов пишет:

У меня у одного клиента такое настроено, так изменение мнговенное почти

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

я отключал сам пункт меню с этой возможностью :)

"Дмитрий Степанов" написал:я отключал сам пункт меню с этой возможностью :)

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

"Владимир Соколов" написал:

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

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

"Демьяник Алексей" написал:Если изменить режим использования поля на уровне объекта на "Никогда", то после очистки кеша по полю нельзя будет отфильтровать и отобразить его в реестре раздела.

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

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

Максим Шевченко, кстати дельный совет.
Кажется это решит проблему, спасибо)

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

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

Возникла проблема при добавлении вложения.
элементом "Добавить данные" создал активность, и потом при добавлении файла в активность(файл находится в Базе знаний, копирую оттуда) выбивает ошибка при компиляции: 'The type or namespace name 'Stream' could not be found (are you missing a using directive or an assembly reference?)'
на строке:

internal FuncStream> _recordDefValues_Data;

 

Нравится

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

Using System.IO добавили в контекст процесса?

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

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

Вам необходимо заполнить значения полей:

  • Тело
  • Тело письма в формате HTML

В поле "Тело" необходимо задать html код письма, добавив значения необходимых параметров из процесса. Единственная сложность - двойные кавычки в html необходимо экранировать (так, как C# будет считать кавычки окончанием строки).

Быстрого способа и сформировать письмо и добавить вложение, к сожалению, нет. Для заполнения поля "Тело" можно сделать приблизительно следующее:
1) Создать шаблон
2) Выполнить запрос к таблице EmailTemplate для получения значения поля Body созданного шаблона
3) Перенести значение этого поля, заменив макросы на параметры процесса и экранировав кавычки.

Здравствуйте! а есть ограничение по объему вложенных файлов? в рамках процесса нужно будет отправлять письма с вложенными файлами и там их большое число. боюсь упереться в ограничения при отправке

Zaitova Liubov,

Здравствуйте, Любовь!

Ограничение на объем файлов регулируется в системной настройке - 

Максимальный размер загружаемого файла.

С помощью данной системной настройке ВЫ можете увеличить или уменьшить ограничение на загружаемые файлы.

В 7.17.1 добавится возможность без кода, действиями в БП манипулировать с файлами, находящимися на деталях, в том числе и формировать письма со вложениями.

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

 Подскажите каким именно способом это делать

Максим, см. описания релизов.

7.17.1:

  • Появилась возможность автоматизировать управление файлами в бизнес-процессах. Для этого реализован элемент бизнес-процесса [Обработать файл], который позволяет вычитывать и копировать файлы, которые находятся на детали [Файлы и ссылки]. Вычитанные файлы формируют исходящую коллекцию, которую можно использовать далее в процессе. Например, элемент [Отправить email] может добавлять нужные файлы в виде вложений в письмо.

    Данный элемент работает только с теми файлами, которые хранятся в базе данных приложения. Если у вас настроено хранение файлов в стороннем хранилище (в файловой системе или облаке), то данный элемент не сможет с ними работать. API для работы с файлами из сторонних хранилищ появится в ближайших релизах.

    Пример использования элемента [Обработать файл]

    business_process_process_file

     

  • Добавлен новый параметр процесса “Файл”. Этот параметр хранит информацию о файле и предназначен для передачи этой информации между элементами и бизнес-процессами. 
  • В элементе [Отправить email] реализована возможность добавлять вложенные файлы в отправляемые письма. Для этого в элемент необходимо добавить параметр и указать в качестве источника данных необходимые файлы. Список файлов можно получить из элемента [Обработать файл]. 

7.17.2

  • Реализована возможность пользовательскими инструментами настроить генерацию отчетов Word и Fast Report в элементе бизнес-процесса [Обработать файл]. Сгенерированные отчеты можно добавить в любую запись на деталь [Файлы и ссылки] или использовать далее в процессе, например, отправить вложением по email.

Зверев Александр А есть уже какая-то подробная инструкция или статья на эти тему с подробно расписанным примером?

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

Здравствуйте, уважаемое сообщество!

Настроил телефонию согласно инструкции https://academy.terrasoft.ru/documents/sales-team/7-7-0/kak-nastroit-int...
Всё отлично, звонок проходит, слышно хорошо, но у нас несколько менеджеров и каждому привязана своя симка, разделение на стороне Astresk'а выполнено при помощи контекстов, можно ли как-то настроить для каждого пользователя свой контекст или передавать его при вызове, а то при настройке по умолчанию в Terrasoft.Messaging.Service.exe.config для Asteriks originateContext="from-internal" и вызов для всех менеджеров идёт с одного номера.

7.9.0.1228

Нравится

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

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

Насколько мне известно в Asterisk можно настроить отдельно очередь для входящих и исходящих звонков. Попробуйте выполнить настройку исходящих звонков создав для каждого менеджера отдельную очередь и привязав к ней отдельную сим-карту и линию менеджера. Про настройку очереди для исходящих звонков в Asterisk есть много статей. Например, https://habrahabr.ru/post/204048/ или https://habrahabr.ru/post/180445/

"Мотков Илья" написал:

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

Насколько мне известно в Asterisk можно настроить отдельно очередь для входящих и исходящих звонков. Попробуйте выполнить настройку исходящих звонков создав для каждого менеджера отдельную очередь и привязав к ней отдельную сим-карту и линию менеджера. Про настройку очереди для исходящих звонков в Asterisk есть много статей. Например, https://habrahabr.ru/post/204048/ или https://habrahabr.ru/post/180445/


Спасибо, буду копать в этом направлении

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

Пытаюсь получить связанную структуру по url

0/ServiceModel/EntityDataService.svc/UsrKinoAndSetyCollection(guid'57be85d8-913f-483e-a349-8bb40b212257')/UsrProductDetailCollectionByUsrKinoteatr

в ответ приходит

{
  "error": {
    "code": "4",
    "message": {
      "lang": "",
      "value": "Not Implemented"
    },
    "innererror": {
      "message": "Not Implemented",
      "type": "System.Data.Services.DataServiceException",
      "stacktrace": "   at System.Data.Services.WebUtil.GetRequestEnumerator(IEnumerable enumerable)\r\n   at System.Data.Services.DataService`1.SerializeResponseBody(RequestDescription description, IDataService dataService, IODataResponseMessage responseMessage)\r\n   at System.Data.Services.DataService`1.HandleRequest()",
      "internalexception": {
        "message": "Method 'SelectMany' not supported",
        "type": "System.NotSupportedException",
        "stacktrace": "   at Terrasoft.Core.Entities.EntityQueryProvider.VisitMethodCall(MethodCallExpression node)\r\n   at Terrasoft.Core.Entities.EntityQueryProvider.Build(Expression expression)\r\n   at Terrasoft.Core.Entities.EntityQueryProvider.LoadEntityCollection(Expression expression)\r\n   at Terrasoft.Core.Entities.EntityQueryProvider.ExecuteEnumerable(Type elementType, Expression expression)\r\n   at Terrasoft.Core.Entities.EntityQuery`1.GetEnumerator()\r\n   at System.Data.Services.WebUtil.GetRequestEnumerator(IEnumerable enumerable)"
      }
    }
  }
}

В чем ошибка?

Нравится

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

Здравствуйте, Сергей.

Уточните пожалуйста версию системы.

"Мария Ватулина" написал:

Здравствуйте, Сергей.

Уточните пожалуйста версию системы.


версия 7.10.0.1742

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

Есть сущность кинотеатры и сущность продукты. Кинотеатр может быть связан(пользоваться) с несколькими продуктами. Так же продукт может быть использоваться в нескольких кинотеатрах. Я пытаюсь получить продукты которыми пользуется определенный кинотеатр.

Добрый день, Сергей.

Приведем пример запроса по аналогии (на примере таблиц Активности, Контакты и Участники Активностей).

Участники Активностей – это таблица развязки, так как у контакта может быть много активностей, и в свою очередь, в каждой активности может участвовать несколько контактов. Запрос ниже выбирает все активности, в которых участником является конкретный пользователь

ActivityCollection?$select=Title,StartDate,DueDate&$filter=(ActivityParticipantCollectionByActivity/any(x:%20x/Participant/Id%20eq%20(guid%2724cf58c3-3926-4bff-9353-b8ef887f7b17%27)))
)

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

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

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

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

Версия 7.9 sales.

Стандартное добавление детали с реестром в карточку выглядит так:

entitySchemaName: "Object",
                details: /**SCHEMA_DETAILS*/{
                        "UsrDetail2": {
                                "schemaName": "SchemaDetail",
                                "entitySchemaName": "DetailObject",
                                "filter": {
                                        "detailColumn": "Object",
                                        "masterColumn": "Id"
                                },
                        }
                }/**SCHEMA_DETAILS*/,

В результате на детали отображаются записи объекта DetailObject, у которых значение Object соответствует значению открытой карточки, то есть entitySchemaName основной карточки.

К детали можно добавить дополнительные условия для фильтра, через свойство filterMethod.

Можно ли при этом обойтись без основного filter. То есть по сути сделать деталь, на которой отображались бы все записи DetailObject, но фильтрация работала бы не по карточке, а по одной из колонок объекта Object?

Нравится

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

Добрый день, Денис!

Дело в том, что если вы указываете filterMethod, фильтрация и так будет по нему, filter учитываться не будет. Однако, указывать его в любом случае нужно, так как при добавлении DetailObject через карточку(после нажатия "+" на детали), в нее автоматически проставляются некоторые поля из связанного Object.

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

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

В версиях 7.9 - 7.10 появился функционал множественного добавления записей на деталь: https://academy.terrasoft.ru/documents/technic-sdk/7-10/mnozhestvennoe-d...

Вопрос - чем этот вариант отличается от обычной детали с выбором из справочника https://academy.terrasoft.ru/documents/technic-sdk/7-10/sozdanie-detali-... ?

Нравится

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

Добрый день, Денис!

Они ничем и не отличаются. Просто это был достаточно частый кейс, и разработчики Террасофта добавили новый миксин, чтобы можно было сделать то же самое, но меньшим количеством строчек кода за меньшее время.

Илья, понятно, спасибо.

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

Разбирались с механизмом кейсов на портале - необходимо было дать пользователю заполнять Subject и Symptoms самостоятельно, а не слепливать их из Service+Category.

С Subject всё решилось довольно просто.
А с Symptoms интересная вещь обнаружилась:

В PortalCaseSectionActionsDashboard довольно умно прописано формирование Symptoms из сообщения на портале:

        saveMasterEntity: function(config) {
                var activeTabName = this.get("ActiveTabName");
                if (activeTabName === "PortalMessageTab" && this.isNewMode()) {
                        this.setCaseSymptoms(config.scope.get("Message"));
                        }
                        this.callParent(arguments);
                },
                               
        setCaseSymptoms: function(message) {
                var symptoms = this.getMasterEntityParameterValue("Symptoms");
                if (this.Ext.isEmpty(symptoms)) {
                        var formatter = this.Ext.util.Format;
                        this.setMasterEntityParameterValue("Symptoms", this.Terrasoft.decodeHtmlEntities(formatter.stripTags(message)));
                }
        }

Однако в объекте Case перед этим в процессе на CaseInserting стоит заполнение Symptoms = Subject, что сводит на нет предыдущую логику

        if(string.IsNullOrEmpty(Entity.GetTypedColumnValuestring>("Symptoms"))) {
                var subject = Entity.GetTypedColumnValuestring>("Subject");
                Entity.SetColumnValue("Symptoms", subject);
        }
        return true;

Если пользователь нажмет Publish, то всё работает нормально, но если Save (что ему на запрещено), то Symptoms заполняется некорректно

Как бы убрать из процесса CaseInserting эту "заглушку", чтобы остальное не рухнуло?

Нравится

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

Владимир, добрый день!
Логика генерации поля Symptoms довольно проста, система проверяет заполнено ли данное поле при сохранении обращения, если нет, то происходит копирование значения из поля "Тема". Если данное поле было заполнено до сохранения записи обращения, то значение поля не меняется.
Данное поле "Описание" можно вывести на портале и заплнять вручную, при этом данное поле не будет генерироваться автоматически, не зависимо от нажатия кнопки "Опубликовать" или "Сохранить".

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

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

"Михайленко Михаил" написал:Быстрым решением будет вывод поля "Описания" на карточку портала

Спасибо!
Но думаю, что в будущих версиях можно сделать одинаковым логику при нажатии на кнопки "Сохранить" и "Опубликовать" (с формированием "Описания" из комментария), так как для пользователя это совершенно одинаковые по смыслу действия

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

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

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

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

Версия 7.10.0.1742

Нравится

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

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

Базовая логика приложения - элемент "Страница редактирования" создает в системе техническую активность. Элемент "Преднастроенная страница"/"Автогененрируемая страница" активность не создает. По этой причине при выполнении этих элементов активность создана не будет.

"Демьяник Алексей" написал:Базовая логика приложения - элемент "Страница редактирования" создает в системе техническую активность. Элемент "Преднастроенная страница"/"Автогененрируемая страница" активность не создает. По этой причине при выполнении этих элементов активность создана не будет.

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

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

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

Базовая логика приложения - элемент "Страница редактирования" создает в системе техническую активность. Элемент "Преднастроенная страница"/"Автогененрируемая страница" активность не создает. По этой причине при выполнении этих элементов активность создана не будет.


а нет никакой возможности сделать так, чтобы активность все таки появлялась?

"Zaitova Liubov" написал:а нет никакой возможности сделать так, чтобы активность все таки появлялась?

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

"Максим Шевченко" написал:Нет, но можете не использовать преднастроенная\автогенерируемая,

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

"Владимир Соколов" написал:Да, иногда необходимо ввести дату. Или выбрать сотрудника из списка. Или ввести число. Для каждой такой страницы создавать свой раздел?

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

С другой стороны, вы так же можете создать обычную активность в рамках вашего БП, а открываемую "преднастроенная\автогенерируемая" страницу, привязать к ней, тогда в самой записи будет кнопка продолжения процесса:

И далее по процессу данную активность можно будет завершить. Как вариант.

Проблему зарегистрировали.

"Максим Шевченко" написал:

С другой стороны, вы так же можете создать обычную активность в рамках вашего БП, а открываемую "преднастроенная\автогенерируемая" страницу, привязать к ней, тогда в самой записи будет кнопка продолжения процесса:


а как страницу можно привязать к активности?

"Максим Шевченко" написал:В любом случае зарегистрируем проблему, что пользователям хочется видеть служебную активность

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

"Владимир Соколов" написал:И любой может взять и заполнить данные в этой странице

В любом из вышеописанных обходных путей, будь-то с созданием активности, либо кастомного объекта, на данную активность или объект можно раздать права.
Если вопрос только в правах на использование "преднастроенная\автогенерируемая" страницы, то указывайте конкретного пользователя в "Кому отобразить страницу?".

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

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

Есть страница редактирования PageEdit1 в Package1, которая наследуется от базовой в некотором пакете, также есть PageEdit2 (наследник от PageEdit1) в Package2 и PageEdit3 (наследник от PageEdit2) в Package3.

Пакеты наследуются от верхнего к нижнему в такой последовательности: Package1 -> Package2 -> Package3.

Нужно удалить PageEdit2.

Интересует последовательность действий, что нужно сгенерировать и скомпилировать, чтобы система поняла, что PageEdit3 нужно наследоваться от PageEdit1.

Нравится

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

Только удалить PageEdit2, и пересоздать PageEdit3, указав нового родителя.

А после этого нужно сгенерировать исходные схемы или скомпилировать все?

Если мы говорим о JS схемах, то нужно почистить кеш.
Если это страницы разделов, тогда нужно еще подставить UID новой страницы в таблицу SysModuleEdit. Если это страница справочника, выполненная в C#, то нужно компилироваться. Также нужно поправить таблицу Lookup, чтобы при открытии справочника открывалась новая страница, а не базовая страница редактирования значений справочника.

А вообще схемы лучше не удалять.

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