Карточки в типовой конфигурации, если какрточка сущности была открыта в chain
(или поправьте меня как это правильно называть, мое толкование проистекает от метода openCardInChain)
В таком режиме - определенные типовые действия: "Закрыть", "Сохранить", "Отмена", приводят к "шагу назад" в цепочке открытых карточек.
Иногда в бизнес-логике необходимо выполнить принудительное сохранение карточки, для этого очень удобно использовать методы распостраняемые BasePageV2, и расширяемые на уровне сущностей в соответствии с их особенностями, в частности this.save()
Вопрос:
Можно ли принудительно изменить, в данном случае "прервать" поведение которое осуществляет закрытие карточки и возврат к предыдущей карточке в chain, после вызова this.save() ?

Нравится

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

Сам спросил, сам ответил

var config = {
    isSilent: true,
};
this.save(config)

метод принимает конфигурационный объект, в котором предусмотрен соответствующий флаг.
isSilent

так... сей фокус не работает если это целевой режим создания или копирования. (т.е. если это карточка новой записи - она все равно закрывается)

Вообщем итоговый "трюк" таков.
Если вам нужно вызвать this.save() и избежать закрытия карточки:

if (this.isAddMode() || this.isCopyMode()) {
	//сохраняем значения для восстановления их далее
	var operation = this.get("Operation");
	var isChain = this.get("IsInChain");
	//подменим целевой режим
	this.set("Operation", "edit");
	//подменим флаг присутствия в chain, елси он установлен
	if (isChain) {
		this.set("Operation", false);
	}
	//вызываем метод save, используем флаг isSilent
	this.save({isSilent: true});
	//Восстановим подмененные значения
	this.set("Operation", operation);
	if (isChain) {
		this.set("Operation", isChain);
	}
} else {
	//Если карточка открыта в целевом режиме "Редактировать запись" 
	//вызываем метод save, используем флаг isSilent
	this.save({isSilent: true});
}
Показать все комментарии

После создания замещающего клиентского модуля карточка редактирования превращается в пустой лист и удаление модуля уже не имеет действия

Нравится

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

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

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

После удаления замещающего клиентского модуля необходимо пересохранить любую другую схему, которую Вы можете изменять, например из пакета "Custom". Это необходимо для того чтобы перегенерировались bundle-файлы.

Ошибки в коде нет
Пересохранение другой схему ничего не дало
Консоль указывает на ошибку в /combined/all-combined.js
message: Uncaught Terrasoft.ItemAlreadyExistsException: Элемент с ключом "ProductsTab" Уже существует
Связи с элементом нет, т.к. на разных сайтах падает эта ошибка с указанием разных элементов

Произведите так называемый "эталонный чистый старт":
1) В конфигураторе

  • Сгенерируйте исходные коды для всех элементов
  • Компилировать всё

2) Разлогиньтесь в приложении
3) Очистите куки и кеш Вашего браузера
4) Очистите Redis-хранилище
5) Перезапустите пул приложений и сам сайт в IIS

После чего попробуйте воспроизвести проблему.

PS: Практика показывает, что при удалении чего либо - зачастую бывает множество "артефактов" причем они выглядят прям "магически". Вышеописанное позволяет наверняка избавиться от "артефактов" и далее разбираться уже с "чистой" проблемой, если она все еще будет воспроизводиться.

Булат, добрый день!

Ошибка указывает на то, что Вы повторно пытаетесь добавить вкладку ProductsTab в своем замещающем клиентском модуле. Убедиться в этом можно закомментировав весь diff и осуществив публикацию. Скорее всего, подобная ошибка возникла в результате того, что после создания замещающего клиентского модуля Вами был перенесен код из родителя, в котором есть insert данной вкладки - соответственно, система 2 раза пытается добавить элемент с одинаковым идентификатором и сваливается с ошибкой.

Илья,

насчет "чистого старта" - это нужно выносить в отдельный блог "Магия да и только" :wink:

От меня дополнение.
Если у Вас on-demand, то попробовать выполнить, как минимум, первые 3 пункта, если не поможет, тогда дергать поддержку.

Хотя в данном случае, всё-таки похоже, что ошибка в коде)

"Алла Савельева" написал:"чистого старта" - это нужно выносить в отдельный блог "Магия да и только"

немножко "магии" никогда не помешает :)

PS: А если серьезно, то это действительно уже такая "проходка" сформировалась у нас, когда ситуация выглядит прям "магией", т.е. проблема есть, но никаких предпосылок, всё перепроверили по 100500 раз. Причем, опытным путем, выяснили, что такие "магические" проблемы возникают, чаще всего, когда что-то, кто-то пытается удалить.
Из последнего:
1) по непонятным причинам наблюдалась загрузка замещающей схемы - которая была удалена. т.е. после чистки кеша браузера и redis-а, в отладчике все равно в итоговом файле схемы присутствовал код схемы которая была удалена из конфигрурации. "чистый запуск" - полет нормальный
2) в схему был внесен код, код загружается на клиент в рамках агрегированного исходника включающего в себя все замещающие схемы, это код - в нем присутствует, но не выполняется - никогда :)
ставим точку останова прямо на "define" того участка который отвечает за нашу схему.
Исполнение просто туда не передается. Перезагружали безсчетное количество раз, отлаживались вплоть до all-combined.js
"чистый старт" - полет нормальный.
Вот как-то так

"Севостьянов Илья Сергеевич" написал:Произведите так называемый "эталонный чистый старт"

Чистый старт не помог

"Мотков Илья" написал:Ошибка указывает на то, что Вы повторно пытаетесь добавить вкладку ProductsTab в своем замещающем клиентском модуле

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

Так же попробовал накатить рабочий backup, не помогло,
backup сел данные обновились, ошибка осталась

Решил проблему следующим образом
1) Открыл мастер раздела
2) Оттуда перешёл к редактированию проблемной страницы
3) Внёс косметическое изменение
4) Сохранил
5) Ошибка ушла

Всем спасибо за помощь и по меньше "магии"

"Хусаинов Булат" написал:Всем спасибо за помощь и по меньше "магии"

самая что ни на есть "магия" :)
"Хусаинов Булат" написал:Решил проблему следующим образом
1) Открыл мастер раздела
2) Оттуда перешёл к редактированию проблемной страницы
3) Внёс косметическое изменение
4) Сохранил
5) Ошибка ушла

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

Встроенный редактор кода JavaScript поддерживает некоторые полезные сочетания клавиш,
например мультикурсорность через Ctrl+click, стало быть должна быть и функциональность поиска паттерна и установки мультикурсора (так называемая "Select Next Occurrence" в большинстве редакторов и IDE)
Где-то можно посмотреть исчерпывающий перечень поддерживаемых "шоткатов" ?

Нравится

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

Здравствуйте, у нас используется aceEditor, и следовательно его шорткаты можно использовать, ищите больше информации на сайте ace:
https://ace.c9.io/
или:
https://ace.c9.io/demo/keyboard_shortcuts.html

в дополнение темы
Станица документации по сочетаниям клавиш на GitHub

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

Существует ли возможность назначать выполнение бизнес-процессов в ротацию по установленному времени, или через определенные временные интервалы от некоего момента ?

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

Нравится

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

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

Запуск процесса в определенное время (при смене регулярного выражения можно добиться других периодов, например, каждые N минут):
http://www.community.terrasoft.ru/forum/topic/24817

Запуск процесса периодично (аналогично синхронизации почты):
http://www.community.terrasoft.ru/forum/topic/13945

Периодичность задается параметром minutelyInterval.

Используется .Net-овская Quartz (соответственно можно нагуглить Cron-выражения для периодов)
Мы для удобной установки триггеров создали вспомогательную утилиту:
toolz

Изнутри выглядит это всё как-то так:

public string startSyncScheduler(string name, string group, string process, string cronCode, int hours, int minutes)
{
	try {
		UserConnection userConnection = this.UserConnection;
		if (AppScheduler.DoesJobExist(name, group))
		{
		    AppScheduler.RemoveJob(name, group);
		}
 
		IJobDetail job = AppScheduler.CreateProcessJob(name, group, process, userConnection.Workspace.Name, userConnection.CurrentUser.Name);
		ITrigger trigger = TriggerBuilder.Create()
			.WithIdentity(name, group)
			.WithSchedule(CronScheduleBuilder.CronSchedule(string.Format(cronCode, minutes, hours, DateTime.UtcNow.Day, DateTime.UtcNow.DayOfWeek.ToString().Substring(0, 3).ToUpper() ))
				.WithMisfireHandlingInstructionDoNothing()
				.InTimeZone(TimeZoneInfo.Utc))
			.ForJob(job)
			.Build();
 
		AppScheduler.Instance.ScheduleJob(job, trigger);
 
		return "Job Well Done!";
	}
	catch (Exception ex) {
		return ex.Message;
	}
}

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

Для установки параметров запуска бизнес-процессов по расписанию через пользовательский интерфейс, мы выпустили соответствующее дополнение к bpm'online. Надеюсь, будет полезным:)

Подробнее здесь https://marketplace.terrasoft.ru/app/extended-business-process-scheduler

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

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

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

Пример: в разделе Юр. лиц у нас добавлено действие для загрузки Юр. лиц из сервиса СПАРК. По завершению действия необходимо автоматически отфильтровать загруженные записи по определенному критерию (например по текстовому полю).

Нравится

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

Здравствуйте, Сергей.

Самым простым способом фильтрации записей в разделе будет замещение метода initQueryFilters в схеме раздела. Данный метод должен возвращать группу фильтров для esq. Фильтры можно хранить в виртуальном атрибуте.

После загрузки Юр. лиц необходимо вызвать метод reloadGridData, который обновит грид. В момент загрузки данных в грид будет вызван метод initQueryFilters.

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

Добрый день сообществу.
Занимаемся поставками оборудования и есть задача вносить в bpmonline 7.10 данные по оборудованию клиентов - наименование, серийный номер, дата продажи.
В карточке КОНТРАГЕНТ через мастер раздела добавлена новая вкладка «Оборудование» в ней деталь «Оборудование клиента».
Вносим данные из каталога ПРОДУКТЫ а так же указываем серийный номер и дату продажи.
В итоге имеем данные в этой вкладке об имеющемся оборудовании.
Но с этими данными хочется качественно работать а для этого надо создавать фильтры с нужными параметрами. Вот с этим и ступор.
Предположим, хотим оповестить всех клиентов имеющих оборудование Leica о специальных ценах на сервис или на обновление прошивок. Настраиваем фильтр что бы отфильтровать тех клиентов у которых есть оборудование марки Leica и ничего не видим, точнее видим ноль таковых, фильтр не работает.
Кто то может подсказать возможна ли такая фильтрация?

Нравится

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

Денис,

А какой фильтр Вы настраиваете (сделайте скриншот)?

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

Алла, добрый день.
Благодарю за участие в вопросе и быстрый отклик.
Вы как раз в правильном направлении подсказываете, 5 минут назад с настройкой фильтра помог Свистунов Александр из Программных Технологий :twisted:

Кстати, я не знаю как тут вставлять изображения... Инструкций не нашел.

По идее это можно сделать, нажав на кнопку [Вставить изображение] (она в списке кнопок над комментарием), но я обычно прикрепляю файл через [Прикрепленные файлы].

На прикрепленном скриншоте выделила, где что находится, для обоих вариантов :-)

ну варианты мне известны )) только при вложении в текст выскакивает окно где надо вводить ссылку на файл и параметры, что там указывать не пойму. А прикреплять не очень удобно так как надо открывать файл тем кто читает.

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

Как рядом с полем редактирования в карточку редактирования добавить кнопку вызывающая какую-либо логику?

Нравится

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

Похожий вопрос уже рассматривался здесь - http://www.community.terrasoft.ru/forum/topic/13848

Булат, ниже налгдяный пример:

Главное это:

itemType - указать Terrasoft.ViewItemType.BUTTON,
click - указать bindto на метод, который обрабатывается при нажатии
layout - расположение кнопки.

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

Всем привет!

Столкнулся с проблемой переноса переименованных справочников на тестовую среду через SVN. Автоматом ничего не перенеслось, думаю можно перенести через SQL-скрипты в пакете разработки.
Подскажите, как это сделать стандартными средствами или в какие таблицы нужно вносить изменения SQL- скриптом?

С уважением.

Нравится

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

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

Выполните переименования справочников при помощи SQL скрипта. Обновив название в поле [Name] таблицы [Lookup]

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

Здравствуйте. Такая ситуация, поставил локально приложение bpm'online, выгрузил клиентские модули, и выгрузил шарпные файлы, в свою файловую систему. Запустил приложение в Visual Studio, но когда хочешь пробовать что-то писать оказывается библиотек Terrasoft нету, вижуалка их просто не видит. И такой вопрос, как подключить данные библиотеки Terrasoft, может их дополнительно нужно выгружать? я их не нашёл среди выгруженных шарпных файлов
Вот пример класса где показывает, что библиотек не видно.

Нравится

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

Здравствуйте, Александр.

Никаких дополнительных действий не требуется.
Рекомендуем вам проверить все настройки по инстукции:
https://academy.terrasoft.ru/documents/technic-sdk/7-10/razrabotka-v-fa…

"Мария Ватулина" написал:

Здравствуйте, Александр.

Никаких дополнительных действий не требуется.

Рекомендуем вам проверить все настройки по инстукции:

https://academy.terrasoft.ru/documents/technic-sdk/7-10/razrabotka-v-fay...


Спасибо, но как мне добраться до папки Pkg, если при запуске проекта Terrasoft.Configuration, там нет ни одной директории. Такие директории как Lib, Autogenerated\Src, Pkg, bin присутствуют физически на диске, но в проекте их нету, и как тогда открывать свои пакеты?

Александр, вам необходимо включить ShowAllFiles.
Для выполнения разработки необходимо в Visual Studio открыть решение Terrasoft.Configuration.sln (см. "Разработка в файловой системе"). Затем в проводнике решения Visual Studio включить отображение всех типов файлов (рис. Разработка в файловой системе, 1), открыть файл UsrGreetingService.cs (рис. Разработка в файловой системе, 2) и добавить нужный исходный код (рис. Разработка в файловой системе, 3).

С данной информацией вы можете ознакомиться по следующей ссылке: https://academy.terrasoft.ru/documents/technic-sdk/7-10/rabota-s-server….

"Мария Ватулина" написал:

Александр, вам необходимо включить ShowAllFiles.

Для выполнения разработки необходимо в Visual Studio открыть решение Terrasoft.Configuration.sln (см. "Разработка в файловой системе"). Затем в проводнике решения Visual Studio включить отображение всех типов файлов (рис. Разработка в файловой системе, 1), открыть файл UsrGreetingService.cs (рис. Разработка в файловой системе, 2) и добавить нужный исходный код (рис. Разработка в файловой системе, 3).

С данной информацией вы можете ознакомиться по следующей ссылке: https://academy.terrasoft.ru/documents/technic-sdk/7-10/rabota-s-servern....

Прикрепленный файлРазмер

razrabotka_v_faylovoy_sisteme.jpg
40.17 кб


Спасибо большое Вам.

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

Добрый день.

Не могу понять как запустить БП из другого БП через элемент "Задание-сценарий". Подскажите, можно ли это сделать?
Так же в запускаемый процесс мне нужно передать параметр.

Нравится

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

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

Запустить БП из ScriptTask можно. Для передачи параметров необходимо использовать словарь. Пример:
DateTime someDate = Get("dateTimeParam");
IDictionary parameters = new Dictionary();
parameters["ContactNum"] = Get("ContactNum");
parameters["starttime"] = someDate.ToString();
IProcessExecutor processExecutor = userConnection.ProcessEngine.ProcessExecutor;
processExecutor.Execute("UsrSomeProcessName ", parameters);

"Зарицкий Олег" написал:Здравствуйте!

Запустить БП из ScriptTask можно. Для передачи параметров необходимо использовать словарь. Пример:
DateTime someDate = Get("dateTimeParam");
IDictionary parameters = new Dictionary();
parameters["ContactNum"] = Get("ContactNum");
parameters["starttime"] = someDate.ToString();
IProcessExecutor processExecutor = userConnection.ProcessEngine.ProcessExecutor;
processExecutor.Execute("UsrSomeProcessName ", parameters);

Спасибо. Попробовала сделать как вы сказали. В элементе "Задание-сценарий" прописала:

UserConnection userConnection=context.UserConnection;
IDictionary<string, string> parameters = new Dictionary<string, string>();
parameters["param1"] = idSale.ToString();
IProcessExecutor processExecutor = userConnection.ProcessEngine.ProcessExecutor;
processExecutor.Execute("UsrProcess23", parameters);

При сохранении и публикации процесса возникает ошибка (скриншот прикрепляю).
Не подскажите что я делаю не так?

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

Зачем придумывать велосипед? Есть элемент "Подпроцесс" - можно использовать его. Альтернативный вариант был описан в теме:
http://www.community.terrasoft.ru/forum/topic/25071

"Демьяник Алексей" написал:Зачем придумывать велосипед? Есть элемент "Подпроцесс" - можно использовать его.

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

Можете из скриптаска дернуть веб сервис, вот статья:
https://academy.terrasoft.ru/documents/technic-sdk/7-4-0/zapusk-process…

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