запуск процесса
7.x

Добрый день! Подскажите, пожалуйста, в чем может быть ошибка????? Есть такая задача: необходимо удалять из резерва щиты по заданному клиенту. Есть очередь из четырех позиций. В этой очереди записываем ID компании, которая зарезервировала рекламный щит. Например, компания отказалась от всех своих резервов и соответственно надо удалить из очереди эту компанию. Процесс запускается из карточки клиента по кнопке из Действия. Делаем это следующим образом:
в карточке редактирования клиента в методе прописываем
showGrafInfo: function() {
var AccountId = this.get("Id");
var processArgs = {
sysProcessName: "GroupDelete",
parameters: {
IDClient: AccountId
}
};
ProcessModuleUtilities.executeProcess(processArgs);
},

getActions: function() {
var actionMenuItems = this.callParent(arguments);
actionMenuItems.addItem(this.getActionsMenuItem({
"Type": "Terrasoft.MenuSeparator",
"Caption": ""
}));
actionMenuItems.addItem(this.getActionsMenuItem({
"Caption": this.get("Resources.Strings.GroupDelete"),
"Tag": "showGrafInfo"
}));
actionMenuItems.addItem(this.getActionsMenuItem({
"Type": "Terrasoft.MenuSeparator",
"Caption": ""
}));
return actionMenuItems;
}

Процесс пишем на C#:

EntitySchema UsrPlacementsschema = UserConnection.EntitySchemaManager.GetInstanceByName("UsrPlacements"); //выбираем из таблицы UsrPlacements
EntitySchemaQuery UsrPlacementsesq = new EntitySchemaQuery(UsrPlacementsschema);
UsrPlacementsesq.AddAllSchemaColumns();

var filter1 = UsrPlacementsesq.CreateFilterWithParameters(FilterComparisonType.Equal, "UsrReserve1", IDClient);
var filter2 = UsrPlacementsesq.CreateFilterWithParameters(FilterComparisonType.Equal, "UsrReserve2", IDClient);
var filter3 = UsrPlacementsesq.CreateFilterWithParameters(FilterComparisonType.Equal, "UsrReserve3", IDClient);
var filter4 = UsrPlacementsesq.CreateFilterWithParameters(FilterComparisonType.Equal, "UsrReserve4", IDClient);
// Объединить фильтры в коллекции логической операцией OR
UsrPlacementsesq.Filters.LogicalOperation = LogicalOperationStrict.Or;

// Добавить фильтры в запрос
UsrPlacementsesq.Filters.Add(filter1);
UsrPlacementsesq.Filters.Add(filter2);
UsrPlacementsesq.Filters.Add(filter3);
UsrPlacementsesq.Filters.Add(filter4);

EntityCollection Placementsentities = UsrPlacementsesq.GetEntityCollection(UserConnection);

foreach (Entity Placement in Placementsentities) {

if (Placement.GetTypedColumnValue("UsrReserve1Id")==IDClient);
{
Placement.SetColumnValue("UsrReserve1Id", null);
Placement.SetColumnValue("UsrResPrice1", 0);
Placement.SetColumnValue("UsrResDate1", "");
Placement.Save();
}

if (Placement.GetTypedColumnValue("UsrReserve2Id")==IDClient);
{
Placement.SetColumnValue("UsrReserve2Id", null);
Placement.SetColumnValue("UsrResPrice2", 0);
Placement.SetColumnValue("UsrResDate2", "");
Placement.Save();
}

if (Placement.GetTypedColumnValue("UsrReserve3Id")==IDClient);
{
Placement.SetColumnValue("UsrReserve3Id", null);
Placement.SetColumnValue("UsrResPrice3", 0);
Placement.SetColumnValue("UsrResDate3", "");
Placement.Save();
}

if (Placement.GetTypedColumnValue("UsrReserve4Id")==IDClient);
{
Placement.SetColumnValue("UsrReserve4Id", null);
Placement.SetColumnValue("UsrResPrice4", 0);
Placement.SetColumnValue("UsrResDate4", "");
Placement.Save();
}

}

return true;

В параметрах прописали аргумент IDClient - уникальный идентификатор. Процесс запускается, проблема в том, что если в очереди (UsrReserve1, UsrReserve2, UsrReserve3, UsrReserve4) стоят разные компании, то они удаляются все, а не только та компания, которая нам необходима. Помогите, пожалуйста разобраться в чем неточность.... Спасибо!

Нравится

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

Добрый день Юлия!!!

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

Михаил, добрый день! Структура таблицы UsrPlacements: есть поля резерв1...резерв4, в которых хранятся Id компании, дата резерва 1...дата резерва 4, цена резерва1...цена резерва 4. В карточке клиента есть кнопка Удаление резервов, по которой запускается процесс. В итоге должны обнуляться поля резерв1...резерв4, дата резерва 1...дата резерва 4, цена резерва1...цена резерва 4, если резерв1 или резерв2 или резерв3 или резерв4 равны Id клиента из карточки.

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

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

Михаил, задача такая: если клиент отказывается от резерва всех щитов, то он удаляется из всех резервов. Я Вам отправляю скрины выполнения этого процесса

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

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

Юля так как вы исправлять структуры таблиц не желаете, а желаете оставить все как есть, то предлагаю алгоритм процесса перестроить следующим образом. Ниже привожу алгоритм 1 скрипта в Бизнес-процессе:

EntitySchema UsrPlacementsschema = UserConnection.EntitySchemaManager.GetInstanceByName("UsrPlacements"); //выбираем из таблицы UsrPlacements
EntitySchemaQuery UsrPlacementsesq = new EntitySchemaQuery(UsrPlacementsschema);
UsrPlacementsesq.AddAllSchemaColumns();
 
var filter1 = UsrPlacementsesq.CreateFilterWithParameters(FilterComparisonType.Equal, "UsrReserve1", IDClient);
UsrPlacementsesq.Filters.LogicalOperation = LogicalOperationStrict.AND;
 
// Добавить фильтры в запрос
UsrPlacementsesq.Filters.Add(filter1);
 
EntityCollection Placementsentities = UsrPlacementsesq.GetEntityCollection(UserConnection);
 
foreach (Entity Placement in Placementsentities) {
 
    if (Placement.GetTypedColumnValue("UsrReserve1Id")==IDClient);
    {
        Placement.SetColumnValue("UsrReserve1Id", null);
        Placement.SetColumnValue("UsrResPrice1", 0);
        Placement.SetColumnValue("UsrResDate1", "");
        Placement.Save();
    }

Далее создаете 2,3,4 скрипты по образу и подобию первого только меняете "UsrReserve1Id" на "UsrReserve2Id". Алгоритм конечно не идеален и мне если честно вообще не нравиться. Я бы так никогда не сделал. Но работать точно будет как вы хотите. Я бы если обнаружил такую таблицу, где изначально неправильно распланировали структуру. Я бы создал новую правильную талбицу. Далее перенес бы все данные, ну и конечно переписал все алгоритмы под новую таблицу. Я бы так сделал.

Михаил, большое спасибо! Попробую сделать и напишу Вам

Михаил, добрый вечер! Большое спасибо за скрипт, все работает корректно!

Показать все комментарии
javascript
Технические вопросы
7.x

В BPMonline 7.6, в каждой записи детали, замещающей BaseCommunicationDetail, справа от поля ввода средства связи (например поля ввода телефонного номера или адреса e-mail) нужно выводить галочку (checkbox) с подписью "Основной". Не получается. При попытке добавить запись в деталь "Средства связи" на странице "Юр. лицо", в консоли отладчика браузера выводится сообщение об ошибке; "Uncaught TypeError: Cannot read property 'changeMethod' of undefined" в модуле all-combined.js в строке 291. Я посмотрел по этому исходнику, там внутри функции setControlPropertyValue проверяется if(a.config.changeMethod) и на этом месте ошибка. Ниже привожу код, который я добавил в функцию getItemViewConfig() для вывода checkbox'а в модуле, замещающем BaseCommunicationDetail из пакета NUI. Замещающий модуль имеет то же имя - BaseCommunicationDetail и находится в пакете Custom.

var checkboxConfig = {
        className: "Terrasoft.CheckBoxEdit",
        classes: {wrapClass: ["communication-lookup-img-user-class", "detail-edit-user-class"]},
        value: {
                        bindTo: "RIBIsBase",
                        bindConfig: {converter: "updateLinkUrl"}
        },
        href: {
                        bindTo: "Link"
        },
        linkclick: {bindTo: "onLinkClick"}
};

Этот код я ввёл сразу после кода для отображения элемента TextEdit, который представляет поле для ввода средства связи. Ниже привожу строки кода, включающего эти элементы в конфигурацию, Эти строки завершают тело функции getItemViewConfig().
config.items.push(typeButtonConfig, editConfig, checkboxConfig, iconTypeButtonConfig);
itemConfig.config = config;
this.set("itemViewConfig", config);
На заметку: Когда я переносил зависимости замещаемого модуля в замещающий, то зависимость "Средства связи контакта" в замещаемом модуле была из пакета Base, а в замещающем - из пакета Base эта зависимость не подцепилась и пришлось взять её из пакета NUI. Других отличий нет.
Что нужно сделать, для того, чтобы checkbox выводился как описано выше ?

С уважением.

Нравится

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

Добрый день Евгений!!!

я еще вчера хотел вам отписать в вашем предыдущем посте. Но раз вы уже создали новый, пишу здесь. Ранее вы говорили что поле CheckBox вы желаете использовать для понимания какой телефон основной а какой нет, какой емайл основной а какой нет. Я так и не начал воплощать в жизнь вашу идею, так как при разработки и использовании системы в первую очередь нужно по максимому использовать стандартный функционал системы, а вот если уже невозможно обойтись стандартными средствами, вести разработку. Вашу идею на детали "Средства связи контрагента или контакта" можно воплотить расширив список типов "Тип средства связи", схема таблицы "CommunicationType", по умолчанию уже есть тип "Основной телефон" предлагаю вам добавить к примеру тип "Основной e-mail" и уже если вам нужно через Запрос получить основной телефон контрагента то вы с легкостью это сделаете. Так как "Тип средства связи" пользователь редактировать не может и следовательно это константные величины.

не придумывайте сейчас сложных путей, идите по легкому пути.

Здравствуйте, Михаил.
Спасибо за ценный комментарий.

Нет, Михаил, извините, но мне нужно чтобы был именно checkbox. Пока можно даже отложить в сторону код, реализующий его функционал. Мне очень важен код, реализующий его вывод на экран в том виде, который я описал вам вчера. Для меня это, можно сказать, вопрос жизни и смерти. Если можете, то помогите, пожалуйста.

P.S. И я делаю его на замещённой детали "Базовая схема детали средств связи", а не на детали "Средства связи контрагента и контакта". И, кстати, где можно посмотреть определение класса CheckBoxEdit?

Форумчане, помогите, пожалуйста!

"Бузин Евгений" написал:И, кстати, где можно посмотреть определение класса CheckBoxEdit?

Путь для конфигурации BPMOnline - OnSite (мой пример)
C:\BPMOnlineOmniChannel7_6_0.Site\Terrasoft.WebApp\Resources\ui\Terrasoft\controls\checkboxedit

По вашей просьбе. Хорошо Евгений раз обещал помогу вам. создам для вас Замещенную деталь. Как сделаю выложу в тему.

Благодарю, Михаил. Буду ждать.

Показать все комментарии
7.6
email
7.x

Добрый день!

Кто-то тестировал Email-рассылки в BPM 7.6?
У меня показывает какие-то странные данные, слабо похожие на правду.

В письмах по рассылкам везде напичкано "3D"

Нравится

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

Я тестировал. Поддержка сказала, что у Mandrill был сбой, поэтому данные по откликам неправильные. Будем тестировать еще

Посмотрел код писем в своих рассылках. Нет никаких "3D". У вас коробка или были доработки?

Показать все комментарии
Технические вопросы
7.x

Добрый день.
Переношу доработки на базу клиента средствами SVN (перенос рабочей копии).
после этого приходится открвать каждый объект (созданый или замещённый) и публиковать его.
Это довольно затратно по времени
Каким образом можно опубликовать сразу все нужные объекты?

Нравится

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

Добрый день Игорь!!!

Если вы переносите свои доработки средствами SVN, то после загрузки из Хранилища в первую очередь нужно выполнить "Структура БД --> Обновить для требующих обновления", далее "Данные --> Установить для требующих установки", а уже после желательно вручную исполнить все SQL скрипты, чтобы видеть что вы исполняете. И когда все сделано достаточно нажать "Конфигурация --> Компилировать все" и ваша новая конфигурация будет собрана.
Так как не забываем о том, что при переходе к примеру с 7.4 на 7.5, изменилась структура пакетов и их зависимости друг от друга. Некоторые схемы перемещены в новые пакеты. И вам обязательно нужно проконтролировать, а все ли зависимости в ваших доработках видят требуемые схемы.
А вообще мой совет вам Игорь прежде чем загружать из SVN свои доработки нужно изучить структуру новой конфигурации. Проанализировать как и где хранятся замещаемые схемы. Чтобы после загрузки в новую конфигурацию вы уже будете знать, куда перенести схемы с доработками, какие новые пакеты создать и т.д. Просто на загрузить надеется не нужно.

Спасибо. В данном случае пернос доработок производится в рамках одного билда.

Ещё один вопрос есть/планируется ли механизм переноса пакетов между разными версиями BPMOnline, например, между 7.4 и 7.5?
Я столкнулся с тем, что разработка велась на 7.4, но после этого потребовалось обновление до 7.5.
Но в базовых пакетах 7.5 отсутствует ряд схем, которые были в 7.4 и замещались в рамках разработки.

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

"Власов Михаил Викторович" написал:Если вы переносите свои доработки средствами SVN, то после загрузки из Хранилища в первую очередь нужно выполнить "Структура БД --> Обновить для требующих обновления", далее "Данные --> Установить для требующих установки", а уже после желательно вручную исполнить все SQL скрипты, чтобы видеть что вы исполняете. И когда все сделано достаточно нажать "Конфигурация --> Компилировать все" и ваша новая конфигурация будет собрана.

Не помогло. В новой конфигурации был создан замещающий объект Contaract. После описаных действий при создании новой записи выдало ошибку Invalid column name на всех новых полей.

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

"Власов Михаил Викторович" написал:

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


ActPageV2, CorrespondencePagev2

"Коновалов Игорь" написал:ActPageV2, CorrespondencePagev2

Игорь как я и писал ранее, прежде чем обновляться нужно изучить до конца новую конфигурацию. А уже после обновляться. Данные схемы что вы описали были удалены. Так как раздел Документы что был в 7.4 в 7.5 претерпел изменения. И в результате появилось 2 раздела Договора и Документы. К примеру у меня было много доработок связанных с разделом Документы в 7.4. Чтобы не потерять ничего, я перед переносом просто клонировал все схемы и создал свой раздел Документы. И далее его переименовал просто в свой раздел и далее стал его развивать (это уже после переноса). Поэтому еще раз повторюсь нужно сначала изучить новую конфигурацию, подготовить старую конфигурацию к переносу. И далее выполнять перенос через SVN.

"Безродный Андрей" написал:каждый объект необходимо публиковать отдельно для обновления структуры каждого из них в базе данных.

Андрей сколько уже с обновлением кошек и собак съел, но отдельно объекты не публиковал никогда (после переноса). Всегда если это таблицы Или обновлял командой "Обновить для требующих обновления", или выделял просто таблицы удерживая Ctrl и "Обновлял выделенные" и все проходило на отлично без всяких траблов. Да так как это было создание впервые к примеру на 7.5. Ну да подольше ждал пока создадутся все таблицы.

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

Михаил, да, Вы правы.

Но не касательно команды "Обновить для требующих обновления" - данная команда актуальна для объектов, для которых таблица в базе данных отсутствует в принципе. Если у объекта обновилась структура, но таблица в базе уже создана, действие не должно сработать.

Второй вариант с множественным выбором объектов и "обновлением выделенных" в этом случае должен помочь.

"Безродный Андрей" написал: Если у объекта обновилась структура, но таблица в базе уже создана, действие не должно сработать.

Действие в настоящий момент работает. И пожалуйста не нужно его убирать :smile: Выделять вручную тоже достаточно сложно и много времени занимает. А так все отлично, движемся в правильном направлении, в отличном настроение!!! Спасибо Андрей!!!

Показать все комментарии
7.6
Визирование
обязательность полей
Технические вопросы
7.x

Здравствуйте!
Подскажите пожалуйста, возможно ли сделать поле комментарий при отклонении визы обязательным?

Нравится

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

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

Проконсультировался с Product Owner'ом продукта.
К сожалению изменение данного функционала невозможно выполнить пользовательски.

Мы зарегистрировали Ваше обращение для реализации в будущих версиях продукта.

Спасибо!

Добрый день Александр!!!

предлагаю вам вариант решения вашей проблемы. Для решения вашего вопроса требуется выполнить замещения схемы VisaHelper. В данной схеме требуется заместить Три функции. Ниже привожу листинг данных функций.

        function baseAction(caption, buttonCaption, entity, action, callback, scope) {
            var checkRightCallback = function() {
                Terrasoft.utils.inputBox(caption, function(result, arg) {
                        if (result === Terrasoft.MessageBoxButtons.YES.returnCode) {
                            var comment = prepareComment(arg.name.value);
                            action.apply(scope || this, [entity, comment, callback]);
                        }
                    }, [{
                        className: 'Terrasoft.Button',
                        caption: buttonCaption,
                        returnCode: 'yes'
                    }, 'cancel'], this,
                    {
                        name: {
                            dataValueType: Terrasoft.DataValueType.TEXT,
                            caption: resources.localizableStrings.UpoComments,
                            customConfig: {
                                className: 'Terrasoft.MemoEdit',
                                height: '77px'
                            },
                            isRequired: true
                        }
                    },
                    {
                        defaultButton: 0,
                        style:  {
                            borderStyle: 'ts-messagebox-border-style-blue ts-messagebox-border-no-header',
                            buttonStyle: 'blue'
                        }
                    }
                );
            };
        function reject(entity, comment, callback) {
            if (Ext.isEmpty(comment)) {
                this.showInformationDialog(resources.localizableStrings.UpoCommentsIsEmptyError);
                return;
            }
            setStatus(entity, rejectStatus, comment, callback, this);
        }
        function approve(entity, comment, callback) {
            if (Ext.isEmpty(comment)) {
                this.showInformationDialog(resources.localizableStrings.UpoCommentsIsEmptyError);
                return;
            }
            setStatus(entity, approveStatus, comment, callback, this);
        }

Во вложении прилагаю MD файл замещенной схемы VisaHelper

Михаил, спасибо, очень помогли.

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

Александр, судя по
this.methods.approve = function() {
VisaHelper.approveAction(this, this.onSaved, this);
};
в VisaPage, попробуйте перекрыть метод onSaved, не вызывая callParent

Показать все комментарии
кнопки
страница редактирования
Технические вопросы
7.x

Коллеги, подскажите, как устранить проблему.
Есть 3 кнопки в AcccountSectionV2. Каждая из них вызывает свой бизнес-процесс, первым элементом в которых стоит открытие страницы редактирования (новой Активности, Счёта или Заказа соответственно). Проблема заключается в том, что после нажатия Отмена на странице редактирования (к примеру, страницы редактирования Счёта) все кнопки в карточке контрагента перестают реагировать на нажатия. По журналу бизнес-процессов видно, что привязанные к кнопкам бизнес-процессы не запускаются, т.е. не отрабатывается код кнопок. Он начинает работать, только если обновить страницу.
Часть кода, создающая кнопки:

{
                                "operation": "insert",
                                "parentName": "CombinedModeActionButtonsCardLeftContainer",
                                "propertyName": "items",
                                "name": "MakeInvoiceButton",
                                "values": {
                                        itemType: Terrasoft.ViewItemType.BUTTON,
                                        caption: "+ Счёт",
                                        style: Terrasoft.controls.ButtonEnums.style.BLUE,
                                        click: {bindTo: "onMakeInvoiceButtonClick"},
                                        "layout": {
                                                "column": 1,
                                                "row": 6,
                                                "colSpan": 1
                                        }
                                }
                        }

Часть кода - запуск привязанного бизнес-процесса:
onMakeInvoiceButtonClick: function() {
                                debugger;
                                var AccountId = this.get("ActiveRow");
                                var processArgs = {
                                        sysProcessName: "UsrOnMakeInvoiceButtonClick",
                                        parameters: {
                                                IncomingAccountId: AccountId
                                        }
                                };
                                ProcessModuleUtilities.executeProcess(processArgs);
                        }

Бизнес-процесс:
Схема

Нравится

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

Антон,

что видно в консоли браузера в момент нажатия на эти кнопки?

P.S. Прикрепите, пожалуйста, скриншот процесса.

в момент вызова нового процесса в браузере видно следующее сообщение:

При выполнении запроса возникла ошибка
статус ответа: 400 (Bad Request)
url запроса: http://crm:82/0/ServiceModel/ProcessEngineService.svc/UsrOnMakeNeedCall…null
метод: POST
данные запроса: {}

Похоже, что после запуска предыдущего при повторном запуске система не передаёт ID Открытой карточки клиента в повторный процесс. Однако - в журнале процессов нет второго запуска процесса.

Добрый день Антон!!!

конечно Бизнес-процесс у вас маленький, но если честно цель данного бизнес-процесса непонятно. Что вы хотели данным процессом достичь? Проконтролировать заполнено ли определенное поле и если да, то открыть карточку редактирования счета? Или же вы хотели сначала проконтролировать наполняемость всех полей, и если определенные поля заполнены, открыть на редактирование карточку счета. Если так, то в процессе не хватает действий для проверки. Это первое, а второе когда вы Первый раз запустили процесс, то в Процесс (через входящие параметры) запоминает Id контрагента, и когда вы не заново, а продолжаете процесс, тогда система уже начинает с того места где остановилась и при этом помнит уже все входящие параметры.

Михаил, цель простая - открыть предзаполненную карточку счёта из карточки клиента. В начале процесса проверяю условия - указан ли ID контрагента, по которому нужно открыть счёт, а также чтобы тип этого контрагента был равен "Клиент". В иных случаях счёт нам не нужен.
По сути, это аналог кнопки "Добавить" в детали Счета в карточке контрагента.

Последний Ваш комментарий не понял - я отменил выполнение предыдущего процесса и запускаю новый из той же карточки. Вот новый у меня и не начинается из-за того, что система не передаёт второй раз ID контрагента, карточка которого открыта в настоящий момент

"Антон Кравченко" написал: Вот новый у меня и не начинается из-за того, что система не передаёт второй раз ID контрагента, карточка которого открыта в настоящий момент

Антон вопрос так откуда вы вызываете бизнес-процесс из Раздела или Открытой карточки редактирования. Так как обращение и получение Id контрагента будут разными. Если из раздела, то нужно еще проверить, а не включен ли режим "Выбора нескольких записей" и если да получить массив Id и передать в процесс, если это карточка редактирования то напрямую получить "this.get(this.entitySchema.primaryColumnName)" и все. И еще один совет если в Бизнес-процесс передаются Массив значений, Id и не только то обязательно, прежде чем вызвать процесс, вы добавьте условия проверки на "Существование" и "Заполненность" передаваемых значений а уже после запускайте процесс. И уже на экране у вас уже не будут появляться ошибки, а вы будите видеть, что процесс запустился или нет. И вот если уже не запустился это уже будет означать, что сработал ваш "IF". Я бы так сделал.

Михаил, хорошо, давайте проверим:
1. Код кнопки у меня расположен и в *Page и в *Section. Из Section в процесс передаётся this.get("ActiveRow"), из Page - this.get("ID")
2. Режим "Выбора нескольких записей не включен 100%
3. При проверке открыта карточка контрагента через Section (т.е. слева есть список других контрагентов, а ссылка в браузере выглядит как .../ ... Section ... / UsrAccountType1Page / edit / ID
4. Вы пишете про проверку на существование и заполненность. Чем Вам первое условие в моём процессе не нравится? в нём как раз и проверяю, что переданный ID != Guid.Empty

Я подозреваю, что после запуска процесса система как бы "выходит" из режима, когда выделена одна из записей реестра (т.е. this.get("ActiveRow") возвращает null), а после обновления страницы снова выделяет того контрагента, чья карточка на экране (т.е. this.get("ActiveRow") возвращает ID выделенной записи).
Как можно проверить данное предположение?

"Антон Кравченко" написал:в нём как раз и проверяю, что переданный ID != Guid.Empty

Антон во первых в процесс может, через входящий параметр, передаться значение ("", String.Empty, т.е пустое значение) или передаться значение "undefined". Можно конечно это все проверить на C# в бизнес-процессе, но зачем если это можно сделать на клиенте. На C# нужно будет не забывать про правила конвертации, чтобы синтаксис был правильный. На JavaScript это проще. Это всего лишь моя рекомендация.
Возвращаясь к вашему вопросу хочу сказать, что по умолчанию в конфигурациях BPMOnline есть маленький баг. Но он быстро правиться. Проверяется этот баг очень просто. Открываете карточку редактирования (к примеру Контрагента) из раздела. И на карточке в любом LookupEdit поле выполняете "Выбор из справочника" и при выборе к примеру редактируете выбираемую запись сохраняете и смотрите. Если слева, где список контрагентов, теряется фокус. То тогда да, ваше предположение может быть, что при подачи команды  this.get("ActiveRow") возвращается "null" или "неопределено", то тогда я вам подскажу где этот маленький баг исправить. Я его уже давно обнаружил, еще в 7.3. Проведите эксперимент если фокус потеряется, я вам подскажу как это поправить.

Михаил, фокус не теряется при Вашем способе с LookupEdit, однако в нашей ситуации с кнопками теряется - см. скриншоты

Добрый день Антон!!!

выполните замещение схемы GridUtilitiesV2, исправьте Функцию "ensureActiveRowVisible"
ниже приведен исправленный текст функции. Жирным выделена строка, что добавлена.

            /**
             * Прокручивает реестр, чтобы была видна активная строка.
             * @protected
             */
            ensureActiveRowVisible: function() {
                var grid = this.getCurrentGrid();
                var activeRow = this.get("ActiveRow");
                if (grid && activeRow) {
                    var activeRowDom = grid.getDomRow(activeRow);
                    if (activeRowDom && activeRowDom.dom) {
                        // TODO: Добавлена строка по фиксации активной записи реестра
                        grid.setActiveRow(activeRow);
                        var el = activeRowDom.dom;
                        if (el.scrollIntoViewIfNeeded) {
                            el.scrollIntoViewIfNeeded(false);
                        } else {
                            el.scrollIntoView(false);
                        }
                    }
                }
            },

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

Михаил, доброго утра!
Заместил GridUtilitiesV2, полностью скопировал код из замещаемой в замещающую страницу, исправил функцию ensureActiveRowVisible ... и ничего не изменилось - фокус по-прежнему теряется.
P.S. Вы пишете, что жирным выделена добавляемая в функцию ensureActiveRowVisible строка, но в Вашем коде не вижу строки с жирным шрифтом ..

Добрый день Антон!!!

воспроизвел вашу ситуацию на своей базе данных. Действительно Фокус теряется и информация о текущей записи теряется. Буду сегодня в отладчике искать, где происходит сбой. Как найду выход из данной ситуацию. Опубликую результат с ответом.

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

            /**
             * Восстановление выделенной записи в реестре.
             */
            onAfterReRender: function() {
                if (this.cachedActiveRow && !this.get("MultiSelect"))  {
                    var gridData = this.getGridData();
                    if (gridData && gridData.contains(this.cachedActiveRow)) {
                        this.set("ActiveRow", this.cachedActiveRow);
                    }
                } else if (!this.cachedActiveRow && !this.get("MultiSelect"))  {
                    var profile = this.getProfile();
                    var activeRow = !Ext.isEmpty(profile.ActiveRow) ? profile.ActiveRow : this.Terrasoft.GUID_EMPTY;
                    if (!Ext.isEmpty(activeRow)) {
                        this.set("ActiveRow", activeRow);
                    }
                }
            },
            /**
             * Событие на изменение значения ActiveRow.
             */
            onActiveRowChange: function() {
                this.cachedActiveRow = this.get("ActiveRow") || this.cachedActiveRow;
                if (!Ext.isEmpty(this.cachedActiveRow)) {
                    var profile = this.getProfile();
                    var key = this.getProfileKey();
                    if (profile && key) {
                        profile.ActiveRow = this.cachedActiveRow;
                        this.Terrasoft.utils.saveUserProfile(key, profile, false);
                    }
                }
            },

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

Михаил, отлично! Ваше решение работает) Спасибо большое

Я рад Антон. Что вам помог. Вы первую мою доработку тоже к себе в код включите, полезна будет. А так я рад. Будут еще вопросы, проблемы пишите, буду рад вам помочь.

а я её (первую доработку) там и оставил )

Показать все комментарии
бизнес-процесс
просрочен по реакции
сигнал
Технические вопросы
7.x

Добрый день!
В обращении в ITIL есть такие поля "просрочен по реакции" и "просрочен по разрешению",
эти поля заполняются автоматически, если плановое время реакции/разрешения прошло.
Почему стартовый сигнал в бизнес-процессе ( при изменении обращения, "просрочен по реакции"=true, должно быть изменено поле "просрочен по реакции") не срабатывает?
Не реагирует именно на изменение поля "просрочен по реакции"(по разрешению)
Если добавить еще какое-то поле в "должно быть изменено поле", то бизнес-процесс стартует

Нравится

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

Добрый день Дарья!!!

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

В обращении в ITIL есть такие поля "просрочен по реакции" и "просрочен по разрешению",
эти поля заполняются автоматически, если плановое время реакции/разрешения прошло.

Я хотела бы сделать бизнес-процесс, в котором в качестве стартового сигнала служило бы изменение поля "просрочен по реакции".
Сигнал выглядит следующим образом: сигнал при изменении обращения, условие - "просрочен по реакции"=Да, список должно быть измененных полей - "Просрочен по реакции".

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

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

ясно, спасибо

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

Добрый день!

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

Права на свой контакт даны каждому пользователю скриптом.

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

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

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

Нравится

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

Добрый день, Наталья!

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

Михаил, спасибо за ответ.

А если попытаться сделать деталь "Средства связи контакта" на странице обращения?
Или деталь тоже очень сложно прикрутить к Пользовательскому порталу?

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

Показать все комментарии
7.6
Технические вопросы
7.x

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

Нравится

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

Добрый день Олег!!!

если вы используете BPMOnline 7.6 Sales, то в данной системе есть созданный компанией Террасофт объект "PivotGrid". Данный объект используется в разделе "Планирование" именно с помощью данного объекта я бы решил вашу задачу. Как работать с данным объектом можно подсмотреть в схемах раздела "Планирование". будут вопросы пишите. я именно данный объект "PivotGrid" переделал и использовал в своих задачах. К примеру я сделал огромную таблицу по ведению БДР и БДДС для экономической части своего проекта.

Добрый день, Олег.
Действительно, базовая функциональность не позволяет реализовать Вам поставленную задачу.
Для решения- попробуйте воспользоваться советом из комментария Власова Михаила.

Добрый день Юрий, Олег!!!

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

Здравствуйте, Михаил!

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

Хм, понятно, тогда такой вопрос, а как создать раздел аналогичный Планированию? Не совсем по теме но все же из того же разряда использования PivotGrid, т.е. при обычной регистрации раздела у меня идет обращение через SectionModule, как это изменить. Если где то подобный вопрос поднимался скиньте пожалуйста ссылку, что то я найти не смог

Немножко не понял суть вопроса. и в особенности про "регистрацию раздела". Можно конкретный кусок кода привести в пример, где и к чему у вас идет обращение, и где возникает трабл. я тогда поясню. а сейчас немного сложно ориентироваться в пространстве. так как в BPM очень много одновременно отрабатывается схем, событий, callback-ов и не только. и еще раз повторюсь, чтобы вы понимали вся основная логика построена и работает с помощью генераторов страниц, это очень удобно, а все отталкивается от Базовой модели. Именно она всем рулит.

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

Для того, чтобы вместо SectionModuleV2 загружался Ваш модуль, необходимо определить уникальный идентификатор этого модуля (поле UId таблицы SysSchema) и подставить его для соответствующего раздела в поле SectionModuleSchemaUId таблицы SysModule. Например, в базовой версии уникальный идентификатор модуля SectionModuleV2 имеет значение "DF58589E-26A6-44D1-B8D4-EDF1734D02B4", а уникальный идентификатор модуля планирования (ForecastsModule) - "F38A00D3-94E1-46AB-89B5-2FCB685754C4", и соответственно эти значения указаны в SysModule.

Добрый день Олег!!!

из комментария Олега, Лабьяк теперь понял, что вы желаете. Могу здесь только добавить одно, так как в системе по умолчанию нет готовой Хранимой процедуры по регистрацию раздела и привязки к нему основной страницы редактирования. То в добавление к комментарию Олега, могу вам только посоветовать разобраться со структурой таблицы SysModule. Что в каком поле храниться, и что за что отвечает. На примере существующих разделов вам будет понятно. От себя скажу, что я всегда иду от обратного. Сначала регистрирую вручную в системе все свои страницы редактирования, детали. А уже после приступаю к регистрации разделов. Так более удобно, понятно. Но не забываем что после Регистрации всех страниц редактирования, деталей, разделов не забываем их подгрузить в Админке на закладке Конфигурация --> Данные. Чтобы при переносе своих доработок с Develop конфигурации на Рабочую конфигурацию у вас при загрузке загрузились бы схемы страниц, схемы данных, SQL скрипты. Я так же не забываю всегда это делать.

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

Здравствуйте.
Пишу модуль страницы на Javascript в BPMonline 7.6. В качестве родительской страницы установлена "Базовая схема карточки". У меня следующие проблемы:
1) Что нужно написать в модуле, чтобы добавить на страницу работающую метку "Страница N из M" ?
2) Что нужно написать в модуле, чтобы удалить с страницы окно "Что я могу для вас сделать? GO" ?
3) Что нужно написать в модуле, чтобы удалить с страницы маленькие круглые сервисные кнопки: "Дизайнер системы", "Справка", "Профиль", "Лента", "Уведомления", "Уведомления ленты" ?
4) Что нужно сделать для того, чтобы надпись к полю на странице находилась не слева от соответствующего ей поля, а сверху него ?
Заранее благодарю.
С уважением.

Нравится

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

Добрый день Евгений!!!

Чтобы решить все ваши проблемы вам требуется не использовать "Базовую схему карточки", а написать свой Модуль, разместить в данном модуле все требуемые поля, описать их логику работы. Пример можете подглядеть в сервисе "GoogleIntegrationSettingsModule". Это полностью рабочая страница созданная с нуля, где используется своя схема верстки, где используется свой алгоритм поведения полей.
Если вы желаете изменить стандартную логику поведения работы страниц, то вам придется править не только схему "BasePageV2" но и много других схем. Так как страницы в системе Генерируются, Поля в системе генерируются, и за каждое действие в системе отвечает свой Generator.
Этот путь гораздо сложнее и дольше, я бы написал с нуля свой Модуль страницы.

А всё-таки, если пойти по пути изменения стандартной логики, то что нужно сделать, чтобы удалить из страницы: окно "Что я могу для вас сделать? GO" и круглые сервисные кнопки ?

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

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

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