Правила объектов системы

8 11

У каждого объекта системы есть список правил, т.е. требований для исполнения неких условий, реализующих внутреннюю логику системы. Этот список можно получить с помощью свойства IObject.Rules. По умолчанию для объекта системы проверяются все правила списка. В справке описано 3 наиболее востребованных правила, но есть и другие правила, которые могут быть полезны.

Получить список всех правил, например, справочника можно так:

  Ref = CreateReference('<Имя типа справочника>')
  // Создать представление, чтобы получить полный набор правил
  View = Ref.CreateView(Ref.MainViewCode)
  // Получить правила справочника
  RuleList = Ref.Rules
  // Посмотреть ИД и описания всех правил
  foreach Rule in RuleList
    ShowMessage(Rule.ID)
    ShowMessage(Rule.Description)
  endforeach  

Если выполнить представленный выше код, то будут получены 20  правил:

ИД

Описание

SET_OURFIRM_BOUNDS_RULE_ID

 

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

CHECK_REQUIRED_REQUISITES_FULLNESS_RULE_ID

 

Для утверждения записи должны быть заполнены все обязательные реквизиты.

SET_FIRST_RECORD_IN_LIST_FORM_RULE_ID

 

При показе формы-списка курсор должен быть установлен на первую запись набора данных.

SET_DEFAULT_FIRM_CONTEXT_RULE_ID

Если есть только одна Наша Организация, то ее контекст должен быть установлен.

SET_OURFIRM_REQUISITE_RULE_ID

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

CHECK_CODE_REQUISITE_RULE_ID

Значение реквизита "Код" не должно содержать символов ".".

AUTO_NUMERATION_RULE_ID

Значение реквизита "Код" для автонумеруемых компонент должно заполняться значением "АВТОНОМЕР" при добавлении новой записи.

SET_DEPARTMENT_SECTION_BOUNDS_RULE_ID

В набор данных компоненты, имеющей реквизит "УчРазд", должны попадать записи, удовлетворяющие установленному модулю.

SET_FIRM_CONTEXT_FROM_RECORD_RULE_ID

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

CANT_CHANGE_ID_REQUISITE_RULE_ID

Нельзя изменять значение реквизита "ИД".

Идентификатор записи набора данных назначается только один раз при ее создании.

CANT_CHANGE_OURFIRM_REQUISITE_RULE_ID

Нельзя изменять значение реквизита "НашаОрг".

Значение реквизита назначается только один раз при создании записи.

CHECK_FILTRATER_CHANGES_RULE_ID

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

MAKE_RECORD_UNRATIFIED_RULE_ID

Сделать запись неутвержденной.

SET_NEXT_CODE_VALUE_RULE_ID

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

RESTORE_AUTO_NUMERATION_RULE_ID

Значение реквизита "Код" для автонумеруемых компонент должно восстанавливаться в значение "АВТОНОМЕР" при ошибках сохранения новой записи.

19

Дата начала действия записи не может быть больше даты окончания действия записи!

CHECK_CHANGING_REFERENCE_RECORD_USE_RULE_ID

Нельзя изменять запись, так как она уже используется.

CHECK_DELETING_REFERENCE_RECORD_USE_RULE_ID

Нельзя удалять запись, так как она уже используется.

CHECK_REFERENCE_INTERVAL_RULE_ID

Период действия записи (%0:s) должен пересекаться с периодами действия используемых записей справочников.

SET_IDSPS_VALUE_RULE_ID

При установке IDSPS произошла ошибка.

Каждое правило проверяется при наступлении определенных событий. Программно можно отключать сразу все правила (IRuleList.DisableAll) или только определенные (IRule.Enabled  = FALSE).  Отключать некоторые правила опасно, например, отключение правила “Нельзя удалять запись, так как она уже используется.” может привести к нарушению ссылочной целостности. Но для оптимизации или для реализации нестандартной логики правила можно отключать.  

Например:

  • SET_FIRST_RECORD_IN_LIST_FORM_RULE_ID– организация пользовательского выбора из справочника, чтобы курсор был установлен на выбранную ранее запись.
  • CHECK_REQUIRED_REQUISITES_FULLNESS_RULE_ID– в коннекторах, когда при приеме данных и создании записи могут быть заполнены не все обязательные реквизиты.
  • CHECK_CHANGING_REFERENCE_RECORD_USE_RULE_ID– в ТР «Управление персональными данными», когда нужно очистить значения обязательных реквизитов, содержащие персональные данные, при этом эти записи уже могут где-то использоваться.

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

 

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

8
Авторизуйтесь, чтобы оценить материал.
1
Дмитрий Тарасов

Обычно при интеграции DIRECTUM с другими системами приходится отключать проверку заполненности обязательных реквизитов карточек документов и справочников:

  // Заполнение реквизитов карточки документа
...
  // Отключим проверку заполненности обязательных реквизитов
  ExceptionsOff()
  EDoc.Rules.Rules(CHECK_REQUIRED_REQUISITES_FULLNESS_RULE_ID).Enabled = False
  EDoc.Save
  EDoc.Rules.Rules(CHECK_REQUIRED_REQUISITES_FULLNESS_RULE_ID).Enabled = True
  ExceptionsOn()
  // Если при сохранении документа была ошибка
  if ExceptionExists()
    Error = GetLastException()
    WriteDataExchangeLogString(LogFileName; "Обработка данных XML"; ; AttachPath; "Сохранение электронного документа"; Error.Message)
    FreeException()
  else
    // Добавим документ вложением в карточку заявления
...
Дмитрий Тарасов

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

Иван Чурбаков

Запись справочника получится, просто она неутвержденной будет. А вот документ действительно не сохранится.

Дмитрий Тарасов

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

Константин Белов

Сохранится, но будет неутвержденной :)

Сам проверял.

Дмитрий Тарасов

Сейчас сам проверил, действительно сохраняется неутвержденной :)

Видимо какая-то другая ситуация была, сейчас уже не помню.

Дмитрий Тарасов

А как вам такой код для разминки:

  RCCRef = References.РКК.GetComponent
  RCCRef.Open
  RCCRef.Append
  RCCRef.Save
  RCCRef = nil

Попадаются справочники с которыми не все так просто :)))

Кирилл Нагирный
View = Ref.CreateView(Ref.MainViewCode)

Непонятно наличие данной строки в коде, так как и без нее возвращается список правил, а переменная View в дальнейшем нигде не используется. Или тут некий тайный смысл?

Ксения Останина

Без создания представления в списке правил не будет правила:

SET_FIRST_RECORD_IN_LIST_FORM_RULE_ID

 

При показе формы-списка курсор должен быть установлен на первую запись набора данных.

Антон Кубасов

Добрый день. Простите за такой странный вопрос, но мне необходимо отключить правило CHECK_REFERENCE_INTERVAL_RULE_ID для справочника и я хоть убейте не могу понять как это сделать. не могли бы вы мне помочь?

Александра Климова
//отключить проверку пересечения пери ода действия записи (в паре с событием Сохранение После)
Object.Rules.Rules(CHECK_REFERENCE_INTERVAL_RULE_ID).Enabled = False  
//
СпрСобытие("СОХРВОЗМ";;;'';'')

Тоже задалась этим вопросом, вставила отключение правила в событии Сохранение Возможность справочника, а в событии Сохранение После, включила правило обратно:

//включить проверку пересечения периода действия записи (в паре с событием Сохранение Возможность) 
  If Object.Rules.Rules(CHECK_REFERENCE_INTERVAL_RULE_ID).Enabled == False
    Object.Rules.Rules(CHECK_REFERENCE_INTERVAL_RULE_ID).Enabled = True
  endif

 

 

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