Docsvision ошибка активизации карточки

Поиск

Программный поиск карточек с включением удаленных в результаты поиска

При использовании UserSession.CardManager.FindCards() из Managed ObjectManager поиск не возвращает удаленные карточки в результатах поиска.
Метод FindCards в принципе не умеет возвращать удаленные карточки, т.к. он возвращает объекты CardData, а для удаленной карточки этот объект получить нельзя.

То же условие касается архивных карточек.

Для поиска таких карточек, лучше использовать не FindCards, а представление.

Пример кода:

ViewSource source = ViewSource.FromSearch(QueryText); source.ShowDeleted = true;
InfoRowCollection rows = m_oUserSession.CardManager.GetViewData(source, Guid.Empty); MessageBox.Show(rows.Count.ToString());
Читать дальше

Поиск блогу

Создание связанных карточек

При создании сложной системы может потребоваться связывать карточки, т.е. сделать так, чтобы одна карточка, порождала другие, а при удалении главной карточки, карточки, связанные с ней удалялись тоже.
Например, создается карточка Проблемы (родительская), а к ней должна быть прикреплена карточка Решения (дочерняя).
Для этого необходимо следующее:
1. Создать в схеме данных карточки новое поле, которое будет представлять собой ссылку на карточку (refcardid) и в типе ссылки указать «Hard».

2. Положить на форму контрол карточки и привязать его к созданному полю (CardLink).

Данный метод можно использовать и с табличным контролом, привязав столбец к настроенному подобным образом полю в табличной секции карточки.

Недавно компания DocsVision запустила свой портал технической поддержки. В настоящий момент в нем есть специальная ветка для статей и вопросов по Конструктору Решений. Найти его можно по этой ссылке.
Несмотря на то, что часть статей взята из этого блога, там есть и статьи, которые не опубликованы здесь.
В дальнейшем часть из них будет перенесена в блог.
Свои вопросы можно по прежнему оставлять в блоге. Отвечать на них буду по возможности оперативно.

Рассылка уведомлений

В версии конструктора 4.5 есть сервис уведомлений.

С его помощью можно настроить рассылку уведомлений в виде ярлыка или почтового сообщения на изменения полей карточки. На данный момент уведомления рассылаются при изменении поля и последующем сохранении карточки. В связи с этим есть проблема, если необходимо отправить уведомление о смене состояния карточки. Для того, чтобы отправить такое уведомление, придется в скрипте карточки, меняющем ее состояние прописать принудительное изменение значения контрола состояния через PropertyController.UpdateProperty, либо (что будет оптимальнее при необходимости отправки нового состояния в уведомлении) записывать новое состояние в скрытый строковый контрол. Например, вот так:

 CardData cStates = Session.CardManager.GetCardData(new Guid("{7984F2CE-9345-4C59-B66B-7125DD9195A1}"));// Получаем справочник ролевой модели. В нем хранятся состояния
 PropertyController.UpdateProperty("СтрокаСостояния",cStates.Sections[new Guid("{521B4477-DD10-4F57-A453-09C70ADB7799}")].Rows[DomainObject.StateId].GetString("DefaultName"));// Получаем название текущего состояния и записываем его в контрол.

Изменение вида карточки

Предположим, что на карточке лежит контрол «Вид».
Опытным путем я установил, что при изменении значения в нем, само изменение вида карточки происходит уже после события ControlValueChanged.

Это означает то, что при написании ControlValueChanged для этого контрола нужно использовать PropertyController.GetPropertyValue(«НазваниеКонтролаВида») вместо DomainObject.KindId, чтобы получить в скрипте новое значение вида.

Скрипт на привязку карточки с табличному контролу.

Всем привет :-)

В одну из составляющих моей разработки решения»Управление совещаниями», входит объединение всех трёх карточек в единую работающую систему. Для этого мне требуется написать несколько скриптов на событие AddButtonClick табличного контрола. Мои познания в ООП находятся на уровне основных понятий, поэтому самостоятельно выполнить поставленную задачу будет крайне трудно, и если уважаемые разработчики помогут мне с преодолением этой проблемы, я буду им очень благодарен за проявленное содействие в достижении личных и организационных успехов.

Итак, задача:

В основной карточке «Совещание» ( Card 1 ) в таблице с вопросами повестки, при нажатии на добавить «+», должна появляться новая карточка «Вопросы повестки» ( Card 2 ). Так же, при каждом нажатии на добавить «+» карточка должна обновляться.

Был использован метод:

{

object newCard = Session.CardManager.CreateCard(new Guid(«{5763AAF2-BF9B-4373-AF1B-6360EF4A2FFA}»));

}

но при загрузке карточки он выдаёт ошибку, что «Данный метод не поддерживается».

Вопрос : Какой скрипт будет выполнять поставленную задачу?

Спасибо)

Как подключать сборки в конструкторе DocsVision

Рано или поздно придется столкнуться с подключением сборок в конструкторе.

Находятся все сборки по пути Windows/assembly/GAC_MSIL

Каталог скрытый, поэтому для доступа к нему через эксплорер необходимо включить отображение скрытых файлов и папок в свойствах папки.

Каждая сборка лежит в отдельной папке, поэтому подключать их придется по одной.

Из-за особенностей Конструтора у вас не получится подключить сборки сразу из assembly, поэтому скопируйте сначала нужные сборки в отдельную папку и уже оттуда подключайте. Но лучше удалить из GAC_MSIL скрытый файл «Desktop.ini». После этого папки со сборками станут видны из конструктора и их не придется никуда копировать. Также одном из плюсов данного способа является тот факт, что при переносе решения на другую машину, вам не придется заново прописывать пути к сборкам.

Для подключения сборки кликните на «+» в нижней таблице «Используемые дополнительные сборки» в окне редактирования скриптов конструктора, выберите нужную сборку и добавьте ее в таблицу.

Получение данных выделенной строки из таблицы

Вывод выделенной строки оказался весьма нетривиальным заданием.

Данный фрагмент кода выведет в MessageBox содержимое выделенной строки в табличном контроле с названием «Журнал заявки».

LayoutHelper layoutHelper = new LayoutHelper(CardControl.LayoutControl, CardControl.BarManager, Session, CardData.Type.Id);
DocsVision.BackOffice.View.WinForms.LayoutItems.ICustomPropertyItem propertyItem = layoutHelper.GetCustomPropertyItem("Журнал заявки");
var refMapper = new CardPropertyDescriptionMapper(Session);
DocsVision.BackOffice.Model.CardProperties.Entities.CardPropertyTable cpt = null;
foreach (DocsVision.BackOffice.Model.Layouts.Entities.CardPropertyTableDescription refPropertyTableDesc in refMapper.FindTableProperties(CardData.Type.Id))
          {
              if (refPropertyTableDesc.Name == "Журнал заявки")
               {
                 var propertyMapper = new CardPropertyMapper(Session, CardData.Id, DomainObject.CustomPropertiesSectionId);
                   cpt = propertyMapper.FindTable(refPropertyTableDesc);
                   break;
               }
          }
System.Reflection.Assembly asm = System.Reflection.Assembly.Load("DocsVision.BackOffice.View, Version=4.5.0.0, Culture=neutral, PublicKeyToken=7148afe997f90519");
Type tableType = asm.GetType("DocsVision.BackOffice.View.WinForms.PropertyControls.TablePropertyControl");
var propInfo = tableType.GetProperty("GridView");
object ooo = propInfo.GetValue(propertyItem.Control, System.Reflection.BindingFlags.NonPublic, null, null, System.Globalization.CultureInfo.InvariantCulture);
DocsVision.BackOffice.View.WinForms.Controls.GridExView gridExView = ooo as DocsVision.BackOffice.View.WinForms.Controls.GridExView;
DevExpress.XtraGrid.Views.Grid.GridView gridView = gridExView as DevExpress.XtraGrid.Views.Grid.GridView;
object key = ((System.Data.DataRowView)gridView.GetFocusedRow()).Row[gridExView.KeyField];
          foreach (DocsVision.BackOffice.Model.CardProperties.Entities.CardPropertyTableRow row in cpt.Rows)
          {
              if (row.Key == (Guid)key)
              {
                  string message = "";                  
                  foreach (DocsVision.BackOffice.Model.CardProperties.Entities.CardProperty cellProp in row.Cells)
                      {
                       object val = cellProp.Value;                          
                       message += val == null ? "null" : val.ToString();
                       message += " ";    
                      }
                      MessageBox.Show(message);
                      }
    
              }

Для работы скрипта нужно прописать в using:

using DocsVision.Platform.WinForms.DataSource;
using DocsVision.BackOffice.Model.CardProperties.DataAccess;

Возможно, что-то еще…

а также подключить сборки DevExpress. А именно
DevExpress.XtraLayout.9.2.dll
DevExpress.XtraGrid.9.2.dll
DevExpress.Data.9.2.dll
DevExpress.Utils.9.2.dll

Добавление новой строки в табличный контрол из скрипта

Оговорю сразу, что данный метод работает, если для табличного контрола создана отдельная секция в карточке, так как добавление происходит через добавление записи в секцию.

Рассмотрим на примере таблицы, содержащей 3 столбца: Дату, идентификатор сотрудника и некоторый текст.

в приведенном скрипте:
secComment — это идентификатор табличной секции(Guid);
comment — какая-то строка(string)

Скрипт записывает текущую дату, пользователя, который открыл карточку в данный момент и некоторый текст.

Guid g = Guid.NewGuid();
CardData.Sections[secComment].BeginUpdate();
RowData newComment = CardData.Sections[secComment].CreateRow(g);
newComment.SetString("Текст", comment);
newComment.SetGuid("Автор", new EmployeeMapper(Session).GetCurrentUserId());
newComment.SetDateTime("Дата", DateTime.Now);
CardData.Sections[secComment].EndUpdate();

Смена атрибутов контрола из скрипта. На примере атрибута ReadOnly

Данный скрипт полезен в тех случаях, когда, например, измененное значение одного контрола влияет на доступность другого.

using System;
using System.Windows.Forms;
using DocsVision.Platform.ObjectManager;
using DocsVision.BackOffice.View.WinForms;
using DocsVision.BackOffice.Model;
using DocsVision.BackOffice.Model.Layouts.DataAccess;
using DocsVision.BackOffice.Model.Base.Entities;
using DocsVision.BackOffice.Model.CardProperties.Entities;
using DocsVision.BackOffice.Model.Layouts.Entities;
using DocsVision.BackOffice.Model.RoleModel.DataAccess;
using DocsVision.BackOffice.Model.RoleModel.Entities;
using DocsVision.BackOffice.View.WinForms.Helpers;

private void cardControl_AfterActivate(System.Object sender, System.EventArgs e)
    {
  CardProperty prop = GetCardProperty("имя контрола");
  CardPropertyDescription.LayoutAttributeSet attrSet = prop.Description.GetLayoutAttributes(CardControl.DomainObject.SelectedLayoutId);
        attrSet.ReadOnly = true;
        PropertyController.Refresh();
    }

//Поиск контрола с нужным именем  
private CardProperty GetCardProperty(string propertyName)
 {
 foreach (CardProperty property in PropertyController.CardProperties)
  {
  if (property.Name == propertyName)
  return property;
  }
 return null;
 }

Перезапуск сервисов из командной строки

Думаю, что многие сталкивались с проблемой, что какие-то изменения, внесенные в структуру DV требовали перезапуска серверов, SQL и IIS. На это уходит много времени, так как надо полазать по различным административным менюшкам и покликать много кнопок.

Я предлагаю вариант, когда перезапуск всех служб можно будет делать по двойному клику на ярлык на рабочем столе.

1. создаем новый текстовый файл.
2. в тело пишем

NET stop DVStorageServer45
NET stop WFServer45
NET stop MSSQL$SQLEXPRESS
IISReset
NET start MSSQL$SQLEXPRESS
NET start DVStorageServer45
NET start WFServer45

3. сохраняем файл на рабочий стол под именем Reset.bat и в свойствах файла выставляем «Запускать от имени Администратора». Иногда для этого приходится создать ярлык на этот батник и в его свойствах поставить запуск от имени администратора.
4. наслаждаемся перезапуском в один клик.

P.S. Возможно, что SQL сервер у вас называется не SQLEXPRESS. В таком случае либо просто удалите из батника строку перезапуска SQL (Обычно такой перезапуск не требуется), либо впишите свое название сервера.

Скрипт смены состояния карточки из бизнес-процесса

К сожалению, стандартными процедурами бизнес-процесса невозможно изменить состояние карточки. Для изменения состояния нужно поставить элемент «Скрипт» и написать в нем код, представленный ниже.
Важно помнить о следующей структурной особенности состояний: они различны у каждого вида карточки, поэтому сначала надо получать текущий вид карточки, а затем выбирать соответствующее ему состояние.

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

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

namespace DVScriptHost
{
   class DVScript
   {
       // стандартная функция, которая будет вызвана подсистемой СУБП
       //
       // входные параметры функции:
       //
       // process - информация о процессе. содержит коллекции
       //     Gates - коллекция шлюзов процесса
       //     Variables - коллекция переменных процесса
       // passInfo - информация о текущем проходе
       //
        private string state = "Согласование с контрагентом"; //Название состояния, в которое мы хотим перевести карточку
        private DVGate m_DVGate;
       public void Execute (DocsVision.Workflow.Runtime.ProcessInfo process, PassState passInfo)
       {
            try
            {
                //Получаем ссылку на карточку, у которой надо сменить состояние. В данном случае она хранится в переменной процесса, которая называется "Инициирующий договор"
                ProcessVariable pvCard = process.GetVariableByName("Инициирующий договор");
                DVCard dvCard = (DVCard)pvCard.Value;

                //получаем шлюз
                m_DVGate = (DVGate)process.Gates[DVGate.GateID];

                // получаем сессию
                UserSession oSes = m_DVGate.Session;
                  
                //Получаем данные карточки
                CardData card = oSes.CardManager.get_CardData(dvCard.ID);

                //Получаем ссылку на секцию "Основная информация". Так как карточка стандартная, то гуид берем из справочника в предыдущем посте. В противном случае - из DVExplorer.
                SectionData mainInfo = card.Sections["8C77892A-21CC-4972-AD71-A9919BCA8187"];

                //Получаем ссылку на справочник типов. Гуид берем из справочника в предыдущем посте.
                CardData RefTypes = oSes.CardManager.get_DictionaryData("BE14D55D-92B7-4345-AD10-32588981F83D");

                //Получаем тип карточки из справочника типов
                RowData currentType = RefTypes.Sections["49AD5A2D-17EC-46E2-A49E-C58D0BBD9C1A"].Rows[mainInfo.FirstRow.get_Value("Type")];

                //Устанавливаем состояние карточки, найдя его по имени и в соответствии с типом карточки
                mainInfo.FirstRow.set_Value("DocState", currentType.ChildRows.GetItemByValue("Name", state).ID);

            }
            catch (Exception ex)
            {
                 // запись в журнал ошибки исполнения
                 process.LogMessage("Ошибка выполнения скрипта:" + ex.Message);
            }
            return;
        }
    }
}

Описание полей стандартных карточек.

Думаю, что многие из вас сталкивались с проблемой отсутствия документации по структуре стандартных справочников и карточек. Я сам лично довольно долго мучился в поисках подобной информации, но недавно мне удалось найти очень полезный документ, в котором содержатся описания всех полей стандартных карточек.
Также, благодаря этому документу я выяснил, что у всех стандартных карточек и справочников постоянные идентификаторы, которые не зависят от того, где установлена система. Они тоже приведены в этом файле.
Описание полей стандартных карточек.doc

Также, если кому-то нужна литература по C#, то выкладываю самоучитель: Секунов С.Ю. — Самоучитель С# — 2001.pdf

И также самоучитель по xml: samou4itel_xml.rar

Новости блога. Дополнительные возможности при просмотре блога.

Благодаря нововведениям платформы Blogger, наш блог теперь можно просматривать в различных видах, используя страницу видов. Ссылка на данную страницу теперь всегда доступна из списка полезных ссылок справа.

Подробнее об этой фиче можно почитать тут.

Также я добавил возможность подписки на новые сообщения в блоге. Для того, чтобы подписаться, достаточно ввести свой адрес электронной почты в форму, которая находится внизу меня справа. Не забудьте подтвердить подписку, перейдя по ссылке, которую вы получите в письме сразу после ввода адреса почты.

Добавление пользовательского свойства карточки в представление

Новые карточки создаются изначально на свойствах, позже, конечно, карточку переводят на поля для удобства работы с ней, но не всегда полностью. Также, если Вы создали новый вид стандартной карточки и напичкали ее пользовательскими свойствами, то скорее всего встанет проблема доступа к ним.
Посмотрим, как можно обратиться к такому свойству при настройке представлений.

Пусть у нас есть карточка договора, настроенная как дополнительный вид входящего документа через справочник типов. В карточке договора используется часть полей из карточки входящего документа (Тема, дата создания и пр.), но также имеются пользовательские свойства (Примечание, сумма договора, сумма аванса, контрагент и его адрес и тд.). Задача усложняется, если пользовательские настройки вида содержат табличный контрол.

В примере Договора в табличном контроле 2 столбца: Контрагент и его адрес.
Free Image Hosting at www.ImageShack.us
Задача: вывести в представлении фамилию контрагента. Вот так:
Free Image Hosting at www.ImageShack.us

Сначала делаем все, как и при обычном создании представления: создаем представление, добавляем колонки.
Затем нужно сделать следующие присоединения:
1.Free Image Hosting at www.ImageShack.us
Привязываем свойство с названием «Контрагент», принадлежащее данной карточке (InstanceID)
2.Free Image Hosting at www.ImageShack.us
Не очевидная привязка выбранных значений. Нужна, так как столбец табличного контрола представляет собой массив. После этого в после «Выбранное значение» будут находиться идентификаторы контрагентов
3.Free Image Hosting at www.ImageShack.us
Получение по Идентификатору из выбранного значения информации о контрагенте.

После перечисленных привязок можно сделать присвоение колонке значения поля Фамилия из привязанной карточки контрагентов:
Free Image Hosting at www.ImageShack.us

P.S. Если есть проблема с добавлением простого (не табличного) пользовательского свойства в представление, дайте знать в комментах. В таком случае напишу и про них.

Смена состояния карточки из скрипта

На первый взгляд простое задание — сменить состояние карточки из скрипта. Вроде и у карточки стандартная кнопка для смены состояния есть, но и тут не обходится без бубна.

На данный момент простого способа сменить состояние из скрипта я не нашел. Единственный способ требует знания гуида конечного состояния. Данный идентификатор не доступен ни в одном из стандартных справочником и контекстных меню, поэтому приходится идти в обход.

Создаем строковый контрол на карточке. Затем на какую-нибудь кнопку ставим команду, записывающую в этот котрол значение из DomainObject.StateManager.CurrentStateId. (В моем случае по какой-то причине на активацию карточки поставить не удалось, только на кнопку или команду меню). Сохраняем карточку, закрываем конструктор.

Открываем карточку в навигаторе, прогоняем состояние карточки стандартной кнопкой «Сменить состояние» до нужного состояния и выполняем скрипт, записывающий состояние в строку. Вот он наш искомый гуид.

Далее в конструкторе в нужном Вам месте пишем:

DomainObject.StateManager.SetCurrentState(new Guid("fce438e8-d38c-4552-86d0-36d464920265"));

CardControl.RefreshLayout();

Вместо «fce438e8-d38c-4552-86d0-36d464920265» конечно же нужно поставить нужный гуид.

P.S. Я полагаю, что возможно как-то менять состояние карточки проще, используя команду DomainObject.ChangeCardState(StateMachineBranch branch), но я так и не смог понять, как ей пользоваться. Если кто-то разберется, то очень хотел бы получить совет в комментах.

Работа блога

Думаю, что все заметили раздел «Полезные ссылки».
Он будет время от времени дополняться. Сегодня была добавлена ссылка на довольно обширную базу знаний о DocsVision от компании-партнера TeamLead.

Также существует страница с частыми вопросами по работе блога: FAQ. К ней в комментариях можно оставлять свои вопросы по работе блога и его настройкам. Также там можно оставлять свои пожелания по добавлению/изменению/удалению каких-то функций в блоге.

DVCardManager

Недавно столкнулся с проблемой, что не мог загрузить библиотеку в базу при помощи CardManager.

При более детальном рассмотрении выяснилось, что для нормальной работы структура локальной базы должны соответствовать структуре базы на сервере, т.е. должна иметь те же системные библиотеки.

Следовательно, кроме «тестовой» должны быть добавлены следующие библиотеки:
Free Image Hosting at www.ImageShack.us.

После этого будут работать функции Update Database и Upload Library.

Вывод значения нумератора в дайджест

Иногда нужно вывести значения из нумератора в дайджест. Например, нужно вывести регистрационный номер документа.

На данный момент не удастся обойтись без создания дополнительного контрола. Нужно добавить новый строчный контрол на форму и сделать его невидимым.

Далее, если, например, вы пользуетесь кодом, опубликованным в этом посте, для автоматической генерации номера, то в конец скрипта нужно добавить всего одну строчку:

PropertyController.UpdateProperty("НомерПрописью",number.Number);// в скрытое поле записываем номер в виде строки

В дайджест добавляем что-то вроде этого:

Номер: 

Результат будет выглядеть так:
Free Image Hosting at www.ImageShack.us

P.S. Если Вы не используете автоматическое заполнение нумератора, то придется написать еще обращение к нумератору через Mapper и вставить это в AfterActivate

Баг

Ошибка: Создаем несколько разметок для разных видов карточки. При редактировании каждой разметки (добавлении контролов), причем только в случае использования многозакладочности, имена контролам могут присвоиться одинаковые для разных разметок. КР сначала не видит ошибку. Но при закрытии КР и повторном входе выдает ошибку о нескольких контролах с одинаковым именем.
Способ решения: при добавлении контролов в разные разметки карточки нужно не допускать совпадания имен контролов, иначе карточка станет недоступна для редактирования. При перезагрузке КР и навигатора карточка загружается без последних изменений.

Продолжение рассмотрения пространства имен BusinessCalendar.

Пару постов назад я начал писать про пространство имен DocsVision.BackOffice.Model.BusinessCalendar.Entities. Упоминал, что в нем содержатся 2 перечислимых типа DayType и TimeType.

Для справки: Перечислимый тип — это тип данных, переменные которого могут принимать значения заранее заданные пользователем. Например, можно создать тип «Animals», и возможными значениями у этого типа сделать «Horse, Pig, Cat, Dog, Cow». Тогда переменная типа Animals сможет принять значение Animals.Horse или, к примеру, Animals.Cat.


Ниже приведу значения для типов DayType и TimeType.

    DayType

  • Holiday
  • NonWorking
  • Working
    TimeType

  • Work
  • NotWork

Просмотр структуры карточки.

Иногда возникает потребность просмотреть, какие свойства содержит та, или иная карточка.
Для этого можно воспользоваться утилитой DVExplorer, входящей в SDK.

После запуска утилиты и подключения к базе выбираем пункт «Card Types…»

Обращение к карточке Бизнес-календаря. Примерная структура класса.

Ни для кого не секрет, что существует тип карточек «Бизнес-календарь». Они позволяют задать расписание работы, рабочие часы для подразделений и выполняют подобные этим функции.

Для того, чтобы обратиться к конкретной карточке календаря нужно узнать ее Guid. Проще всего это сделать, кликнув на бизнес-календарь правой кнопкой и зайти в свойства. Внизу будет указан URL карточки, он то и будет содержать легко узнаваемый Guid.

Далее в самой карточке нужно сделать следующее:

using DocsVision.BackOffice.Model.BusinessCalendar.DataAccess;
using DocsVision.BackOffice.Model.BusinessCalendar.Entities;
/*
.
.
.
*/
Guid calGuid = new Guid("F827960F-6E61-40AD-A7E4-63AF74FAB54A");  
Calendar cal = new CalendarMapper(Session).Find(calGuid);

В результате выполнения будет создан объект класса Calendar, имеющий весьма сложную структуру. Кроме свойств и методов, унаследованных от класса DomainObject, он включает в себя поле DefaultWorkTime типа IList (как я понял, так же представлены столбцы в табличном контроле). DefaultWorkTime содержит соответственно поля StartTime и EndTime, содержащие границы рабочего дня по-умолчанию. Они используются, если в календаре не приписаны рабочие часы, отличающиеся от них.
Если же рабочие часы заданы индивидуально для каждого дня, то нужно будет обращаться к полю Years (IDictionary), содержащему данные о каждом дне (int DayNumber,enum Type(Working,NonWorking,Holiday),IList WorkTime:(StartTime,EndTime)).

Также для работы с календарем может быть полезен класс WorkTimeCalculator, который содержит два метода: GetDayTimeWorkStatus(DateTime date) и GetDayWorkStatus(DayTime date), возвращающие значения типов TimeType и DayType соответственно.

Создать объект класса WorkTimeCalculator можно следующим способом:

using DocsVision.BackOffice.Model.BusinessCalendar;
using DocsVision.BackOffice.Model.BusinessCalendar.DataAccess;
using DocsVision.BackOffice.Model.BusinessCalendar.Entities;
/*
.
.
.
*/
Calendar cal = new CalendarMapper(Session).Find(new Guid("00000000-0000-0000-0000-000000000000"));
WorkTimeCalculator calc = new WorkTimeCalculator(cal);

Примечание: вместо 00000000-0000-0000-0000-000000000000 укажите нужный Guid.

Обращение к данным карточки сотрудника. Программирование действий в ответ на клик по кнопке.

Идея такова: мы выбираем сотрудника в соответствующем контроле типа «сотрудник«, затем кликаем по контролу «кнопка«, в ответ на что в отдельном свойстве появляется, к примеру, Email или Телефон сотрудника.

Эту задачу можно решить двумя способами:

1 способ (в обход объект-модели):

private void Свойство10_Click(System.Object sender, System.EventArgs e)  //Свойство10 - у меня имя кнопки
{
Guid? employeeId=(Guid?)PropertyController.GetPropertyValue("Автор"); //employeeId - ключ на карточку по свойству "Автор". "Автор" - имя контрола типа "сотрудник"
if (employeeId.HasValue) //проверка существования значения ключа employeeId
{
var empl=new DocsVision.BackOffice.Model.StaffModel.DataAccess.EmployeeMapper(Session).Find(employeeId.Value); //новая переменная, в которую записываем значение employeeId.Value
PropertyController.UpdateProperty("Свойство12",empl.Email); //Записываем в свойство типа "строка" значение empl.Email. Соответственно мы можем вытащить в качестве значение не только Email, а практически любое свойство карточки сотрудника
PropertyController.RefreshControls(); //обновляем контролы, чтобы отобразилось новое значение
}
else
{
MessageBox.Show("Ошибка"); //сообщение об ошибке, если employeeId не имеет значения
}
}

2 способ (через объект-модель):


private void Свойство10_Click(System.Object sender, System.EventArgs e)
{
Guid? employeeId=(Guid?)PropertyController.GetPropertyValue("Автор");
if (employeeId.HasValue)
{
RowData employeeData=Session.CardManager.GetDictionaryData(new Guid("6710B92A-E148-4363-8A6F-1AA0EB18936C")).Sections[new Guid("DBC8AE9D-C1D2-4D5E-978B-339D22B32482")].GetRow(employeeId.Value);
//RefStaffCardId = 6710B92A-E148-4363-8A6F-1AA0EB18936C (Правой кнопкой на справочник сотрудников, экспорт, XML карточки)
//Employee = DBC8AE9D-C1D2-4D5E-978B-339D22B32482 (C:Program FilesDocsVisionPlatform4.5ServerToolsDatabaseTakeOfficeRefStaff.xml - строчка с employee)
PropertyController.UpdateProperty("Свойство12",employeeData["Phone"].ToString()); //Phone - стандартное имя ячейки в базе данных, хранящей значение "Телефон" определенного сотрудника
PropertyController.RefreshControls();
}
else
{
MessageBox.Show("Ошибка");
}
}

Скрипт из мануала.

для того, чтобы при открытии карточки,ей присваивался регистрационный номер автоматически, существует след скрипт:
отыскиваете в событиях карточки событие AfterActivate, жмете три точки и открывается скрипт,первая строка генерится автоматически,а далее копируем скрипт)

private void cardControl_AfterActivate(System.Object sender, System.EventArgs e)
{ 
var numeratorProperty = GetCardProperty("Нумератор"); //здесь в скобках идет настоящее имя вашего регистратора, у меня "нумератор"

if (numeratorProperty.Value != null)
{   
return;
}

var ruleAttribute = numeratorProperty.Description.GetAttribute("Rule"); //обратите внимание,что в этом месте как раз идет НЕ настояшее имя вашего правила для регистратора,а стандартное название Rule

Guid? ruleId = (Guid?)ruleAttribute.Value;

var numeratorMapper = new DocsVision.BackOffice.Model.CardProperties.DataAccess.NumeratorNumberMapper(Session, CardData.Id, DomainObject.NumbersSectionId.Value);

var number = numeratorMapper.Create(ruleId.Value);

numeratorProperty.Value = number;
PropertyController.RefreshControls();

}

private CardProperty GetCardProperty(string propertyName)
{
foreach (CardProperty property in PropertyController.CardProperties)
{
if (property.Name == propertyName)
return property;
}
return null;
}

Пара багов

При написании скрипта наткнулся на следующую ошибку:
Ошибка
Если на карточке лежит контрол «Время», то, если в него не было принудительно записано какое-то значение через скрипт (значение по-умолчанию не в счет), то при попытке считать значение контрола возвращается объект неправильного типа.
Способ решения
Задавать значения по-умолчанию для этого контрола в событии карточки CardInitialized.


Ошибка
Если на карточке есть скрытый контрол, то данные о изменении его значения будут также выводиться в истории.
Способ решения
Пока не придуман.

Получение типа значения контрола

Часто при считывании значения свойства карточки может возникнуть вопрос о том, какого типа нужно создать переменную для хранения этого значения.
Для того, чтобы узнать тип значения свойства, можно воспользоваться следующим методом:

MessageBox.Show(PropertyController.GetPropertyValue("ИмяСвойства").GetType().ToString());

В результате при выполнении скрипта будет показано окно сообщения с названием типа выбранного свойства.

Вступление

Всем привет!

Вот и возник наш блог) Дизайн и структура возможно будут дорабатываться по мере необходимости.

В данный момент оставлять сообщения и комментарии могут только участники блога, получившие приглашения, и у блога отключена индексация в поисковых системах.

Есть такая проблема: DocsVision версии 4.0 не всегда стабилен и любит порой убивать Internet Explorer, оставляя пользователю проблему с блокировками карточек и файлов. Точно также проблемы могут возникнуть, если пользователь не закрыв старую сессию, откроет новую. А вот проблемы могут посыпаться самые разные.
Так вот, если надо обработать эту ситуацию, а именно, что пользователь пытается открыть карточку, которую он сам же и блокирует (напомню, что система в таком случае позволяет пользователю «переписать» блокировку в текущую сессию), то достаточно проверить в QueryActivate на наличие блокировки карточки данным пользователем. Но не проверять ILockable.LockStatus на вполне резонное, как кажется, LockStatusEnum.STATUS_OWNER_LOCKED, а проверять на наличие блокировки вообще и то, что владелец блокировки — текущий пользователь:


IsCardHasCorruptedLockByCurrentUser =
lockedObject.LockStatus == LockStatusEnum.STATUS_LOCKED &&
lockedObject.OwnerName == Session.Properties["AccountName"].Value.ToString();

Далее, если QueryActivate вернул всё необходимое для открытия карточки, то в промежутке между ним и Activate, пользователю будет выдан запрос на то, хочет ли он открыть её на редактирование или нет. Результат мы можем узнать непосредственно в Activate по установленному флагу ActivateFlagEnum.ACTIVATE_EDIT в ActivateMode.
Теперь мы знаем практически всё о ситуации и можем её обработать :)

Предложите, как улучшить StudyLib

(Для жалоб на нарушения авторских прав, используйте

другую форму
)

Ваш е-мэйл

Заполните, если хотите получить ответ

Оцените наш проект

1

2

3

4

5

2.4Утилита активации Docsvision

Утилита активации Docsvision входит в состав пакета утилит ResourceKit и предназначена для активации системы Docsvision. Внешний вид окна утилиты показан на рис. 1.10.

http://www.docsvision.com/docs/532559/platform/adminguide/screenshots/activation1.png

Рис. 1.10. Окно утилиты активации Docsvision

Процедура активации предполагает связь с сервисом активации и получение положительного или отрицательного ответа. Проверка осуществляется на основании серийного номера Docsvision, который выдается клиенту при выписке лицензии на продукт.

Активация возможна в двух режимах: через сеть, либо через файл активации.

Для автоматической сетевой активации проделайте следующие действия:

  • Введите серийный номер продукта в поле Серийный номер
  • Нажмите кнопку Активировать

В случае, когда активация по сети по той или иной причине невозможна, активировать продукт можно следующим образом:

  • Введите серийный номер продукта в поле Серийный номер
  • Нажмите кнопку Создать файл активации… и сохраните файл на компьютере
  • Отправьте файл в компанию Доксвижн(info@docsvision.com) и дождитесь получения ответного файла
  • Нажмите в окне утилиты кнопку Активировать из файла… и укажите полученный файл

В поле Текущий лицензионный ключ выводятся следующие сведения:

  • Имя заказчика
  • Дата создания заказа
  • Серийный номер продукта
  • Статус активации
  • Список дополнительных опций
  • Сведения о редакции 
  • Сведения о сроке обновления
  • Срок действия лицензии

Переключатель в поле Приложение указывает разрядность сервера, который будет активирован. Данный переключатель может быть использован на 64-разрядных системах, где могут быть установлены как 64-, так и 32-разрядные версии сервера Docsvision.

Также данная утилита позволяет просматривать текущую лицензию на сервере, если она уже активирована. При запуске утилиты информация будет отображаться сразу же.

Состав дополнительных опций зависит от лицензии на продукт.

2.5Стартовая страница

После установки сервера пользователь может ввести в адресную строку браузера Microsoft Internet Explorer ссылку (URL) на стартовую страницу (http://<имя сервера Docsvision>/<имя виртуальной папки Docsvision>/StartPage.aspx), открыв которую можно начать работу с Docsvision. Если на компьютере пользователя не установлена клиентская часть платформы, он может установить ее, пользуясь инструкциями стартовой страницы.

Если на компьютере установлены клиентские компоненты системы, то открыть Навигатор можно не используя стартовую страницу (по ярлыку на рабочем столе или выполнив Пуск > Все программы > Docsvision 5 > Docsvision Navigator).

Если клиентская часть платформы на компьютере пользователя установлена, то по адресу стартовой страницы откроется Навигатор (под учетной записью пользователя текущей сессии Windows). Поведение Навигатора в момент открытия стартовой страницы может регулироваться ее параметрами, для редактирования которых нужно воспользоваться Консолью настройки (описана в следующем разделе данного руководства) или указать нужные значения в адресе стартовой страницы.

В процессе ожидания открытия Навигатора на экран выводится заставка, состоящая из фоновой картинки и анимированного файла; при желании заставку можно заменить на другую. 
Для этого в папке, в которой лежит файл Navigator.dll (по умолчанию это C:Program FilesDocsvisionclient5.0Client для 32-разрядных компьютеров и C:Program Files (x86)Docsvisionclient5.0Client для 64-разрядных), нужно создать подпапку res и поместить в нее два файла: Splash.jpg с фоновой картинкой (ее рекомендованный размер 400х300) и Splash_animation.gif с анимацией (ее рекомендованный размер 55×55).
Если подпапка с файлами была создана ранее, файлы нужно подменить на новые.

Параметры стартовой страницы добавляются к ее адресу. Так, например, отключить встроенную аутентификацию и задать режим входа в систему с явным указанием имени пользователя и пароля можно, указав в адресе дополнительный параметр DisableNTLM=1; адрес стартовой страницы при этом будет http://<имя сервера Docsvision>/<имя виртуальной папки Docsvision>/?DisableNTLM=1.

В строке адреса можно также указать имя пользователя (username), но на некоторых системах это может приводить к входу в Docsvision под учетной записью пользователя текущей сессии Windows (если вход такого пользователя вообще возможен).

Ниже приведем список возможных параметров и их значений:

  • Настройки окна Навигатора:
    • ShowPanels — настройки панелей Навигатора:
      • 0 — по умолчанию, отображается панель иерархии папок и представление;
      • 1 — отображается только иерархия папок;
      • 2 — отображается только представление;
      • 3 — отображается представление и панель предварительного просмотра;
      • 4 — отображается панель иерархии папок, представление и панель предварительного просмотра;
      • 256 — показать Навигатор при открытии карточки (может быть прибавлено к одному из значений 0–4);
      • 512 — оставлять Навигатор работающим после того, как карточка, открытая по URL, закрывается пользователем (может быть прибавлено к одному из значений 0–4);
      • 1024 — скрыть панель инструментов Навигатора (может быть прибавлено к одному из значений 0–4);
      • 2048 — не показывать заставку при запуске Навигатора (может быть прибавлено к одному из значений 0–4);
      • 32768 — открыть «Рабочее место Администратора»;
      • 36864  — открыть «Рабочее место Администратора», используя при этом старый грид (то есть грид, использовавшийся до версии Docsvision 4.3);
    • LangName (RUS — русский, ENU — английский — язык интерфейса пользователя (дополнительные языки указываются по тому же принципу);
    • KeepBrowserUI — скрывать ли меню и панели Internet Explorer;
    • RefreshTimeout — период обновления панели представления в секундах;
    • FolderID — идентификатор папки, отображаемой при старте;
    • ShortcutID — идентификатор ярлыка карточки, отображаемой при старте;
    • CardID — идентификатор карточки, отображаемой при старте;
    • ModeID — идентификатор режима, в котором отображается карточка;
    • ViewID — идентификатор представления папки, указанной в FolderID;
    • SkipVersionCheck — выполнение проверки соответствия версии установленного решения и версии, запрошенной сервером:
      • 0 — выполнять проверку;
      • 1 — не выполнять проверку;
    • IgnoreInvalidCert — при соединении по SSL, игнорировать некорректный сертификат сервера.
  • Настройки соединения:
    • DisableNTLM — запрещает встроенную аутентификацию (обратите внимание, что несколько окон Навигатора, открытые в одной сессии Windows под разными учетными записями, могут работать нестабильно в связи с особенностями работы Internet Explorer):
      • 0 — использовать встроенную аутентификацию;
      • 1 — не использовать встроенную аутентификацию;
    • Username — имя пользователя, которое будет использоваться для базовой аутентификации;
    • ServerUrl — базовый адрес сервера Docsvision вида http://servername/Docsvision;
    • BaseName — имя базы данных, к которой следует подключиться, игнорируя заданную по умолчанию в Консоли настроек;
    • Transport — тип транспортного канала для работы с сервисом Docsvision:
      • 0 — веб-сервис (HTTP + SOAP);
      • 10 — WCF сервис (HTTP + SOAP);
      • 11 — WCF TCP сервис;
      • 12 — WCF именованный канал (named pipe).
    • ConnectAddress — адрес Веб-сервиса Docsvision вида http://servername/Docsvision/StorageServer/StorageServerService.asmx.
  • Настройки инсталляции решений:
    • InstallUILevel — уровень отображения пользовательского интерфейса инсталляций:
      • 0 — используется настройки интерфейса по умолчанию;
      • 1 — полностью автоматическая инсталляция;
      • 2 — минимальный интерфейс;
      • 3 — сокращенный интерфейс;
      • 4 — полный интерфейс;
    • InstallAction —операция, которую выполняет Навигатор при инсталляции решений:
      • 0 — инсталлировать необходимые библиотеки в режиме по умолчанию;
      • 1 — не инсталлировать ничего;
      • 2 — инсталлировать необходимые библиотеки полностью;
      • 3 — инсталлировать необходимые библиотеки в режиме advertise, при этом в реестр записывается регистрация компонентов, а сами компоненты устанавливаются при первом использовании;
    • InstallLogPath — путь к папке, в которой будет создаваться лог файл для всех инсталлируемых компонентов;
    • InstallScope — область установки компонентов:
      • 0 — для текущего пользователя;
      • 1 — для всех пользователей;
      • 2 — авто-распознавание, при наличии полномочий устанавливается для всех пользователей, иначе только для текущего пользователя;
    • InstallKeepOlder— удалять ли клиентскую часть предыдущей версии Docsvision, если она установлена:
      • 0 — удалять клиентскую часть предыдущей версии Docsvision;
      • 1 — сохранять клиентскую часть предыдущей версии Docsvision;

Введя в адресную строку браузера ссылку (URL) с параметрами FolderId и CardTypeId (идентификатор типа карточки; его возможные значения перечислены в документе «Описание полей стандартной карточки»), пользователь может создать карточку заданного типа в определенной папке.

Все описанные выше параметры могут применяться также, как ключи при запуске приложения Docsvision Навигатор из командной строки. Для запуска в строке следует указать данные в формате:<путь к папке Docsvision Навигатор>Navigator.exe /<ключ> <значение ключа>. Например, C:Program FilesDocsvision5.0Client> Navigator.exe /CardID xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx или C:Program FilesDocsvision5.0Client> Navigator.exe /DisableNTLM true (для параметров типа bool, которые могут принимать значения только 0 (false) или 1 (true)).

Данный скрипт выполняет следующие действия:
— Вызывает диалог выбора папки в которой будет создаваться карточка;
— Создает карточку с видом, назначенным на папку и открывает ее на редактирование.

Для его выполнения необходимо, чтобы на папку был назначен только один вид для создания документа.

Иначе скрипт не будет знать какого вида создавать карточку. Можно дописать и сделать выбор конкретного вида из списка видов, назначенных на папку. Но в данном случае было сделано так. Запускающим методом является процедура newCard.
Для работоспособности данного кода также необходимо, чтобы на рабочей станции, где будет запускаться скрипт был установлен клиент DocsVision 4.5.1988.
Данный код тестировался в Lotus Script. Скорее всего он будет работать и в других VB подобных языках программирования. Может быть с небольшой корректировкой.

Код:
Sub newCard()
Const ID_DICFOLDERSCARD = «{DA86FABF-4DD7-4A86-B6FF-C58C24D12DE2}» ‘ ИД карточки папок
Const ID_CARDIN = «{C1FED883-08DE-420F-8FB4-C16CEFFC1630}» ‘ ИД карточки типа входящий
Const ID_CARDINT = «{425DD1AC-8DF1-49F0-9A06-FA61381C4FEC}» ‘ИД карточки типа внутренний
Const ID_CARDOUT = «{FA0C389E-1095-4BC1-BEDC-793463742571}» ‘ИД карточки типа исходящий
Const ID_CARDARCH = «{A9E3F102-355B-477D-A9F2-99B02579F34E}» ‘ ИД карточки типа архивный
Const ID_CARDUNI = «{E724C058-B678-42FE-9C73-441705698CDB}» ‘ ИД карточки универсальный

‘ Строка подключения к серверу DocsVision по протоколу named pipe
‘можно сделать и протоколу http. Как будет лучше так и сделать
Const ConnectString = «\srv-dvPipeDocsVision45StorageServer»

Dim oSession As Variant
Dim Manager
Dim oTypesObject

Dim host As Variant
Dim oCard
Dim Navigator
Dim RowMainInfo


Set Navigator = CreateObject(«DVNavigator.NavigatorControl»)
Set Manager = CreateObject(«DVObjectManager.SessionManager»)
Set oTypesObject = CreateObject(«TOHelperObjects.TypesObject»)

Manager.Connect ConnectString
Set oSession = Manager.CreateSession()
If oSession Is Nothing Then
Msgbox «Невозможно создать сессию к DocsVision! За помощью обратитесь к администратору.»
Exit Sub
End If

Set oTypesObject.UserSession = oSession

Set host = Navigator.CreateHost(oSession)

‘ Получаем карточку папок
Set oFolderCard = oSession.CardManager.Dictionary(ID_DICFOLDERSCARD)

‘ Выводим форму для выбора папки
FolderID = host.SelectFolder(«Выбор папки для создаваемой карточки.»)

‘ Получаем ИД вида документа по папке
DocsViewID = GetDocViewID(oFolderCard, FolderID)
If DocsViewID = «» Then
Msgbox «Для данной папки не удалось получить вид создаваемых документов. За помощью обратитесь к администратору.»
Exit Sub
End If

‘ Получаем тип документа (Входящий = 0, Исходящий = 1, Внутренний = 2, Архивный = 3, Универсальный = 4)
DocType = GetDocTypeByDocView(oSession, DocsViewID)

‘ В зависимости от типа документа копируем в переменную DocTypeID соответствующий ИД типа документа
If DocType = -1 Then
Msgbox «Ошибка получения типа документа. За помощью обратитесь к администратору.»
Exit Sub
End If
If DocType = 0 Then
DocTypeID = ID_CARDIN
End If
If DocType = 1 Then
DocTypeID = ID_CARDOUT
End If
If DocType = 2 Then
DocTypeID = ID_CARDINT
End If
If DocType = 3 Then
DocTypeID = ID_CARDARCH
End If
If DocType = 4 Then
DocTypeID = ID_CARDUNI
End If

‘ Создаем карточку документа
Set CardData = oSession.CardManager.CreateCardData(DocTypeID)
‘ Получаем первую строку основной секции карточки
Set RowMainInfo = CardData.Sections(CardData.Type.Sections.GetByAlias(«MainInfo»).ID).FirstRow
RowMainInfo.Value(«Name») = «Имя документа»
Call oTypesObject.SetCardType(CardData.ID, DocsViewID, True, True, False, True, True, True, True)

‘Здесь прописываются значения свойств документа. 
‘ В закомментрированном ниже коде свойству Name присвоено значение: Test oMailItem.Subject 
‘Можно добавить свои свойства
Set oName = GetProperty(«Name», CardData, DocType)
oName.Value(«Value») = «Test oMailItem.Subject»
oName.Value(«TextValue») = «Test oMailItem.Subject»
oName.Value(«DisplayValue») = «Test oMailItem.Subject»


‘ Создаем слабый ярлык на карточку в выбранной папке
oFolderCard.CreateShortcut FolderID, CardData.ID, True

‘ Обновляем данные карточки
CardData.Refresh

‘ Отображаем карточку
host.ShowCard CardData.ID
End Sub


Function GetDocViewID(oFolderCard, FolderID)
GetDocViewID = «»
Set AllowedForFolderTypes = Nothing

‘Получаем объект карточка папок
‘    Set oFolderCard = UserSession.CardManager.Dictionary(ID_FOLDERSCARD)

‘Получаем объект папки в которой будет храниться карточка
Set oFolder = oFolderCard.GetFolder(FolderID)

‘Получаем разрешенные для папки типы и возвращаем их из функции
‘Если на папку не включено ограничение на создаваемые виды возвращаем Nothing, иначе список разрешенных видов
If (oFolder.Restrictions And FOLDER_RESTRICTED_TYPES) <> FOLDER_RESTRICTED_TYPES Then
Set AllowedForFolderTypes = Nothing
Else
Set AllowedForFolderTypes = oFolder.AllowedTypes
End If

If AllowedForFolderTypes Is Nothing Then
Msgbox «На папке не стоит ограничение на виды создаваемых в ней карточек. Карточка не будет создана. За помощью обратитесь к администратору.»
Exit Function
End If

If AllowedForFolderTypes.Count = 0 Then
Msgbox «В списке ограничений папки на создаваемые виды не стоит ни один вид. Карточка не будет создана. За помощью обратитесть к администратору.»
Exit Function
End If

If AllowedForFolderTypes.Count > 1 Then
Msgbox «В списке ограничений папки на создаваемые виды установлен больше чем один вид. Карточка не будет создана. За помощью обратитесь к администратору.»
Exit Function
End If

GetDocViewID = AllowedForFolderTypes.Item(0).TypeID

End Function


Function GetDocTypeByDocView(UserSession, DocsViewID)
‘ По умолчанию тип карточки равен -1 (Теоретически. Что в принципе не может быть,
‘ так как у вида документа не может не быть типа карточки.)
‘ID карточки типов
Dim oSectDocType As Variant
Const ID_TYPESCARD = «{BE14D55D-92B7-4345-AD10-32588981F83D}» ‘ИД Карточки справочника типов
GetDocTypeByDocView = -1

Set oTypesCard = UserSession.CardManager.DictionaryData(ID_TYPESCARD)
Set oSectDocType = oTypesCard.Sections(oTypesCard.Type.AllSections.GetByAlias(«DocumentTypes»).ID)
Forall Row In oSectDocType.AllRows
If Row.Value(«RowID») = DocsViewID Then
GetDocTypeByDocView = Row.Value(«DocumentType»)
Exit Function
End If
End Forall

End Function


Function GetProperty(tName, CardData, DocType)
Const ID_SECTPROP_CARDIN = «{B822D7D1-2280-4B51-AE58-A1CF757C5672}» ‘Секция свойства карточки входящий документ
Const ID_SECTPROP_CARDINT = «{ 5B6B407E-3D72-49E7-97D9-8E1E028C7274}» ‘Секция свойства карточки внутренний документ
Const ID_SECTPROP_CARDOUT = «{13A6A514-DC45-4078-AD02-66A79F896E68}» ‘Секция свойства карточки исходящий документ
Const ID_SECTPROP_CARDARCH = «{ECD7A672-22E3-4748-9962-00FC0FE2ABBC}» ‘Секция свойства карточки архивный документ
Const ID_SECTPROP_CARDUNI = «{D25F1089-C63D-43E1-9FA4-864C48EECCB4}» ‘Секция свойства карточки универсальный документ

If DocType = 0 Then
Set oProp=CardData.Sections(ID_SECTPROP_CARDIN)
End If
If DocType = 1 Then
Set oProp=CardData.Sections(ID_SECTPROP_CARDOUT)
End If
If DocType = 2 Then
Set oProp=CardData.Sections(ID_SECTPROP_CARDINT)
End If
If DocType = 3 Then
Set oProp=CardData.Sections(ID_SECTPROP_CARDARCH)
End If
If DocType = 4 Then
Set oProp=CardData.Sections(ID_SECTPROP_CARDUNI)
End If

Set oProp=CardData.Sections(ID_SECTPROP_CARDIN)
Set oPropRow=oProp.FindRow(«@Name='» & tName & «‘»)
Set GetProperty=oPropRow

End Function

Понравилась статья? Поделить с друзьями:
  • Docker ошибка wsl2
  • Docker ошибка hyper v
  • Donationalerts произошла ошибка при проверке платежа
  • Docker как посмотреть ошибки
  • Donationalerts ошибка при выводе средств