Задача

Получить номер из нумератора в бизнес-процессе DocsVision для дальнейшей вставки его в карточку документа.

Решение

Использовать специальный сценарий на языке c#.

Файл

нет

Для версии

4.5

Текст сценария

/*
    Сценарий получения номера из нумератора для факсов
    В нумераторе должна быть хотябы одна зона! Береться первая!
*/


// подключение системных библиотек
using System;
using System.Xml;

// подключение библиотек СУБП
using DocsVision.Workflow.Objects;
using DocsVision.Workflow.Runtime;
using DocsVision.Workflow.Gates;
using DocsVision.Platform.ObjectManager;

namespace DVScriptHost
{
   class DVScript
   {
       // ===========================================================================================
       /*
            Функция получения номера документа и пересоздания зоны нумератора
            один раз в месяц.
       */
       // ===========================================================================================
       public void Execute (DocsVision.Workflow.Runtime.ProcessInfo process, PassState passInfo)
       {
        process.LogMessage( "Формирование номера счета...");

        // ========================================================================================
        //
        //                                   исходные данные
        // 
        //  принцип формирования имени зоны нумератора:  MYYYYmm YYYY - номер года, mm - номер месяца
        // ========================================================================================
        // получение переменной для номера
        ProcessVariable oVarNumber = process.GetVariableByName( "cAccNumber" ); // переменная для полного номера
        ProcessVariable oVarDate   = process.GetVariableByName( "dDateTime" );  // текущее дата/время
        // 
        string cNumeratorName      = "Нумератор входящих счетов";    // полное наименование нумератора
        string cNumeratorPrefix    = "СВ-";     // префикс полного номера документа
        string cFormat             = "0000";    // формат номера нумератора
        // ========================================================================================


        // получение шлюза к DV
        DVGate oGate = (DVGate)process.GetGateByName("DocsVision");    

        // получаем сессию 
        DVGate dvGate = (DVGate)process.Gates[DVGate.GateID];
        UserSession oSession = dvGate.Session;



        int lNumber, i = 0;
        string cID, cNumber, cZoneName;
        DateTime dCurrent = (DateTime)oVarDate.Value;

        // Поиск нумератора
        SearchQuery oQuery = new SearchQueryClass();
        oQuery.AttributiveSearch.CardTypeQueries.AddNew( "{959FF5E2-7E47-4F6F-9CF6-E1E477CD01CF}" )
              .SectionQueries.AddNew( "{7A357C7B-7C36-48C8-8008-294B00F48AB2}" )
              .ConditionGroup.Conditions
              .AddNew( "Name", FieldTypeEnum.FIELD_STRING,
                       ConditionOperationEnum.CONDITION_OPERATION_STREQUALS, cNumeratorName );

        // получить нумератор
        CardDataCollection oNumerators = oSession.CardManager.FindCards( oQuery.GetText( true, null ));
        if ( oNumerators.Count == 0 )
        {
            process.LogMessage( "Ошибка нумератора: Нет нумератора с именем - " + cNumeratorName);
            return;
        }

        // получение карточки нумератора
        INumeratorCard oNumerator = ( INumeratorCard )oSession.CardManager.get_Card( oNumerators[0].ID );
        // формируем имя нумератора по дате
        cZoneName = "M" + dCurrent.ToString( "yyyyMM" );

        // присвоить пустое значение нумератору
        NumeratorZone oZone = null;

        // ищем по всем зонам нужную нам
        for( i = 0; i < oNumerator.Zones.Count; i ++ )
        {
            // если нашли - вываливаемся
            if( oNumerator.Zones[i].Name == cZoneName )
            {
                oZone = oNumerator.Zones[i];
                break;
            }
        }

        // если нумератора нет, то создаем новую зону с нужным именем
        if ( oZone == null ) oZone = oNumerator.Zones.AddNew( cZoneName );

        // Находим свободный номер
        lNumber = oZone.GetNumber( "", true, out cID );

        // Записываем номер в переменную по нашему формату...
        cNumber = cNumeratorPrefix + dCurrent.ToString( "yyMM-" ) + lNumber.ToString( cFormat );
        oVarNumber.Value = cNumber;

        process.LogMessage ("Присвоен номер: " + cNumber );
     }
 } 
}

Использование сценарий

1. Создаем в процессе функцию "Сценарий".

2. Вставляем в нее текст сценария.

3. Определяем в сценарии параметры (ID нумератора, разрядность номера, переменная в которую записать полученный номер и так далее).