Коллеги, приветствую.



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

 

2 часа (120 минут) буду зашивать в системную настройку (чтобы можно было варьировать админу)

 

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

далее, из записи вычитаю поле "время разрешения" (тип поля - дата/время) и тут главная загвозка.... как мне высчитать, что обращение должно разрешиться через 2 часа (120 минут)?

 

если должно решиться больше 2 часов - пропустить запись

если меньше, то по идее, должно было уже отправиться уведомление.

ко всему прочему, кажется, что могут возникнут потери записей (из разряда, если на момент проверки, "время разрешения" должно быть через 2 часа и 5 минут, то в следующую проверку может быть уже меньше 2 часов) - это смущает.



из идей:

  1. пробовать преобразовать поле с помощью формул .TotalHours/.TotalMinutes в часы/минуты и сравнивать..
  2. попробовать с помощью формул .AddMinutes(), .AddHours() добавить настройке "текущее время и дата" значение системной настройки и сравнить...

в общем, буду рада советом, а сама пошла пока пробовать :) 

Нравится

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

Aleksei Efimenko, 

я прибегла к другому решению:

  • сделала системную настройку, которая хранит значение за сколько нужно уведомление (в минутах)
  • сделала 2 параметра: 

Параметр 1: [#Системная переменная.Текущее значение времени#]. AddMinutes([число из системной настройки])

Параметр 2: параметр 1. AddMinutes(59) - чтобы получился час

 

  • и развела условными потоками:

1. если время разрешение больше моих параметров или меньше - проскакиваю

2. если время разрешение попадает в промежуток параметров - высылаю уведомление

Создаю новое поле - Reminding time. И его сравниваю.

 

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

Александра Дубс, подскажите, решило ли вашу задачу предоставленное решение от Владимира?

Aleksei Efimenko, 

я прибегла к другому решению:

  • сделала системную настройку, которая хранит значение за сколько нужно уведомление (в минутах)
  • сделала 2 параметра: 

Параметр 1: [#Системная переменная.Текущее значение времени#]. AddMinutes([число из системной настройки])

Параметр 2: параметр 1. AddMinutes(59) - чтобы получился час

 

  • и развела условными потоками:

1. если время разрешение больше моих параметров или меньше - проскакиваю

2. если время разрешение попадает в промежуток параметров - высылаю уведомление

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

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

Беру [#Системная переменная.Текущее значение времени#] и мне из нее необходимо:

  • вычитать день и месяц из текущей даты;
  • сравнить день и месяц текущей даты с другими значениями дня и месяца;
  • написать сравнение в Формулу условного потока.

Фактический пример: сегодня 19.07.2021.

19.07 < 15. 11 и 19.07 > 01.01, поэтому идем по условному потоку 1, иначе по условному потоку 2.



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

Нравится

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

Коллеги, решили вопрос такой формулой.

В каждый условный поток поставили формулу в зависимости от требуемого периода.

Например, в одном потоке такая формула для промежутка времени 01.01 - 31.08:

([#Системная переменная.Текущее значение даты#].Day >= 1 && [#Системная переменная.Текущее значение даты#].Month == 1) || ([#Системная переменная.Текущее значение даты#].Month == 2) || ([#Системная переменная.Текущее значение даты#].Month == 3) || ([#Системная переменная.Текущее значение даты#].Month == 4) || ([#Системная переменная.Текущее значение даты#].Month == 5) ||  ([#Системная переменная.Текущее значение даты#].Month == 6) ||  ([#Системная переменная.Текущее значение даты#].Month == 7) || ([#Системная переменная.Текущее значение даты#].Month == 8)



в другом потоке такая формула для промежутка времени16.11 - 31.12:

([#Системная переменная.Текущее значение даты#].Day >= 16 && [#Системная переменная.Текущее значение даты#].Month == 11 ) || ([#Системная переменная.Текущее значение даты#].Month == 12 )

Правильно ли я понял, вы хотите, чтоб ваш поток срабатывал ежегодно в определённый период дат (с 01.01 по 15.11)? Поэтому вы хотите отделить год от даты?

Николай Ходаковский,

да, верно

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

Отделить год, к сожалению, не получится. Но возможно, указанная ниже реализация покроет Ваш кейс:

В параметр процесса записываем текущую дату по формуле:

new DateTime(DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day)

Во второй параметр записываем дату сравнения с текущим годом:

new DateTime(DateTime.Now.Year, [#Дата сравнения 1#].Month,[#Дата сравнения 1#].Day)

Созданные параметры можно сравнивать в формуле или условном потоке в виде:

[#Текущая дата#] < [#Дата сравнения#]

Коллеги, решили вопрос такой формулой.

В каждый условный поток поставили формулу в зависимости от требуемого периода.

Например, в одном потоке такая формула для промежутка времени 01.01 - 31.08:

([#Системная переменная.Текущее значение даты#].Day >= 1 && [#Системная переменная.Текущее значение даты#].Month == 1) || ([#Системная переменная.Текущее значение даты#].Month == 2) || ([#Системная переменная.Текущее значение даты#].Month == 3) || ([#Системная переменная.Текущее значение даты#].Month == 4) || ([#Системная переменная.Текущее значение даты#].Month == 5) ||  ([#Системная переменная.Текущее значение даты#].Month == 6) ||  ([#Системная переменная.Текущее значение даты#].Month == 7) || ([#Системная переменная.Текущее значение даты#].Month == 8)



в другом потоке такая формула для промежутка времени16.11 - 31.12:

([#Системная переменная.Текущее значение даты#].Day >= 16 && [#Системная переменная.Текущее значение даты#].Month == 11 ) || ([#Системная переменная.Текущее значение даты#].Month == 12 )

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

Добрый день коллеги. 

Столкнулись с такой проблемой: есть два поля одно дата, другое дата и время. В БД дата и время сохраняется в  utc (2021-03-15 21:00:00.0000000), а дата без utc(2021-03-16 00:00:00.0000000). Как правильно на уровне БД сравнить эти даты с учётом часового пояса?

 

Нравится

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

Добрый день.

 

Для меня не так давно стало открытием, что в базе данных дата хранится в том же виде, в котором отображается в клиентском приложении, а дата и время по Гринвичу.

 

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

Что значит на уровне бд, вы как запрос пишите?

Полозюков Евгений Петрович,

Если кратко есть представление которое нужно заполнить данными по промежутку времени

Добрый день.

 

Для меня не так давно стало открытием, что в базе данных дата хранится в том же виде, в котором отображается в клиентском приложении, а дата и время по Гринвичу.

 

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

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

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

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

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

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

Спасибо!

Нравится

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

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

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

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

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

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

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

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

Добрый день. Применил валидацию даты согласно статье https://academy.terrasoft.ru/documents/technic-sdk/7-15/dobavlenie-validacii-k-polyu-stranicy

Всё работает хорошо. Но при удалении значения  поля почему, то распознаёт что не проходит валидацию. 

У меня поле желаемая дата не должна быть меньше текущей даты и времени или должно быть пусто. Пустым полем он не даёт сохранить. Скрин вложил. 

https://i.imgur.com/H9hksBj.png

 

Вот код:

// Метод-валидатор значения колонок [UsrCustomDate] и [CreatedOn].

            dueDateValidator: function() {

                // Переменная для хранения сообщения об ошибке валидации.

                var invalidMessage = "";

                // Проверка значений колонок [UsrCustomDate] и [CreatedOn].

                if (this.get("UsrCustomDate") < this.get("UsrDateReal"))  {

                    // Если значение колонки [UsrCustomDate] меньше значения колонки [CreatedOn], 

                    // в переменную invalidMessage помещается значение локализуемой строки с сообщением

                    // об ошибке валидации.

                    invalidMessage = this.get("Resources.Strings.CreatedOnLessDueDate");

                }

        

                // Объект, свойство которого содержит сообщение об ошибке валидации.

                // Если валидация прошла успешна, в объекте возвращается пустая строка.

                return {

                    // Сообщение об ошибке валидации.

                    invalidMessage: invalidMessage

                };

            }

Нравится

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

Если в базе в поле Null, не факт, что в переменной JS тоже так. добавьте вывод в лог, посмотрите что там, а затем можно будет вписать в условие if проверку на такое значение.

Не смотрели, что попадает в переменную при очистке? Может, там как раз минимальная дата, вроде 01.01.01? Или оба сравниваемые поля пустые, их значения одинаковы и строгое сравнение при помощи «<» даёт отрицательный ответ? Попробуйте отладиться или просто выводить в консоль значение полей и результаты проверки.

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

Насколько я понял NULL. А NULL это меньше текущей даты. Можно ли 

        if (this.get("UsrCustomDate") < this.get("UsrDateReal")) как то изменить.? Чтобы принимал тоже NULL.

 

 

Если в базе в поле Null, не факт, что в переменной JS тоже так. добавьте вывод в лог, посмотрите что там, а затем можно будет вписать в условие if проверку на такое значение.

Я по трассировке проверил почему то window.console.log(); ничего не возвращает. 

  if (this.get("UsrCustomDate") < this.get("UsrDateReal"))  {

                      if (this.get("UsrCustomDate") !== null)  {

                    // Если значение колонки [UsrCustomDate] меньше значения колонки [CreatedOn], 

                    // в переменную invalidMessage помещается значение локализуемой строки с сообщением

                    // об ошибке валидации.

                    invalidMessage = this.get("Resources.Strings.CreatedOnLessDueDate");

                }

                }

 

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

В JS текущую дату и время можно узнать при помощи присвоения или сравнения с new Date().

Я проще нашёл решение. Просто к сравнительному полю привязал системную переменную текущая дата https://i.imgur.com/Xf3bcEA.png.&nbsp;

С new Date() нужно было попотеть по моему. 

Мне кажется, от лишнего поля в таблице расходов ресурсов всё же больше, чем от пары строк на JS, даже если нужно привести к нужному формату кодом.

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

На страницу выведено поле с датой и временем, нужно передать в него время из справочника при изменении значения в выпадающем списке. Стандартные js способы new Data(dataCode) не работает

Нравится

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

Добрый день!

А что именно "стандартное" не работает? Какой тип у dataCode? Возможно просто напросто вы не можете создать дату? Так как значение устанавливается просто. Например:

//...
attributes: {
	"SomeDate": {
		"dataValueType": this.Terrasoft.DataValueType.DATE_TIME,
		"type": this.Terrasoft.ViewModelColumnType.VIRTUAL_COLUMN,
		"dependencies": [{
			columns: ["Type"],
			methodName: "setSomeDate"
		}]
	},
	"Type": {
		"lookupListConfig": {
			columns: ["CreatedOn"]
		}
	}
},
//...
methods: {
	setSomeDate: function () {
		var value = (this.get("Type") || {}).CreatedOn || null;
		this.set("SomeDate", value);
	}
}
//...

И Вам, наверное, стоит заглянуть в консоль, там скорее всего ошибка, которая прояснит ситуацию

Добрый день!

А что именно "стандартное" не работает? Какой тип у dataCode? Возможно просто напросто вы не можете создать дату? Так как значение устанавливается просто. Например:

//...
attributes: {
	"SomeDate": {
		"dataValueType": this.Terrasoft.DataValueType.DATE_TIME,
		"type": this.Terrasoft.ViewModelColumnType.VIRTUAL_COLUMN,
		"dependencies": [{
			columns: ["Type"],
			methodName: "setSomeDate"
		}]
	},
	"Type": {
		"lookupListConfig": {
			columns: ["CreatedOn"]
		}
	}
},
//...
methods: {
	setSomeDate: function () {
		var value = (this.get("Type") || {}).CreatedOn || null;
		this.set("SomeDate", value);
	}
}
//...

И Вам, наверное, стоит заглянуть в консоль, там скорее всего ошибка, которая прояснит ситуацию

Лопатин Константин Николаевич,

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

Пробовал this.set("dataColume", new Date(); - не работает, хотя в js даёт текущую дату и время. Так же пробовал из другого поля скопировать дату this.set("date", new Date(this.get("date2").toString()))

И

this.set("date1", this.get("date2"))

Prime Source,

А в каком методе Вы это делаете? По событию? Запрос может быть к базе какой-то выполняете? Контекст верный? Вариант с

this.set("SomeDate", new Date());

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

Лопатин Константин Николаевич,

define("PsPPsPApprovalPuRequests1Page", [], function() {
	return {
		entitySchemaName: "PsPApprovalPuRequests",
		attributes: {
			"PsPDateTimeApproval": {
				dataValueType: Terrasoft.DataValueType.FLOAT,
				dependencies: [
					{
						columns: ["PsPsPMatchResult"],
						methodName: "approvalDate"
					}
				]
			}
		},
		modules: /**SCHEMA_MODULES*/{}/**SCHEMA_MODULES*/,
		details: /**SCHEMA_DETAILS*/{}/**SCHEMA_DETAILS*/,
		businessRules: /**SCHEMA_BUSINESS_RULES*/{
			"PsPsPMatchResult": {
				"b7a163a0-228d-4005-bfd3-3d19229a6328": {
					"uId": "b7a163a0-228d-4005-bfd3-3d19229a6328",
					"enabled": true,
					"removed": false,
					"ruleType": 0,
					"property": 1,
					"logical": 0,
					"conditions": [
						{
							"comparisonType": 3,
							"leftExpression": {
								"type": 3,
								"value": "CurrentUserContact",
								"dataValueType": 10
							},
							"rightExpression": {
								"type": 1,
								"attribute": "PsPApprovalMan"
							}
						},
						{
							"comparisonType": 1,
							"leftExpression": {
								"type": 1,
								"attribute": "PsPsPMatchResult"
							}
						}
					]
				}
			},
			"PsPComent": {
				"e39449ef-895f-4341-8133-2e773a4dec7d": {
					"uId": "e39449ef-895f-4341-8133-2e773a4dec7d",
					"enabled": true,
					"removed": false,
					"ruleType": 0,
					"property": 1,
					"logical": 0,
					"conditions": [
						{
							"comparisonType": 3,
							"leftExpression": {
								"type": 3,
								"value": "CurrentUserContact",
								"dataValueType": 10
							},
							"rightExpression": {
								"type": 1,
								"attribute": "PsPApprovalMan"
							}
						}
					]
				}
			}
		}/**SCHEMA_BUSINESS_RULES*/,
		methods: {
			approvalDate: function() {
				var matchResult = this.get("PsPsPMatchResult");
				if (matchResult) {
					var esq = this.Ext.create("Terrasoft.EntitySchemaQuery", {rootSchemaName: "PsPMatchResult"});
					//esq.addColumn("PsPTimeLimit", "PsPTimeLimit");
					debugger;
					esq.getEntity(matchResult.value, function(result) {
						if (!result.success) {
							// обработка/логирование ошибки, например
							this.showInformationDialog("Ошибка запроса данных");
							return;
						}
						this.set("PsPDateTimeApproval", new Date());
					}, this);
				}
			}
		},
		dataModels: /**SCHEMA_DATA_MODELS*/{}/**SCHEMA_DATA_MODELS*/,
		diff: /**SCHEMA_DIFF*/[
			{
				"operation": "insert",
				"name": "PsPApprovalMan",
				"values": {
					"layout": {
						"colSpan": 12,
						"rowSpan": 1,
						"column": 0,
						"row": 1,
						"layoutName": "Header"
					},
					"bindTo": "PsPApprovalMan"
				},
				"parentName": "Header",
				"propertyName": "items",
				"index": 0
			},
			{
				"operation": "insert",
				"name": "PsPsPMatchResult",
				"values": {
					"layout": {
						"colSpan": 12,
						"rowSpan": 1,
						"column": 0,
						"row": 2,
						"layoutName": "Header"
					},
					"bindTo": "PsPsPMatchResult",
					"labelConfig": {
						"caption": {
							"bindTo": "Resources.Strings.PsPsPMatchResultLabelCaption"
						}
					},
					"enabled": true,
					"contentType": 5
				},
				"parentName": "Header",
				"propertyName": "items",
				"index": 1
			},
			{
				"operation": "insert",
				"name": "PsPComent",
				"values": {
					"layout": {
						"colSpan": 12,
						"rowSpan": 1,
						"column": 0,
						"row": 3,
						"layoutName": "Header"
					},
					"bindTo": "PsPComent"
				},
				"parentName": "Header",
				"propertyName": "items",
				"index": 2
			},
			{
				"operation": "insert",
				"name": "PsPDateTimeApproval27fcf723-04c0-4c5d-86d1-e4ef52f8b467",
				"values": {
					"layout": {
						"colSpan": 12,
						"rowSpan": 1,
						"column": 0,
						"row": 0,
						"layoutName": "Header"
					},
					"bindTo": "PsPDateTimeApproval",
					"enabled": false
				},
				"parentName": "Header",
				"propertyName": "items",
				"index": 3
			}
		]/**SCHEMA_DIFF*/
	};
});

 

Лопатин Константин Николаевич,

attributes: {
	"PsPTimeLimit": {
		dataValueType: Terrasoft.DataValueType.FLOAT,
		dependencies: [
			{
				columns: ["PsPProcurementType"],
				methodName: "calculateTimeLimit"
			}
		]
	}
},
methods: {
	onEntityInitialized: function() {
		this.callParent(arguments);
		this.calculateTimeLimit();
		this.calculateDepartment();
	},
	calculateTimeLimit: function() {
		var recordId = this.get("PsPProcurementType");
		var esq = this.Ext.create("Terrasoft.EntitySchemaQuery", {rootSchemaName: "PsPProcurementType"});
		esq.addColumn("PsPTimeLimit", "PsPTimeLimit");
		if (recordId) {
			esq.getEntity(recordId.Id, function(result) {
				if (!result.success) {
					// обработка/логирование ошибки, например
					this.showInformationDialog("Ошибка запроса данных");
					return;
				}
				var timeLimit = result.entity.get("PsPTimeLimit").toString();
				this.set("PsPTimeLimit", {
					displayValue: new Date(timeLimit)
				});
			}, this);
		}
	}
}

Это из базы уже

Prime Source,

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

this.set("PsPTimeLimit", { displayValue: new Date(timeLimit) });

Вы где подсмотрели?

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

Лопатин Константин Николаевич,

Спасибо, тип изменил и все заработало, нужно больше спать)))

Показать все комментарии
Идея
Обсуждение

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

Например, такИзображение удалено.

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

Здравствуйте, Владимир!

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

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

Коллеги, посоветуйте, пожалуйста, какой формат даты и времени выбрать, чтобы иметь возможность вводить её в общепринятом виде dd.MM.yyyy?

Перепробовали очень многие, но на такой так и не нарвались (версии 7.8 и 7.11)

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

Нравится

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

Здравствуйте, Владимир!

Можете выбрать формат Russian (Russia). 

 

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

Я хочу в процессе создать активность, в которой дата=текущая дата, а время - конкретное. Но стандартные элементы позволяют либо выбирать текущую дату (без времени), либо текущую дату и время. А как объединить текущую дату и конкретное время, которое я могу выбрать?

И как задать в параметрах дату на следующий день (на завтра)?http://prntscr.com/g4x2g2

Нравится

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

Вам требуется это сделать прямо в БП, или же у Вас автогенерируемая страница и ввод пользователем ?

выбрать текущую дату и прилепить к ней время

пишет:

Вам требуется это сделать прямо в БП, или же у Вас автогенерируемая страница и ввод пользователем ?

 Да, мне это нужно в процессе сделать

Дмитрий Степанов пишет:

выбрать текущую дату и прилепить к ней время

 В этом-то и вопрос, как прилепить то?

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

Добрый день! Подскажите, пожалуйста, какие есть функции для того, чтобы рассчитать дату.

Например есть одна дата,
и необходимо рассчитать другую дату 2 = как дата 1 + столько дней/месяцев

Спасибо

Нравится

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

Думаю, ответ тут - про методы DateTime C#
А если на клиенте, то javascript здесь

на клиенте, да.
в скриптах карточек..

Значит что-то вроде

var newDate = CurrentDate.setMonth(CurrentDate.getMonth() + x);

хотя правильнее

var newDate = new Date(CurrentDate.getTime() + days * 24*60*60*1000);

Спасибо

Добрый день!
Хочу в элементе процесса (добавление данных)
рассчитать дату
вот таким образом, например,
[#Системная переменная.Текущее значение даты#].AddMonths(1)

Но при сохранении процесса возникает ошибка

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

Здравствуйте, Дарья!

Вместо [#Системная переменная.Текущее значение даты#] используйте System.DateTime.Now

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