Поиск
Ярлыки
Загрузка библиотек карточек при помощи CardManager
При загрузке карточек CardManager получает версию библиотеки DocsVision.Platform.Data.dll. И эту версию указывает в поле SysVersion при генерации скрипта.
Следовательно, если CardManager запускается не на сервере DocsVision, а на другом, где установлена другая версия DocsVision, то и в базу карточки будут загружены с указанием той версии сервера, на котором запускался CardManager.
Это может привести к тому, что карточки будут не видны в Навигаторе Читать дальше
Отладка скриптов в карточках
1. Активируем возможность отладки скриптов:
REGEDIT4
[HKEY_CURRENT_USER\Software\Microsoft\Windows Script\Settings]
"JITDebug"=dword:00000001
2. В скрипте карточки ставим точку останова с помощью оператора "stop" в нужном месте. На выполнении этой команды выскакивает окно выбора отладчика.
Ну и далее запускаем студию и отлаживаем.
"Брякнулись":
IntelliSense в действии:
Если окно выбора отладчика не появляется, то удостоверьтесь, что в настройках MSVS: Options -> Debugging -> Just-in-Time стоит галочка "Script".
Для отладки скриптов также есть отладчик Microsoft Script Debugger, но он совсем уж простой, даже функционал watches отсутсвует, что сводит его полезность почти на нет. Также есть инструмент Microsoft Script Editor, но его поддержка ограничивается 2003-им офисом, что тоже является проблемой.
Поэтому лучше всё-таки использовать полноценную среду MSVS. Подойдёт даже бесплатная Express-редакция.
Читать дальше
Еще один пример работы с правами
Ссылки установлены на библиотеки DocsVision 3.6
Скачать (VS 2008, vb.net) Читать дальше
Синхронизация данных карточки и формы InfoPath
Итак, что требовалось от скрипта:
- записывать значения заданных полей карточки документа в файл формы;
- записывать значения заданных полей формы InfoPath в карточку;
- производить указанные действия при открытии карточки и ее сохранении.
- получить первый вложенный в карточку документа файл и выгрузить его на файловую систему во временный файл;
- прочитать из файла значения заданных полей формы и записать их в поля (и/или пользовательские свойства) карточки документа;
- записать в файл значения других заданных полей карточки в поля формы;
- сохранить файл в карточке и удалить его с файловой системы.
Для пользовательских свойств карточки отдельно синхронизируется значение и отдельно отображаемое значение.
А вот, собственно, и сам скрипт:
Читать дальше
Function DoEvent(UserSession, CardFrame, CardData, ActivateFlags, ModeID, FolderID)
StoreProps CardData, UserSession
LoadProps CardData, UserSession
DoEvent = 1
End Function
' Синхронизировать свойства из файла в карточку
Sub LoadProps(CardData, UserSession)
Dim File, Path
Set File = FirstFile(CardData, UserSession)
If FIle Is Nothing Then Exit Sub
Path = SaveFileOnFs(File)
ReadPropsFromFile Path, CardData
DeleteFileFromFs Path
End Sub
' Синхронизировать свойства из карточки в файл
Sub StoreProps(CardData, UserSession)
Dim File, Path
Set File = FirstFile(CardData, UserSession)
If FIle Is Nothing Then Exit Sub
Path = SaveFileOnFs(File)
WritePropsToFile UserSession, Path, CardData
File.Upload Path
DeleteFileFromFs Path
End Sub
' Соответствие свойста карточки и полей xml-файла
Class PropMapping
Public PropName
Public ValueXPath
Public DisplayValueXPath
End Class
' Создать соответствие свойста карточки и полей xml-файла
Function Map(PropName, ValueXPath, DisplayValueXPath)
Set Map = New PropMapping
With Map
.PropName = PropName
.ValueXPath = ValueXPath
.DisplayValueXPath = DisplayValueXPath
End With
End Function
' Соответствия свойств карточки и полей xml-файла для передачи из файла в карточку
Dim ReadMappings : ReadMappings = Array( _
Map("Тема", "/my:Protocol/my:Subject", "/my:Protocol/my:Subject"), _
Map("Номер", "/my:Protocol/my:Number", "/my:Protocol/my:Number"), _
Map("Место совещания", "/my:Protocol/my:Place", "/my:Protocol/my:Place"), _
Map("Подписанты", "/my:Protocol/my:AllSigners", "/my:Protocol/my:AllSigners"), _
Map("Участники", "/my:Protocol/my:AllAttendees", "/my:Protocol/my:AllAttendees"), _
Map("Присутствовали от контрагентов", "/my:Protocol/my:AllContragents", "/my:Protocol/my:AllContragents"), _
Map("Дата", "/my:Protocol/my:Date", "/my:Protocol/my:Date"), _
Map("Филиал", "/my:Protocol/my:BranchID", "/my:Protocol/my:BranchName") _
)
' Соответствия свойств карточки и полей xml-файла для передачи из карточки в файл
Dim WriteMappings : WriteMappings = Array( _
Map("Регистратор", "/my:Protocol/my:RegistratorID", "/my:Protocol/my:RegistratorName"), _
Map("Состояние", "/my:Protocol/my:State", "/my:Protocol/my:State"), _
Map("Вид протокола", Null, "/my:Protocol/my:Type"), _
Map("ConfirmationStartProcessTempl", "/my:Protocol/my:ConfirmationStartProcessTempl", Null), _
Map("ConfirmationStartProcessFolder", "/my:Protocol/my:ConfirmationStartProcessFolder", Null), _
Map("ResolutionTemplateID", "/my:Protocol/my:ResolutionTemplateID", Null), _
Map("ResolutionFolderID", "/my:Protocol/my:ResolutionFolderID", Null), _
Map("DeliveryStartProcessTempl", "/my:Protocol/my:DeliveryStartProcessTempl", Null), _
Map("DeliveryStartProcessFolder", "/my:Protocol/my:DeliveryStartProcessFolder", Null), _
Map("@Card", "/my:Protocol/my:CardID", Null), _
Map("@CurrentUser", "/my:Protocol/my:CurrentUserID", Null) _
)
' Прочитать свойства из xml-фала в карточку
Sub ReadPropsFromFile(Path, CardData)
Dim XDoc, Mapping, CardProp
Set XDoc = CreateObject("Msxml2.DOMDocument.3.0")
XDoc.async = False
XDoc.load Path
For Each Mapping In ReadMappings
If Not IsNull(Mapping.ValueXPath) Then
SetPropValue CardData, Mapping.PropName, XDoc.selectSingleNode(Mapping.ValueXPath).Text
If Not IsNull(Mapping.DisplayValueXPath) Then
SetPropDisplayValue CardData, Mapping.PropName, XDoc.selectSingleNode(Mapping.DisplayValueXPath).Text
End If
End If
Next
End Sub
' Записать свойства из карточки в xml-файл
Sub WritePropsToFile(UserSession, Path, CardData)
Dim XDoc, Mapping, CardProp
Set XDoc = CreateObject("Msxml2.DOMDocument.3.0")
XDoc.async = False
XDoc.load Path
For Each Mapping In WriteMappings
If Not IsNull(Mapping.ValueXPath) Then
XDoc.selectSingleNode(Mapping.ValueXPath).Text = GetPropValue(UserSession, CardData, Mapping.PropName)
End If
If Not IsNull(Mapping.DisplayValueXPath) Then
XDoc.selectSingleNode(Mapping.DisplayValueXPath).Text = GetPropDisplayValue(UserSession, CardData, Mapping.PropName)
End If
Next
XDoc.save Path
End Sub
' Получение первого приложенного к карточке файла
Function FirstFile(CardData, UserSession)
Dim FileList, FileRefs, VerFile, VersionID, FileID
Set FileList = UserSession.CardManager.CardData(MainInfo(CardData).Value("FilesID"))
Set FileRefs = Sect(FileList, "FileReferences")
If FileRefs.Rows.Count = 0 Then
Set FirstFile = Nothing
Exit Function
End If
Set VerFile = UserSession.CardManager.CardData(FileRefs.Rows(0).Value("FileID"))
VersionID = Sect(VerFile, "MainInfo").FirstRow.Value("CurrentID")
FileID = Sect(VerFile, "Versions").GetRow(VersionID).Value("FileID")
Set FirstFile = UserSession.FileManager.File(FileID)
End Function
' Сохранение файла на файловой системе во временный файл (возвращает путь к файлу)
Function SaveFileOnFs(File)
Dim Fso, Fld
Set Fso = CreateObject("Scripting.FileSystemObject")
Set Fld = Fso.GetSpecialFolder(2)
SaveFileOnFs = Fso.BuildPath(Fld.Path, Fso.GetTempName)
File.Download SaveFileOnFs
End Function
' Удаление файла с файловой системы
Sub DeleteFileFromFs(Path)
Dim Fso
Set Fso = CreateObject("Scripting.FileSystemObject")
Fso.DeleteFile Path, True
End Sub
' Получение секции карточки по имени
Function Sect(CardData, Alias)
Set Sect = CardData.Sections(CardData.Type.AllSections.GetByAlias(Alias).ID)
End Function
' Нулевая строка секции MainInfo
Function MainInfo(CardData)
Set MainInfo = Sect(CardData, "MainInfo").FirstRow
End Function
' Строка свойства
Function Prop(CardData, Alias)
Set Prop = Nothing
Dim Row: For Each Row In Sect(CardData, "Properties").Rows
If Row.Value("Name") = Alias Then
Set Prop = Row
Exit Function
End If
Next
End Function
' Получение значения свойства
Function GetPropValue(UserSession, CardData, PropName)
Select Case PropName
Case "@Card"
GetPropValue = CardData.ID
Case "@CurrentUser"
GetPropValue = StaffObject(UserSession).GetCurrentUserID
Case Else
Dim PropRow
Set PropRow = Prop(CardData, PropName)
GetPropValue = PropRow.Value("Value")
End Select
End Function
' Получение отображаемого значения свойства
Function GetPropDisplayValue(UserSession, CardData, PropName)
Select Case PropName
Case "@Card"
GetPropDisplayValue = CardData.Description
Case "@CurrentUser"
Dim Staff
Set Staff = StaffObject(UserSession)
GetPropDisplayValue = Staff.GetEmployeeName(Staff.GetCurrentUserID)
Case Else
Dim PropRow
Set PropRow = Prop(CardData, PropName)
GetPropDisplayValue = PropRow.Value("DisplayValue")
End Select
End Function
' Установка значения свойства
Sub SetPropValue(CardData, PropName, Value)
Select Case PropName
Case "Дата"
Value = CDate(Value)
End Select
Dim PropRow
Set PropRow = Prop(CardData, PropName)
PropRow.Value("Value") = Value
End Sub
' Установка отображаемого значения свойства
Sub SetPropDisplayValue(CardData, PropName, DisplayValue)
Select Case PropName
Case "@Card"
CardData.Description = CStr(DisplayValue)
Case Else
Select Case PropName
Case "Дата"
DisplayValue = FormatDateTime(CDate(DisplayValue), 2)
End Select
Dim PropRow
Set PropRow = Prop(CardData, PropName)
PropRow.Value("DisplayValue") = CStr(DisplayValue)
End Select
End Sub
' Получение StaffObject
Function StaffObject(UserSession)
Set StaffObject = CreateObject("TOHelperObjects.StaffObject")
Set StaffObject.UserSession = UserSession
End Function
Получение значения из справочника в XSLT преобразовании
Рассмотрим как получить данные из справочника. Пример, необходимо вывести имя и учетную запись регистратора карточки внутреннего документа. Поскольку строка из справочника сотрудников есть в xml то нужно получить её данные по идентификатору. XPath адрес должед быть таким:
Полный текст шаблона:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<link href="%ServerUrl%/StorageServer/Fetch.aspx?BaseName=%BaseName%&TransformID=B5344DA1-D28F-4024-8798-3FC3992C94B7" rel="stylesheet" type="text/css"></link>
<title><xsl:value-of select="//CardOrd[1]/MainInfo/@Name"/></title>
<xsl:value-of select="//EmployeesRow[@RowID=//CardOrd[1]/MainInfo/@RegisteredBy]/@AccountName">
<xsl:value-of select="//EmployeesRow[@RowID=//CardOrd[1]/MainInfo/@RegisteredBy]/@LastName">
</xsl:value-of>
</xsl:value-of>
</xsl:template></xsl:stylesheet>Читать дальше
Получение идентификатора пользователя, который открыл карточку
Function DoEvent(UserSession, CardFrame, CardData, ActivateFlags, ModeID, FolderID)
'ID Справочника сотрудников и секции "Сотрудники"
Const DIC_STAFF = "6710B92A-E148-4363-8A6F-1AA0EB18936C"
Const SEC_STAFF = "DBC8AE9D-C1D2-4D5E-978B-339D22B32482"
Dim Groups, oRows, FindUserID
'Получаем пользователя, который открыл карточку
Set RefStaff = UserSession.CardManager.DictionaryData(DIC_STAFF)
Set oRows = RefStaff.Sections.Item(SEC_STAFF).FindRows( _
"AccountName STREQ '" & _
UserSession.Properties("AccountName") & "' ")
If oRows.Count = 0 Then
'Не найден
MsgBox ("ОШИБКА! Невозможно найти вашу учетную запись в справочнике")
Exit Function
End If
'Это ID пользователя, открывшего карточку
FindUserID = oRows.Item(0).ID
End Function
Развитие темы. Определение, входит ли пользователь в определенную группу.
Function DoEvent(UserSession, CardFrame, CardData, ActivateFlags, ModeID, FolderID) 'ID Справочника сотрудников и секции "Сотрудники" Const DIC_STAFF = "6710B92A-E148-4363-8A6F-1AA0EB18936C" Const SEC_STAFF = "DBC8AE9D-C1D2-4D5E-978B-339D22B32482" Dim Groups, oRows, FindUserID 'Получаем пользователя, который открыл карточку Set RefStaff = UserSession.CardManager.DictionaryData(DIC_STAFF) 'Поиск по справочнику сотрудников Set oRows = RefStaff.Sections.Item(SEC_STAFF).FindRows( _ "") If oRows.Count = 0 Then 'Не найден MsgBox ("ОШИБКА! Невозможно найти вашу учетную запись в справочнике") Exit Function End If 'Это ID пользователя, открывшего карточку FindUserID = oRows.Item(0).ID 'Поиск в группах Dim StaffObject Set StaffObject = CreateObject("TOHelperObjects.StaffObject") Set StaffObject.UserSession = UserSession Const GROUPID = "ID группы" If StaffObject.IsEmployeeInGroup(FindUserID, GROUPID) = True Then 'Пользователь, открывающий карточку - в группе. End If Set StaffObject = Nothing End Function AccountName STREQ '" & _ UserSession.Properties("AccountName") & "'
Читать дальше
Открытие приложенного документа Word и перенос некоторых полей в документ
Пример взаимодействия с внешним приложением MS Word. Рассматриваемый скрипт карточки открывает приложенный файл *.doc, и производит вставку значений полей секции «Основная информация» в текст документа.
Вставка производится следующим образом: В тексте документа размещены названия полей в виде @Name или @Digest – т.н. теги. Скрипт производит замену этих тегов на значения из полей с таким же названием.
Function DoEvent(UserSession, CardFrame, CardData, ActivateFlags, ModeID, FolderID)
'Открываем файл, присоединенный к карточке
'Создается объект FileList
Dim sFilesID
sFilesID = CardDa-ta.Sections.Item(CardData.Type.Sections.GetByAlias("MainInfo").ID).FirstRow.Value("FilesID") & ""
If sFilesID = vbNullString Then Exit Function
Dim oFileList
Set oFileList = CreateObject("TOFileList.FileList")
Set oFileList.UserSession = UserSession
Dim rows
Set rows = CardDa-ta.Sections.Item(CardData.Type.Sections.GetByAlias("Properties").ID).rows
Set oFileList.PropertyRows = rows
oFileList.ID = sFilesID
'Количество файлов
Dim n: n = oFileList.FileRefs.Count
'Если нет файлов, то выход
If n = 0 Then
Exit Function
End If
'Открытие файла
Dim oFile
Set oFile = oFileList.FileRefs.Item(1)
oFile.OpenFile
'Получаем объект WORD
Dim objWord
Set objWord = GetObject(, "Word.Application")
'Меняем
Dim arrFields, strField, oFlag
arrFields = Array("Name", "Digest") 'Здесь перечислены все теги и поля
Dim rngStory
Dim oMainRow
Set oMainRow = CardData.Sections.Item(CardData.Type.Sections.GetByAlias("MainInfo").ID).FirstRow
Do
oFlag = False
For Each strField In arrFields
objWord.Selection.Start = 0
objWord.Selection.End = 0
objWord.Selection.Find.Forward = True
If objWord.Selection.Find.Execute("@" & strField) = True Then
If IsNull(oMainRow.Value(strField)) Then
objWord.Selection.TypeText (" ")
Else
objWord.Selection.TypeText (oMainRow.Value(strField))
End If
oFlag = True
End If
Next
Loop Until oFlag = False
Set oFileList = Nothing
End Function
Читать дальше
Пример. Получение пользователей, которые подписали файл.
Set m_oAccessManager = UserSession.AccessManager
Set m_oFile = UserSession.FileManager.File(FileID)
' oSignRows - DVObjectManager.InfoRowCollection
Set oSignRows = m_oAccessManager.ListCryptObjects(m_oFile.ID, 0)
For Each oSignRow In oSignRows
' кто подписал?
MsgBox oSignRow.Value("AccountName")
Next oSignRow
Читать дальше
Получение поля FullNumber из скрипта карточки на событии сохранение в DocsVision 4.3
Поэтому если есть необходимость работы с номером у только что созданной карточки, то нужно реализовывать логику в скрипте на событие "Выделение номера"
1. Создается скрипт на событие "Выделение номера"
2. В данном скрипте номер записывается и производятся необходимые действия с ним, например, запись в свойства. Читать дальше
Настройки карточек в Справочнике типов
Добавляем свойство в вид карточки в справочнике, и данное свойство присутствует только у вновь созданных карточек. Старые карточки не имеют этого свойства. А если добавить кнопку - функцию в виде, то данная кнопка появляется как вновых так и в старых карточках. Почему так происходит?
Дело в том, что свойства хранятся в самой карточке. Только при создании карточки по виду их настройки перечитываются из справочника и применяются. Все же остальные настройки, например, права доступа к полям, функции и т.п., получаются из справочника при каждом открытии. Поэтому, если скрыть какую либо вкладку, то она не будет показываться и в ранее созданных карточках.
p.s. А как все таки добавить новое свойство в ранее созданные карточки?
Сделать это можно, например, бизнес-процессом. Читать дальше
Ограничение на размер прикрепляемых к карточке файлов
В текущих версиях через настройки такого ограничения выставить нельзя (требование зафиксировано). Однако, почему бы не попробовать делать проверку в скрипте на какое-либо событие?
Итак, где же хранится размер файла? Структура прикрепления файлов к карточкам документов (внутренний, входящий, исходящий, универсальный) следующая:
Карточка документа -- Список файлов -- Карточка файла -- Карточка файла с версиями -- Файл.
чертой обозначена ссылка.
Карточка "Список файлов" хранит ссылки на карточки файлов, поэтому в ней навряд-ли хранится размер. Поэтому, смотрим на схему карточки файла. Вот удача! В секции "Основная информация" есть поле FileSize. Обытным путем устанавливаем, что это поле хранит размер в килобайтах. Остается только написать скрипт, который будет по ссылкам из списка файлов получать карточки файлов и суммировать размер.
Function DoEvent(UserSession, CardFrame, CardData, ActivateFlags, ModeID, FolderID)
' Check size of all files
MaxSize = 1024 ' max size of files in KB
' Get FileList Card
Set MainRow = CardData.Sections(CardData.Type.Sections.GetByAlias("MainInfo").ID).FirstRow
If Not IsNull(MainRow.Value("FilesID")) Then
FilesID = CStr(MainRow.Value("FilesID")) ' if card has a FileList
Else
Exit Function ' exit
End If
Set FileList = UserSession.CardManager.CardData(FilesID)
' Get FileCard and size
Set FileRefs = FileList.Sections(FileList.Type.Sections.GetByAlias("FileReferences").ID).Rows
SummSize = 0
For Each SingleRow In FileRefs
CardFileID = CStr(SingleRow.Value("CardFileID"))
Set CardFile = UserSession.CardManager.CardData(CardFileID)
Set CardFileMainRow = CardFile.Sections(CardFile.Type.Sections.GetByAlias("MainInfo").ID).FirstRow
SummSize = SummSize + CInt(CardFileMainRow.Value("FileSize"))
Next
If SummSize > MaxSize Then
DoEvent = -1
CardFrame.ShowMessage "Внимание", "Превышен допустимый размер приложенных файлов", , 3
End If
End Function
Данный скрипт нужно разместить на событие "Закрытие" карточки. Если размер файлов превышен, карточка не будет закрываться. Читать дальше
Как назначить права в скрипте карточки
' Rights
iRights = &H1 + &H2 ' read+change!
aEmpl = Array ("DOMAIN\User1","DOMAIN\User2")
' Get secure object
Set oSecureObj = UserSession.AccessManager.GetSecureCard(CardData.ID)
Set oSD = oSecureObj.ADsSecurityDescriptor
Set oDACL = oSD.DiscretionaryAcl
' remove old ace's
Do
bFlag = False
For Each oACE In oDACL
oDACL.RemoveAce (oACE)
bFlag = True
Next
Loop Until bFlag = False
' Add Rights
For n = 0 To iCount
sEmpl = aEmpl(n)
If CStr(sEmpl) <> "" Then
Set oNewAce = CreateObject("AccessControlEntry")
oNewAce.AccessMask = iRights
oNewAce.AceType = 0 ' allowed
oNewAce.AceFlags = 2 'inherit
oNewAce.Trustee = sEmpl
oDACL.AddAce oNewAce
End If
Next
Set oSecureObj.ADsSecurityDescriptor = oSD
Список прав (все значения являются битовой маской и могут суммироваться):
"000F001F"
Полный доступ
"00000001"
Чтение данных объекта
"00000002"
Изменение данных объекта
"00000004"
Создание дочерних объектов
"00000008"
Удаление дочерних объектов
"00000010"
Копирование объекта
"00010000"
Удаление объекта
"00020000"
Чтение разрешений
"00040000"
Изменение разрешений
"00080000"
Смена владельца
"00020001"
Чтение
"0000001E"
Изменение
"00010000"
Удаление
"000C0000"
Владение
При назначении прав в бизнес-процессе или из .net приложений, нужно пользоваться методами .net framework Читать дальше
Использование XSLT преобразований в нумераторах DocsVision 4.1
Xslt шаблон применяется к xml карточки, для которой выделяется номер. Таким образом, в полном номере можно вывести данные из полей карточки.
В шаблоне так же можно использовать ряд тегов:
[Number] - номер
[DepPref], [DepSuff] - префикс, суфикс подразделения
[TypePref], [TypeSuff] - префикс, суфикс вида
[CasePref], [CaseSuff] - префикс, суфикс дела
[CasePrefPar], [CaseSuffPar] - префикс, суфикс дела с учетом родителей
[FolderPref], [FolderSuff] - префикс, суфикс папки
[FolderPrefPar], [FolderSuffPar] - префикс, суфикс папки с учетом родителей
Пример XSLT шаблона:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<xsl:value-of select="//CardInc[1]/MainInfo/@Name"/>-[Number]+[TypePref]
</xsl:template>
</xsl:stylesheet>
Данный шаблон формирует номер по принципу:
имя карточки-номер+префикс вида Читать дальше
Программное выделение полного номера карточки DocsVision
Частой задачей при разработке решения на платформе DocsVision является выделение номера. В данной публикации будет продемонстрировано, как можно выделить полный номер, вместе с префиксами и суффиксами, програмно.
Итак будем делать скрипт для версии DocsVision 4.1. Это будет дополнительная команда Навигатора, которая будет назначена на контекстное меню карточек документов. Т.е. пользовать сможет нажать правой кнопкой мыши на карточку в Навигаторе и назначить полный номер, не открывая карточку.
Скрипт:
Для получения номера используем объект TOHelperObject.NumeratorObject.
Sub DoEvent(UserSession, CardHost, FolderType, FolderID, SelectionIDs)
Dim sDetails, bFlag
bFlag = True
sDetails = "Номера присвоены следующим карточкам: "
' Создаем объект "Нумератор"
Set oNumerator = CreateObject("TOHelperObjects.NumeratorObject")
' Для каждой карточки из коллекции
For Each sID In SelectionIDs
' Получаем карточку
Set oCard = UserSession.CardManager.CardData(sID)
' Получаем основную секцию
Set oMainRow = oCard.Sections(oCard.Type.Sections.GetByAlias("MainInfo").ID).FirstRow
If IsNull(oMainRow.Value("NumberRef")) Then
' Если номера нет
Set oNumerator.CardData = oCard
Set oNumerator.UserSession = UserSession
sNumID = ""
sFullNum = ""
If oNumerator.GetNewNumber(sNumID, sFullNum) Then
oMainRow.Value("FullNumber") = sFullNum
oMainRow.Value("NumberRef") = sNumID
sDetails = sDetails + oMainRow.Value("Name") + ","
Else
CardHost.ShowMessage "Комманда Навигатора", "Не найден нумератор для '" + oMainRow.Value("Name") + "'", , 3
End If
End If
Next
CardHost.ShowMessage "Комманда Навигатора", "Номера выделены успешно", sDetails, 4
Set oNumerator = Nothing
End Sub


