Ваш браузер устарел, не поддерживает современные веб-стандарты и представляет угрозу Вашей безопасности. Для комфортной работы с порталом, пожалуйста, установите современыый браузер.
Портал технической поддержки

Автоматическое выделение номера в документах 5.0

Комментарии

Комментариев: 28

  • Уточняю: не забыть прописать пространство имен

    using DocsVision.Platform.ObjectModel.Search;

     

    0
    Действия с комментариями Постоянная ссылка
  • Еще одно уточнение. При выделении номера таким скриптом почему-то игнорируется прописанный в правилах нумерации префикс и суффикс.

    Есть функции, которые могут помочь прописать их при выделении номера  или хотя бы получить?




    Формат полного номера в справочнике нумераторов 4_5.jpg
    0
    Действия с комментариями Постоянная ссылка
  • Проверил все варианты еще раз - номер выделяется как надо, текстовая его часть пишется в поле Number секции Numbers.

    Единственное но - нельзя выделять номер, который в префиксе или суффиксе содержит какие-либо XSLT преобразования до того, как карточка сохранена хотя бы один раз (иначе неоткуда будет взять XML этой карточки).

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

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

    0
    Действия с комментариями Постоянная ссылка
  • Хочу спросить еще по данной теме.

    Согласно приведенному коду текст функции выделения номера пишется в скрипте для конкретного вида документа 5.0, но вызывается эта функция из методов Документ_CardActivated, Документ_Saving, которые содержаться в родительском виде Документ. Таким образом для всех видов документов 5.0 выделение номера срабатывает на одном событии.

    Можно как-то вызывать это изменить? Чтобы для каждого вида выделение номера срабатывало на конкретном событии (для какого-то при открытии, для другого - при сохранении и т.д.)

    Одним из вариантов я вижу создание для конкретного вида конкретной функции выделения номера, т.е internal virtual void UpdateRegNumber1(), UpdateRegNumber2(), ... и их вызов при конкретных событиях.

    Но может есть более простые варианты?

    0
    Действия с комментариями Постоянная ссылка
  • Все именно так, только лучше сразу назвать соответствующие виртуальные методы, н-р, OnCardActivated, OnSaving и т.п. и переопределять их в нужных скриптах видов по необходимости с вызовом не только получения номера, но и прочих требующихся операций.

    0
    Действия с комментариями Постоянная ссылка
  • Пробую скрипт на 5.1 не работает.

    Как на 5.1 автоматически выделять номер?

    Проверял кто нибудь на 5.1 ?

    0
    Действия с комментариями Постоянная ссылка
  • Странно, что при нажатии кнопки "Зарегистрировать" выдается сообщение при отсутствии номера, хотя логичнее было бы предложить установить номер, если он еще не выделен, и только при отказе записать без номера. Постоянно какие - то лишние события. Ну согласовали все - переведи автоматом в состояние "Согласован", или нажал кнопку "Подписать" Подписант - переведи в состояние подписан. Придется дописывать самим.

    А пока в 5.1 конструкторы еще не нормально не работают: какую кнопку не нажмешь: либо предупреждение об ошибке, либо ошибка, и это на пустой базе 5.1. Даже после публикации заплаток. Надо ждать SP. Тогда и может и скрипт заработает. 

    0
    Действия с комментариями Постоянная ссылка
  • Скажите подалуйста, какие сборки еще необходимо подключить? При сохранении скрипта выдает ошибку (скриншот)




    err.jpg
    0
    Действия с комментариями Постоянная ссылка
  • Это не сборки, это сам метод UpdateRegNumber.

    Внимательнее смотрите в статье - должно быть реализовано не только переопределение метода (т.е. то, что со словом override), но и сам метод (то, что со словом virtual в родительском классе).

    0
    Действия с комментариями Постоянная ссылка
  • Avatar
    Денис Лопаев

    Подскажите пожалуйста, можно ли как то скриптом изъять название правила нумератора из поля рег_номера?

    0
    Действия с комментариями Постоянная ссылка
  • Можно, но, как всегда, только "хаком" через reflection.

    ICustomizableControl customizable = CardControl;
    ILayoutPropertyItem regNumberItem = customizable.FindPropertyItem<ILayoutPropertyItem>("RegNumber");
    Guid? ruleId = regNumberItem.GetType().GetProperty("Rule").GetValue(regNumberItem) as Guid?;

    Этим получили Id правила, дальше можно получить его из контекста и т.д.

    0
    Действия с комментариями Постоянная ссылка
  • Если мы добавим виртуальный метод в базовый класс 

    // это вставляем в скрипты для Базовые объекты / Документ

    internal virtual void UpdateRegNumber()
    {
    }

    , то при очередном обновлении платформы он затрется?

    Еще вопрос.

    В конструкторе скриптов:

     public class CardDocumentДокументУДScript : ScriptClassBase //Это тип Документ УД

     public class CardDocumentScript : ScriptClassBase // Это тип Документ

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

    Для ДВ 5.3. данное обсуждение актуально?

     

     

     

     

     

    0
    Действия с комментариями Постоянная ссылка
  • В "Документ" вряд ли затрется, а вот в "ДокументУД" скорее да, т.к. для этого вида скрипты точно при обновлении перегружаются.

    Рекомендую свои методы в виде "ДокументУД" выделить, н-р, в отдельный регион, тогда его можно будет переносить целиком.


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

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

    0
    Действия с комментариями Постоянная ссылка
  • Добавил вызов данного метода UpdateRegNumber в событие CardActivated. Метод UpdateRegNumber вызывается только, когда e.ActivateFlags == ActivateFlags.New.

    Карточка создается, номер выделяется.

    На вопрос о сохранении говорю Нет. Номер всё равно остается занят.

    Как его очистить?

    0
    Действия с комментариями Постоянная ссылка
  • Самый простой вариант - вызвать метод INumerationRulesService DeleteNumber для полученного объекта BaseCardNumber. Он удалит строку с номером из карточки, а та по специальному флагу ссылки очистит эту строку в нумераторе.

    0
    Действия с комментариями Постоянная ссылка
  • Какое событие использовать для очистки номера? как проверить в этом событии, что мы не сохранились?

    0
    Действия с комментариями Постоянная ссылка
  • на событие Card Closed (закрытие карточки) повесить код, который будет проверять флаги CardControl.ActivateFlags, если там есть флаг New - значит, карточка только что создана; затем проверяем, стоит ли флаг CommittedData в CardControl. ActionFlags, если там нет CommittedData - значит от сохранения отказались и номер можно спокойно удалять.

    0
    Действия с комментариями Постоянная ссылка
  • В CardControl отсутствует свойство ActionFlags

    0
    Действия с комментариями Постоянная ссылка
  • Флаги можно поймать из аргумента DocsVision.Platform.WinForms.CardActivatedEventArgs события CardActivated.

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

    0
    Действия с комментариями Постоянная ссылка
  • Добрый день, коллеги

    А с чем может быть связана ошибка Unable to execute script.   Error code: 0. Error description: Заданное приведение является недопустимым.

    на строчке BaseCardNumber number = numerationService.CreateNumber(documentCardData, documentCard , rule);

    делаю из Бизнес-процесса. 

    Guid myDocumentId = new Guid((myDocumentVariable.Value as IGateVariable).ID);
    DocsVision.BackOffice.ObjectModel.Document documentCard = context.GetObject<DocsVision.BackOffice.ObjectModel.Document>(new System.Guid(myDocumentId.ToString()));
    CardData documentCardData = process.Session.CardManager.GetCardData(new System.Guid(myDocumentId.ToString()));

     

    Пробовала и BaseCard вместо Document. Ошибка все та же

    0
    Действия с комментариями Постоянная ссылка
  • Катира, добрый день.

    Выложил модифицированную версию на пастебин:  http://pastebin.com/AFWzJxUv .

    Попробуйте её.

    0
    Действия с комментариями Постоянная ссылка
  • Здравствуйте, Дим

    Тоже самое

    на моменте CreateNumber говорит что заданное приведение является недопустимым... :(

    0
    Действия с комментариями Постоянная ссылка
  • Какой формат номера в данном конкретном правиле?

    Нормально ли работает это правило, если просто привязать его к контролу в документе?

    Если нет, то не используется ли там XSLT, в котором, действительно, может быть подобная ошибка?

    0
    Действия с комментариями Постоянная ссылка
  • Добрый день, Евгений

    В правиле номер и ничего больше. Никаких префиксов/суффиксов нет. В документе скрипт работает. 

    В ТП обратится?

    0
    Действия с комментариями Постоянная ссылка
  • Ага, приложить проблемный БП и журнал работы Workflow.

    0
    Действия с комментариями Постоянная ссылка
  • Дмитрий, поясните, пожалуйста, ваш код:

    "Выложил модифицированную версию на пастебин:  http://pastebin.com/AFWzJxUv ."

    Вот эти строки:

    Guid numberID = context.GetObjectRef(number).Id;

    someDocument.MainInfo.SetGuid("RegNumber", numberID);

    В MainInfo в поле RegNumber хранится ID строки из секции Numbers. Почему в данному случае в RegNumber записывается ID номера.

    При этом ваш код работает: при установке поля RegNumber появляется строка в секции Numbers.

     

    0
    Действия с комментариями Постоянная ссылка
  • number в данном случае - это как раз строка из секции Numbers (которая приводится к объекту вида BaseCardNumber).

    Id этого объекта, ес-но, будет совпадать с Id строки этой секции.

    0
    Действия с комментариями Постоянная ссылка

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