Стандартное переопределение метода setValidationConfig не работает.

Нравится

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

при каком событии хотите проверять? Почему не работает, можно код?
Если писать что кастомное, то можно перед сохранением проверять его заполненность в методе onSaved или save

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

Добрый день. Столкнулся с такой проблемой: на странице раздела настроена асинхронная валидация "из коробки". Проблема в том, что она срабатывает при попытке добавить запись в деталь на другой вкладке. Есть ли способ при открытии определенной вкладки убирать обязательность поля?

Нравится

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

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

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

Добрый день. Я новичок, не могу разобраться с одной вещью.

 

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

Нравится

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

При добавлении записи используется миникарточка?

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

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

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

Работаю с кодом страницы редактирования.

Необходимо в metods: {} реализовать некую логику. Использую onEntityInitialized и setValidationConfig.

onEntityInitialized - чтобы в момент загрузки страницы получить данные из БД (с помощью ESQ).

setValidationConfig - чтобы реализовать валидацию на основе данных полученных в момент инициализации.

Но в дебаге в консоли браузера увидел, что первым отрабатывает setValidationConfig, а вторым onEntityInitialized. Соответственно на момент работы валидации данных там нет, там underfained. И валидация должным образом не работает.

ВОПРОС: как заставить onEntityInitialized работать в первую очередь, уже потом setValidationConfig  для поверки условия?

Нравится

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

Всё запускается в нужном порядке, ничего менять не надо. Заданы эти функции в базовых страницах: setValidationConfig — в BaseSchemaViewModel, а onEntityInitialized — в BasePageV2.

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

Подробнее см. пример в академии: Добавление валидации к полю страницы

Схема страницы с валидацией оттуда:

define("OpportunityPageV2", [], function() {
    return {
        // Название схемы объекта страницы редактирования.
        entitySchemaName: "Opportunity",
        methods: {
            // Метод-валидатор значения колонок [DueDate] и [CreatedOn].
            dueDateValidator: function() {
                // Переменная для хранения сообщения об ошибке валидации.
                var invalidMessage = "";
                // Проверка значений колонок [DueDate] и [CreatedOn].
                if (this.get("DueDate") < this.get("CreatedOn")) {
                    // Если значение колонки [DueDate] меньше значения колонки [CreatedOn], 
                    // в переменную invalidMessage помещается значение локализуемой строки с сообщением
                    // об ошибке валидации.
                    invalidMessage = this.get("Resources.Strings.CreatedOnLessDueDate");
                }
                // Объект, свойство которого содержит сообщение об ошибке валидации.
                // Если валидация прошла успешна, в объекте возвращается пустая строка.
                return {
                    // Сообщение об ошибке валидации.
                    invalidMessage: invalidMessage
                };
            },
            // Переопределение базового метода, инициализирующего пользовательские валидаторы.
            setValidationConfig: function() {
                // Вызывает инициализацию валидаторов родительской модели представления.
                this.callParent(arguments);
                // Для колонки [DueDate] добавляется метод-валидатор dueDateValidator().
                this.addColumnValidator("DueDate", this.dueDateValidator);
                //Для колонки [CreatedOn] добавляется метод-валидатор dueDateValidator().
                this.addColumnValidator("CreatedOn", this.dueDateValidator);
            }
        }
    };
});

 

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

А как сделать, чтобы onEntityInitialized запускалось в первую очередь?

Всё запускается в нужном порядке, ничего менять не надо. Заданы эти функции в базовых страницах: setValidationConfig — в BaseSchemaViewModel, а onEntityInitialized — в BasePageV2.

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

Спасибо!

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

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

Добрый день

 

Поставлена задача контролировать статус активностей по обращению на момент перехода в статус "IsResolved". Сделал на CasePage в methods 2 функции:

asyncValidate: function(callback, scope) {
	this.callParent([function(response) {
		if (!this.validateResponse(response)) {
			return;
		}
		Terrasoft.chain(
			function(next) {
				this.validateActivities(function(response) {
					if (this.validateResponse(response)) {
						next();
					}
				}, this);
			},
			function() {
				callback.call(scope, response);
			}, this);
	}, this]);
},
validateActivities: function(callback, scope) {
	var result = {success: true};
	if (this.get("Status").IsResolved===true) {
		var esq = Ext.create("Terrasoft.EntitySchemaQuery", { rootSchemaName: "Activity" });
		esq.addColumn("Status.Finish", "Isfinished");
		esq.filters.addItem(esq.createColumnFilterWithParameter(Terrasoft.ComparisonType.EQUAL, 
			"Status.Finish", "0"));
		esq.filters.addItem(esq.createColumnFilterWithParameter(Terrasoft.ComparisonType.EQUAL, 
			"Case", this.get("Id")));
		esq.getEntityCollection(function(response) {
			if (response.success && response.collection.getCount() > 0) {
					result.message = this.get("Resources.Strings.CantChangaStatus");
					result.success = false;
			}
			callback.call(scope || this, result);
		}, this);
	}
}

Если обращение существует, то все отлично. Проверка идет, сохранять обращение не дает.

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

Нравится

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

Алексей, не пробовали отладку в этом коде и просмотр уходящих к серверу HTTP-запросов. Зависание может означать или цикл, или рекурсию, когда эта логика будет повторяться снова и снова.

 

А если заменить проверку с ESQ на заглушку, тоже зависает? Может, дело в асинхронности получения ответа от него, а выполнение проверки в asyncValidate ожидало результата сразу?

 

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

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

Всем доброго времени! Есть вопрос на примере простенького процесса:

 

Если пользователь выбирает вариант:

"Отлично" - шаг должен завершится без обязательного заполнения поля "комментарий".

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

 

Как проще реализовать проверку факта заполнения поля в зависимости от нажатой кнопки?

 

Нравится

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

Сделайте поле "Комментарий" обязательным

И при кнопке "Хорошо" уберите проверку обязательности

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

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Сделайте поле "Комментарий" обязательным

И при кнопке "Хорошо" уберите проверку обязательности

t.ponomarov,

спасибо, этот вариант не хотел использовать чтобы не "отлучать" пользователя от информации на главной странице.

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

спасибо, как то не сообразил за эту функцию. 

 

Если в один элемент, то только через преднастроенную страницу.

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

Здравствуйте. Задача была в валидации по полю и системной настройке. Читал статьи по фильтрам в ESQ и по форуму перелистал всё.

Всё работает, кроме одного момента.

 

Валидация:

Если значение выпадающего списка frequency равно "Ежедневно" и в выпадающем списке active поле = "Да" и количество записей в базе больше чем системной настройке(в данном случае 5) - срабатывает валидация на поле и всплывающее уведомление при попытке сохранения, или изменения записи.

 

frequency - выпадающий список периодичностей;

active - выпадающий список активности;

ermsg - сообщение ошибки;

maxCount - системная настройка (ранее "MaxAmountofDailyActivities");

response.collection.getCount() - актуальное кол-во записей;

 

При сохранении записи с полем "Ежедневно" + "Да", если таких записей уже 5  - валидация работает и правильно выдаёт ошибку. 

1.Но если любую другую запись, например с полем "Еженедельно" + "Да" изменить на "Ежедневно" + "Да", то ошибка не показывается и запись сохраняется. В данный момент записей становится уже 6.

2.Но если далее создавать записи с "Ежедневно" + "Да" или изменять другие на "Ежедневно" + "Да", ошибка показывается и всё продолжает работать нормально.

код метода прикрепил ниже + скриншоты 

 

methods: {
	asyncValidate: function(callback, scope) {
		this.callParent([function(response) {
			if (!this.validateResponse(response)) {
				return;
			}
			Terrasoft.chain(
				function(next) {
					this.validateSwimmingPrograms(function(response) {
						if (this.validateResponse(response)) {
							next();
						}
					}, this);
				},
				function(next) {
					callback.call(scope, response);
					next();
				}, this);
		}, this]);
	},
	validateSwimmingPrograms: function(callback, scope) {
		Terrasoft.SysSettings.querySysSettingsItem("MaxAmountofDailyActivities", function(maxCount) {
			var frequency = "";
			var active = "";
			var ermsg = this.get("Resources.Strings.ErrorMessage");
			var result = {success: true};
			if (this.get("UsrFrequency")) {
				frequency = this.get("UsrFrequency").displayValue;
			}
			if (this.get("UsrActive")) {
				active = this.get("UsrActive").displayValue;
			}
			var esq = Ext.create("Terrasoft.EntitySchemaQuery", { rootSchemaName: "UsrSwimmingPrograms" });
			esq.addColumn("UsrFrequency.Name", "UsrFrequencyName");
			esq.addColumn("UsrActive.Name", "UsrActiveName");
			esq.filters.addItem(esq.createColumnFilterWithParameter(Terrasoft.ComparisonType.EQUAL, 
				"UsrFrequency.Name", "Ежедневно"));
			esq.filters.addItem(esq.createColumnFilterWithParameter(Terrasoft.ComparisonType.EQUAL,
				"UsrActive.Name", "Да"));
			esq.getEntityCollection(function(response) {
				if (response.success && frequency === "Еженедельно" || frequency === "Ежемесячно" ||
					frequency === "Ежедневно" && active === "Нет"){
					result.success = true;
				}
				else if (response.success && frequency === "Ежедневно" && active === "Да" && (!this.isAddMode() && 
					response.collection.getCount() > maxCount) || (this.isAddMode() && 
					response.collection.getCount() >= maxCount)) {
						result.message = maxCount + ermsg + active;
						result.success = false;
				}
				callback.call(scope || this, result);
			}, this);
		}, this);
	}
},

Ниже по очереди: 

- Уже созданные 5 записей;

- при создании 6-ой с "Ежедневно" + "Да" выдаёт ошибку(выводит системную настройку(5), и в конце активность;

- При создании другой записи с другиме полями - ошибку не выводит(как и надо);

- При смене в пред. записи поля на "Ежедневно" - сохраняет (должно выводить ошибку);

- При последующих сохранения изменения записей всё работает корректно(где надо выдаёт ошибку, где не надо - не выдёт).

Нравится

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

То есть Ваша функция не вызывается при изменении существующей записи, а только для новых? Проверьте, выполняется ли вообще перед сохранением функция, добавленная в asyncValidate и доходит ли до вызова validateSwimmingPrograms. 

 

Правильные примеры валидации есть в этой теме  и в DocumentPageV2 пакета Document в «коробке»:

asyncValidate: function(callback, scope) {
	this.callParent([function(response) {
		if (!this.validateResponse(response)) {
			return;
		}
		Terrasoft.chain(
			function(next) {
				this.validateAccountOrContactFilling(function(response) {
					if (this.validateResponse(response)) {
						next();
					}
				}, this);
			},
			function(next) {
				this.validateUniqueNumber(function(response) {
					if (this.validateResponse(response)) {
						next();
					}
				}, this);
			},
			function(next) {
				callback.call(scope, response);
				next();
			}, this);
	}, this]);
},

 

Василий, попробуйте в браузере поставить отладчик и пошагово посмотреть, как выполняется эта функция. Заходит ли вообще в неё, правильно считает количество? Может, меняемая запись не учитывается, поскольку проверка идёт по последней ветке с «>=»?

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

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

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

В разделе Активности ничего не делал, не пойму почему ругается на это.

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

Имею в виду, посмотреть, как по строкам выполняется скрипт, по каким ветвям условий выполняется в этом случае.

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

 Отработка скрипта при сохранении 5-ой записи с полями "Ежедневно" и "Да"
-Показывает, что перед добавлением было 4 записи: 

 

 

Далее, при попытке сохранить 6-ю записи с нужными полями, показывает что 5шт уже есть, то-есть пред. запись сохранилась и записалась:

 

 

Окей, работает, пробую изменить другую запись с рандомными полями на нужные.

Результат показывает, кол-во записей до изменения и сохранения записи на нужные поля.

 

 

Пробую еще раз добавить запись с нужными полями:

 

Попробуйте выполнить скрипт в отладке!

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

currentCount - кол-во существующих записей с нужными полями.

Тут показывает, что есть уже 5(при попытке создать 6-ю)

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

Ошибку не выкидывает, а просто сохраняет и уже currentCount = 6

 

Но когда уже есть 6, функция не позволяет дальше создавать с нужными полями или даже изменять произвольную запись на запись с "Ежедневно" / "Да". 

 

То есть Ваша функция не вызывается при изменении существующей записи, а только для новых? Проверьте, выполняется ли вообще перед сохранением функция, добавленная в asyncValidate и доходит ли до вызова validateSwimmingPrograms. 

 

Правильные примеры валидации есть в этой теме  и в DocumentPageV2 пакета Document в «коробке»:

asyncValidate: function(callback, scope) {
	this.callParent([function(response) {
		if (!this.validateResponse(response)) {
			return;
		}
		Terrasoft.chain(
			function(next) {
				this.validateAccountOrContactFilling(function(response) {
					if (this.validateResponse(response)) {
						next();
					}
				}, this);
			},
			function(next) {
				this.validateUniqueNumber(function(response) {
					if (this.validateResponse(response)) {
						next();
					}
				}, this);
			},
			function(next) {
				callback.call(scope, response);
				next();
			}, this);
	}, this]);
},

 

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

Спасибо огромное за наводку, разобрался.

Переделал что-бы функция реагировала на изменения: 

 

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

Добрый день, уважаемые коллеги!

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

2. В записях справочника Подразделений есть признак (булево) можно выбирать это подразделение для указания в Контрагентах или нет - UsrProhibitSelectionAccount

3. Нужно запретить выбор записи Подразделения, если признак UsrProhibitSelectionAccount = true

4. Настраиваю правило валидации, как описано https://academy.terrasoft.ru/documents/technic-sdk/7-16/dobavlenie-vali…

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

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

Добавленные методы в карточку Контрагента

methods: {
			// Метод-валидатор значения колонки [UsrDepartment] // semmrn
            DepartmentValidator: function() {
                // Переменная для хранения сообщения об ошибке валидации.
                var invalidMessage = "";
                // Проверка значения колонки [UsrDepartment]
                var AccountDepartments = this.get("UsrDepartment");
                if (AccountDepartments.UsrProhibitSelectionAccount) {
                    // Если значение колонки [UsrAccountDepartments.UsrProhibitSelectionAccount] 
                    // запрещено к выбору = да, то
                    // в переменную invalidMessage помещается значение локализуемой строки с сообщением
                    // об ошибке валидации.
                    invalidMessage = this.get("Resources.Strings.DepartmentMustBeAllowed");
                }
                // Объект, свойство которого содержит сообщение об ошибке валидации.
                // Если валидация прошла успешна, в объекте возвращается пустая строка.
                return {
                    // Сообщение об ошибке валидации.
                    invalidMessage: invalidMessage
                };
            },
            // Переопределение базового метода, инициализирующего пользовательские валидаторы.
            setValidationConfig: function() {
                // Вызывает инициализацию валидаторов родительской модели представления.
                this.callParent(arguments);
                // Для колонки [UsrDepartment] добавляется метод-валидатор DepartmentValidator().
                this.addColumnValidator("UsrDepartment", this.DepartmentValidator);
                }
		},

 

Нравится

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

Для того, что Вы хотите есть как раз валидация, которую Вы пробовали в первом сообщении. Она должна предотвращать и от ручного ввода. Не смотрели в отладке, функция-валидатор выполняется, что в поле AccountDepartments и как срабатывает условие?

Доброго дня, Марина. Почему Вы не хотите сделать настройку посредством бизнес-правила (фильтрацией)? 

Марина, ещё можно деактивировать при помощи стандартного механизма:

Если одно или несколько значений справочника устарели и больше не используются, то такие значения можно деактивировать (Рис. 2). Деактивированное значение не будет отображаться при выборе значений в справочных полях. При этом пользователи продолжат видеть это значение в тех записях, где оно было указано ранее, и смогут использовать его для фильтрации. По умолчанию возможность деактивировать значения справочника выключена. Разрешить деактивацию записей для нужного справочника можно в разделе [Конфигурация]. Подробнее о настройке читайте в статье “Деактивация записей объектов”.

Рис. 2 — Деактивированное значение справочника [Типы статей базы знаний]

section_lookups_deactivated_record_example.png 

Но так будет запрещён выбор не в конкретной карточке, а везде. 

Уважаемые коллеги, спасибо за Ваши предложения.

Стандартные фильтры и деактивация не подходят, так как в справочнике настроена иерархия, которая не совмещается с данными инструментами.

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

Для того, что Вы хотите есть как раз валидация, которую Вы пробовали в первом сообщении. Она должна предотвращать и от ручного ввода. Не смотрели в отладке, функция-валидатор выполняется, что в поле AccountDepartments и как срабатывает условие?

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

 

благодарю), ситуация, действительно, прояснилась через отладчик

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

Коллеги, есть способ добавить валидацию к полю детали страницы?

Нравится

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

Похожий вопрос и разные подходы к его решению обсуждались тут. Также валидация детали описана в статье SDK в п. 2.

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

Добрый день.

Нужна помощь в реализации одного вопроса.

 

В Обращениях есть справочная колонка, допустим "Квартира". При создании Обращения можно выбрать в колонке "Квартира" значение "Запрещено".

Надо сделать так, что-бы при выборе значения "запрещено" - появлялась валидация или всплывающее окно. Но что-бы окно только предупреждало, что "Квартира - запрещено" и была возможность сохранять даже с данным значением.

 

Подскажите, каким образом можно реализовать этот момент.

Нравится

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

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

Похожее обсуждали тут и тут. Также см. статью.

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