Перейти к основному содержанию
`Ctrl`+`K`

# Миграция документов с файлами из внешнего источника

Используется для массового создания документов `Wf_Doc` по данным внешнего источника и прикрепления файлов к созданным версиям документов. Скрипт проверяет наличие файла на диске, создает файл в файловом хранилище, создает документ и версию документа с файлом.

Место применения: `Сервис > Инструменты > Выполнить JEXL-скрипт`

Внимание

Требует адаптации под конкретный внешний источник, тип документа, файловое хранилище и путь к файлам. Перед запуском проверьте SQL-запрос, `idvObjectType`, `idvDir`, `idvExt_Tronix` и путь к каталогу файлов.

Тип: JEXL-скрипт

    var idvDir = null;
    var idvObjectType = 75901L;
    var idvFileStorage = Wf_Lib.idFileStorageWf();
    var idvExt_Tronix = 52L;
    if(idvDir != null) {
    	var nvCount = sql(`
    		select count(*) as "nCount"
    		from tronix.old_norm_doc ond
    		left join wf_doc d on (d.jidext_dz ->> '52') = cast(ond.id as varchar)
    		where d.id is null
    		`).asSingle().nCount;
    	var nvIter = nvCount / 200 + 1;
    	for (i : (1 .. nvCount)){
    		sql(`
    			select
    				cast(ond.id as varchar) as sid
    				,cast(ond.inv as varchar) as "sNumInventory"
    				,to_date(nullif(ond.Srokvved, 'None'), 'YYYY-mm-dd') as "dStartDate"
    				,to_date(nullif(ond.Srokprod, 'None'), 'YYYY-mm-dd') as "dProlongPeriod"
    				,cast(ond.Obozn as varchar) as "sDesignation"
    				,cast(ond.Naimen as varchar) as "sCaption"
    				,cast(ond.Kolex as numeric) as "nQtyCopies"
    				,cast(ond.Tfile as varchar) as "sFilePath"
    			from tronix.old_norm_doc ond
    			left join wf_doc d on (d.jidext_dz ->> '52') = cast(ond.id as varchar)
    			where d.id is null
    			order by ond.id
    			limit 200
    		`).foreach(function(r){
    			@begin{
    				var filePath = "/mnt/attach/upl_normdoc"+r.sFilePath;
    				var file = new ("java.io.File", filePath)
    				if (!file.exists()) {
    				  raise("Файл " + filePath  + " не существует")
    				}
    				var is = new("java.io.FileInputStream", file);
    				var idFile = null;
    				@begin{
    				 idFile = Btk_FilePkg.createAndFill(file.getName(), idvFileStorage, null, is)
    				}@exception function(e){
    				  is.close();
    				  throw(e);
    				} end;
    				 is.close();
    				var ropDoc = Wf_DocApi.insert();
    				Wf_DocApi.setidParent(ropDoc, idvDir);
    				Wf_DocApi.setidObjectType(ropDoc, idvObjectType);
    				Wf_DocApi.setIdExtForExtSystem(ropDoc, idvExt_Tronix, r.sid);
    				Wf_DocApi.setsNumInventory(ropDoc, r.sNumInventory);
    				Wf_DocApi.setdStartDate(ropDoc, r.dStartDate);
    				Wf_DocApi.setdProlongPeriod(ropDoc, r.dProlongPeriod);
    				Wf_DocApi.setsDesignation(ropDoc, r.sDesignation);
    				Wf_DocApi.setsCaption(ropDoc, r.sCaption);
    				Wf_DocApi.setnQtyCopies(ropDoc, r.nQtyCopies);

    				Wf_DocVerApi.createVerWithFile(ropDoc.idJ(), idFile);
    				Btk_FileApi.setgidSrc(Btk_FileApi.load(idFile), ropDoc.gid());
    			}
    			@exception
    			function(exp){
    				var svErr = "Ошибка загрузки документа " + r.sid + ": " + exp.getCause()
    				println(svErr);
    				tsql("update tronix.old_norm_doc set serr = '"+svErr+ "' where id = " + r.sid).execute()
    			}end;
    		}) ;
    		commit();
    	};
    };