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

Я заблокировал объекты в хранилище SVN под учеткой другого пользователя с полными правами, после очистил реестр контактов и теперь не могу под Supervisor зафиксировать данные в хранилище. По идее у supervisor полные права, но выходит ошибка, что объекты заблокированы.

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

Нравится

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

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

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

В комментариях к некоторым постам упоминается, что Terrasoft.showInputBox может быть многострочный, но на практике это не работает.

Делаю так:

Terrasoft.showInputBox("Список рекомендаций", function() {}, ["ok"], null, {
name : {
	dataValueType: Terrasoft.DataValueType.TEXT,
	value: text,
	values: {
		layout: {
			rowSpan: 3
		},
		contentType: Terrasoft.ContentType.LONG_TEXT
	}
}
},
{
	defaultButton: 0
});

Получаю однострочное поле (input type="text"), в консоли ошибок нет.

Я что-то делаю не так?

Нравится

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

Оно крайне забавно съезжает в процессе заполнения текстом :DDD

 

Terrasoft.showInputBox("Список рекомендаций", function() {}, ["ok"], null, {
name : {
	dataValueType: Terrasoft.DataValueType.TEXT,
	value: "",
	customConfig: {
        className: "Terrasoft.MemoEdit"
    }
  }
},
{
	defaultButton: 0
});

 

Исправляюсь. Там оказывается есть параметр высоты.

Terrasoft.showInputBox("Список рекомендаций", function() {}, ["ok"], null, {
	name : {
		dataValueType: Terrasoft.DataValueType.TEXT,
		value: "",
		customConfig: {
			className: "Terrasoft.MemoEdit",
			height: "150px"
		}
	}
},
{
	defaultButton: 0
});

 

Варфоломеев Данила,

Ну раз пошла такая пьянка, какие там еще параметры есть? :)

Алексей-Карягин пишет:

какие там еще параметры есть

конкретно под  MemoEdit? поиск по all-combined выдал:

memo: {
	dataValueType: Terrasoft.DataValueType.TEXT,
	value: a,
	customConfig: {
		className: "Terrasoft.MemoEdit",
		height: "235px",
		readonly: !0,
		markerValue: "validationMessage"
	}
}

Можно тут глянуть что ещё можно добавить из свойств (placeholder и width точно работают). Ну и я так понимаю аналогично с др. контролами.

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

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

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

"Candidate": {
	dependencies: [
		{
			columns: ["Candidate"],
			methodName: "onCandidateChanged"
		}
	]
}

, метод onCandidateChanged не вызывается. Для отслеживания изменений значения справочника помогла конструкция в массиве Diff:

                        "values": {

                            ...

                            "change": { "bindTo": "onCandidateChanged" }

                        }

Но для текстового поля такая конструкция не работает.

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

В качестве примера я пробую отловить изменение в текстовом поле стандартного элемента SocialMessagePublisherPage, и тоже ничего не получается. Но на обычных страницах (например, в карточках) всё прекрасно работает, и нужный метод вызывается при изменении значения поля.

Нравится

12 комментариев
define("SocialMessagePublisherPage", [], function() {
	return {
		entitySchemaName: "SocialMessage",
		mixins: {},
		methods: {
			init: function() {
				this.callParent(arguments);
				this.on("change:Message", this.onMessageChanged, this);
			},
			onMessageChanged: function(model, value, event) {
				debugger;
			}
		},
		diff: /**SCHEMA_DIFF*/[]/**SCHEMA_DIFF*/
	};
});

 

Варфоломеев Данила,

Спасибо! А есть ли вариант отловить события смены текста непосредственно в момент его изменения? В приведенном Вами примере событие срабатывает при потере фокуса у текстового поля.

Небеддаг Иван Владимирович пишет:

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

Есть, но надо конкретно так упороться: 

1) Сворганить свой модуль, наследуется от Terrasoft.ESNHtmlEdit. В нём подменить функции onKeyUp. Сделать так, чтобы всегда отрабатывал fireEvent.

2) В странице SocialMessagePublisherPage переопределить SocialMessagePublisherEdit: className заменить на только что созданный модуль и забиндить свою функцию на event из функции fireEvent

3) Ну и как итог своя функция будет отрабатывать на каждый введенный/удаленный символ в поле.

Варфоломеев Данила,

забиндить свою функцию на event из функции fireEvent 

Данила, добрый вечер, а можно поподробнее что именно нужно сделать. Все предыдущие шаги выполнил! 

Не могли бы вы поподробнее рассказать (или выложить кусочек кода) о том как "забиндить свою функцию на event из функции fireEvent". Никак не  получается сделать. Предыдущие шаги выполнить удалось!

Варфоломеев Данила,

"и забиндить свою функцию на event из функции fireEvent" - не могли бы Вы подробнее объяснить, каким образом это сделать?

Иван, видимо, он имел в виду как тут, только не на onClick, а на onKeyUp:

// Генерирует событие canExecute.
// Возвращает true, если можно продолжить выполнение метода onClick().
canExecute: function(config) {
    var args = config.args;
    var event = args[args.length - 1];
    // Если метод onClick() был вызван из миксина CheckModuleDestroyMixin как callback-функция,
    // то в него последним параметром передается событие, которое сигнализирует о прерывании выполнения.
    if (event && event.isComeBack) {
        return true;
    }
    // Добавление в аргументы события прерывания выполнения метода.
    // Необходимо для остановки выполнения метода при вызове onСlick из callback-функции.
    Array.prototype.push.call(config.args, {
        isComeBack: true
    });
    // Применение текущего контекста.
    Ext.apply(config, { scope: this });
    // Генерация события canExecute.
    var canExecute = this.fireEvent("canExecute", config);
    return canExecute;
},

Небеддаг Иван Владимирович,

mcNosferatum,

Извиняюсь за длительный ответ. В принципе да, Илья правильно объяснил. Если вы откроете ESNHtmlEditModule и посмотрите на функцию onKeyUp, то конкретно этот кусок кода 

this.fireEvent("keyUp", keyboardEvent, this);

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

Upd. по быстрому набросал

Код модуля

define("UsrHtmlEditModule", ["ESNHtmlEditModule"],
	function() {
 
	//Ext.ns("Terrasoft.controls.UsrHtmlEditModule");
	/**
	 * @class Terrasoft.controls.HtmlEdit
	 * Html editor control class.
	 */
	Ext.define("Terrasoft.controls.UsrHtmlEditModule", {
		extend: "Terrasoft.ESNHtmlEdit",
		alternateClassName: "Terrasoft.UsrHtmlEditModule",
 
		onKeyUp: function(keyboardEvent) {
			this.callParent(arguments);
			this.fireEvent("keyPressed", keyboardEvent, this);
		},
 
		setInitConfig: function() {
			this.callParent(arguments);
			this.addEvents("keyPressed");
		},
 
	});
	return Terrasoft.UsrHtmlEditModule;
});

Код страницы

define("SocialMessagePublisherPage", ["UsrHtmlEditModule"], function() {
	return {
		entitySchemaName: "SocialMessage",
		mixins: {},
		methods: {
			userPressedKey: function(event) {
				debugger;
			}
		},
		diff: /**SCHEMA_DIFF*/[
			{
				"operation": "merge",
				"name": "SocialMessagePublisherEdit",
				"values": {
					"className": "Terrasoft.UsrHtmlEditModule",
					"keyPressed": {bindTo: "userPressedKey"}
				}
			}
		]/**SCHEMA_DIFF*/
	};
});

 

Событие keyPressed действительно теперь отрабатывает при нажатии на каждую кнопку, но почему то this.Get("SocialMessagePublisherEdit") присылает не обновленное значение!

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

mcNosferatum пишет:

присылает не обновленное значение!

Видимо обновленное проставляется при unFocus событии элемента. Ну что ж. Можно тогда прокидывать введённое значение.

//в модуле:
this.fireEvent("keyPressed", keyboardEvent, this.getTypedValue(), this);
 
в странице:
userPressedKey: function(event, typedValue) {
	var message = this.get("Message");
	debugger;
}

 

Данила, спасибо! Все получилось, как хотел. Использовал :

var message = typedValue; - для получения текущего значения
var message = this.get("Message"); - теперь постоянно возвращает "undefined".
Показать все комментарии

Добрый день! Столкнулся с проблемой отображения времени в sql server. Например, есть обращение с датой регистрации 25.05.2018 10:00, а в БД оно отображается как 25.05.2018 07:00, системные настройки времени сервера UTC+3. Как можно сменить часовой пояс системно?

Нравится

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

Можно ли как-то продолжить двигаться по процессу после ошибки? В автоматическом или ручном режимах (в журнале процессов)?

Например, не сохранились данные в элементе "добавить данные", допустим, это не критично, можно ли продолжить процесс?

Нравится

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

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



В момент возникновения ошибки экземпляр процесса фиксирует текущее состояние.



Если устранить источник проблемы и повторно выполнить элемент с ошибкой в журнале процессов - БП продолжит выполнение.



Если ошибка возникает на уровне БД (блокировка транзакции, дедлок) возможен риск потери служебных данных. В таком случае продолжить экземпляр процесса не представляется возможным.



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

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

 

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

Нравится

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

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

Получить не хэшированный пароль нельзя.

Можно выгрузить хэша пароля, но раскодировать его нельзя.

Добавить комментарий

Shevchenko Andrey,

Спасибо

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

Коллеги, интересует можно ли ограничить доступ к bpm только по внутренней сети и вывести field sales в открытый доступ?

 

Нравится

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

Если приложение не будет доступно по внешнему адресу, мобильное приложение не сможет синхронизироваться с БД.

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

Всем привет, подскажите как сделать цикл в бизнес процессе?

Задача пробежаться по всем лидам и на каждой итерации выполнить некую логику

Нравится

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

Ну, не знаю что конкретно Вы хотите сделать, но можно создать булевое поле, Читать количество записей, где это поле = false, если такие записи найдены, то выполняете свою логику и ставите в это поле true. Опять идет читка данных из лидов, если опять найдены такие лиды где false - отрабатывает та же логика. Если записей не найдено. завершаете процесс. Надеюсь чем-то помог.

 

Можно сделать блок БП «скрипт» и в С#-коде написать GetEntityCollection, а затем по результату foreach-циклом, как в примере №4 тут.

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

Товарищи спасибо

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

Здравствуйте! Такой вопрос, возможно ли получить Id записи добавленной в бизнесс-процессе с помощью элемента [Открыть страницу редактирования] или как получить Id добавленной записи, когда делаешь добавление через класс insert?

Нравится

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

Добрый день.

Вы можете сначала добавить новую запись с помощью действия [Добавить данные], который вернет Id добавленной записи, в потом в элементе [Открыть страницу редактирования] в параметре 'Идентификатор записи' указать этот Id как параметр процесса.

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

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

Добрый день!

Был создан обьект как справочник унаследован от (базовый справочник (base))

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

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

(BPM 7.11)

Собственно вопрос как это сделать из справочника раздел?

Нравится

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

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

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

1) Создание страницы редактирования

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

Либо создать по аналогии как в справочнике «Источник лида» (см. Схему «LeadSourcePageV2»).

Либо же попробовать вручную (см. приближенный пример, который по необходимости нужно «дебажить»):

Создаем схему модели представления карточки, наследуемся от «BaseModulePageV2» вводя ее имя заголовка в поле «родительский объект», в разных конфигурациях может быть переведена по-разному, в нашем примере это «Страница активности V2».

Заполняем ее нужными полями, в нашем примере только Name, а объект в нашем примере называется «UsrAccStage»:

define("UsrAccStagePageV2", ["AccountPageV2Resources", "GeneralDetails"],

function(resources, GeneralDetails) {

    return {

        entitySchemaName: "UsrAccStage",

        details: /**SCHEMA_DETAILS*/{}/**SCHEMA_DETAILS*/,

        diff: /**SCHEMA_DIFF*/[

               {

                "operation": "insert",

                "name": "Name",

                "parentName": "Header",

                "propertyName": "items",

                "values": {

                       "bindTo": "Name",

                       "layout": {

                           "column": 0,

                           "row": 0,

                           "colSpan": 12

                      }

                }

            }

        ]/**SCHEMA_DIFF*/,

        attributes: {},

        methods: {},

        rules: {},

        userCode: {}

    };

});

Далее нашей целью является зарегистрировать связь страницы редактирования в базе данных в таблице «SysModuleEdit» через развязочную таблицу «SysModuleEntity» с сущностью объекта, в котором хранится информация. В нашем случае «UsrAccStage». Листинг SQL приводим ниже:

SELECT * FROM SysSchema Where Name = 'UsrAccStagePageV2'

-- UId карточки редактирования = 064A98B5-E6FE-47E7-B9A6-499561BD1347

SELECT * FROM SysSchema Where Name = 'UsrAccStage"

-- колонка UId объекта = E894EBA6-9FBB-4AA7-90E4-6A99B6CD5329

-- проверяем развязочную таблицу

SELECT * FROM SysModuleEntity

WHERE SysEntitySchemaUId = 'E894EBA6-9FBB-4AA7-90E4-6A99B6CD5329'

-- если нет там записи, добавляем:

INSERT INTO SysModuleEntity (SysEntitySchemaUId) VALUES ('E894EBA6-9FBB-4AA7-90E4-6A99B6CD5329')

-- проверяем развязочную таблицу

SELECT * FROM SysModuleEntity

WHERE SysEntitySchemaUId = 'E894EBA6-9FBB-4AA7-90E4-6A99B6CD5329'

-- берем от туда Id = 671F61D8-2E72-47A4-95C7-D67E2C8B723F

INSERT INTO SysModuleEdit (SysModuleEntityId, CardSchemaUId, ActionKindCaption, ActionKindName, PageCaption) VALUES ('671F61D8-2E72-47A4-95C7-D67E2C8B723F', '064A98B5-E6FE-47E7-B9A6-499561BD1347', 'Добавить нашу сущность',

'UsrAccStage','Стадия контрагента')

SELECT * FROM SysModuleEdit WHERE SysModuleEntityId = '671F61D8-2E72-47A4-95C7-D67E2C8B723F'

2) Вопрос по регистрации схемы раздела и самого раздела уже обсуждался на комьюнити (например, https://community.terrasoft.ru/node/26721)

 

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

Спасибо за оперативность. Пробую.

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