Массовая простановка штампов подписей в документ с использованием HTML-конструктора для RX 4.6

19 0

Задача

На одном из проектов возникла потребность в конце согласования, добавлять таблицу с именами и подписями участников согласования документа. Казалось бы, похожий функционал можно реализовать с помощью отчёта, своего, или доработав коробочный Лист согласования. Но сложность в том, что эта таблица должна была содержать штампы подписей. Таким образом, понадобилось осуществить массовую и динамическую простановку штампов подписей сотрудников. Можно было бы воспользоваться шаблоном со сложной системой якорей, но поэкспериментировав с HTML конструкторами, было решено остановиться на них. Получилось достаточно эффективно и быстро достигнуть необходимого результата.

 

Реализация

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

 

В нашей задаче были обозначены следующие участники согласования: Председатель, Cекретарь и Члены комиссии. Сначала подписывает Председатель (он есть всегда, согласует Утверждающей подписью), затем Члены комиссии (их может быть несколько) и в самом конце Секретарь (обязателен в задаче, присутствует всегда). 

Для редактирования html-схемы, подойдёт любой онлайн html-редактор.

Сначала создадим схему для Председателя:

<head>
    <style>
        .main{      
            border-collapse: separate;
            border-spacing: 0 0.5em;
            font-family: "Times New Roman";
      }
      .p{
      font-size:12.5pt;
      font-family: "Times New Roman";
      }       
    </style>
</head>

<p class = p>Подписи:</p>
<table class =  "main" border="0"  cellpadding="0" cellspacing="0" style="border: 1px solid transparent"   font-family: "Times New Roman">
    <tbody>
        <tr>
            <td>Председатель: &emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;</td>
            <td>{CharmainSign}</td>
            <td>&emsp;&emsp;{CharmainName}</td>
        </tr>
            {NextTableLine}
    </tbody>
</table>
<p>&nbsp;</p>
<p>&nbsp;</p>

 

Мы задаём название таблице, оставляем теги для подписи и имени Председателя: {CharmainSign} и {CharmainName}  соответственно, а так же {NextTableLine} для связи со следующим блоком таблицы. 

В результате в данный момент наша таблица выглядит следующим образом: 

Сохраняем в ресурс, в коде создаём из него строку и заполняем соответствующими данными:

 //Создаём основной шаблон с Председателем
      var mainHtml = centrvd.Purchase.Resources.HtmlVisualMainChairman.ToString();
      mainHtml = mainHtml.Replace("{CharmainSign}", chairmanHtml);
      mainHtml = mainHtml.Replace("{CharmainName}", chairmanName);

     

Штамп для Председателя и для следующих участников согласования создаём заранее в виде строки. Штамп подписи это такой же html макет, подробно останавливаться на его создании я не буду, отмечу что принцип формирования точно такой же, как и в данной статье - модифицируем html-схему штампа, создаём строку из ресурса, заменяем теги на данные , в зависимости от требований к содержанию штампа.

Далее в нашей таблице должны выводится участники, формируем список сотрудников и перебираем их через foreach: 

if (members.Any())
{
  foreach (var member in members)
 {
   var nextMemberHtml = centrvd.Purchase.Resources.HtmlNextMemberComission.ToString();
   mainHtml = mainHtml.Replace("{NextTableLine}", nextMemberHtml);
   memberHtml = this.GetHtmlSignature(member, sigStamp, simpleSigStamp, logo);
   nextMemberHtml = nextMemberHtml.Replace("{MemberSign}", memberHtml);
   nextMemberHtml = nextMemberHtml.Replace("{MemberName}", 
   centrvd.Purchase.PublicFunctions.Module.
   GetEmployeeFullName(Sungero.Company.Employees.As(member.Signatory)));
 }
}

 

В каждой итерации, на место {NextTableLine} добавляется следующая строка таблицы:

<tr>
   <td class="alignleft"> {Члены комиссии:} </td>
   <td class="aligncenter">{MemberSign}</td>
   <td class="alignright">&emsp;&emsp;{MemberName}</td>
  </tr>
   {NextTableLine}

 

Тег {Члены комиссии: } необходим для оформления первой строки участников, поэтому заполняем её для первой итерации, для всех последующих заменяем на string.Empty. Таким образом таблица с несколькими участниками выглядит вот так:

 

В данный момент, в нашей результирующей строке данные уже заполнены, но, для лаконичности, привожу пока примеры без данных. Итак, Члены комиссии заполнены, добавляем блок Секретаря, который уже не содержит {NextTableLine} т.к. является последним и заполняем данные в коде, по аналогии  с предыдущими:

<tr>
<td class="alignleft">Секретарь:</td>
<td class="aligncenter">{SecretarySign}</td>
<td class="alignright">&emsp;&emsp;{SecretaryName}</td>
</tr>

 

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

В итоге наша таблица выглядит следующим образом:

 

Итоги

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

Спасибо за внимание.

Пока комментариев нет.

Авторизуйтесь, чтобы написать комментарий