Переношу JQueryInputMask из 7.2 в 7.6. Есть следующая функция:

var isInputEventSupported = function(eventName) {
                var el = document.createElement("input"),
                                eventName = "on" + eventName,
                                isSupported = (eventName in el);
                if (!isSupported) {
                        el.setAttribute(eventName, "return;");
                        isSupported = typeof el[eventName] === "function";
                }
                el = null;
                return isSupported;
}

В 7.6 интерпретатор показывает ошибку 'eventName' is already defined на строке

eventName = "on" + eventName,
Скажите, пожалуйста, что нужно сделать для исправления этой ошибки ?

Нравится

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

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

Для устранения данного сообщения необходимо вынести присвоение из блока var:

var isInputEventSupported = function(eventName) {
	eventName = "on" + eventName;
	var el = document.createElement("input"),
		isSupported = (eventName in el);
	if (!isSupported) {
		el.setAttribute(eventName, "return;");
		isSupported = typeof el[eventName] === "function";
	}
	el = null;
	return isSupported;
}

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

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

Добрый день.

Помогите разобраться, создан шаблон вида:
"Вы назначены ответсвенным по обращению № %Number% "%Subject%".
Суть обращения: %Symptoms%;
Автор обращения: %Contact.Name%"

Отправляем письмо и оно приходит уже таким:
"Вы назначены ответсвенным по обращению № Нет данныхidНет данных "Нет данных".
Суть обращения: Нет данных;
Автор обращения: Нет данных"

Как решить это?

Нравится

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

Алеся, а какая Вас версия системы?

Версия системы 7.5.0.1473

Алеся, подскажите, вы редактировали существующий макрос, или добавляли новый?

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

А идентификатор объекта, данными которого нужно запомнить письмо Вы передаете?

В FillEmailUserTask необходимо передавать параметр RecordId в котором передавать идентификатор объекта, в Вашем случае, как я понимаю Идентификатор обращения.

В FillEmailUserTask необходимо передавать параметр RecordId в котором передавать идентификатор объекта, в Вашем случае, как я понимаю Идентификатор обращения.

Александр, большое спасибо за помощь, у меня "Идентификатор обращения" брался не из того элемента, поменяла и все заработало.

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

Добрый день!

В странице раздела использую переопределенный метод GetModuleRowConfig со следующим кодом:

var configs = base.GetModuleRowConfig( module );

string primaryColumnName = module.Schema.PrimaryColumn.Name;
string primaryColumnValue = module.GetColumnValue(primaryColumnName).ToString();
var config = new DataSourceRowConfig(primaryColumnValue);

string VIPColumnValue = "";

Select select = new Select( UserConnection )
.Column("VipClientMarkId")
.From("Contact")
.Where("Contact", "Id")
.IsEqual( new QueryParameter( module.GetTypedColumnValue( "DebtorContactId" ) ) ) as Select;

VIPColumnValue = select.ExecuteScalar();

if ( VIPColumnValue != null ) {
configs.AddConfig( new DataSourceRowBackgroundColorConfigValue( "Salmon" ));
}

return configs;

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

Нравится

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

Да, посмотреть, как это сделано, можно на странице «RecordAllChangesGridPage» (журнал изменений):

		public virtual DataSourceRowConfig GetRowConfig(Entity row) {
			if (!HighlightColumnsCheckPerformed) {
	HighlightColumns = GetColumnsHighlightState();
	HighlightColumnsCheckPerformed = true;
}
string primaryColumnName = row.Schema.PrimaryColumn.Name;
string primaryColumnValue = row.GetColumnValue(primaryColumnName).ToString();
var config = new DataSourceRowConfig(primaryColumnValue);
Guid changeType = row.GetTypedColumnValue<Guid>("ChangeTypeId");
string backgroundColor;
if (changeType == new Guid("A852C33F-0BDD-E011-92C3-00155D04C01D")) {
	backgroundColor = "Green";
} else if (changeType == new Guid("AA52C33F-0BDD-E011-92C3-00155D04C01D")) {
	backgroundColor = "Red";
} else {
	backgroundColor = "Blue";
}
var cellsBackground = new Dictionary<string, DataSourceRowColumnBackgroundColorConfigValue>();
if (PreviousRow != null && HighlightColumns) {
	var previousRow = PreviousRow as Entity;
	foreach (var column in row.Schema.Columns) {
		if ((column.Name != "ModifiedOn") && (column.Name != "ModifiedBy") 
			&& (column.Name != "ChangeTrackedBy") && (column.Name != "ChangeTrackedOn")
			&& (column.Name != "ChangeType")) {
			object currentValue = row.GetColumnValue(column.Name);
			object prevValue = previousRow.GetColumnValue(column.Name);
			if (!Object.Equals(currentValue, prevValue)) {
				cellsBackground.Add(column.Name, new DataSourceRowColumnBackgroundColorConfigValue("#FFF30F"));
			}
		}
	}
}
PreviousRow = row;
config.AddConfig(new DataSourceRowColorConfigValue(backgroundColor));
config.AddConfig(new DataSourceRowColumnsBackgroundColorConfigValue(cellsBackground));
return config;
		}

Алксандр, а если поле справочное, как тогда? (т.е. в бд поле DebtorContactId, а в карточке и реестре отображается Физ лицо)

А в чём разница? В моём примере в цикле перебираются колонки и выкидывается ModifiedBy (полное название ModifiedById), оно тоже справочное.

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

Добрый день! Какие цвета можно использовать в конфигах( если можно ссылочку)

Использую следующие кофиги:
config.AddConfig(new DataSourceRowColorConfigValue("цвет"));
config.AddConfig(new DataSourceRowBackgroundColorConfigValue("Цвет"));

Цвета пока беру от сюда http://www.stm.dp.ua/web-design/color-html.php
Не все подходят..

Нравится

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

Можно указывать цвета в формате:

#A0A0A0

Так можно указать любой цвет.

"Зверев Александр" написал:

Можно указывать цвета в формате:

#A0A0A0

Так можно указать любой цвет.

Спасибо!

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

Необходимо применить фильтр к комбобоксу StatusEdit в карточке редактирования задачи.

При применении следующего кода:

Page.StatusEdit.PrepareLookupFilter += delegate (object sender, ComboBoxEditEventArgs e) {
var InWorkStatusId = "394D4B84-58E6-DF11-971B-001D60E938C6";
Collection> filters = e.Filters;
filters.Add(new Dictionary {
{"comparisonType", FilterComparisonType.Equal},
{"leftExpressionColumnPath", "Id"},
{"useDisplayValue", false},
{"rightExpressionParameterValues", new object[] {InWorkStatusId}}});
};

При выборе выпадающего списка происходит следующая ошибка:

Exception Message: The control 'PageContainer_StatusEdit' does not have an AjaxEvent with the name 'InternalPrepareLookupFilter' or the handler is absent

Что не так делаю?

Нравится

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

Попробуйте так:

Page.StatusEdit.PrepareLookupFilter += delegate (object sender, ComboBoxEditEventArgs e) {
var InWorkStatusId = "394D4B84-58E6-DF11-971B-001D60E938C6";
var filters = e.Filters;
filters.Add(new Dictionary<string, object> {
{"comparisonType", FilterComparisonType.Equal},
{"leftExpressionColumnPath", "Id"},
{"useDisplayValue", false},
{"rightExpressionParameterValues", new object[] {InWorkStatusId}}});
};

Та же самая ошибка вылетает.

Exception Message: The control 'PageContainer_StatusEdit' does not have an AjaxEvent with the name 'InternalPrepareLookupFilter' or the handler is absent

У меня работает нормально. Сообщите больше информации. Может, кроме этого в другом месте ещё какие-то фильтры на это поле есть?

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

А надо на Init.

Каким образом тогда в скрипте Init получить следующее значение:

var TaskId = Page.DataSource.ActiveRow.GetTypedColumnValue("Id");

На этой строчке скрипт "вылетает". т.к. , насколько я понимаю, данные из DataSource еще не загружены.

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

Почему тогда происходит ошибка:

System.NullReferenceException: Ссылка на объект не указывает на экземпляр объекта.
в Terrasoft.WebApp.TaskEditPageEventsProcess`1.ChildInitAfterParentScriptExecute(ProcessExecutingContext context)

при получении Id открываемой активности:

var TaskId = Page.DataSource.ActiveRow.GetTypedColumnValue("Id");

???

И под скриптом Init подразумевался ChildInitBeforeParentScript ???

Функция GetTypedColumnValue — это generic, там надо указать тип в угловых скобках. Вроде:

Guid accountId = Page.DataSource.ActiveRow.GetTypedColumnValue<Guid>("AccountId");

Можно и before, и after.

Угловые скобки вырезал парсер форума, они там есть:

var TaskId = Page.DataSource.ActiveRow.GetTypedColumnValue<Guid>("Id");

т.е. ошибка с этим не связана.

Посмотрите в других разделах как устроено наложение фильтров и сделайте по аналогии. Там несложно.

Вот пример:

			Page.ManagerLookupEdit.PrepareLookupFilter += delegate (object sender, LookupEditEventArgs e) {
	Collection<Dictionary<string, object>> filters = e.Filters;
	Guid accountId = Page.DataSource.ActiveRow.GetTypedColumnValue<Guid>("AccountId");
	filters.Add(new Dictionary<string, object> { 
       {"comparisonType", FilterComparisonType.Equal}, 
       {"leftExpressionColumnPath", "Account.Id"}, 
       {"useDisplayValue", false}, 
       {"rightExpressionParameterValues", new object[] {accountId}}});
};

Если нужно Id записи, карточка которой открыта, то можно просто:

           {"rightExpressionParameterValues", new object[] {Page.DataSource.ActiveRowPrimaryColumnValue.ToString()}}});

Между нами, есть некоторое недопонимание, если использовать напрямую т.е. просто вставить ваш код фильтра в скрипт, фильтр применяется, тут проблем нет.

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

var TaskId = Page.DataSource.ActiveRow.GetTypedColumnValue<Guid>("Id");

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

if(NeedFilters) {
filters.Add(new Dictionary<string, object> {

Применил :

var TaskId = Page.DataSource.ActiveRowPrimaryColumnValue.ToString();

На выходе получил значение TaskId:

00000000-0000-0000-0000-000000000000

Возможно, запись ещё не сохранена.

Я открываю уже существующую запись.

Дело в том, что :

var TaskId = Page.DataSource.ActiveRowPrimaryColumnValue.ToString();

получает Id активности только если его перенести в ScriptAfterBasePageLoadComplete, в скриптах Init всегда нулевые значения.

Проверяйте значение поля внутри делегата.

Все работает. Большое спасибо.

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

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

Хочу с вами посоветоваться так как не могу найти решение следующий проблемы.
Пользователь портала при создание нового запросе через свой личный кабинет на вкладку «Комментарии» добавляет 2 файла. После классификации сотрудник технической поддержки берет данный запрос в работу. Но после этого пользователь портала передумывает и удаляет 1 из файлов на вкладке «Комментарии». Это не где не отслеживается. Не системный администратор и не сотрудник тех. поддержки не могут доказать что, раньше было прикреплено 2 файла вместо 1-го текущего файла.

С уважением,
Гюнель

Нравится

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

Решение простое - установите на объект "Файлы и ссылки чего-то-там" признак "Администрируется по операциям".
Затем для пользователей портала ставите чтение и добавление, на удаление и изменение запрет.

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

Скажите, пожалуйста, можно ли в BPMonline 7.6 создавать объекты программным образом, используя MS VS, язык C# и API, описанный в SDK? Например используя классы из пространства имён Terrasoft.Core.Entities? И если можно, то дайте ссылку на хороший пример. Заранее благодарен.

Нравится

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

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

К сожалению, на данный момент разработка схем конфигурации BPMonline на языке C# в MS Visual Studio не поддерживается.

Возможно для Вас будет полезная следующая статья:
Отладка серверного кода
http://academy.terrasoft.ru/documents/docs/technic/SDK/7.6.0/ServerCode…

Да, эту статью я читал.

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

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

Нравится

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

Здравствуйте, Евгений!

Для этого в системе можно создавать замещающие объекты. Подробнее Вы можете ознакомиться в документации http://academy.terrasoft.ru/documents/docs/technic/SDK/7.6.0/SectionCon….

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

То есть, Вы можете создать замещающий объект и добавить в него желаемые колонки.

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

Здравствуйте, имеется terrasoft 3.3.1.126
Нет возможности удалить пользовательское поле в контрагентах (поле создано мной же), выдается сообщение: Невозможно удалить поле (Имя базы данных) т.к. существует связь FAccount(имя базы данных), использующее это поле..
после нажатия кнопки ок пользовательское поле пропадает из списка, но при следующем открытии terrasoft поле появляется вновь...

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

Прошу помочь советом в данном вопросе, за ранее спасибо.

Нравится

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

Имя базы данных тут, скорее всего, не при чём.
Попробуйте открыть tbl_Account d TSAdmin и удалить элементы, ссылающиеся на это поле в разделах Relations и Indexes.

Спасибо, но когда я удаляю элемент в разделе Relations вылетает сообщение разрушительный сбой.. и TSadmin закрывается.

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

Нет нет я честный человек мне не чего скрывать.
В tbl_Account в разделе Field Поле называется type_sagawebID
В разделе Relations Связь называется FAccounttypesagawebID
В разделе Indexes ничего с таким названием не нашел
На сколько они не корректны судить не могу...
так же ещё нашел в элементе tbl_AccountLog в разделе fields, 2 поля type_sagawebID и type_sagawebName

Какого типа поле и если справочник, то на какой раздел ссылается?

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

Вы удалили не справочник, а регистрацию в списке справочников. Похоже, сама таблица с данными никуда не делась.

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

Добрый день всем!

В Salesforce есть такое понятие, как связанные активности (емейлы, таски и тд). И есть такая кнопка View All, которая генерит вебстраницу, на которой отображены все связанные с parent record активности в развернутом виде (сабжект, описание, кто создал, когда и тд).

Такое представление очень удобно саппорт-инженерам, чтобы в один клик просмотреть всю переписку с пользователем.

Скажите, есть ли такая фича в BPMOnline? Сложно ли такого добиться?

С уважением,
Андрей

Нравится

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

Похожее делает стандартный отчёт «Досье контакта». Там есть раздел «История взаимодействия».
досье

Смотря что вы имеете в виду под "parent record". Если это инцидент, то связанные активности видны на детали "Активности" в том виде, который пользователь себе сконфигурирует

"Владимир Соколов" написал:

Смотря что вы имеете в виду под "parent record". Если это инцидент, то связанные активности видны на детали "Активности" в том виде, который пользователь себе сконфигурирует

Владимир, спасибо за ответ!
Нашел, настроил - сделано здорово.
Единственное, в режиме Tile View при выводе поле Body содержимое отображается в виде html-кода.

"Andrey Baranov" написал:Единственное, в режиме Tile View при выводе поле Body содержимое отображается в виде html-кода.

Тут решали похожую задачу - http://www.community.terrasoft.ua/forum/topic/9406

Но у вас bpm'online 7?

Да, у меня BPM 7, я уже заметил, что не в ту ветку форума запостил..

"Andrey Baranov" написал:Да, у меня BPM 7, я уже заметил, что не в ту ветку форума запостил..

Точно не подскажу, но думаю, что настройкой css можно добиться, чтобы в реестре показывать html. Картинки, ведь, показывают в Opportunity, и фото в Contact

Андрей, для объекта «Статья базы знаний» реализовано поле «Решение без HTML тегов». Для активности можно создать аналогичное поле, которое будет называться, например, «Тело без HTML тегов».

Пример кода Вы можете посмотреть в «KnowledgeBasePageV2». В блоке diff для контрола, в который выводиться значение поля «Notes», реализован байндинг «plainTextValue» на поле «NotHtmlNote».

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