Перенос VBA-макросов в Р7-Офис: почему простой замены кода недостаточно

от автора

Многие компании в России за последние пару лет перешли с Microsoft Office на отечественный Р7-Офис. Документы открываются, интерфейс в целом знаком пользователям и, казалось бы, что ещё нужно? Однако довольно быстро обнаруживается, что часть привычных операций перестаёт работать. И причина часто находится не в самих документах, а в макросах, которые годами автоматизировали рутинные процессы.

Мы тоже столкнулись с этой проблемой и решили создать для нее инновационное решение. Рассказываем, как это было и почему простой заменой кода здесь не обойтись.

Почему после замены офисного пакета могут перестать работать привычные процессы

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

Поэтому, при переходе на новое ПО, важно оценивать не только совместимость документов, но и совместимость автоматизированных сценариев

Макросы — незаметная часть корпоративной инфраструктуры

Если спросить руководителя, что в компании автоматизировано, он, скорее всего, перечислит 1С, CRM-систему и прочее дорогое ПО. Но в большинстве организаций VBA-макросы фактически выполняют роль небольших информационных систем. Они могут быть написаны много лет назад, постепенно дорабатываться разными сотрудниками и не иметь никакой документации.

Сотрудник нажимает одну кнопку и получает готовый отчёт. За этой кнопкой могут находиться несколько тысяч строк VBA-кода, десятки листов, внешние файлы и запросы к базе данных. И когда приходит время переходить на Р7-Офис, выясняется, что вся эта автоматизация перестаёт работать.

Почему VBA-код не запускается в Р7-Офис

Тут всё просто. Microsoft Office использует язык программирования VBA и собственную объектную модель для работы с документами. В Р7-Офис для автоматизации используется язык программирования JavaScript.

Синтаксис, конструкции и сама объектная модель в этих языках принципиально различаются. Поэтому код, написанный для Microsoft Office, в Р7 просто не будет работать, он либо выдаст ошибку, либо выполнится с непредсказуемым результатом.  Дело не в том, что одна система хуже, а другая лучше. Просто они по сути говорят на разных языках. Задача состоит не в переводе строк кода, а в переносе смысла: что макрос должен сделать с документом, какие данные обработать и какой результат получить.

Какие элементы переносятся относительно легко

Относительно простые случаи можно конвертировать без особых проблем. К ним относится базовая работа с ячейками, чтение и запись значений, перебор строк и столбцов, простые циклы и условия, математические операции и работа с отдельными листами.

Например, типовой VBA-макрос суммирует значения из трёх диапазонов и записывает результат в нужные ячейки. После конвертации в JavaScript код остаётся понятным и сохраняет структуру.

Но на практике, нам требуется гораздо больше функций, чтобы работа шла легко и быстро. Когда нужно быстро составить бухгалтерский баланс, макрос на сумму значений по столбцам нам мало чем поможет.

Где начинаются основные проблемы

Итак, вы уже приняли решение о переходе на Р7-Офис, и вот, что вас ждет:

1.Несовпадение объектных моделей. Одни и те же действия в Microsoft Excel и Р7-Офис выполняются разными методами. Некоторые функции могут отсутствовать или иметь ограничения. Часть команд можно заменить напрямую, часть требует обходного решения, а часть- изменения логики работы макроса.

2.Работа с внешними приложениями. Макросы, взаимодействующие с внешними системами, представляют отдельный класс сложности.  Например те, которые контактируют с Outlook, Word, COM-объектами, вызовом внешних исполняемых программ, работой с файловой системой и сетевыми каталогами.

3.Пользовательские формы. Конструкция VBA UserForm не имеет прямого аналога в JavaScript-среде Р7-Офис. Воспроизведение интерфейсов форм требует использования плагинов и веб-технологий для реализации аналогичной функциональности.

4. Обработчики событий. События открытия книги, изменения ячейки, нажатия кнопки или сохранения документа могут отличаться по способу реализации.

5.Недокументированная бизнес-логика. Отдельную проблему представляет полное или частичное отсутствие документации по бизнес-логике макросов. В процессе длительной эксплуатации в код вносились изменения разными разработчиками и часть логики реализована без формального описания требований. При конвертации важно понимать, как именно работал старый макрос.

При миграции важно суметь не только восстановить старые макросы, но и иметь возможность их усовершенствовать.

Как правильно подготовить макросы к миграции

Перед тем как начинать процесс конвертации, стоит выполнить несколько простых шагов:

-собрать все файлы с макросами;

-удалить дубликаты;

-определить владельца процесса;

-согласовать критерии приемки.

Это может показаться очевидным, но на практике именно этот этап часто пропускают, что приводит к путанице и потерям времени.

В сложных случаях перенос макроса становится поводом привести в порядок старую автоматизацию: убрать дубли, описать правила расчёта и зафиксировать ответственных за процесс.

Автоматизированная конвертация

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

Заказчик передает нам все имеющиеся данные по макросам, которые необходимо конвертировать. Разработка идет полностью на нашей стороне, мы не просто загоняем код в нейросеть, а отрабатываем его вручную, чтобы в Р7-Офис не возникли затем сложности. На выходе заказчик получает быстрый и полностью соответствующий ожиданиям результат.

Пример преобразования реального макроса и результаты

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

If i < 1 Or i > 6 Then MsgBox i & "   - Номер не корректен ": Exit SubActiveWorkbook.Sheets("Увязки").Range("I1") = itblList = "Таблица " & i     'Windows(tblList).ActivateApplication.GoTo Worksheets(tblList).Range("B12")If i < 6 Then    With Worksheets(tblList)        ttt = .Cells(.Rows.Count, 1).End(xlUp).Row    End With    If ttt < 12 Then ttt = 12    For j = 0 To 32000        If 0 = Worksheets(tblList).Cells(ttt + j, 2).Borders.Color Then ttt = ttt + j: Exit For    NextEnd IfSelect Case iCase 1: Set r = Worksheets(tblList).Range("B12:K" & ttt) 'Case 2: Set r = Worksheets(tblList).Range("B12:F" & ttt)Case 3: Set r = Worksheets(tblList).Range("B12:F" & ttt)

И вот как выглядит итоговый код:

Api.GetSheet("Увязки").GetRange("I1").SetValue(i);tblList = "Таблица " + i;// TODO_UNRESOLVED: FORBIDDEN_APPLICATION | VBA: Application.GoTo Worksheets(tblList).Range("B12")if (i < 6) {    // WITH Worksheets(tblList)    // TODO_UNRESOLVED: TODO_UNRESOLVED_LASTROW | VBA: ttt = Worksheets(tblList).Cells(Worksheets(tblList).Rows.Count, 1)Worksheets(tblList).End(xlUp)Worksheets    // END WITH    if (ttt < 12) {        ttt = 12;    }    for (var j = 0; j <= 32000; j += 1) {        if (0 == __getRange(Api.GetSheet(tblList), __cellA1(ttt + j, 2)).Borders.Color) {            ttt = ttt + j;            break;        }    }}switch (i) {    case 1:        r = __getRange(Api.GetSheet(tblList), "B12:K" + ttt);        break;    case 2:        r = __getRange(Api.GetSheet(tblList), "B12:F" + ttt);        break;    case 3:        r = __getRange(Api.GetSheet(tblList), "B12:F" + ttt);        break;    case 4:

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

Безопасность

Наша разработка полностью отечественная, и решение располагается на защищённых российских серверах с многоуровневой системой защиты и контролем доступа, например Selectel, HOSTKEY, DDoS-Guard. Можно так же развернуть решение на мощностях компании-заказчика.

Немаловажно, что вся работа с данными соответствует требованиям российского законодательства.

Итог

Переход на отечественное ПО – процесс не из легких. Вопрос лишь в том, станет ли он для вашей компании болезненным или планомерным.

Мы предлагаем провести тестирование: загрузите тестовый файл с макросом, и мы покажем, как работает первичный анализ: какие зависимости будут найдены, какие участки можно перенести автоматически и где потребуется экспертная доработка.

Тестирование можно провести по ссылке: https://vbatojs.ru/

Мы развиваемся, и будем рады конструктивной и честной обратной связи, для того чтобы стать лучше.

Если ваша компания столкнулась с трудностями при импортозамещении и переходе на Р7-Офис, от конвертации макросов до интеграции, настройки и адаптации рабочих процессов, свяжитесь с нами. Мы комплексно проанализируем вашу задачу и разработаем решение, которое сделает переход безопасным, быстрым и максимально комфортным для бизнеса.

Контакты для связи:
Тел.: +7(923) 426-72-77
Тг: @sibtech_tomsk
Email: sibtech_tomsk@mail.ru

ссылка на оригинал статьи https://habr.com/ru/articles/1051708/