Вопрос

Проверка полей в событийном подпроцессе

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

Решил действовать через встроенные БП на событие "Перед сохранением".

БП получился простым,

но почему то процесс сохранения не прерывается.

Если условие выполняется, то генерится сигнал тот же самый, который был на входе (UsrParametersOfContractsSaving), по умолчанию - останов (TerminateEvent).

Условие элементарное

Entity.GetTypedColumnValue<DateTime>("UsrStartDate") < Entity.GetTypedColumnValue<DateTime>("UsrEndDate").

Отладка как то не проясняет ситуацию. Может кто сталкивался с данной ситуацией?

Нравится

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

Павел, добрый день! Для решения указанной задачи ПРАВИЛЬНЕЕ использовать не встроенные процессы, а клиентский код. Пример можно посмотреть на странице активности (там проверяется, что завершение не может быть меньше начала). Серверный код не стоит использовать, если в результате проверки необходимо запретить клиенту сохранить запись.

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

Юлия, спасибо за ответ. Действительно, я рассматривал вариант отмены на клиенте. С редактируемым реестром более менее работать научился. Но здесь проблема в том, что это справочник. То есть страница редактирования не персональная, а общая. Поэтому и выбрал встроенные БП. Но там, похоже ничего не получится... А задача действительно - запретить изменение полей, а не делать промежуточные вычисления.

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

Сформулирую как я понял задачу:

На странице есть поле. Поле ссылается на справочник. В справочнике есть следующие поля:

  • Название (то, что будет отображаться на странице)
  • Дата начала
  • Дата завершения

На странице есть также поле с типом "Дата" (назовем его "Валидатор"). Необходимо, чтобы выполнялась проверка находится ли значение, указанное в поле "Валидатор" в интервале ["Дата начала", "Дата завершения"].

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

Есть два решения задачи:

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

Задача в следующем. Есть справочник, в котором есть поля Название, Дата начала, Дата окончания. Справочник редактируется в разделе Дизайнер системы - справочники. В этом справочнике необходимо контролировать, чтобы дата окончания не была меньше даты начала. Чтобы при попытке сохранить запись справочника производилась проверка и запись справочника не сохранялась бы при невыполнении условия.

"Для решения указанной задачи ПРАВИЛЬНЕЕ использовать не встроенные процессы, а клиентский код."

- я извиняюсь, а почему это "ПРАВИЛЬНЕЕ"? Потому, что заморачиваться не хочется? А если мне нужно обезопасить данные, чтобы сотрудник не "нахимичил"? Ваша валидация, которая "ПРАВИЛЬНЕЕ", обходится средствами браузера на раз-два. И действительно "ПРАВИЛЬНЕЕ" было бы организовать валидацию на стороне сервера перед сохранением.

Наряду с валидацией в клиентской схеме, можете встроить проверку по событию "Проверка записи" на вкладке "Сохранение" в событийном подпроцессе. Просто при помощи сценария. При невыполнении каких-либо условий пробросьте Exception из сценария.
* Во первых, сообщение ошибки вылезет пользователю на экран в информационном окошке , так что можете сообщить, что не так.
* Во вторых, сохранения точно не произойдёт.
* В третьих, такую проверку пользователь точно не обойдёт.

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