В посте описана не плохая идея как предотвратить переход на стадию не выбрав причину, или какие либо условие https://community.terrasoft.ru/questions/pokazat-dialog-dlya-podtverzhdeniya-statusa-otmena-v-dcm-razdela-keys#comment-83766 , но к сожалению не описано как именно это выполнить в "save" не получив рекурсию вечную. К автору поста и ответившему на него так и не удалось достучаться.

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

Нравится

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

CheckConfirmationMessage управляет проверять - или нет

 

if (confirmationMessage && this.get("CheckConfirmationMessage")) {
		this.set("CheckConfirmationMessage", false);
		var scopeArguments = arguments;
		this.showConfirmationDialog(confirmationMessage.message, function(result) {
				if (result === Terrasoft.MessageBoxButtons.YES.returnCode) {
					this.save(scopeArguments);
				} else {
					this.onDiscardChangesClick();
				}
		}, ["Yes", "No"]);
	} else {
    	this.callParent(arguments);
}

 

 

Владимир Соколов,

 

а как быть с такой комбинацией?

attributes: {
	"CheckConfirmationMessage": {
		dataValueType: Terrasoft.DataValueType.BOOLEAN,
		value: true
	}
},
 
methods: {
	eaqRequestReason: function() {
		var esq = Ext.create("Terrasoft.EntitySchemaQuery", {
			rootSchemaName: "KtBadReasonEndRequest"
		});
		esq.addColumn("Id");
		esq.addColumn("Name");
		var requestInServiceFilter = esq.createColumnFilterWithParameter(Terrasoft.ComparisonType.EQUAL,
			"KtRequestInService", this.get("KtRequestInService").value);
		var stageFilter = esq.createColumnFilterWithParameter(Terrasoft.ComparisonType.EQUAL,
			"KtRequestStage", this.get("KtStage").value);
		var recordInactiveFilter = esq.createColumnFilterWithParameter(Terrasoft.ComparisonType.EQUAL, 
				"RecordInactive", false);
		esq.filters.add("requestInServiceFilter", requestInServiceFilter);
		esq.filters.add("stageFilter", stageFilter);
		esq.filters.add("recordInactiveFilter", recordInactiveFilter);
		return esq;
	},
	save: function() {
		var scopeArguments = arguments;
		var esq = this.eaqRequestReason();
		esq.getEntityCollection(function (request) {
			if (request && request.success) {
				var requestLength = request.collection.collection.length;
				if (requestLength > 0 && this.get("CheckConfirmationMessage")) {
					this.set("CheckConfirmationMessage", false);
					this.showConfirmationDialog(resources.localizableStrings.DisqualifyReason, function(result) {
						if (result === Terrasoft.MessageBoxButtons.YES.returnCode) {
							this.save(scopeArguments);
						} else {
							this.onDiscardChangesClick();
						}
					}, ["Yes", "No"]);
				} else {
					this.callParent(scopeArguments);
					this.set("CheckConfirmationMessage", true);
				}
			}
		}, this);
	}
}

 

Тут save вроде как с переданным скоупом передается, но выполниться не может

Александр, что значит, «не может выполниться»? Если в функции отладчик поставить, туда заходит?

Зверев Александр,

Проблема была скорее всего в области видимости, но не стал разбираться дальше. Подумал что так как это условие перехода, можно сказать проверка его обязательности, решил переделать не трогая save а использовать asyncValidate. С его помощью получилось как хотел. Код полный выложу не много позже, так как он совсем пока красивый, а если время будет то наверно сделаю видео с разъяснением почему решил сделать именно так и приложу ссылку, может в комментариях кто предложит как еще оптимизировать

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

Подскажите, как можно задать название модульного окна выбора из справочника (по умолчанию " Выбор: ..." + название таблицы). Хотелось бы указать не название таблицы а что-то более подходящее по обстоятельствах (как это сделано в кейсах)Изображение удалено.

Изображение удалено.

Нравится

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

Есть одна неочевидная фича. Если добавить в раздел справочники запись, указав в поле "Объект" ваш объект, а в "Названии" то что вы хотите видеть в справочных окнах, то после перезахода в систему заголовки всех справочников этого объекта поменяются) 

Есть одна неочевидная фича. Если добавить в раздел справочники запись, указав в поле "Объект" ваш объект, а в "Названии" то что вы хотите видеть в справочных окнах, то после перезахода в систему заголовки всех справочников этого объекта поменяются) 

Дмитрий А.,

а если таблица не справочник, и в справочники ее не добавлять?

Александр, попробуйте сделать как в SupervisorSingleWindowPageV2, там тоже меняют этот заголовок окна выбора:

//LookupPrefixCaption = "Выбор: ";
 
/**
 * @inheritdoc BasePageV2#getLookupPageConfig
 * @overridden
 */
getLookupPageConfig: function(args, columnName) {
	var config = this.callParent(arguments);
	var schemaColumn = this.getColumnByName(columnName);
	if (!schemaColumn) {
		return config;
	}
	var prefixCaption = resources.localizableStrings.LookupPrefixCaption;
	switch (columnName) {
		case "QueueEntitySchema":
		case "BusinessProcessSchema":
			config.captionLookup = prefixCaption + schemaColumn.caption;
			break;
		default:
			break;
	}
	return config;
},

 

Александр Тыра,

Для любого объекта в системе можно создать справочное представление. В вашем примере с продажами - точно можно. Добавление справочника в раздел "справочники" - возможность открыть записи объекта в списочном представлении с возможностью редактирования и на сам раздел/объект никак не повлияет.

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

Коллеги, здравствуйте.

Не до конца понимаю как задать фильтрацию выпадающего списка времени для полей с типом "Дата/Время" в карточке.

Идея в том, чтобы ужать выпадающий список под рабочие часы (9:00-18:00).

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

Спасибо!

Нравится

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

Александр, это поле — компонент ядра, в конфигурации он не дорабатывается. Можно сделать рядом два поля: одно для ввода только даты, без времени, а другое — справочное с выпадающим списком только рабочего времени. И программно сводить их значения в одно поле объекта с полной датой.

Или оставить обычное поле с датой и временем, но в обработчике корректировать неподходящие выбранные значения, как сейчас в карточке задачи убирают секунды в функции clearSeconds.

Была такая же идея по поводу ограничения расписания, добавил и Вашу о поле ввода времени.

Александр, это поле — компонент ядра, в конфигурации он не дорабатывается. Можно сделать рядом два поля: одно для ввода только даты, без времени, а другое — справочное с выпадающим списком только рабочего времени. И программно сводить их значения в одно поле объекта с полной датой.

Или оставить обычное поле с датой и временем, но в обработчике корректировать неподходящие выбранные значения, как сейчас в карточке задачи убирают секунды в функции clearSeconds.

Была такая же идея по поводу ограничения расписания, добавил и Вашу о поле ввода времени.

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

Добрый день, какое свойство отвечает за сохранение с игнорированием обязательных полей на js

я знаю что есть такое на c# entity.save(false)

Мне надо нечто подобное

Нравится

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

Попробуйте 

this.save({isSilent: true});

 

Александр Тыра

не подходит(


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

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

Мне с удаленного сервера  приходит файл, который я хочу сохранить в creatio, каким образом это реализовать и куда сохранять, когда получу его?

Нравится

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

Дмитрий, где именно Вы хотите это выполнять?

Если извне, то есть стандартный FileApiService, примеры работы с ним см. тут. Перед этим нужно ещё выполнить авторизацию.

 

Если же Вы хотите это делать это в серверной логике 7.Х, то нужно делать примерно то, что делается внутри этого сервиса, писать данные в поле Data записи о файле в таблице ...File от нужного раздела. См. пояснение в комментарии тут

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

Добрый день, мне надо. что бы при создании записи в разделе копировались значения и родительской записи, так как полей больше 70

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

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

Нравится

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

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

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

Алексей Следь,

мне надо что бы все 100+ полей копировались одной коллекцией, добавлять вручную такое мне не особо по душе

Dima Avdoshin,

Не понял. Один раз настроить в БП элемент добавить данные и все. Все 100+ полей будут копировать автоматически при создании новой записи. Если сложно настроить элемент добавить данные, то можно все сделать добавление данных скриптом в том же процессе. Можно через InsertSelect

Алексей Следь,

InsertSelect не вызвет событийную модель, что не есть хорошо.

Dima Avdoshin,

Как вариант можно заместить логику нажатия по плюсу на детале.

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

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

В режиме копирования система сама копирует значения всех полей, которые на объекте отмечены признаком "Копировать".

Владислав Литвинчук пишет:

InsertSelect не вызвет событийную модель, что не есть хорошо.

Если проблема только в этом, можно создавать Entity, наполнять её поля и затем вызывать Save. Или, как изначально предложили, средствами стандартных элементов БП для работы с данными.

 

По изначальному вопросу темы:

Вы хотите копировать из одноимённых полей одного объекта в другой?

А то, если просто создать копию записи, то в реестре есть кнопка копирования записи, при нажатии на неё создаётся новая запись с заполненными полями, у которых в объекте включена галка «Копировать данные при копировании записи».

Зверев Александр,

то в реестре есть кнопка копирования записи, при нажатии на неё создаётся новая запись с заполненными полями, у которых в объекте включена галка «Копировать данные при копировании записи».

Да именно это мне нужно, каким образом я могу вызвать ее программно?

Зверев Александр,

можно пример пожалуйста

Сходу нашёлся пример только из интерфейса 5.Х в базовой карточке. От него можно отталкиваться, выкинув лишнее.

row = dataSource.Rows[0].Clone() as Terrasoft.Core.Entities.Entity;
Guid currentUserContactId = Page.UserConnection.CurrentUser.ContactId;
EntityPrimaryColumnValue = Guid.NewGuid();
row.SetColumnValue(primaryColumnName, EntityPrimaryColumnValue);
row.SetColumnValue("CreatedOn", DateTime.Now);
row.SetColumnValue("CreatedById", currentUserContactId);
row.SetColumnValue("ModifiedOn", DateTime.Now);
row.SetColumnValue("ModifiedById", currentUserContactId);
var columnNames = new List<string>();
foreach (var column in row.Schema.Columns) {
	if (column.HasDefValue && 
		((column.IsLookupType || column.IsMultiLookupType) &&
		column.ReferenceSchema.PrimaryDisplayColumn != null) &&
		!columnNames.Contains(column.Name)) {
		columnNames.Add(column.Name);
	}
}
row.LoadLookupDisplayValues(columnNames);
dataSource.Insert(row);

У объекта Entity есть метод .Clone() (или вызываемый им же конструктор Entity(Entity source)). Запускаем его, получаем новый объект в памяти. При необходимости заполняем текущими датой и пользователем стандартные 4 поля, затем те поля, значения которых в Вашей логике нужно поменять относительно образца. Все остальные поля, у которых в дизайнере есть галочка, скопировались автоматически. Id, естественно, будет уже новый.

Цикл из примера не нужен, ведь поля для отображения справочников нас сейчас не интересуют. И в конце запускаем у своего Entity метод .Save(), чтобы эта запись из памяти попала в базу. Кажется, ничего не упустил.

 

Но это всё на уровне C#-скрипта в процессе. Если надо в JS-логике, подобно кнопке копирования, нужно смотреть, как она устроена.

 

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

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

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

Т.е есть к примеру текстовое  с названием Name 

Мне надо что бы если , выполнились определенные условия то его название сменлось бы на Name1

Не создавая при этом новое поле, а делать в пределах одного

Нравится

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

Добрый день! Можно попробовать через атрибут, и в атрибут переопределять caption

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

А поделитесь плиз бизнес-задачей? Зачем вам такая штука?

Нигрескул Алексей,

сделал через свойство caption

Сергей Зеленский,для того что бы менять в зависимости от условия названия поля

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

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

Изображение удалено.

У меня не отображается ничего, я следовал статье в академии, где было все нормально

может быть на стороне почтового клиента нужны какие-то доп настройки?

Нравится

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

Дмитрий, у меня тоже ничего не отображается:

 

Изображение удалено.

Можете прикрепить картинку и описать подробнее, что не работает?

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

как правильно включить переводы названий полей, разделов в пакет? 

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

Как можно правильно включить эти переводы в пакет дабы перенести на продуктивную среду?

Нравится

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

Здравствуйте! По идее переводы должны перенестись вместе с ресурсами объекта. Если же не переносится, то переводы можно привязать к пакету в виде данных.

Переводы хранятся в таблице SysTranslation, привязка данных осуществляется в разделе конфигурация -https://prnt.sc/w18hsw

https://prnt.sc/w18jq7

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

Так же переводы можно выгрузить в Excel и потом залить на нужной среде в вышеуказанную таблицу.

 

 

Здравствуйте! По идее переводы должны перенестись вместе с ресурсами объекта. Если же не переносится, то переводы можно привязать к пакету в виде данных.

Переводы хранятся в таблице SysTranslation, привязка данных осуществляется в разделе конфигурация -https://prnt.sc/w18hsw

https://prnt.sc/w18jq7

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

Так же переводы можно выгрузить в Excel и потом залить на нужной среде в вышеуказанную таблицу.

 

 

Насколько я понимаю, если переводы были сделаны не во время разработки, а в разделе "Переводы", то в ресурсы объекта они не попадут?

Владимир Соколов,

Переводы которые были добавлены в разделе "переводы" попадут в ресурсы пакета. В ресурсы самого объекта они не попадут.

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

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

Нравится

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

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

В методе prepareCurrencyMenu мы биндим к своей функции "Click: {"bindTo": "on" + column + "CurrencyMenuItemClick"}". У меня мультивалютные колонки называются "NavDamageSize" и "NavSumCurrency", название методов "onNavDamageSizeCurrencyMenuItemClick", "onNavSumCurrencyCurrencyMenuItemClick" (изначально были другими). Название атрибутов должно быть "NavDamageCurrencyButtonMenuList" и "NavReqSumCurrencyButtonMenuList". Это особенности моей реализации.

Проще говоря, внимательно следите за названием методов и атрибутов.

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

В методе prepareCurrencyMenu мы биндим к своей функции "Click: {"bindTo": "on" + column + "CurrencyMenuItemClick"}". У меня мультивалютные колонки называются "NavDamageSize" и "NavSumCurrency", название методов "onNavDamageSizeCurrencyMenuItemClick", "onNavSumCurrencyCurrencyMenuItemClick" (изначально были другими). Название атрибутов должно быть "NavDamageCurrencyButtonMenuList" и "NavReqSumCurrencyButtonMenuList". Это особенности моей реализации.

Проще говоря, внимательно следите за названием методов и атрибутов.

Алексей Следь

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

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