Задача |
Получить номер из нумератора в бизнес-процессе 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 нумератора, разрядность номера, переменная в которую записать полученный номер и так далее).