Вопрос

Коллеги, добрый день!

Подскажите, пожалуйста, возможно ли выполнить импорт данных из Excel в раздел [Сервисы] во вкладку "Файлы и ссылки" на деталь "Файлы и примечания" ?

В конфигураторе и мастере импорта найти объект не удаётся :(

Заранее спасибо!

У меня такой же вопрос

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

Если нужно импортировать в примечания, тогда импортировать нужно в саму таблицу [Сервисы] в поле "'Заметки".

А, если нужно во вкладку "Файлы и ссылки", то, чтобы не искать таблицу по названию, можно сразу выполнить импорт из детали через меню [Импорт данных]. Смотрите пример на Академии.

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

Добрый день!
Не могу понять как изменить колонку для поиска по умолчанию. Если открывается lookup (this.openLookup(config, this.lookupCallback, this);) - то как изменить эту самую колонку с базового "Название" на "Полное имя"? Суть в том, чтобы когда открывалось окно - можно было сразу писать в поиске, а не выбирать каждый раз "Полное имя"

У меня такой же вопрос

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

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

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

Добрый день!
Мне необходимо создать правило поиска дублей Сервисных договоров по полю Name.
Нашел пример в академии с созданием хранимой процедуры. 

https://academy.terrasoft.ru/documents/technic-sdk/7-13/dobavlenie-prav…

В ней указано:
INSERT INTO [ContactDuplicateSearchResult]. В моем случае таблицы [ServicePactDuplicateSearchResult] нет. Нужно ли ее создавать? В коробке правило поиска дублей работает только для контактов и контрагентов что ли?

У меня такой же вопрос

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

В коробке да реализованы правила поиска дублей, только по сущностям:

- Контакты

- Контрагенты 

- Лиды

Все остальное, это Кастомная доработка.

В коробке да реализованы правила поиска дублей, только по сущностям:

- Контакты

- Контрагенты 

- Лиды

Все остальное, это Кастомная доработка.

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

Но, в общем, реализация этой функциональности очень обьемна и сводится к следующему:

1. Создать процесс для поиска записей в своем разделе (аналогично процессу StartGlobalContactDuplicatesSearch).
2. Для поиска необходимо создать процедуру в базе данных, аналогичную уже существующим нашим (по Вашей ссылке в руководстве разработчика описана последовательность создания хранимой процедуры).
3. Процедура будет записывать данные в созданный Вами объект MyObjectDuplicates (создайте объект по аналогии с объектом ContactDuplicate)
4. Необходимо создать новую страницу редактирования, которая будет отображать данные из созданного объекта MyObjectDuplicates по аналогии со страницей DuplicatesPageV2 (либо заместите DuplicatesPageV2, добавив в нее нужную логику).

ууу...

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

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

в корень зрите, так тоже можно решить проблему)

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

Здравствуйте!
Система - bpm'online service enterprice 7.13 
Раздел Конфигурации(он же Продукты на других версиях) в карточке единицы конфигурации есть деталь Комплектация, где присутствует возможность добавить связанные продукты(ед. конфигурации).
Интересует возможность добавления в контейнер секции(Конфигурации) поля для ввода и кнопки после нажатия на которою устанавливался бы фильтр на ед. конфигурации по названию(которое было введено в поле) и плюс в грид выводились все комплектующие данной ед. конфигурации.
Можно ли такое реализовать?

У меня такой же вопрос

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

Андреев Андрей Сергеевич,

Так, ну тогда можно попробовать следующий вариант:
1) Создаем контейнер и поле для поиска

{
                "operation": "insert",
                "name": "MyFilterContainer",
                "parentName": "LeftGridUtilsContainer",
                "propertyName": "items",
                "index": 0,
                "values": {
                    "id": "MyFilterContainer",
                    "itemType": this.Terrasoft.ViewItemType.CONTAINER,
                    "items": [],
                    "layout": {
                        "column": 25,
                        "row": 1,
                        "colSpan": 4
                    }
                }
            },
            {
                "operation": "insert",
                "parentName": "MyFilterContainer",
                "propertyName": "items",
                "name": "UsrEmail",
                "values": {
                    "bindTo": "UsrEmailFilter",
                    "caption": {"bindTo": "Resources.Strings.UsrEmailFilter"},
                    "layout": {
                        "column": 5,
                        "row": 2,
                        "colSpan": 4
                    },
                    "controlConfig": {
                        "change": {
                            "bindTo": "emailChanged"
                        }
                    }
                }
            }

2) Добавляем атрибуты
 

  attributes: {
            "UsrEmailFilter": {
                "dataValueType": Terrasoft.DataValueType.TEXT
            },
            "UsrEmails": {
                "dataValueType": Terrasoft.DataValueType.TEXT,
                "values": ""
            }
        },

3) Добавляем методы
 

emailChanged: function(a, b, c) {
                this.set("UsrEmails", a);
                this.onUsrFilterChanged();
                debugger;
            },
            clearFilter: function() {
                this.set("UsrEmailFilter", "");
                this.onUsrFilterChanged();
            },
 
            onUsrFilterChanged: function() {
                this.reloadGridData();
            },
 
            initQueryFilters: function(esq) {
                this.callParent(arguments);
 
                var usrEmailFilter = this.get("UsrEmails");
 
                if (usrEmailFilter) {
                    esq.filters.add("UsrEmailFilter", this.Terrasoft.createColumnFilterWithParameter(
this.Terrasoft.ComparisonType.CONTAIN, "[Account:Id].Email".substring(), usrEmailFilter));
                } else {
                    esq.filters.removeByKey("UsrEmailFilter");
                }
            }

Конкретно в данном примере вы на выходе получите поле для фильтрации контрагентов по Email.
Ваша же задача, доработать initQueryFilters, во первых заменить на продукты фильтр и дополнить значениям с детали.

Делаете esq запрос,с фильтрами, по названию, в примере выше есть, формируйте коллекцию Id записей, затем по этой коллекции, делайте еще одну выборку уже в деталь, на выходе получите еще одну коллекцию ID продуктов записей, дополните её значениями первой коллекции, после чего, весь этот массив данных передайте в initQueryFilters и через обычный for (i=0; collection.lenghr; i++) { постройте и верните filterGroup }

Можете скриншотами показать, что вы хотите? Как-то все запутано звучит.
Что касается, первой части "Поле для ввода" и "Кнопки" по нажатию на которой в гриде отобразить подходящие значения - реализовать можно, делается достаточно быстро.
В моем понимании этой части вашей задачи все выглядит так: есть раздел Контрагент => Ввел в нужном Поле например Наша компания => клик Найти => в гриде раздела отобразились все записи с названием "Наша компания".
Если верно, то что вы хотите во 2-ой части своего вопроса?

Литвинко Павел,

http://prntscr.com/lj4zpx

На скрине сама секция - Техника аки Конфигурации

1.Контейнер где должен располагаться фильтр(поле и кнопка)
2. Сущность секции аки Запись

http://prntscr.com/lj50rz

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

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

Как сделать такого рода фильтрацию?

 

Андреев Андрей Сергеевич,

Так, ну тогда можно попробовать следующий вариант:
1) Создаем контейнер и поле для поиска

{
                "operation": "insert",
                "name": "MyFilterContainer",
                "parentName": "LeftGridUtilsContainer",
                "propertyName": "items",
                "index": 0,
                "values": {
                    "id": "MyFilterContainer",
                    "itemType": this.Terrasoft.ViewItemType.CONTAINER,
                    "items": [],
                    "layout": {
                        "column": 25,
                        "row": 1,
                        "colSpan": 4
                    }
                }
            },
            {
                "operation": "insert",
                "parentName": "MyFilterContainer",
                "propertyName": "items",
                "name": "UsrEmail",
                "values": {
                    "bindTo": "UsrEmailFilter",
                    "caption": {"bindTo": "Resources.Strings.UsrEmailFilter"},
                    "layout": {
                        "column": 5,
                        "row": 2,
                        "colSpan": 4
                    },
                    "controlConfig": {
                        "change": {
                            "bindTo": "emailChanged"
                        }
                    }
                }
            }

2) Добавляем атрибуты
 

  attributes: {
            "UsrEmailFilter": {
                "dataValueType": Terrasoft.DataValueType.TEXT
            },
            "UsrEmails": {
                "dataValueType": Terrasoft.DataValueType.TEXT,
                "values": ""
            }
        },

3) Добавляем методы
 

emailChanged: function(a, b, c) {
                this.set("UsrEmails", a);
                this.onUsrFilterChanged();
                debugger;
            },
            clearFilter: function() {
                this.set("UsrEmailFilter", "");
                this.onUsrFilterChanged();
            },
 
            onUsrFilterChanged: function() {
                this.reloadGridData();
            },
 
            initQueryFilters: function(esq) {
                this.callParent(arguments);
 
                var usrEmailFilter = this.get("UsrEmails");
 
                if (usrEmailFilter) {
                    esq.filters.add("UsrEmailFilter", this.Terrasoft.createColumnFilterWithParameter(
this.Terrasoft.ComparisonType.CONTAIN, "[Account:Id].Email".substring(), usrEmailFilter));
                } else {
                    esq.filters.removeByKey("UsrEmailFilter");
                }
            }

Конкретно в данном примере вы на выходе получите поле для фильтрации контрагентов по Email.
Ваша же задача, доработать initQueryFilters, во первых заменить на продукты фильтр и дополнить значениям с детали.

Делаете esq запрос,с фильтрами, по названию, в примере выше есть, формируйте коллекцию Id записей, затем по этой коллекции, делайте еще одну выборку уже в деталь, на выходе получите еще одну коллекцию ID продуктов записей, дополните её значениями первой коллекции, после чего, весь этот массив данных передайте в initQueryFilters и через обычный for (i=0; collection.lenghr; i++) { постройте и верните filterGroup }

Литвинко Павел,

Спасибо большое!
Чекните ЛС плз.

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

Коллеги, требуется помощь.

Добавляю в VisualStudio2017 ссылку на сервис /0/ServiceModel/EntityDataService.svc/,ввожу логин и пароль, нажимаю далее - и высвечивается ошибка (рис 0001.1 и 0001). В сообщении выдаётся ссылка на документацию http://odata.github.io/odata.net/#OData-Client-Code-Generation-Tool

Если вводить адрес сервера в строку браузера - то после авторизации отврывается нормальный xml (рис. 0003)

Как поправить ошибку?

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

Прикрепленные файлы
0001.1.png21.53 КБ
0001.png61.55 КБ
0003.png43.26 КБ

У меня такой же вопрос

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

Есть инструкция по созданию прокси-классов, проверьте, может, что-то упустили.

Также, если есть доступ к бинарникам сайта, вместо EntityDataService из своей программы можно работать посредством DataService, как описано тут.

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

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

Все работает

Terrasoft.sdk.Model.addBusinessRule("Account", {
    ruleType: Terrasoft.RuleTypes.Visibility,
    conditionalColumns:
        [
            {name: "UsrStage", value: "a5d0ceac-3ef4-45e0-be25-af3a1190f6f9"}
        ],
        triggeredByColumns: ["UsrStage"],
        dependentColumnNames: ["UsrInstalationDate"]
    }
);

Как сделать такое же правило, но для признака "обязательно для заполнения".

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

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

 

 

У меня такой же вопрос

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

Requirement правило не поможет в данном случае. Нужно использовать Custom. Что-то вроде этого.

Terrasoft.sdk.Model.addBusinessRule("UsrMyModel", {
    name: "RuleName",
    ruleType: Terrasoft.RuleTypes.Custom,
    triggeredByColumns: [/*Список колонок, которые активируют правило*/],
    events: [Terrasoft.BusinessRuleEvents.Load, Terrasoft.BusinessRuleEvents.ValueChanged, Terrasoft.BusinessRuleEvents.Save],
    executeFn: function(record, rule, column, customData, callbackConfig) {
        var hasError = false; //булевая переменная, указывающая корректность поля.
        var errorMessage = "Необходимо указать значение."; // Сообщение об ошибке.
        //Выполняем нужный код, определяющий наличие ошибки
        record.changeProperty("UsrMyColumn", {
            isValid: {
                value: hasError,
                message: errorMessage
            }
        });
        Ext.callback(callbackConfig.success, callbackConfig.scope);
    }
});

 

Обязательность задаётся как Terrasoft.RuleTypes.Requirement. В конфигурации есть много примеров использования. Например, в MobileContactAddressModelConfig так:

Terrasoft.sdk.Model.addBusinessRule("ContactAddress", {
    name: "ContactAddressRequirementRule",
    ruleType: Terrasoft.RuleTypes.Requirement,
    requireType: Terrasoft.RequirementTypes.OneOf,
    triggeredByColumns: ["Address", "City", "Country"],
    position: 3
});

 

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

Requirement правило не поможет в данном случае. Нужно использовать Custom. Что-то вроде этого.

Terrasoft.sdk.Model.addBusinessRule("UsrMyModel", {
    name: "RuleName",
    ruleType: Terrasoft.RuleTypes.Custom,
    triggeredByColumns: [/*Список колонок, которые активируют правило*/],
    events: [Terrasoft.BusinessRuleEvents.Load, Terrasoft.BusinessRuleEvents.ValueChanged, Terrasoft.BusinessRuleEvents.Save],
    executeFn: function(record, rule, column, customData, callbackConfig) {
        var hasError = false; //булевая переменная, указывающая корректность поля.
        var errorMessage = "Необходимо указать значение."; // Сообщение об ошибке.
        //Выполняем нужный код, определяющий наличие ошибки
        record.changeProperty("UsrMyColumn", {
            isValid: {
                value: hasError,
                message: errorMessage
            }
        });
        Ext.callback(callbackConfig.success, callbackConfig.scope);
    }
});

 

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

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

Я столкнулся со следующей проблемой в DevExpress дизайнере отчетов bpm'online. При печати отчета таблица записей, если она не вмещается на первую страницу, переносится на вторую, однако со второй она разделяется нормально, перенося только часть на третью и т.д.

Подскажите, пожалуйста, в чем может быть проблема. Благодарю.

У меня такой же вопрос

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

Дело может быть и в самом DevExpress. Без анализа конкретного Вашего отчёта сложно сказать точно, в какой строке ошибка.

Вместо DevExpress можно использовать отчёты в Word или в Excel. Если стандартного движка мало, в маркете есть бесплатные дополнения: 1, 2, 3.

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

Здравствуйте, Александр! Спасибо вам за ответ!

Ошибка была в том, что свойству Keep Together, которое отвечает за разрыв таблицы, нужно проставить "No" в нескольких местах. У меня проблема решилась после проставления в table, tableRow, tableCell, Detail (в нем находилась таблица). В Detail помимо этого свойства есть еще Keep Together with Detail Reports, которое я тоже изменил.

Спасибо за информацию, Арслан.

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

Добрый день!

Решаем следующую задачу: интеграция bpm с внешней системой для синхронизации контактов. 

Имеются порядка 40к контактов из AD, BS и ручной загрузки. Все они собраны в одной системе и обновляются там автоматически. Стоит вопрос - как лучше проводить синхронизацию контактов bpm?

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

У меня такой же вопрос

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

Если не в Exchange, можно придумать самые различные способы синхронизации: из внешней системы работать с веб-сервисами bpm'online по OData или DataService. Или наоборот, из bpm'online периодически обращаться к сервисам внешней системы. Если есть доступ в базу bpm'online, можно напрямую писать в таблицы контактов и деталей. Или то же самое, но с использованием шлюзовых таблиц.

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

Добрый день!

Столкнулся с проблемой: письма видят только те люди, кто участвуют в процессе ее обработки. Но обработкой писем занимаются 10% от всех пользователей. Поэтому надо настроить права на чтение через БП. 

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

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

Заранее спасибо за помощь.

У меня такой же вопрос

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

Попробуйте создать БП  с стартовым сигналом создание активности с типом Email (те в сигнале объект активность,а в фильтрах тип=Email)

Права нужно менять этого же объекта те по созданию активности с типом email (входящего) вы из стартового сигнала вычитываете id созданной записи и на нее раздаете права!

В последних версиях появилась настройка, дающая права на письма определённым ролям 

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

Это с какой версии и где? Может есть такое, а я не знаю

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

К сожалению, БП просто не запускается с таким стартовым сигналом

Быстров Сергей,

1) Как  вы получаете письма? У вас своя какая то интеграция с почтовой системой?

2) Выложите принскрины вашего БП с параметрами стартового сигнала

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

Ошибка оказалась банальней некуда - был выключен БП. Включил и все заработало. Права на письма раздаются. Спасибо за помощь.

Вообще не подумал, что БП может быть выключен 

Может кто подсказать, если я хочу стартовать БП не с добавления активности (что сейчас и работает), а с нажатия кнопки "Обработать" (на скриншоте) - http://prntscr.com/lc5pf7

Итог:

Стартовый сигнал: Активность; фильтр: "Тип"=почта, "Нуждается в обработке"=нет

Далее уже назначение прав, прочитка письма и анализ отправителя. Если письмо входящее - анализируется состояние обращения и отрабатывается переоткрытие. Таким образом все необходимые задачи были решены. 

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

 

О компании

«BRITA» является одним из технологических лидеров и ведущим авторитетным экспертом в сфере улучшения качества воды. Специалисты компании гарантируют высокое качество своей продукции благодаря проведению научных исследований в области очистки воды и созданию разработок на их основе.

Среди достижений «BRITA» — многочисленные международные награды «Design Awards» за постоянное усовершенствование своих товаров. Основа успешности компании — стремление максимально расширить ассортимент предлагаемой продукции.

Предпосылки внедрения bpmonline

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

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

Задачи внедрения bpmonline

  1. Ведение клиентской базы и истории взаимодействия с клиентами компании (сделки, сервисное обслуживание, мультиканальные коммуникации) в единой системе.
  2. Сегментация клиентской базы на потенциальных и действующих клиентов для качественной обработки по настроенному процессу с целью увеличения объёмов продаж.
  3. Ограничение прав доступа менеджеров к клиентской базе для обработки ответственными только закрепленными за ними клиентов.
  4. Консолидация информации по выполненному и планируемому сервисному обслуживанию в карточке клиента.
  5. Возможность обработки обращений сервисными инженерами в мобильном приложении без необходимости находиться за стационарным ПК.
  6. Получение сводной информации по работе сервисной службы компании для анализа и повышения качества предоставления услуг.

Для выполнения поставленных задач была выбрана система bpmonline sales и bpmonline service.

В рамках данного кейса будут описаны настройки, выполненные для блока bpmonline service.

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

В карточке контрагента была добавлена вкладка «Сервисное обслуживание» для фиксации информации об условиях сервисного обслуживания клиентов. На вкладке отображается информация по установленному оборудованию клиента, характеристикам воды и дате проведения последнего сервисного обслуживания (Рис. 1)

                                                                     Рис.1

Настроен бизнес-процесс для автоматического расчёта даты следующего сервиса в зависимости от периода предоставления сервисного обслуживания данному контрагенту. При проставлении даты проведения последнего сервиса появляется окно для выбора периода проведения следующего. (Рис. 2)

                                                                      Рис.2

В зависимости от выбранного периода в карточке проставляется планируемая дата сервиса. За две недели до планируемой даты сервисного обслуживания ответственному сотруднику автоматически назначается задача: «Связаться с контрагентом по вопросам проведения планового сервиса».

Обработка обращений

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

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

Процесс обработки обращений в мобильном приложении:

  • В мобильном приложении было добавлено рабочее место сервис-инженера, которое включает в себя основные разделы системы, необходимые для обработки заявок на проведение сервиса.
  • Выполнена настройка страницы обращения. Карточка обращения содержит следующую информацию (Рис. 3):
  • номер, тема и описание обращения;
  • состояние обращения;
  • контрагент;
  • адрес проведения ремонтных работ;
  • желаемая дата выполнения работ;
  • комментарии;
  • деталь [Сервисное обслуживание], на которой отображается список установленного оборудования контрагента.

                                                                     Рис. 3

  • Был настроен бизнес-процесс отправки push-уведомлений: в момент, когда инженер назначается ответственным по новому обращению, ему в мобильном приложении приходит соответствующее уведомление.
  •  По завершению проведения сервисных работ инженер фиксирует результаты на детали [Категории работ] непосредственно в мобильном приложении (Рис. 4) и изменяет статус обращения, в результате чего по настроенному бизнес-процессу об этом уведомляется инженер по качеству.
  • Инженер по качеству проверят результат выполнения обращения и переводит обращение в состояние «Закрыто».  

                                                                     Рис. 4

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

                                                                       Рис. 5

Также настроен дашборд, отображающий итоговое количество закрытых обращений по ответственным инженерам за текущий месяц. (Рис. 6)

                                                                        Рис. 6

Результат

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

 

Поделиться

0 комментариев
Войдите или зарегистрируйтесь, чтобы комментировать