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

Нравится

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

Добрый день! В "кубике" Задание-сценарий, в свойствах снимите галку "Для интерпретируемого процесса".

"Шамшин Олег" написал:

Добрый день! В "кубике" Задание-сценарий, в свойствах снимите галку "Для интерпретируемого процесса".


Спасибо за ответ, чуть-чуть бы раньше, а так методом тыка разобрался.

А как получить коллекцию из элемента ReadData в интерпретируемом процессе?
Раньше можно было обратиться к нему как к параметру: ReadData.ResultEntity.

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

А как получить коллекцию из элемента ReadData в интерпретируемом процессе?

Раньше можно было обратиться к нему как к параметру: ReadData.ResultEntity.

Как я понял сценарии "Для интерпретируемого процесса" умеют работать только с параметрами самого процесса. Следовательно тебе надо ReadData.ResultEntity засунуть в какой-то элемент процесса и работать с ним через

Get<тип>("Название параметра");

Или использовать сценарии НЕ "Для интерпретируемого процесса" тогда можно обращаться как к параметру ReadData.ResultEntity

*кажется разница в "интерпретируемом" и "не интерпретируемом" сценарии в виртуальном методе класса.

Слава, спасибо.
Уже решил через не интерпретируемый элемент процесса.
По ходу возникла проблема с использованием методов БП.
Решил так:

var processModel = ((<Название БП>Wrapper)this.ProcessModel);
processModel.<Название метода>(<Аргументы>);

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

И что же? За год так и не появился официальный ответ на этот вопрос?

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

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

Нравится

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

Екатерина, добрый день.
Прошу уточнить точную версию сборки и название продукта/бандла, на котором воспроизводится ошибка. Проверили на версии 7.8 - ошибка не воспроизвелась.

Для проверки выполнили следующее:
1. Создали лид с параметрами:
поле "должность" - пустое
поле "Мобильный телефон" - 123
2. Создали Контакт с параметрами:
поле "Должность" - Директор по продажам
поле "Мобильный телефон" - 456

3. Связали лид с контактом.
4. Квалифицировали лид.

Результат:
- Поле "Должность" у контакта заполнено(не перезатерлось пустым значением)
- Для контакта добавлено дополнительно средство связи "Мобильный телефон" - 456.

В случае, если Ваш кейс воспроизведения отличается, пожалуйста, сообщите.

Анастасия, у нас версия 7.8.0.1005

Только что воспроизвели ваш кейс, поле "Должность" затерлось пустым значением.

Добрый день!

Воспроизвели на последней сборке проблему с затиранием должности контакта, т.к. создается новая запись о месте работы. Средства связи (телефон и email) не затираются в последней сборке, а дополняются к уже существующим.
Проблему с затиранием должности исправим в следующей версии приложения.
В случае, если требуется исправление на определенном сайте сейчас, то обратитесь от авторизованного лица на почту support@terrasoft.ru с указанием проблемы и сайта где необходимо внести изменения.

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

Добрый день. Необходимо в раздел Орг.структура добавить текстовое поле.
Добавил его в SysAdminUnit, VwSysadminUnit. Добавил элемент в diff.
Но при открытии раздела в консоли появляются следующие ошибки:
http://joxi.ru/Grqv86vTK3akmz
Подскажите, что упустил.

Нравится

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

Здравствуйте. Судя по первой ошибке запрос не может найти колонку UsrChannelSlack и вторую, которую вы замазали. Если вы не ошиблись с названием колонки в замещенной клиентской схеме, то, возможно, проблема в фильтрах или вы забыли очистить кеш браузера.
Возможно, банально забыли сохранить замещенные объекты (посмотрите наличие колонок в таблицах БД)
Сложно ответить без примера исходных кодов

И в догонку. Судя по URL Вы ведете разработку в продуктовом приложении. Это грубейшая ошибка. Вам следует развернуть отдельное приложение для разработки и для тестирования. Или хотя-бы создать отдельную конфигурацию (workspace)

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

"Симута Роман Русланович" написал:Возможно, банально забыли сохранить замещенные объекты (посмотрите наличие колонок в таблицах БД)

+

И это, я понимаю когда номера машин на фото замазывают, но уж название поля - это шикарно :cool: при этом спалили логин и сайт...

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

Может у кого есть кейс по добавлению поля в орг.структуру?
Буду очень благодарен.

"Коновалов Игорь" написал:И это, я понимаю когда номера машин на фото замазывают, но уж название поля - это шикарно при этом спалили логин и сайт...

А вы, Александр, ещё и внимание на этом заострили :lol:

в ранних сборках 7.8 была проблема с одинаковыми заголовками замещенных схем и соответственно, с порядком наследования. Например, для базового объекта было три разных схемы в одном пакете с одинаковыми заголовками. Поэтому после создания пользовательского объекта с родителем базовым объектом, надо было проверять из того ли пакета и тот ли это базовый объект.
В релизе 7.8.1681 проблема точно исправлена. в более ранних надо проверять

Роман, а вообще есть ли особенности при добавлении пользовательского поля в орг.структуру (SysAdminUnitPageV2)?
Я, например, заметил. что в нём не указывается entitySchema.

у меня Версия 7.8.0.1434

Схема объекта указана в "Базовая схема страницы редактирования раздела "Роли"" (SysAdminUnitRoleBasePageV2) от которой наследуется Схема страницы редактирования раздела "Организационные роли" (SysAdminUnitPageV2)

define("SysAdminUnitRoleBasePageV2", ["ConfigurationConstants", "SysAdminUnitRoleBasePageV2Resources"],
	function(ConfigurationConstants, resources) {
		return {
			entitySchemaName: "VwSysAdminUnit"....

т.к. схема объекта - VwSysAdminUnit, то именно ее и следует замещать, и в замещающей схеме добавить новую колонку, которую необходимо привязать к новому полю в тоже замещающей клиентской схеме SysAdminUnitPageV2
Никаких особых особенностей по идее быть не должно
единственное что надо внимательно смотреть для 7.8 какую схему из какого пакета в результате заместили :)

Я так понимаю, что моя проблема заключается в том, что я добавил поле в VwSysAdminUnit, а в сам select VwSysAdminUnit его не добавил.
Есть ли пример проведения данной операции для базы on-demand?

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

очень приблизительный путь решения (и я очень не уверен в правильности)
создать в бд в таблице SysAdminUnit нужную колонку
создать в бд в представлении VwSysAdminUnit нужную колонку и связать с таблицей SysAdminUnit
может еще что нужно сделать

НО ДЕЛАТЬ ЭТО НА ТЕСТОВОЙ БД, ни в коем случае не на рабочей
для базы on-demand это сделать вряд-ли получится из-за требований по безопасности
нужно разворачиваться локально

"Коновалов Игорь" написал:Есть ли пример проведения данной операции для базы on-demand?

http://www.community.terrasoft.ru/blogs/11961
установите и гоняйте любые запросы

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

Добрый день.
Необходимо реализовать следующую последовательность действий:
Входной звонок-> получение уникального Id звонка ->вызов C# сервиса передав ему необходимые параметры включая Id звонка из базы.
Создаю бизнес процесс на объекте Call: После добавления записи.
Но он не срабатывает. Есть ли какая инструкция на реализацию похожего функционала?
P.S. bpm 7.5

Нравится

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

Здравствуйте, возможно вам поможет эта статья:
https://academy.terrasoft.ru/documents/technic-sdk/7-6-0/kak-dobavit-av…

[quote="Татаринов Андрей Алексеевич"]Здравствуйте, возможно вам поможет эта статья:
https://academy.terrasoft.ru/documents/technic-sdk/7-6-0/kak-dobavit-av…]
Добрый день.
Делал по этой инструкции.
Заместил объект Call -> Событие: После добавления записи(CallInserted) -> Начальные сообщение(Сообщение: CallInserted). Добавил скриншоты.
Делаю звонок с cті панели звонок в раздел Звонки попадает, но процесс не запускается и его в журнале нет.
Не могу понять что я сделал не так.

В свойствах бизнес-процесса указан тег 'Business Process'?

"Татаринов Андрей Алексеевич" написал:В свойствах бизнес-процесса указан тег 'Business Process'?

Нет такого пункта.
При создании простого бизнес-процесса тег есть. Скрин прилагаю.
P.S. в свойствах выбрал показывать все.

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

Достаточно создать процесс со стартовым сигналом, как например во вложении. Процесс стартует, проверено на 7.5.

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

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

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

Заранее благодарю за помощь.

Нравится

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

Настолько частая задача, что хотелось бы, чтобы её в коробку добавили.

Так как же эта задача решается не из коробки?

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

ставим attributes

"CustomerBillingInfo": {
	dependencies: [
		{
				columns: ["Account"],
				methodName: "setCustomerBillingInfo"
		}
	]
}

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

	   /**
             * Установка BillingInfo по условию: 1) Если у контрагента всего один BillingInfo то
             *									 2) Вставляем его объект в BillingInfo
             *                                   3) Если больше - ищем по умолчанию
            */
			setCustomerBillingInfo: function() {
                var account = this.get("Account");
				if (account) {
					var esq = Ext.create("Terrasoft.EntitySchemaQuery", {
						rootSchemaName: "AccountBillingInfo"
					});
                    esq.addColumn("Id");
                    esq.addColumn("Name");
                    esq.addColumn("UsrDefault");
					esq.filters.add("AccountFilter", this.Terrasoft.createColumnFilterWithParameter(
						this.Terrasoft.ComparisonType.EQUAL, "Account", account.value));
					esq.getEntityCollection(function(response) {
						if (response && response.success) {
							var collection = response.collection;
							if (collection && collection.getCount() > 0) {
                               var items = collection.getItems();
                               if (items.length === 1) {
                                   var item = items[0];
                                   this.set("CustomerBillingInfo", {value: item.get("Id"), displayValue: item.get("Name")});
                               }
                               else {
                                   items.forEach(function(item) {
                                       if (item.get("UsrDefault")) {
                                           this.set("CustomerBillingInfo", {value: item.get("Id"), 
                                               displayValue: item.get("Name")});
                                           return;
                                       }
                                   }, this);
                               }
							}
						}
					}, this);
				}
			}

Владимир, благодарю! Я был на правильном пути, но мне не хватало вот этой строчки кода:

this.set("CustomerBillingInfo", 
    {value: item.get("Id"), displayValue: item.get("Name")});
Показать все комментарии

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

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

Нашел в сообществе:

getGridDataColumns: function() {
        var columnsConfig = this.callParent(arguments);
        columnsConfig.NumberDecimal = {
                path: "NumberDecimal",
                orderPosition: 10,
                orderDirection: 1
        };
        return columnsConfig;
}

Но это не работает.

Нравится

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

Добрый день.
Попробуйте:

/**
 * Возвращает колонки, которые всегда выбираются запросом.
 * @protected
 * @overridden
 * @return {Object} Возвращает массив объектов-конфигураций колонок.
 */
getGridDataColumns: function() {
	var baseGridDataColumns = this.callParent(arguments);
	var gridDataColumns = {
		"SmrNumber": {path: "SmrNumber"}
	};
	return Ext.apply(baseGridDataColumns, gridDataColumns);
},
/**
 * Инициализирует колонки сортировки.
 * @protected
 * @overridden
 * @param {Terrasoft.EntitySchemaQuery} esq Запрос, в который будут инициализорованы опции сортировки.
 */
initQuerySorting: function(esq) {
	var sortedColumn = esq.columns.collection.get("SmrNumber");
	if (sortedColumn) {
		sortedColumn.orderPosition = 0;
		sortedColumn.orderDirection = this.Terrasoft.OrderDirection.DESC;
	}
}

Здравствуйте, Дмитрий.
Спасибо. Это то что нужно.

Здравствуйте, подскажите, как отфильтровать по колонке связанного справочника?
Например, есть деталь, в ней справочное поле, а в справочнике целочисленное поле.
Деталь UsrPrimaryContact, справочное поле UsrRelationType поле UsrOrder. Т.е. нужно отсортировать по UsrRelationType.UsrOrder

Уже разобрался. Спасибо за хороший пример.

 /**
                 * Возвращает колонки, которые всегда выбираются запросом.
                 * @protected
                 * @overridden
                 * @return {Object} Возвращает массив объектов-конфигураций колонок.
                 */
                getGridDataColumns: function () {
                    var baseGridDataColumns = this.callParent(arguments);
                    var gridDataColumns = {
                    	"UsrRelationshipType": {path: "UsrRelationshipType"},
                        "UsrRelationshipType.UsrOrder": {path: "UsrRelationshipType.UsrOrder"}
                    };
                    return Ext.apply(baseGridDataColumns, gridDataColumns);
                },
                /**
                 * Инициализирует колонки сортировки.
                 * @protected
                 * @overridden
                 * @param {Terrasoft.EntitySchemaQuery} esq Запрос, в который будут инициализорованы опции сортировки.
                 */
                initQuerySorting: function (esq) {
                    debugger;
                    var sortedColumn = esq.columns.collection.get("UsrRelationshipType.UsrOrder");
                    if (sortedColumn) {
                        sortedColumn.orderPosition = 0;
                        sortedColumn.orderDirection = this.Terrasoft.OrderDirection.ASC;
                    }
                },
Показать все комментарии

Добрый день!

Столкнулся со следующей задачей: есть два поля datetime - UsrEnsFromDate и UsrPolisEndDate. Необходимо, чтобы при изменении UsrEnsFromDate, менялся и UsrPolisEndDate (UsrEnsFromDate+ 1 год - 1 день). С этим справился:

attributes: {
  "UsrPolisEndDate": {
    dataValueType: this.Terrasoft.DataValueType.DATE,
      dependencies: [
        {
           columns: ["UsrEnsFromDate"],
           methodName: "onUsrEnsFromDateChanged"
        }
      ]
  }
}

methods: {
  onUsrEnsFromDateChanged: function() {
    var toDate = this.Terrasoft.deepClone(this.get("UsrEnsFromDate"));
    toDate.setFullYear(toDate.getFullYear() + 1).setDate(toDate.getDate() - 1);
    if (!this.Ext.isDate(toDate)) {
      return;
    }
    this.set("UsrPolisEndDate", toDate);
  }
}

Далее, требуется при создании новой записи, заполнять поля значениями по умолчанию. UsrEnsFromDate = текущая дата, UsrPolisEndDate = UsrEnsFromDate+ 1 год - 1 день. Настроил для поля UsrEnsFromDate значение по умолчанию. Но, при этом не срабатывает заполнение зависимого поля UsrPolisEndDate :(

При ручной смене значения в поле UsrEnsFromDate - все работает прекрасно.

Подскажите, в какую сторону копать?

Нравится

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

Добрый день коллеги! Подскажите пожалуйста, возможно есть какие то "регламентные" процедуры, которые нужно выполнить для актуализации данных о замещаемых модулях? Имеется ввиду чтобы система "увидела" функцию самого последнего замещаемого модуля.
Приведу пример: на тестовом сайте был добавлен замещаемый модуль для ActivitySectionV2, и переопределена функция, без CallPatent(), после обновления другой копии этого сайта через svn - почему то идет вызов не последней версии функции, а функции из родительской схемы(пакета Field force)
Подскажите пожалуйста, как можно это исправить. Спасибо!

Нравится

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

Влад, все зависит от условий
Одинаковые ли версии приложения на разных сайтах?
И если можно, подробнее о самом процессе, как вы вносили замещающую схему в SVN и как вы передавали ее из SVN?

Роман, да версии одинаковые. Схема передавалась стандартно, через зафиксировать пакет в хранилище/ обновить с хранилища

Желательно бы открыть и пересохранить схему на новой копии сайта, чтобы были внесены данные в базу данных. Посмотрите в свойствах схемы, корректно ли установлен родительский объект.
Возможно не установился признак ExtendParent в таблице (см. вложение)

проверил в свойствах, и в sql - все данные правильные. К сожалению :smile:

может как вариант попробовать создать новый пакет, в нем создать еще один ActivitySectionV2, и в нем переопределить эту функцию? :)

Еще раз перечитал. А почему вы замещаете схему из FieldForce? Обычно замещается из NUI

Нет, у меня тоже NUI, то я имел ввиду что вызывается функция, которая была переопредена в FieldForce (isSchedulerDataView).
На сколько я понимаю, когда я пишу имя схемы в качестве родителя, то система автоматически выбирает пакет - корневой.
Эта функция изначально описана в NUI, переопределена в FieldForce, а потом в моем пакете. Но на втором сайте вызывается из схемы FieldForce, а мою не видит.

Наверное надо попробовать повторить

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

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

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

Нравится

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

Замещаете MainHeaderSchema и переопределяете loadProfileButtonMenu и вставляете необходимые код, который будет вызывать пользовательский метод

Спасибо большое, это именно тот модуль. Но что-то пошло не так ...

http://pixs.ru/showimage/Bezimyanni_3822167_22664458.png

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

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

"Заставный Роман" написал: Я создал замещающую страницу, скопировал код который был...

Т.е. вы вставили код из родительской схемы?

Да. Но пропали картинки, а не дублируются функции

Вам нужно просто добавить новый код в замещающую схему, например вот так

define("MainHeaderSchema", [], function() {
	return {
		methods: {
			// обработчик нажатия на новый пункт меню
			myClickMethod: function() {
				window.console.log("работает");
			},
			//перегрузка родительского метода
			loadProfileButtonMenu: function() {
				//вызов родительского метода
				this.callParent();
				//пользовательская реализация
				var profileMenuCollection = this.get("ProfileMenuCollection");
				//сепаратор
				profileMenuCollection.addItem(this.Ext.create("Terrasoft.BaseViewModel", {
					values: {
						Type: "Terrasoft.MenuSeparator",
						Caption: ""
					}
				}));
				//новый пункт меню
				//используются существующие картинки и строки
				profileMenuCollection.addItem(this.Ext.create("Terrasoft.BaseViewModel", {
					values: {
						Caption: this.get("Resources.Strings.ProfileMenuItemCaption"),
						Click: {
							bindTo: "myClickMethod"
						},
						MarkerValue: this.get("Resources.Strings.ProfileMenuItemCaption"),
						ImageConfig: this.get("Resources.Images.ContactEmptyPhoto")
					}
				}));
			}
		}
	};
});

После сохранения схемы и обновления страницы приложения полцчится так, как на прикрепленной картинке

"Симута Роман Русланович" написал:

Т.е. вы вставили код из родительской схемы?


Спасибо вам большое! Сейчас попробовал оставить только необходимые методы, и все заработало. Но был как-то случай, что модуль отказывался работать полноценно, пока весь код из родительской схемы не перенёс в замещёную ...

Пожалуйста :)

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

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

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

Нравится

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

Добрый день.

Загрузка вложенных модулей дашборда запускается через sandbox в методе BaseDashboardViewModel.loadNestedModule() (пакет Platform).
Далее в методе BaseNestedModule.render() (пакет NUI) выполняется отрисовка каждого модуля и в конце вызывается метод представления onRender().

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

Такие доработки можно реализовать с помощью базового механизма обмена сообщениями sandbox.

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