Добрый день!

 

Подскажите, каким образом можно создать процесс по событию из новой конфигурации?

Раньше было:

Изображение удалено.

 

а теперь просто автозаполняемое поле и никаких кнопок "Открыть процесс" и т.п.

Изображение удалено.

 

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

Нравится

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

В объекте слева выбираете События, в событиях выбираете нужны галочки. В верху есть кнопка Открыть процесс.

 

 

В объекте слева выбираете События, в событиях выбираете нужны галочки. В верху есть кнопка Открыть процесс.

 

 

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

Создал замещающий объект Order.

Добавил событие OrderOnSaving https://yadi.sk/i/VeViyXnt6GIJzQ

(в БП Генерирую сообщение для БП родительского объекта)

Публикую объект и БП

В РФС появляется cs файл с методами данного объекта

При сохранении карточки Заказа появляется ошибка:

Процесс "Order_<Название пакета разработки>EventsProcess" остановлен. Превышено максимальное количество повторений элемента "StartMessage4".

StartMessage4  - Это название стартового сообщения БП в моём замещённом объекте.



Версия 7.15.1.1295. РФС.

Кто знает в чем причина такой ошибки? 

Нравится

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

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

Во-вторых, видимо, во втором элементе БП отправляется то же сообщение в тот же процесс, происходит вечное зацикливание.

В 5.Х было использование этого элемента с проставленной галкой отправки в родительский процесс. Сейчас специально отправлять уже не нужно.

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

Добрый день!

Есть некий метод который отрабатыват на событие Inserting в объекте и изменяет поле статус:

Изображение удалено.

И есть процесс который ждет изменения поля статус: 

Изображение удалено.

Собственно, проблема в том что событие в процессе не отрабатывает, и процесс остается виснуть на этом элементе. В чем может быть проблема?

Нравится

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

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

В БП добавьте старт данного события ещё и по сигналу добавления записи.

Алла Савельева,

я неверно написал, у меня метод отрабатывает на событие Updating а не Inserting

Миннекаев Айдар,

Проверьте, запускается ли Ваш бизнес-процесс при изменении статуса на нужное значение из конфигурации. Возможно, проблема в процессе.

Также уточните, откуда запускается метод SetStatus и каким образом получен объект entity, который передается в него?

Алла Савельева пишет:

откуда запускается метод SetStatus и каким образом получен объект entity, который передается в него?

 Видимо, дело в том, что оба механизма срабатывают на одном событии. Сначала пользователь меняет запись, потом во встроенном БП срабатывает обработчик на Updating, потом сохраняется запись в базу и затем должен был срабатывать сигнал в БП. И список изменённых полей формируется на первом шаге, до изменения статуса, из-за чего сигнал не получен.

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

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

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

Коллеги всем доброго времени суток! Столкнулся со следующей проблемой, у нас CRM интегрируется со сторонней системой в БД которой Id представлены как long.

Реализовали БП  создания заказа из звонка. На уровне объекта Order перед сохранение уходит запрос во внешнюю систему тянет последний id в БД, полученный ответ инкрементируем  на 1 и переводим в GUID получаем "00000000-0000-0000-0000-000000000001";  полученный Id подставляем PrimaryColumnValue

http://prntscr.com/m7t797

 

var origin = HttpContext.Current.Request.Headers["Origin"];
IntegrationAutobookingClient client = new IntegrationAutobookingClient(UserConnection);
if (!string.IsNullOrEmpty(origin))
{
	var lastOrerIdInPlatform = client.GetRequest("/v1/orders/last_id");
	var abOrderId = Convert.ToInt64(lastOrerIdInPlatform);
	var newOrderId = abOrderId + 1;
	var bpmOrderId = client.ChangeId(newOrderId);
	Entity.PrimaryColumnValue = bpmOrderId;
}
return true;

Далее идет обработчик после сохранения записи, уходит запрос во внешнюю систему создания Заказа.

Открытие карточки редактирования заказа осуществляется через БП - http://prntscr.com/m7t97l

При сохранении заказ создается, но карточка(эл-т процесса) остается не выполненным - http://prntscr.com/m7taim и дальше по процессу не идет

В консоли наблюдаю следующее - http://prntscr.com/m7tb5u

Подскажите как с этим бороться? Подозреваю что дело в изменении PK.

Нравится

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

Видимо, элемент открытия карточки новой записи в БП уже подразумевает какой-то сгенерированный Id, который затем во встроенном БП объекта на Inserting заменяется нужным, что и приводит к некорректной работе.

Можно попробовать переделать логику: в БП генерировать Id и сохранять новую запись, а уже потом уже открывать её на редактирование в карточке.

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

Приветы, в дизайнере страницы добавил "текстовое поле".

Как при выборе из справочника в другой детали (деталь выбор из справочника) значения, чтобы в "текстовое поле" установить значение на основе работы какой-то функции, которая через бд получит значение и запишет в это "текстовое поле"

 

 

Нравится

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

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

Как вариант - использовать бизнес-процесс, который будет читать данные поля детали и записывать его в поле на странице

Больше информации о настройке бизнес-процессов - на Академии: https://academy.terrasoft.ru/documents/technic-bpms/7-11/obzor-funkcionalnosti-biznes-processov-v-bpmonline

Одеяненко Юлия,

 

Спасибо, пока не понимаю как сделать, могли бы вы более конкретно подсказать, заранее спасибо. Как заставить биз процесс читать/слушать изменение в детали-комбобоксе и функцией менять значение в текстовой детали

QArt,

Алгоритм примерно следующий:

- стартовый сигнал - "Получен сигнал от объекта", какой объект - объект детали, событие - добавление записи (пример - http://prntscr.com/iudrkj)

- элемент "Читать данные", читать данные первой записи объекта детали, сортировка по убыванию колонки "Дата создания", значение только той колонки, которая будет транслироваться (пример - http://prntscr.com/iudxeb)

- элемент "Изменить данные" объекта, в котором нужно автоматически заполнять поле, изменить ту запись, на которой находится деталь, изменить значение Вашего кастомного поля параметром процесса, вычитаном в предыдущем элементе (пример - http://prntscr.com/iudwk1).

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

Спасибо. Если мне нужно в деталь "текстовое поле" писать расчетное значение, которое должно рассчитываться на событие "изменение значения в детали". Но в расчете Значение = "значение из детали" + в зависимости от типа указанного в сущности "значение из детали" то есть как-то запросом подгребать. И, увы, в бд поле есть у объекта, а в конструкторе в биз процессе поле выбрать нельзя, хотя деталь есть в интерфейсе пользователя, странно все это... 

 

Может попробовать как-то через атрибуты 

"aMetro": {

                        dependencies: [

                            {

                                columns: [ "WorkAddr" ],

                                methodName: "calcMetro"

                            }

                        ]

                    }

в calcMetro через esq получить метро и вписать его в деталь -  "текстовое поле" можно такой пример?

У меня опыта мало в ковырянии динозавра :)

QArt,

Разобрался, узнаю новое и странное. Почти сделал

getFullAddressFromVacancy: function (Id) {

                        var esq = this.Ext.create("Terrasoft.EntitySchemaQuery", {

                            rootSchemaName: "AccountAddress"

                        });

                        esq.addColumn("Id");

                        esq.addColumn("Address", "Address");

                        esq.addColumn("AccountAddress.SxSubwayStation.Name", "MetroName");

                        esq.addColumn("AccountAddress.City.Name", "CityName");

                        esq.filters.add("VacancyCandidateFilter222", this.Terrasoft.createColumnFilterWithParameter(

                            this.Terrasoft.ComparisonType.EQUAL,

                            "Id", Id));

                        esq.getEntityCollection(function (response) {

                            if (response.success && response.collection.getCount() == 1) {

                                var entity = response.collection.getByIndex(0);

                                var addr = entity.get("Address");

                                var city = entity.get("CityName");

                                var metro = entity.get("MetroName");

                                var add = '';

                                if (city != undefined && city != 'Москва')

                                  add += city + ', ';

                                if (metro != undefined)

                                  add += metro + ', ';

                                if (addr != undefined)

                                  add += addr;

                                this.log('Add = ' + add);

                                this.set("BpMetroAutoFill", add);

                            }

                        }, this);

                }

В консоли хрома вижу что столбцы, кроме Address пишутся isNotFound. 

Делал согласно https://academy.terrasoft.ru/documents/technic-sdk/7-8/poluchenie-rezul…

EntitySchemaQuery умеет довыгребать AccountAddress.SxSubwayStation.Name в таблице AccountAddress есть столбец SxSubwayStationId

Аналогично с City.

Что не так делаю, подскажите плиз?

Добрый день.

Таблицу AccountAddress вы указываете в rootSchemaName. Тоесть, при добавлении колонки из AccountAddress, не нужно указывать название этой таблицы. Нужно указывать именно поле из этой таблицы, например SxSubwayStation.Name.

Demchenko Olha,

Оля, спасибо, помогло! 

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

Помогите с обьяснением

Вот к примеру в схеме обьекта:

diff: /**SCHEMA_DIFF*/[

    {

        "operation": "insert",

        "name": "UsrSchema13Detail1dcd436c",

        "values": {

            "itemType": 2,

            "markerValue": "added-detail",

            "visible":{"bindTo": "myFunction"} //

        },

        "parentName": "Tabcf202d7cTabLabel",

        "propertyName": "items",

        "index": 5

    }

]

 "visible":{"bindTo": "myFunction"}  - Эта функция отрабатывает только в момент инициализации???

Как динамически поменять свойство видимости view элемента? 

Например у меня поменялся статус в справочнике представленным view элементом в разделе и мне нужно отобразить на странице деталь(по умолчанию она скрыта)

Нравится

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

"Как динамически поменять свойство видимости view элемента?" — Биндить на аттрибут.

" "visible":{"bindTo": "myFunction"}  - Эта функция отрабатывает только в момент инициализации???" — уж не знаю когда, но отрабатывает она по несколько раз при загрузке страницы (подозреваю, что при рендеринге и ререндеринге элемента)

Роман. "visible":{"bindTo": "myFunction"}  по факту делает одностороннее связывание. Вызов функции или же проверка атрибута будут происходить при любом изменении в модели (т.е. даже если вы поменяете соседнее тектосвое поле). И да, Данила подметил верно, при рендеринге и инициализации страницы вызов функции может произойти несколько раз, по этому не стоит громоздить в подобные функции много логики и точно не стоит в них хоть как-то менять остальную модель. 

Лучше всего проверять значения соседних полей и основываясь на их содержании менять возвращаемое значение. К примеру:

myFunction: function() {

      return this.get("UsrSTRING") === "123";

}

 

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

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

Использую версию BPMonline sales comerce версии 7.6
В разделе продажы имеется стандартный набор фильтров, при изменении которых выводиться отфильтрованная информация. В этом разделе есть кнопка аналитика, где вырисовываются настраиваемые графики и виджеты. Я создал свой собственный виджет, который строит HTML таблицу с нужными полями и подсчетами, так сказать отчет. Нужно применить к виджету стандартные фильтры. Как мне получить значения фильтров и как мне обрабатывать событие изменения фильтров??? Нужно также обновлять таблицу при изменении фильтров.

Код могу предоставить если нужно.

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

Нравится

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

Еще раз здравствуйте, я немного поправлю свой вопрос.

Как получить значения FixedFilter и CustomFilter? И как обработать событие изменения этих фильтров?

За событие изменение фильтров отвечает метод базовой секции: afterFiltersUpdated
Получить фильтры можно методом базовой секции getFilter
На возникший вопрос для конкретного сайта по передаче этой информации в нужную схему через сендбокс, ответим в созданном инциденте.

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

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

Нужно добавить в карточку редактирования "Заявки" новый тип заявки (в моем случае - тип "Отгрузки клиентам"). При выборе именно этого типа пользователем должны стать доступны для редактирования (или отобразиться, оба варианта устрят) новые добавленные мною поля, присущие только этому типу.
Как это реализовать?
Насколько я понял, проверка значения поля осуществляется с помощью функции ValAsBool(), которая возвращает значение true или false для переданного ей параметра, сопоставляя его с записями в массиве структур ValAsBool. Так вот как добавить в эту структуру новое значение поля с соответствующим ему булевым значением?
Может быть я иду не в том направлении? Тогда подскажите, как реализовать поставленную передо мной задачу?

Нравится

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

Алексей, добрый день.

В принципе, данный функционал можно реализовать посредством пользовательских полей. Они отображаются для заданных типов записей.
Настройка пользовательских полей детально описана в книге Руководство Администратора, в главе 4.3. Настройка пользовательских полей, на странице 147:
http://www.training.terrasoft.ru/system/files/TS_AG_3.4.0.pdf

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

Алексей,

Создавая пользовательские поля, Вы определяете тип записи, для которых они будут отображаться.
Если данный механизм Вам не подходит, используйте событие OnDatasetDataChange невизуального элемента dlData (функция dlDataOnDatasetDataChange в сервисе wnd_OrderEditScript) и конструкцию switch-case:

switch (DataField.Name) { //изменяемое поле
	case 'TypeID': //если изменилось поле Тип
		if (Dataset.Values('TypeID') == 'Идентификатор типа Отгрузки клиентам') { //если значение поля Тип = Отгрузки клиентам
			edtNewAddedField.IsEnabled = true; //новый добавленный контрол видим
		} else { //иначе
			edtNewAddedField.IsEnabled = false; //новый добавленный контрол невидим
		}
		break; //конец условия
}

Maxim, спасибо, я понял, разобрался

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

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

Столкнулся с такой проблемой: для LookupDataControl событие OnPrepareSelectWindow генерируется только один раз при включённой опции "Отображать как выпадающий список в карточках". Таким образом, приходится отключать эту опцию, если нужно каждый раз фильтровать данные в зависимости от других полей.

Можно ли как-то сделать так, чтобы это событие генерировалось каждый раз при попытке выбора из списка?

Версия: Terrasoft XRM 3.3.2.197

Нравится

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

Здравствуйте Дмитрий

Просьба ознакомится с http://www.community.terrasoft.ua/forum/topic/1489#comment-5131
ключевая фраза UnprepareDropDownList()

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

Здравствуйте, господа. Заимел проблему.
Задача: в карточке договора при изменении значения состояния (в комбобоксе) надо подставить в качестве даты завершения текущую дату. То есть выбираем в комбобоксе "Завершён" - дата меняется.
Проблема: скрипт работает, но не совсем корректно. Дата меняется не тогда, когда мы меняем какое-то состояние на состояние "Завершён", а уже тогда, когда мы пытаемся менять состояние "Завершён" на какое-то другое.

В function DataChange(DataField) добавил такой кусок кода:

case ('ContractStatusID'):
                        ContractScript.DisableDataChange = true;
                        try {
                                var StatusName = DataFields.ItemsByName('ContractStatusName').Value;
                                var Today = GetLocalDate();
                                var sEnd = 'Завершён';
                                if(StatusName == sEnd)
                                {
                                        DataFields.ItemsByName('DueDate').Value = Today;
                                        MessageBox('В качестве даты закрытия контракта установлена сегодняшняя дата!');
                                }
                        }                      
                        finally{
                                ContractScript.DisableDataChange = false;
                        }
                        break;

Видимо, получается, что я обращаюсь к старому экземпляру поля ContractStatusName. А надо к только что установленному.
Помогите, пожалуйста.

Нравится

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

Сергей, не пробовали сравнивать if(StatusName == sEnd) не по названию состояния, а по его ID? Возможно, поскольку обработка происходит в момент изменения StatusID, а не StatusName, последнее поле содержит старое значение.

Олег Лабьяк,
разработчик,
3-я линия Службы поддержки Terrasoft.

Олег,
пробовал, но только сейчас сообразил что ID для сравнения подставлял при этом без фигурных скобок.
Разобрался, спасибо;)

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