<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Business Rules &#8211; NowCarnet</title>
	<atom:link href="https://nowcarnet.com/category/business-rules/feed/" rel="self" type="application/rss+xml" />
	<link>https://nowcarnet.com</link>
	<description>Le Carnet du Consultant ServiceNow</description>
	<lastBuildDate>Sun, 21 Jun 2026 14:52:08 +0000</lastBuildDate>
	<language>fr-FR</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=7.0</generator>

<image>
	<url>https://nowcarnet.com/wp-content/uploads/2026/06/cropped-favicon-32x32.png</url>
	<title>Business Rules &#8211; NowCarnet</title>
	<link>https://nowcarnet.com</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Business Rules ServiceNow : Le Guide Complet du Développeur (2026)</title>
		<link>https://nowcarnet.com/2022/08/29/business-rules-servicenow-le-guide-complet-du-developpeur-2026/</link>
					<comments>https://nowcarnet.com/2022/08/29/business-rules-servicenow-le-guide-complet-du-developpeur-2026/#respond</comments>
		
		<dc:creator><![CDATA[admin.aly]]></dc:creator>
		<pubDate>Mon, 29 Aug 2022 16:26:29 +0000</pubDate>
				<category><![CDATA[Business Rules]]></category>
		<guid isPermaLink="false">https://itcroctheme.com/wp/demos/themes/benqu/emirates-palace-spends-that-a-hefty-sum-for-copy/</guid>

					<description><![CDATA[There are many variations of passages of Lorem Ipsum available but the majority have suffered alteration in that  some injected humour.]]></description>
										<content:encoded><![CDATA[		<div data-elementor-type="wp-post" data-elementor-id="1670" class="elementor elementor-1670" data-elementor-post-type="post">
				<div class="elementor-element elementor-element-207e4732 e-flex e-con-boxed e-con e-parent" data-id="207e4732" data-element_type="container" data-e-type="container">
					<div class="e-con-inner">
				<div class="elementor-element elementor-element-22761176 elementor-widget elementor-widget-text-editor" data-id="22761176" data-element_type="widget" data-e-type="widget" data-widget_type="text-editor.default">
									
<div class="nc-callout nc-callout--intro"><p class="wp-block-paragraph">Tout ce que vous devez savoir sur les Business Rules ServiceNow : types, déclencheurs, ordre d&rsquo;exécution, bonnes pratiques et exemples de code concrets. La référence pour consultants et développeurs.</p>
</div>
								</div>
				<div class="elementor-element elementor-element-2173ae0 elementor-widget elementor-widget-text-editor" data-id="2173ae0" data-element_type="widget" data-e-type="widget" data-widget_type="text-editor.default">
									<p>Les <strong>Business Rules</strong> sont l&rsquo;un des outils les plus puissants — et les plus mal utilisés — de la plateforme ServiceNow. Mal écrites, elles sont à l&rsquo;origine d&rsquo;innombrables incidents de production : boucles infinies, performances dégradées, comportements imprévisibles à la mise à jour. Bien écrites, elles sont la colonne vertébrale d&rsquo;une instance maintenable.</p>
<p>Ce guide condense ce qu&rsquo;un consultant doit absolument savoir en 2025 : <em>quand</em> utiliser une Business Rule, <em>quel type</em> choisir, <em>comment</em> écrire le script, et surtout <em>quelles erreurs</em> évitent un week-end à débugger.</p>
<h2 id="definition">Qu&rsquo;est-ce qu&rsquo;une Business Rule ?</h2>
<p>Une Business Rule est un script côté serveur, déclenché par un événement de base sur une table donnée : insertion, mise à jour, suppression, ou requête. Contrairement à un Client Script (qui s&rsquo;exécute dans le navigateur), une Business Rule a accès complet à l&rsquo;API serveur — donc à <code>GlideRecord</code>, <code>gs.log</code>, aux Script Includes, etc.</p>
<p>L&rsquo;équivalent dans d&rsquo;autres mondes : un trigger SQL, mais avec la puissance d&rsquo;un environnement applicatif complet.</p>
<p> </p>
<div class="nc-callout nc-callout--quote"><span class="nc-callout__title">Citation</span><p>Règle d&rsquo;or : si vous pouvez le faire avec une <strong>Flow</strong>, une <strong>Data Policy</strong> ou une <strong>UI Policy</strong>, faites-le avec ça. Une Business Rule n&rsquo;est justifiée que pour la logique qui doit s&rsquo;exécuter quel que soit le canal d&rsquo;entrée (UI, API, import, intégration).</p>
</div>
<p> </p>
<h2 id="types">Les 4 types : Before, After, Async, Display</h2>
<h3>Before</h3>
<p>Exécutée <strong>avant</strong> la persistance. C&rsquo;est ici qu&rsquo;on modifie <code>current</code> sans coût (pas d&rsquo;<code>update()</code> nécessaire). Idéal pour : valeurs par défaut, normalisation, calculs dérivés, validation bloquante avec <code>current.setAbortAction(true)</code>.</p>
<p> </p>
<div class="nc-callout nc-callout--important"><span class="nc-callout__title">Important</span><p>// Before insert/update on incident<br />// Normaliser la priorité en fonction de l&rsquo;urgence + impact<br />(function executeRule(current, previous /*null when async*/) {<br />if (current.urgency.changes() || current.impact.changes()) {<br />current.priority = computePriority(current.urgency, current.impact);<br />}<br />})(current, previous);</p>
</div>
<p> </p>
<h3>After</h3>
<p>Exécutée <strong>après</strong> la persistance. <code>current</code> a déjà l&rsquo;ID définitif et est en base. Idéal pour : créer des enregistrements liés, déclencher une notification, journaliser, mettre à jour une autre table.</p>
<div class="nc-callout nc-callout--warning"><span class="nc-callout__title">Attention</span><p>Ne modifiez pas <code>current</code> dans une After sans appeler <code>current.update()</code> — sinon vos changements sont perdus.</p>
</div>
<h3>Async</h3>
<p>Comme After, mais découplée : exécutée par le scheduler dans une transaction séparée. C&rsquo;est le bon choix dès que la logique n&rsquo;a pas besoin d&rsquo;être visible immédiatement à l&rsquo;utilisateur (envoi d&#8217;email, sync vers un système externe, calcul lourd).</p>
<h3>Display</h3>
<p>Exécutée au chargement du formulaire. Sert principalement à pousser des données dans <code>g_scratchpad</code> à destination des Client Scripts (typiquement, des résultats de Script Include nécessaires côté UI).</p>
<p> </p>
<div class="nc-callout nc-callout--important"><span class="nc-callout__title">Important</span><p>// Display Business Rule<br />(function executeRule(current, previous) {<br />g_scratchpad.userIsManager = gs.getUser().hasRole(&lsquo;itil_admin&rsquo;);<br />g_scratchpad.relatedTickets = new IncidentUtils().countOpenForCaller(current.caller_id);<br />})(current, previous);</p>
</div>
<h2> </h2>
<h2 id="when">When to run : conditions et déclencheurs</h2>
<p>Le champ <em>When</em> détermine quand le script tourne ; le champ <em>Filter Conditions</em> détermine sur quels enregistrements. Quelques règles de bon sens :</p>
<div class="nc-callout nc-callout--important"><span class="nc-callout__title">Important</span><ul>
<li>Préférez les <strong>Filter Conditions</strong> au <code>if</code> en début de script : c&rsquo;est filtré côté DB, donc plus rapide.</li>
<li>N&rsquo;utilisez <strong>Insert + Update</strong> que si la logique est strictement identique. Sinon, séparez en deux Business Rules nommées clairement.</li>
<li>Le combo <strong>Async + Update</strong> sur une table à fort volume (incident, task) est un grand classique du <em>noisy neighbor</em> : si vous le faites, vérifiez le coût avec <code>System Diagnostics → Stats</code>.<br />
</div></li>
</ul>
<h2 id="order">Ordre d&rsquo;exécution et priorités</h2>
<p>L&rsquo;ordre des Business Rules sur une même table suit le champ <code>order</code> (ascendant). Les valeurs par défaut sont 100 et 200 ; conservez 0–999 pour vos rules métier et réservez 1000+ pour les rules transverses (audit, sync). Documentez l&rsquo;ordre dans la description — futur-vous vous remerciera.</p>
<table>
<thead>
<tr>
<th>Étape</th>
<th>Type</th>
<th>Conseil</th>
</tr>
</thead>
<tbody>
<tr>
<td>1</td>
<td>Before</td>
<td>Validation, normalisation, valeurs dérivées</td>
</tr>
<tr>
<td>2</td>
<td>Persistance</td>
<td>(automatique)</td>
</tr>
<tr>
<td>3</td>
<td>After</td>
<td>Effets côté DB nécessaires immédiatement</td>
</tr>
<tr>
<td>4</td>
<td>Async</td>
<td>Effets différés, externes, lourds</td>
</tr>
</tbody>
</table>
<p><code></code></p>
<p><!-- /wp:paragraph --></p>
<h2 id="examples">Exemples concrets commentés</h2>
<h3>Exemple 1 — Empêcher la fermeture d&rsquo;un incident sans description de résolution</h3>
<pre><div class="nc-callout nc-callout--tip"><span class="nc-callout__title">Astuce</span><p>// Type: Before, When: update, Filter: state changes to Resolved<br />(function executeRule(current, previous) {<br />if (gs.nil(current.close_notes)) {<br />gs.addErrorMessage("Vous devez renseigner les notes de résolution avant de fermer.");<br />current.setAbortAction(true);<br />}<br />})(current, previous);</p>
</div></pre>
<h3>Exemple 2 — Auto-assignation au manager de la CI lors de la création</h3>
<pre><div class="nc-callout nc-callout--tip"><span class="nc-callout__title">Astuce</span><p>// Type: Before, When: insert, Filter: cmdb_ci is not empty AND assigned_to is empty<br />(function executeRule(current, previous) {<br />var ci = new GlideRecord('cmdb_ci');<br />if (ci.get(current.cmdb_ci.toString())) {<br />if (!gs.nil(ci.managed_by)) {<br />current.assigned_to = ci.managed_by;<br />current.assignment_group = ci.support_group;<br />}<br />}<br />})(current, previous);</p>
</div></pre>
<h3>Exemple 3 — Async : notifier un système externe via Scripted REST</h3>
<div class="nc-callout nc-callout--tip"><span class="nc-callout__title">Astuce</span><p>// Type: Async, When: after insert OR update<br />// Délègue toute la logique à un Script Include — la BR reste mince.<br />(function executeRule(current, previous) {<br />new x_corp_sync.IncidentMirror().push(current.getUniqueValue());<br />})(current, previous);</p>
</div>
<h2 id="pitfalls">Pièges classiques à éviter</h2>
<ul>
<li><strong>Boucle infinie sur <code>current.update()</code> dans une After.</strong> Si vous appelez <code>update()</code>, la BR se redéclenche. Solution : guardez avec <code>current.changes()</code> ou utilisez Before.</li>
<li><strong><code>setWorkflow(false)</code> oublié.</strong> Quand vous mettez à jour une autre table, désactivez le workflow et les Business Rules cibles si elles ne sont pas pertinentes — sinon vous cascadez sans le vouloir.</li>
<li><strong>Logique métier dans la BR plutôt que dans un Script Include.</strong> Une BR doit appeler ; pas implémenter. C&rsquo;est la seule façon de tester unitairement.</li>
<li><strong>Pas de <code>previous</code> dans Async.</strong> Le param <code>previous</code> est <code>null</code> dans une Async — utilisez <code>current.changes()</code> avec prudence (elle compare à la valeur en DB au moment de l&rsquo;exécution, pas au moment du déclenchement).</li>
<li><strong>Trop de BR sur une même table.</strong> Au-delà de ~30 BR actives sur une table chaude (incident, task), regroupez ou migrez vers Flow Designer.</li>
</ul>
<h2 id="best-practices">Bonnes pratiques de production</h2>
<ol>
<li><strong>Nommez clairement.</strong> <code>Incident — auto-assign from CI manager</code> bat <code>BR1</code>.</li>
<li><strong>Une responsabilité par BR.</strong> Si la description fait plus de deux phrases, divisez.</li>
<li><strong>Délégez aux Script Includes.</strong> Le script de la BR doit tenir en moins de 20 lignes idéalement.</li>
<li><strong>Tracez avec <code>gs.info()</code>.</strong> Pas <code>gs.log()</code> — on le retrouve mieux dans les System Logs.</li>
<li><strong>Désactivez plutôt que supprimer.</strong> Une BR désactivée garde son historique d&rsquo;audit.</li>
<li><strong>Update Set discipline.</strong> Une BR par Update Set quand c&rsquo;est possible — ça facilite les rollbacks.</li>
</ol>
<h2 id="faq">FAQ rapide</h2>
<h3>Quand utiliser une Flow plutôt qu&rsquo;une Business Rule ?</h3>
<p>Si la logique est <em>linéaire</em>, <em>visualisable</em> et <em>maintenable par un fonctionnel</em>, choisissez Flow Designer. Pour de la logique pure code (calculs, manipulation de données complexes, intégrations), Business Rule reste plus adapté.</p>
<h3>Comment tester une Business Rule ?</h3>
<p>Trois leviers : <code>gs.info()</code> dans le script + System Logs, <code>Background Scripts</code> pour exécuter le code à la main, et surtout : déléguez la logique à un Script Include et testez celui-ci avec ATF.</p>
<h3>Async ou After ?</h3>
<p>Si l&rsquo;utilisateur n&rsquo;a pas besoin du résultat immédiatement (et que ça ne casse pas un workflow visible), Async. Sinon After.</p>								</div>
					</div>
				</div>
				</div>
		]]></content:encoded>
					
					<wfw:commentRss>https://nowcarnet.com/2022/08/29/business-rules-servicenow-le-guide-complet-du-developpeur-2026/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
