На одном из проектов возникла потребность в конце согласования, добавлять таблицу с именами и подписями участников согласования документа. Казалось бы, похожий функционал можно реализовать с помощью отчёта, своего, или доработав коробочный Лист согласования. Но сложность в том, что эта таблица должна была содержать штампы подписей. Таким образом, понадобилось осуществить массовую и динамическую простановку штампов подписей сотрудников. Можно было бы воспользоваться шаблоном со сложной системой якорей, но поэкспериментировав с 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>Председатель:        </td>
<td>{CharmainSign}</td>
<td>  {CharmainName}</td>
</tr>
{NextTableLine}
</tbody>
</table>
<p> </p>
<p> </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">  {MemberName}</td>
</tr>
{NextTableLine}
Тег {Члены комиссии: } необходим для оформления первой строки участников, поэтому заполняем её для первой итерации, для всех последующих заменяем на string.Empty. Таким образом таблица с несколькими участниками выглядит вот так:
В данный момент, в нашей результирующей строке данные уже заполнены, но, для лаконичности, привожу пока примеры без данных. Итак, Члены комиссии заполнены, добавляем блок Секретаря, который уже не содержит {NextTableLine} т.к. является последним и заполняем данные в коде, по аналогии с предыдущими:
<tr>
<td class="alignleft">Секретарь:</td>
<td class="aligncenter">{SecretarySign}</td>
<td class="alignright">  {SecretaryName}</td>
</tr>
Готово. Теперь у нас в строке большой штамп, с заполненными данными. Проставляем его на пустую страницу документа любым доступным способом, я использовал вариант с координатами. Подробности создания пустой страницы у документа и варианты простановки на ней штампа, планирую позже описать в отдельной статье, с соответствующей темой, здесь же не буду заострять на этом внимания.
В итоге наша таблица выглядит следующим образом:
Данный способ простановки массовой штампов достаточно прост в написании и гибок к изменениям. Блоки хранятся в ресурсах, т.е. в перспективе можно написать справочник, в котором эти ресурсы будут храниться в текстовых полях, и в котором их можно будет изменять по необходимости, а со стороны кода, просто заполнять данными новые теги, так же, через Replace.
Спасибо за внимание.
Авторизуйтесь, чтобы написать комментарий