Приветствую!

 

Интересует следующий вопрос: возможно ли реализовать автоматическое заполнение детали/деталей на записи при массовом импорте данных в раздел из Excel без указания в шаблоне полей детали.

 

Условный пример: У меня имеется раздел Контакты, на записи Контакта имеется деталь Навыки (деталь с редактируемым реестром).

В данной детали всегда должно быть n-количество записей с условно такими полями:
НаименованиеНавыка (string), Включен (bool), УровеньВладения (lookup)

Сами записи (заполнены только наименования, остальное пусто):

Навык1

Навык2

Навык 3
 

Данные записи должны быть в детали Навыки на каждом Контакте. При добавление контакта кнопкой Добавить можно предзаполнять исходя из isAddMode или isCopyMode, но если загрузка данных производится через импорт, то каким образом данную деталь на каждую добавленную запись заполнить, так скажем, значениями по-умолчанию?

Нравится

1 комментарий
Лучший ответ

Добрый день, Ирина.

 

Вашу задачу можно решить несколькими вариантами:

1) написать sql-запрос, который вставит нужные данные во все детали для загруженных записей. Такой запрос нужно запустить после импорта;

2) реализовать бизнес-процесс, который вставит нужные данные во все детали для загруженных записей. Процесс также нужно запускать после импорта

2) импортом из Excel. Подготовить файл с данными, в котором каждая строка будет содержать название навыка и поле-ссылку, идентифицирующую родительскую запись. Таким образом, если у Вас 3 навыка и 2 записи в родительской таблице, то в этом файле должно быть 6 строк по 3 навыка на каждую родительскую запись.

Добрый день, Ирина.

 

Вашу задачу можно решить несколькими вариантами:

1) написать sql-запрос, который вставит нужные данные во все детали для загруженных записей. Такой запрос нужно запустить после импорта;

2) реализовать бизнес-процесс, который вставит нужные данные во все детали для загруженных записей. Процесс также нужно запускать после импорта

2) импортом из Excel. Подготовить файл с данными, в котором каждая строка будет содержать название навыка и поле-ссылку, идентифицирующую родительскую запись. Таким образом, если у Вас 3 навыка и 2 записи в родительской таблице, то в этом файле должно быть 6 строк по 3 навыка на каждую родительскую запись.

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

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

Необходимо автоматически ставить в карточке договора определенный признак (булево), если на детали Продукты хотя бы у одной записи количество больше единицы.

Ну и соотвественно обратно снимать, если это условие перестает соблюдаться.

Каким способом лучше это сделать?

Спасибо!!)

 

 

 

Нравится

7 комментариев
Лучший ответ

Бп. А в странице к описанию детали влепить subscriber и делать loadEntity (грубо говоря — аналогично стандартной логике в заказе)

Бп. А в странице к описанию детали влепить subscriber и делать loadEntity (грубо говоря — аналогично стандартной логике в заказе)

Можно и триггером в базе вместо БП. Особенно, если на деталь льют записи извне в обход движка EntitySchemaQuery.

Доброе утро. Дабы не плодить новую тему. Не могли бы вы поделиться примером работы subscriber? Есть задача суммировать значения полей в детали и выводить их на карточке. Заполненение поля через БП проходит корректно, но не в онлайн режиме, поле обновляется только после перезагрузки страницы.

Трефилов Павел Сергеевич,

ContactAnniversary: {
	schemaName: "ContactAnniversaryDetailV2",
	filter: {
		masterColumn: "Id",
		detailColumn: "Contact"
	},
	subscriber: {
		"methodName": "sendSaveCardModuleResponse"
	}
}

Вот, допустим, из базовой страницы контакта. Метод sendSaveCardModuleResponse располагается в BasePageV2. Встаньте туда дебаггером через консоль и попробуйте поудалять/подобавлять записей в деталь "знаменательные события". При каждом изменении чего-нибудь в детали - тут же отрабатывает метод. В идеале в нём же делать this.reloadEntity (чтобы обновились поля карточки, которые были перерасчитаны по бп)

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

Данила, спасибо огромное! Сделали. 

Только тут асинхронность проявилась. Сабскрайбер отрабатывает и обновляет страницу быстрее чем отрабатывает БП. Как послать сигнал из БП чтобы страница обновилась после завершения БП. Ну кроме, как таймаут ставить). Спасибо!!!

Елена К,

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

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

Да, так и сделали. Спасибо вам!!)

 

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

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

Настроен ящик тех.поддержки, при поступлении на него письма, автоматически создается обращение.
Подскажите пожалуйста, столкнулась с такой проблемой: хочется, чтобы некоторые поля в созданном по входящему письму обращении, заполнялись так же автоматически (такие как Категория, Сервис, Группа ответственных и др).
Я так понимаю, данный функционал реализован в IncidentRegistrationFromEmailHelper.
Какие изменения внести, чтоб автозаполнялись нужные поля? Как реализовать данный функционал, может кто-нибудь уже сталкивался с данной задачей?

Нравится

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

Добрый день Елена!!!

функционал по регистрации Инцидента по Входящему письму реализован в классе Terrasoft.Configuration.IncidentRegistrationFromEmailHelper пакета "Case" вызывается метод "RegisterCase" в бизнес-процессе "IncidentRegistrationFromEmailProcess" пакет "SLM". Для решения вашей задачи вам требуется перегрузить метод "CreateNewCaseByEmail" класса Terrasoft.Configuration.IncidentRegistrationFromEmailHelper. Если не знаете как это сделать, то прошу в ответ конкретно описать какие Поля "Обращения" вы желаете заполнить автоматически при получение Входящего письма, я вам помогу перегрузить Класс и Метод класса

"Власов Михаил Викторович" написал:перегрузить метод "CreateNewCaseByEmail"

Разве можно перегрузить данный метод? Он же приватный и не виртуальный

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

"Власов Михаил Викторович" написал:Можно пойти по пути отлавливать событие когда уже обращение Создано

Как выполнить данное действие?

"Власов Михаил Викторович" написал:Апдейтить данное обращение добавляя недостающую информацию

командой SetColumnValue(Название_поля_в_обращении, Значение)???

"Гольфельд Елена Андреевна" написал:Как выполнить данное действие?

Данной действие нужно выполнить с помощью Бизнес-процесса. Где начало бизнес-процесса это "Начальные события" --> "Сигнал". Ниже пример инициализации "Сигнала":

"Гольфельд Елена Андреевна" написал:командой SetColumnValue(Название_поля_в_обращении, Значение)???

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

Спасибо за помощь, сделала через БП заполнение нужных мне полей.

Пожалуйста Елена. Всегда рады вам и всем пользователям сообщества помочь. Хорошего дня!

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

Задаю довольно таки распространенный вопрос, как ни странно, я не нашел подобной темы.
Допустим есть поле статус, при его изменении должно автозаполняться другое поле - дата(возможно текстовое или даже справочник). И сразу усложню задание, изменения должны вступить в силу когда поле статус меняет одно конкретное значение в другое(например из "В работе" в "Выполнено").
BPMonline 7.x
Заранее спасибо.

Нравится

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

Есть кто живой и знающий?

Здравствуйте, данный кейс решается стандартной подпиской на событие. И выполнением интересующей Вас логики по событию.

Подписка на событие в том или ином виде проскакивала на форуме, к примеру:
http://www.community.terrasoft.ua/forum/topic/13908

А по скольку Вы говорите про статусы "В работе", "Выполнено" могу предположить что речь идет про карточку активности, а в ней уже есть, если посмотреть исходный код, в родительских схемах, атрибут:

"Status": {
  "isRequired": true,
  lookupListConfig: {
    columns: ["Finish"]
  },
  dependencies: [
    {
      columns: ["Status"],
      methodName: "onStatusChanged"
    }
  ]
},

В котором задан метод "onStatusChanged" на изменение данной колонки, и метод этот уже написан, достаточно его переопределить, и дописать недостающей логики.

К примеру:

define("ActivityPageV2", ["ActivityPageV2Resources", "GeneralDetails"],
function(resources, GeneralDetails) {
	return {
		entitySchemaName: "Activity",
		details: /**SCHEMA_DETAILS*/{}/**SCHEMA_DETAILS*/,
		diff: /**SCHEMA_DIFF*/[
		]/**SCHEMA_DIFF*/,
		attributes: {
			"StatusValue": {
				dataValueType: this.Terrasoft.DataValueType.TEXT
			}
		},
		methods: {
			onEntityInitialized: function() {
				this.callParent(arguments);
				var statusValue = this.get("Status");
				this.set("StatusValue", statusValue);
			},
			onStatusChanged: function() {
				this.callParent(arguments);
				var oldStatus = this.get("StatusValue");
				var statusValue = this.get("Status");
 
				console.log("был: " + oldStatus.displayValue + ", стал: " + statusValue.displayValue);
				// тут любая логика проверки, и установки
				if (oldStatus.displayValue === "Не начата" && statusValue.displayValue === "В работе") {
					this.set("DetailedResult", "Взята в работу");
				}
 
				this.set("StatusValue", statusValue);
			}
		},
		rules: {},
		userCode: {}
	};
});

"Щиголь Максим" написал:А по скольку Вы говорите про статусы "В работе", "Выполнено" могу предположить что речь идет про карточку активности

Это карточка заказа, нужно поставить дату окончания(текущую дату) в определенное поле когда статус стает определенным значением. Не знаю как это работает но у меня выбивает ошибку, с помощью вывода данных в консоль определил что выбивает на
"Щиголь Максим" написал:this.set("StatusValue", statusValue);

подумал раз это поле то и тип должен быть не DataValueType.TEXT а DataValueType.LOOKUP, но ничего не помогло, этот код: var statusValue = this.get("Status"); срабатывает(вывожу в консоль данные из statusValue)

this.set("StatusValue", statusValue);

В данном месте ошибка может быть только по двум причинам:

1) неправильный контекст выполнения.
2) проблемы с аттрибутом StatusValue.

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

Получилось, поменял местами немного, написал так:
this.set("StatusValue", statusValue.displayValue);
а в остальных местах пользовался просто statusValue и oldStatus

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

Создал раздел через мастер разделов. В объекте раздела установил для справочного поля "Автор" значение по умолчанию - Текущий пользователь. При сохранении получаю ошибку - Конфликт инструкции INSERT с ограничением FOREIGN KEY "FKMUz8mt4GOdEmSGqDq6UKqFRng". Конфликт произошел в базе данных "ClientPortal_7.6.0_SO", таблица "dbo.Contact", column 'Id'.
Выполнение данной инструкции было прервано.
Если очистить поле - эффект тот же.
Если убрать значение по умолчанию - все сохраняется.

Нравится

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

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

Правильно - не Текущий пользователь, а Контакт Текущего Пользователя.

Текущий пользователь ссылается на SysAdminUnit, в то время как колонка Автор - Contact.

Спасибо большое. И как я сразу не догадался...

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

В базовой версии приложения колонка "Полное название должности" заполняется, если заполнить поле "Должность". Т.е. срабатывает бизнес-правило.

Если у Вас стоит задача, например, чтобы поле "Полное название должности" автоматически не проставлялось при заполении поля "Должность" (Рис. 1)


Рис. 1

то для этого необходимо на замещающей странице «ContactPageV2» добавить следующий метод:

jobChanged: function() {
return false;

},

который отключает базовый метод jobChanged (отвечает за изменение данных полей).

Нравится

Поделиться

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

1. Сделайте резервную копию базы данных. Это поможет обезопасить программу от случайных сбоев в процессе доработки, т.к. изменение конфигурации влияет на систему целиком.
2. Закройте все запущенные приложения комплекса Terrasoft и убедитесь, что TSClient.exe и OUTLOOK.exe не запущены в процессах.
3. Откройте утилиту TSAdmin.exe
4. Найдите по поиску компонент scr_ContactEdit и откройте его по Enter;
AdminTree
5. В коде скрипта найдите функцию function wnd_ContactEditOnPrepare и добавьте в нее следующие строки:
var Dataset = dlData.Dataset;
if (!IsEmptyValue(Dataset('Name'))&&IsEmptyValue(Dataset('Dear'))) {
Dataset('Dear') = GetDearFromName(Dataset('Name'));
}

В результате функция примет вид:
Config
6. Затем необходимо сохранить скрипт и запустить TSClient.

В результате система будет заполнять поле [Обращение] автоматически, если оно пустое.

Нравится

Поделиться

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