Исполняем обязанности по получению сведений о своих бенефициарных владельцах
Небольшая вводная
Начиная с 21 декабря 2016 года вступили изменения в ФЗ РФ «О противодействии легализации (отмыванию) доходов, полученных преступным путем, и финансированию терроризма», касательно обязанности юридического лица по раскрытию информации о своих бенефициарных владельцах. В связи с этим, многие компании направляют запросы по цепочке владения с целью выяснения своих бенефициарных владельцев. Кто-то формирует запросы на бумаге, кто-то рассылает электронные письма.
На наш взгляд, надлежащим доказательством исполнения обязанности «знай своего бенефициарного владельца» является наличие письма на бумаге с отметкой об отправке/вручении. Данные письма в идеале должны готовиться не реже одного раза в год. Если в ведении юриста находится всего несколько компаний, то составление писем не составляет особого труда. Но, если компаний больше 3-х десятков, составление писем превращается в уничтожающую позитив рутину. Дело усугубляется тем, что реквизиты писем постоянно меняются: подписанты увольняются, компании перерегистрируются, меняя адреса. Все это надо учитывать. Как здесь могут помочь навыки программирования на python?
Очень просто — хорошо бы иметь программу, которая сама будет подставлять в письма необходимые реквизиты. В том числе формировать сами письма, не заставляя создавать документ за документом вручную. Попробуем.
Структура письма в word. Модуль python docxtpl
Перед написанием кода программы посмотрим как должен выглядеть шаблон письма, в который мы будем помещать наши данные.
Текст письма от общества своему участнику/акционеру будет примерно следующим:
Напишем простую программу, которая заполнит для начала одно поле в нашем шаблоне, чтобы понять принцип работы.
Для начала в самом шаблоне письма Word вместо одного из полей, например, подписанта поставим переменную. Данная переменная должна быть на либо на англ. языке, либо на русском, но в одно слово.Также переменная должна быть обязательно заключена в двойные фигурные скобки. Выглядеть это будет примерно так:
Сама программа будет иметь следующий вид:
from docxtpl import DocxTemplate
doc = DocxTemplate("шаблон.docx")
context = { 'director' : "И.И.Иванов"}
doc.render(context)
doc.save("шаблон-final.docx")
Вначале мы импортируем модуль для работы с документами формата Word. Далее мы открываем шаблон, и в поле директор, которое бы обозначили ранее в самом шаблоне, вносим ФИО директора. В конце документ сохраняется под новым именем.
Таким образом, чтобы заполнить все поля в файле-шаблоне Word нам для начала необходимо определить все поля ввода в самом шаблоне скобками {} вместе с переменными и потом написать программу. Код будет примерно следующим:
from docxtpl import DocxTemplate
doc = DocxTemplate("шаблон.docx")
context = { 'emitent' : 'ООО Ромашка', 'address1' : 'г. Москва, ул. Долгоруковская, д. 0', 'участник': 'ООО Участник', 'адрес_участника': 'г. Москва, ул. Полевая, д. 0', 'director': 'И.И. Иванов'}
doc.render(context)
doc.save("шаблон-final.docx")
На выходе при исполнении программы мы получим готовый заполненный документ.
Скачать готовый шаблон Word можно здесь.
Комментарии (11)
danilovmy
18.06.2019 22:13А почему не использовался макрос документа Word?
zoldaten Автор
19.06.2019 09:21Потому что использовался python. Вы можете изложить свое решение.
danilovmy
21.06.2019 01:42Изложил. Настойчиво рекомендую почитать о VBA, он явно потерял популярность после перехода на .net, но его возможностей более, чем достаточно для описанных тобою запросов по автоматизации. Мое решение работает по сети, с одновременным редактированием, на любой машине где стоит ворд или опенворд (макросы в опенворде тоже работают).
Я немного знаю питон, т.к. являюсь ведущим разработчиком компании пищущей софт на питоне, а это тот еще изврат. Меня всегда удивляет и удивляла ненужность решений на питоне (яве, бейсике… любой другой язык) там, где это не нужно.
nikoloza
20.06.2019 19:42А как насчет экспорта в PDF?
danilovmy
21.06.2019 01:28nikoloza, автор статьи походу вообще не разбирается в Word, а ты его спрашиваешь про экспорт. Пройти по полям и заполнить их содержимым из макроса VBA и сохранить в пдф это 2 строки, без питона и docx. А автор статьи скорее всего reportlab тебе установит и начнет PDF сущностями оперировать, поскольку разобраться в Word он не удосужился.
Итак. В Документе расставляются поля, в данном случае я это сделал через DocVarField.
После в макросе VBA это решается так:
Sub Macros() With ActiveDocument.Variables .Item("EMITENT") = "Емитент" .Item("ADDRESS1") = "Адрес" .Item("DIRECTOR") = "Директор" End With ActiveDocument.Fields.Update ActiveDocument.SaveAs2 FileName:="newname.pdf", FileFormat:=wdFormatPDF End Sub
Всего две строки без определения параметров словаря, автор не сказал откуда он берет эти данные. сохранение возможно в любом вордовом формате. или перед этим можно диалог сохранения вызвать и выбрать.
Две строки, только Word без Питона. Как тебе такое Илон Маск?
vin2809
Все это, конечно, хорошо… Но чем вас не устраивает стандартный режим «Слияние», существующий в MS WORD?
Действия те же:
1. Создаете шаблон письма и вставляете в нужные места поля.
2. Создаете таблицу (базу) данных.
3. Запускаете слияние.
Anthrax_Beta
меня эта фича спасла в армии от монотонного заполнения документов.
yvm
Ох… Надеюсь это была совсем не секретная часть…
zoldaten Автор
да, по сути это «Слияние...» support.office.com/ru-ru/article/%D0%A1%D0%BB%D0%B8%D1%8F%D0%BD%D0%B8%D0%B5-%D1%81-%D0%B8%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%D0%BC-%D1%82%D0%B0%D0%B1%D0%BB%D0%B8%D1%86%D1%8B-excel-858c7d7f-5cc0-4ba1-9a7b-0a948fa3d7d3
Только шагов меньше.
bopoh13
Перечислю ещё раз проблемы слияния:
zoldaten Автор
Сделаю ремарку, что это не относится к программе в посте.