понедельник, 26 февраля 2018 г.

Groovy-скрипты для АЦК. Примеры.

Само выражение groovy-скрипта дожно быть условием (при этом указывать "if" необязательно, см.примеры ниже, сам groovy-скрипт всегда возвращает только 2 значения: "true" или "false" (по-умолчанию "false"), соответственно, пункт "Подписать" либо будет показан пользователю, либо - нет):
Примеры:
1) покажет пункт "Подписать" только если пользователь открывает меню действий документа класса 197:
document.documentclass_id.value == 197L;
2) покажет пункт "Подписать" только если пользователь открывает меню действий документа классов, у которых есть поле "CONTRACTOR_ID" (например, 3, 210, 197) и это поле содержит значение "302000014441":
document.contractor_id.value == 302000014441L;
Примечание: после слова "document" можно указывать те реквизиты, что упомянуты в классе, на который ссылается "Имя серверного класса обработчика документа".

Обратная связь:
Можно проверять значения реквизитов объектов, например, скрипт "println document.documentclass_id.value" будет выводить в окно консоли СП номер класса документа, который запустил скрипт.

Можно писать целые блоки:
import java.sql.*;
// Получаем ID органиации, которая указана в поле "Принадлежность к организации" текущего пользователя:
final PreparedStatement pstmt = con.prepareStatement("select u.org_id from usersession s join sysuser u on u.id=s.sysuser_id where s.id=?");
pstmt.setLong(1, con.session.getId());
//Можно применять запрос без параметров (см.конец следующей строки):
//final PreparedStatement pstmt = con.prepareStatement("select u.org_id from usersession s join sysuser u on u.id=s.sysuser_id where s.id=" + con.session.getId());
final ResultSet rs = pstmt.executeQuery();
while (rs.next()) {
println rs.getString("org_id");
}
//Без этой строки в потоке вывода будет появляться предупреждение: "Some statements were not closed":
pstmt.close();

Еще пример:
import java.sql.*;
// Получаем ID организации из поля "Принадлежность к организации" текущего пользователя
Long usrOrgId = 0;
final PreparedStatement pstmt_usr = con.prepareStatement("select u.org_id from usersession s join sysuser u on u.id=s.sysuser_id where s.id=?");
pstmt_usr.setLong(1, con.session.getId());
final ResultSet rs_usr = pstmt_usr.executeQuery();
while (rs_usr.next()) {
usrOrgId = rs_usr.getLong("org_id");
}
pstmt_usr.close();
// Получаем ID бюджетополучателя текущего документа
Long docRecId = 0;
final PreparedStatement pstmt_doc = con.prepareStatement("select recipient_id from conbudget where contract_id=?");
pstmt_doc.setLong(1, document.id.value);
final ResultSet rs_doc = pstmt_doc.executeQuery();
while (rs_doc.next()) {
docRecId = rs_doc.getLong("recipient_id");
}
pstmt_doc.close();
//Сравниваем:
usrOrgId == docRecId;

В логе АЦК:

В логе СП АЦК информация о документе, связанном с ним groovy-скрипте, и результате выполнения этого скрипта выводится, начиная с уровня журнализации "DEBUG", в следующем виде (данные о документе отражаются после слова "document:", содержимое скрипта - после слова "script:", результат выполнения скрипта - после слова "result:", результатом выполнения скрипта могут быть три значения: "false", "null", "true" (примечание: если в правиле указан скрипт, тогда действие "Подписать" появляется у документа только при этом значении)), см. пример:

22.07.22 12:28:26.899,ORB-726433(535),DEBUG,GroovyExecutor,Script completed for:
document: EXPASSIGNMENT: ID=2400000129811;VERSION=3;DOCUMENT_ID=2400005674113;DOCUMENTCLASS_ID=128;DISPSTATUS_ID=0;...
script: return false;
result: false

Комментариев нет:

Архив