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

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

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

Нравится

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

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

Показать все комментарии
#showInputBox
7.11
sales_enterprise

В комментариях к некоторым постам упоминается, что 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".
Показать все комментарии
7.11
service_enterprise

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

Нравится

1 комментарий
бизнес-процесс
7.11
sales_enterprise

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

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

Нравится

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

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



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



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



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



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

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

 

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

Нравится

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

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

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

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

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

Shevchenko Andrey,

Спасибо

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

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

 

Нравится

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

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

Показать все комментарии
Бизнес-процессы
7.11
sales_enterprise

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

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

Нравится

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

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

 

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

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

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

Показать все комментарии
Бизнес-процессы
7.11
bank_customer_journey

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

Нравится

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

Добрый день.

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

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

Показать все комментарии
справочник
раздел
7.11
service_enterprise

Добрый день!

Был создан обьект как справочник унаследован от (базовый справочник (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)

 

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

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

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