Исполняем обязанности по получению сведений о своих бенефициарных владельцах


Небольшая вводная


Начиная с 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)


  1. vin2809
    18.06.2019 13:12
    +1

    Все это, конечно, хорошо… Но чем вас не устраивает стандартный режим «Слияние», существующий в MS WORD?

    Действия те же:
    1. Создаете шаблон письма и вставляете в нужные места поля.
    2. Создаете таблицу (базу) данных.
    3. Запускаете слияние.


    1. Anthrax_Beta
      18.06.2019 13:29

      меня эта фича спасла в армии от монотонного заполнения документов.


      1. yvm
        18.06.2019 16:43

        Ох… Надеюсь это была совсем не секретная часть…



    1. bopoh13
      18.06.2019 16:00

      Перечислю ещё раз проблемы слияния:

      1. Расположение книги менять нельзя (иначе придётся заново связывать документ)
      2. По сети не комфортно работать более чем одному юзеру (т. к. будет занята книга)
      3. В поле с датой не должно быть записей с текстом (иначе отображаться будет целое число)
      4. Периодически слетают связи (особенно, если применяете к полям фильтры)
      5. В поля слияния нельзя вставить неразрывный пробел и дефис — chr(160) и chr(30)
      6. Как итог: обновление множества документов превращается в боль


      1. zoldaten Автор
        18.06.2019 22:04

        Сделаю ремарку, что это не относится к программе в посте.


  1. danilovmy
    18.06.2019 22:13

    А почему не использовался макрос документа Word?


    1. zoldaten Автор
      19.06.2019 09:21

      Потому что использовался python. Вы можете изложить свое решение.


      1. danilovmy
        21.06.2019 01:42

        Изложил. Настойчиво рекомендую почитать о VBA, он явно потерял популярность после перехода на .net, но его возможностей более, чем достаточно для описанных тобою запросов по автоматизации. Мое решение работает по сети, с одновременным редактированием, на любой машине где стоит ворд или опенворд (макросы в опенворде тоже работают).

        Я немного знаю питон, т.к. являюсь ведущим разработчиком компании пищущей софт на питоне, а это тот еще изврат. Меня всегда удивляет и удивляла ненужность решений на питоне (яве, бейсике… любой другой язык) там, где это не нужно.


  1. nikoloza
    20.06.2019 19:42

    А как насчет экспорта в PDF?


    1. danilovmy
      21.06.2019 01:28

      nikoloza, автор статьи походу вообще не разбирается в 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 без Питона. Как тебе такое Илон Маск?