...

Резервирование рег. номера документооборота из сценария

Тема в разделе "Разработчикам", создана пользователем sanches, 22 май 2017.

  1. sanches

    sanches New Member

    Всем доброго времени суток. Хотим сделать полную генерацию исходящего письма. Для этого нужно в сценарии, перед регистрацией документа секретарем, зарезервировать номер документа. А во время регистрации документа секретарем использовать этот номер. Можно ли это как-то это сделать? Перелопатил все API, не нашел. Или может кто подскажет, каким другим способом это можно реализовать. Смысл в том, чтобы человек мог зайти, создать исходящее письмо из маршрута, забить все нужные поля, в том числе выбор контакта и контрагента. Дальше генерируется письмо, регистрируется секретарем, печатается, подписывается и сканируется уже оригинал и ложится рядом с генерированным документом.
     
  2. arkarimov

    arkarimov Member

    Не пробовал, но есть ReservedRegNumber в PublicAPI попробуйте его поковырять, если правильно понял.
    Получится что-то в духе
    //Резервируем номер
    var reservedNumber= PublicAPI.Docflow.Objects.Nomenclature.ReservedRegNumber.Create();
    ...заполнение данных
    reservedNumber.Save();
    //Регистрация сценарием если необходима.
    PublicAPI.Docflow.Document.Register(Document, Variant, reservedNumber);
    Ну и можно в базе знаний почитать про регистрацию сценарием там есть может что-то полезное найдете себе.
     
  3. pushkarev

    pushkarev Active Member

    Дополню предыдущий комментарий, примерно так должна выглядеть строка создания зарезервированного номера:
    Код:
    var reservedRegNumebr = PublicAPI.Docflow.Objects.Nomenclature.ReservedRegNumber.ReservRegNumberByVariant(variant);
    Это регистрация через имеющийся в системе вариант регистрации.
     
  4. sanches

    sanches New Member

    Ага, значит проглядел этот метод. Спасибо.

    А теперь вопрос другой: можно ли как-то далее подставить этот зарезервированный номер в форму? То есть, чтоб стояла галочка использовать зарезервированный номер и стоял этот номер через context?
    Или же теперь либо выбирать этот номер в ручную или регистрировать автоматически?
    Тогда если регистрировать документ автоматически, почему он не дает мне его зарегистрировать? Ниже сценарий: в нем генерируется файл по шаблону и этот файл добавляется в документ Исходящее письмо.

    // Вариант регистрации - Исходящее
    var regVariant = PublicAPI.Docflow.Objects.RegistrationVariant.Load (2);
    // Резервирование номера регистрации
    var reservedRegNumber = PublicAPI.Docflow.Objects.Nomenclature.ReservedRegNumber.ReservRegNumberByVariant (regVariant);
    reservedRegNumber.Save();
    context.Inicialy = context.OutgoingLetter.Contact.Surname;
    context.Fayl = InterfaceActivator.Create<BinaryFile> ();
    context.Fayl.Name = context.OutgoingLetter.Theme + " от " + context.OutgoingLetter.CreationDate + ".txt";
    context.Fayl.CreateDate = DateTime.Now;
    context.Fayl.InitializeContentFilePath ();
    System.IO.File.Copy (@"D:\\ELMA3-Express\\UserConfig\\Documents\\Test.txt", context.Fayl.ContentFilePath);
    PublicAPI.Services.DocumentGenerator.Generate (context.Fayl, context);
    PublicAPI.Services.File.SaveFile(context.Fayl);
    PublicAPI.Docflow.DocumentVersion.AddDocumentVersion (context.OutgoingLetter, context.Fayl, PublicAPI.Enums.Documents.DocumentVersionStatus.Current);
    PublicAPI.Docflow.Document.Register(context.OutgoingLetter, regVariant, reservedRegNumber);​

    Ошибка вроде как вылетает, что нет такого зарезервированного номера, но точно сказать не могу, ибо при тестировании ошибки срезаются браузером и как их посмотреть полностью, пока не понял.
    Или еще как вариант: можно ли передать переменную reservedRegNumber дальше по модели, потом секретарь говорит зарегистрировать документ и уже на этом этапе при регистрации вставляется зарезервированный номер?

    P.S. Решил проблему по другому, нашел пример двойной генерации файла.
     
    Последнее редактирование: 23 май 2017
  5. sanches

    sanches New Member

    И еще пара вопросов:
    1. Можно ли использовать переменную сценария при генерации файла по шаблону из этого сценария?
    2. Как можно преобразовать дату к нужному виду? В C# есть метод date.ToString("M.d.yyyy"), но элма на него ругается.
    3. Можно ли удалить временный файл из документа?
     
    Последнее редактирование: 23 май 2017
  6. arkarimov

    arkarimov Member

    Логи ошибок надо смотреть в папке Элмы\Web\logs\
    Там для ошибок общего характера error, ошибок в сценариях ScriptLog и можно своё логирование сделать оно будет писаться в папку scripts
    Чисто теоретически генератор файлов по шаблону принимает что угодно (тип object), но никакого руководства как сконструировать объект нужным образом, чтобы генератор его принимал и обрабатывал нет, отладка генерации файлов тоже дело очень муторное. Поэтому можно считать что использовать можно только переменные контекста процесса.
    Вы что-то не то делаете, код ниже отрабатывает на ура.
    Код:
    public void TestDate (Context context)
    {
        var date = DateTime.Now;
        Console.WriteLine(date.ToString("M.d.yyyy"));
    }
    Что такое временный файл в документе??
     
  7. sanches

    sanches New Member

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

    По логам спасибо, смотрел только папку error и ничего там не находил по теме.

    По дате: у меня есть context.OutgoingLetter.CreationDate (это исходящее письмо, и дата создания). Вот из этой даты он у меня ругается:
    Код:
    var data = context.OutgoingLetter.CreationDate.ToString("M.d.yyyy");
    
    Ошибка: Ни одна из перегрузок метода "ToString" не принимает "1" аргументов
     
  8. arkarimov

    arkarimov Member

    Это называется версии документа. Очень полезная штука. Если посмотрите ваш код вы добавляете версию при генерации.
    Теоретически её можно заменять. Никогда такого не делал, но можно попробовать на втором этапе что-то в духе
    Код:
    //doc- ваш документ, получим текущую версию
    var Version = doc.CurrentVersion;
    //GeneratedFile нужный файл
    Version.File=GeneratedFile;
    
    Обычно ELMA создает переменные Nullable типа, это когда при создании переменной контекста стоит галка "Разрешать пустое значение". Полагаю проблема в этом, у Nullable типов нет перегрузок ToString с аргументами, нужно либо свою писать либо вытаскивать значение даты
    Код:
    var data = context.OutgoingLetter.CreationDate.Value.ToString("M.d.yyyy");
    Разумеется Nullable надо проверять на null прежде чем трогать Value чтобы не схватить исключение
     
    1 это нравится
  9. sanches

    sanches New Member

    Спасибо. Все работает.
     

Поделиться: