Вопрос

Добрый день!

Интересует вопрос: как показать модальное окно с картинкой? Точнее что для этого необходимо. Для примера взял https://marketplace.terrasoft.ru/app/new-year-motivation-bpmonline (процесс как раз показывает картинки), но не могу до конца разобраться что из всего является обязательным. По сути у меня уже есть справочник с картинками и описанием. Дальше надо в БП вызвать собственно само модальное окно (из картинки и текста). Для этого нужная страница этого модального окна и все? И как тогда его вызывать из БП?

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Можно просто в 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

Итог:

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

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

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