# Нумераторы (настройка системы ТЕЗИС) **Category:** [Нумераторы](https://community.tezis-doc.ru/c/numeratory/65) **Created:** 2024-07-03 12:23 UTC **Views:** 311 **Replies:** 0 **URL:** https://community.tezis-doc.ru/t/numeratory-nastrojka-sistemy-tezis/306 --- ## Post #1 by @d.slepnev В разделе описаны часто используемые скрипты при создании и настройки нумераторов. ## Нумератор для присвоения номера дополнительного соглашения Пример скрипта для создания нумератора, который присваивает номера дополнительного соглашения по следующему правилу: номер_основания-порядковый_номер. ```groovy import com.haulmont.cuba.core.app.DataService import com.haulmont.cuba.core.global.LoadContext import com.haulmont.thesis.core.entity.Doc import com.haulmont.thesis.core.entity.DocOfficeData DataService dataService= com.haulmont.cuba.core.Locator.lookup(DataService.NAME); String numPrefix = ""; if(binding.variables.containsKey("docOfficeData")) { com.haulmont.thesis.core.entity.OfficeFile officeFile = ((DocOfficeData)binding.getProperty("docOfficeData")).getOfficeFile(); if (officeFile && officeFile.getNomenclature().getIndex() != null && officeFile.getNomenclature().getIndex() != "") { numPrefix = officeFile.getNomenclature().getIndex() + "-" } } LoadContext ctx = new LoadContext(Doc.class); Doc parent = binding.getVariable("entity").getParentCard(); String parentNumber = parent.getNumber(); ctx.setQueryString("""select doc1 from df\$Doc doc1 where doc1.docKind.id=:docKindId and doc1.parentCard.id=:parentCardId and doc1.parentCard is not null and doc1.id<>:exclId"""); ctx.getQuery().setParameter("docKindId",binding.getVariable("entity").getDocKind()) .setParameter("parentCardId",binding.getVariable("entity").getParentCard()) .setParameter("exclId",binding.getVariable("entity").getId()); List docs = dataService.loadList(ctx); String number = null; if (number==null) number=numPrefix+(docs.size()+1).toString().padLeft(5, "0"); return parentNumber+"-"+number; ``` ## Нумератор для договоров Пример скрипта создания нумератора для договоров вида MM/YY/NNNN/codeDepart - docKindCode/docCategoryCode. ```groovy import com.haulmont.cuba.core.app.UniqueNumbersAPI import com.haulmont.cuba.core.global.AppBeans import com.haulmont.cuba.core.global.PersistenceHelper import com.haulmont.cuba.core.global.TimeSource import com.haulmont.thesis.core.entity.Department import com.haulmont.thesis.core.entity.Doc import com.haulmont.thesis.core.entity.DocCategory import java.text.DecimalFormat import java.text.SimpleDateFormat EntityManager em = AppBeans.get(Persistence.class).getEntityManager(); UniqueNumbersAPI uniqueNumbersAPI = AppBeans.get(UniqueNumbersAPI.NAME); Calendar calendar = Calendar.getInstance(); SimpleDateFormat sdf = new SimpleDateFormat("MM/yy") SimpleDateFormat sdfY = new SimpleDateFormat("yyyy") calendar.setTime(AppBeans.get(TimeSource.class).currentTimestamp()); StringBuilder result = new StringBuilder() String year = sdfY.format(AppBeans.get(TimeSource.class).currentTimestamp()); Doc doc = doc; if (doc && !PersistenceHelper.isNew(doc)) doc = em.find(Doc.class, doc.id); //DocCategory docCategory = doc.docCategory; //Department department = doc.getDepartment(); String seqName = 'doc_contarct_numerator' + "_" + year; String date = sdf.format(AppBeans.get(TimeSource.class).currentTimestamp()); result.append(date) .append("/") .append(new DecimalFormat("0000").format(uniqueNumbersAPI.getNextNumber(seqName))) .append("/"); if(doc.department!=null) result.append(doc.department.code ? doc.department.code.substring(0, 1) : ''); result.append(" - "); result.append(doc.docKind?.code ? doc.docKind.code.substring(0, 1) : '') .append(" / ") if(doc.docCategory!=null) result.append(doc.docCategory.code ? doc.docCategory.code.substring(0, 1) : ''); return result.toString(); ``` ## Нумератор по первой букве фамилии Пример скрипта для создания нумератора входящих писем, для которых номер строится следующим образом: берется первая буква фамилии обратившегося (в системе ТЕЗИС для этого подойдет поле "Отправитель") и добавляется порядковый номер внутри списка поступивших документов с такой же первой буквой, т.е. нумерация не сквозная, а только внутри одинаковых букв. Например: поступила жалоба от условного Петрова, ей присваивается номер "П-1", далее поступила жалоба от Павлова - номер "П-2", далее жалоба от Иванова - номер "И-1", далее жалоба от Пронина - номер "П-3", далее жалоба от Сидорова - номер "С-1" и т.д. Для нумератора входящих документов можно использовать скрипт ниже: ```groovy import com.haulmont.cuba.core.EntityManager import com.haulmont.cuba.core.Persistence Calendar calendar = Calendar.getInstance() def un = com.haulmont.cuba.core.Locator.lookup("cuba_UniqueNumbers") String numPrefix = "" String nameCorr="" String seqNum="zpz" if(binding.variables.containsKey("docOfficeData")) { com.haulmont.thesis.core.entity.Correspondent correspondent = docOfficeData.getSender() if (correspondent && correspondent.getName()){ nameCorr+=correspondent.getName() numPrefix+=nameCorr.substring(0,1)+"-" seqNum+=nameCorr.substring(0,1)+"_"+Calendar.getInstance().get(Calendar.YEAR) } } return numPrefix +String.valueOf( un.getNextNumber(seqNum)) ``` Если нумерация для исходящих должна быть сквозной внутри одной буквы, как и для входящих, то можно использовать скрипт ниже: ```groovy Calendar calendar = Calendar.getInstance() def un = com.haulmont.cuba.core.Locator.lookup("cuba_UniqueNumbers") String numPrefix = "" String nameCorr="" String seqNum="zpz_outcome_" if(binding.variables.containsKey("docOfficeData")) { com.haulmont.thesis.core.entity.Correspondent correspondent = docOfficeData.getResponseToDoc().getDocOfficeData().getSender() if (correspondent && correspondent.getName()){ nameCorr+=correspondent.getName() numPrefix+=nameCorr.substring(0,1)+"-" seqNum+=nameCorr.substring(0,1)+"_"+Calendar.getInstance().get(Calendar.YEAR) } } ``` ## Нумератор по категории ```groovy import com.haulmont.cuba.core.EntityManager import com.haulmont.cuba.core.Persistence import com.haulmont.cuba.core.app.UniqueNumbersAPI import com.haulmont.cuba.core.global.AppBeans import com.haulmont.cuba.core.global.PersistenceHelper import com.haulmont.cuba.core.global.TimeSource import com.haulmont.thesis.core.entity.Doc import com.haulmont.thesis.core.entity.DocCategory import java.text.DecimalFormat EntityManager em = AppBeans.get(Persistence.class).getEntityManager(); UniqueNumbersAPI uniqueNumbersAPI = AppBeans.get(UniqueNumbersAPI.NAME); Calendar calendar = Calendar.getInstance(); calendar.setTime(AppBeans.get(TimeSource.class).currentTimestamp()); String result = '' Doc doc = doc; if(doc && !PersistenceHelper.isNew(doc)) doc = em.find(Doc.class, doc.id); DocCategory docCategory = doc.docCategory; if (docCategory) { String seqName = 'doc_category_numerator' + doc.docCategory.id.toString().replaceAll('-', '_'); result += (doc.docCategory.code ?: '') + new DecimalFormat("0000").format(uniqueNumbersAPI.getNextNumber(seqName)); } return result; ``` ## Нумератор для регистрации по индексу Пример скрипта для присвоения номера при регистрации по следующим правилам: Если индекс дела не равен «181-06» или «181-07» или «181-08», то регистрационный номер = «Индекс дела» + «-» + «Порядковый номер в пределах года для данного дела» + «-» + «Год»; Если индекс дела равен «181-07», то регистрационный номер = «Порядковый номер в пределах года для данного дела» + «/к»; Если индекс дела равен «181-06» или «181-08», то регистрационный номер = «Порядковый номер в пределах года для данного дела». ```groovy import com.haulmont.cuba.core.app.UniqueNumbersService import com.haulmont.cuba.core.global.AppBeans import com.haulmont.thesis.core.entity.OfficeFile import org.apache.commons.lang.StringUtils Calendar calendar = Calendar.getInstance() UniqueNumbersService un = AppBeans.get(UniqueNumbersService.NAME) String index = "" String domain = "mk_" if (binding.variables.containsKey("docOfficeData")) { OfficeFile officeFile = docOfficeData.getOfficeFile() if (officeFile && StringUtils.isNotEmpty(officeFile.getNomenclature().getIndex())) { index = officeFile.getNomenclature().getIndex() domain = domain + index.replaceAll("\\W", "_") + String.valueOf(calendar.get(Calendar.YEAR)) if ("181-06".equals(index) || "181-08".equals(index)) { return String.valueOf(un.getNextNumber(domain)).padLeft(1, "0") } else if ("181-07".equals(index)) { return String.valueOf(un.getNextNumber(domain)).padLeft(1, "0") + "/к" } } } return index + "-" + String.valueOf(un.getNextNumber(domain)).padLeft(1, "0") + "-" + String.valueOf(calendar.get(Calendar.YEAR)) ``` --- **Canonical:** https://community.tezis-doc.ru/t/numeratory-nastrojka-sistemy-tezis/306 **Original content:** https://community.tezis-doc.ru/t/numeratory-nastrojka-sistemy-tezis/306