Мы в МойОфис любим Lua. И сами активно его используем: в наших редакторах с помощью Lua работают макросы и надстройки. И помогаем разработчикам лучше узнать этот язык — при нашей поддержке вышли уже два издания классного учебника по Lua от Роберту Иерузалимски (кстати, сам автор считает, что этот язык в части задач даже более хорош, чем Си!)

А летом 2025 года мы выпустили целый трёхтомник по Lua. Первый том — новое издание книги Роберту. Второй и третий — вышедшие впервые учебники от Дмитрия Шульгина, старшего тренера по продуктам Учебного центра МойОфис.

В этой статье поделимся выдержкой из первого тома, введением в основы языка. А самых искушенных читателей в конце материала ждет «особое приглашение».

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

«Русскоязычных пособий по Lua катастрофически не хватает, хотя спрос на них высок. Наш трехтомник решает эту проблему», — Дмитрий Шульгин, старший тренер по продуктам Учебного центра МойОфис.

Чтобы начать выполнять задания из трёхтомника и создавать макрокоманды в редакторах МойОфис, можно установить бесплатную версию «МойОфис Стандартный. Домашняя версия».

Занятие 1. Введение в разработку макрокоманд.

В ходе занятия вы:

  • Узнаете зачем нужны макрокоманды и особенности их использования в редакторах МойОфис.

  • Познакомитесь с возможностями встроенного редактора макрокоманд: создавать, удалять и переименовывать макрокоманды.

  • Запустите первую макрокоманду на Lua в приложении МойОфис.

Содержание занятия:

1.1. Что такое макрокоманды и почему на языке Lua.

1.2. Обзор редактора макрокоманд в МойОфис.

1.3. Запуск простой макрокоманды.

1.1. Что такое макрокоманды и почему на языке Lua

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

Чтобы ускорить работу пользователей, разработчики редакторов создали множество инструментов, позволяющих выполнить сразу несколько операций с выбранными объектами – например, в текстовых редакторах с помощью стилей можно сразу изменить настройки шрифта и абзаца, во всех редакторах с помощью «кисточки» быстро перенести форматирование с одного объекта на другой, в табличном редакторе – автоматически применять форматирование к новым строкам.

Но что делать, если одну и ту же последовательность действий необходимо выполнить на нескольких листах в табличном документе? Или даже выполнить действия с несколькими разными объектами? Для этого придуманы макрокоманды (дословно – команды, которые позволяют выполнить несколько простых команд).

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

  • Автоматизировать форматирование текста.

  • Проверить корректность данных.

  • Отредактировать документ, заменить одни данные на другие.

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

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

  • простой синтаксис, что обеспечивает быстрый старт.

  • хранение программ в виде текста, что упрощает изучение, отладку и контроль работы макросов. 

  • выполнение программ с использованием интерпретатора (специальной программы, переводящей код в действия только при непосредственном вызове), что позволяет выполнять макросы по отдельности.

В редакторах МойОфис разработка макрокоманд ведется на языке программирования Lua, который не только является скриптовым языком программирования, но и обеспечивает дополнительные возможности:

  • Макросы одинаково работают в настольных редакторах МойОфис для ОС, Linux, для ОС Windows и в веб-редакторах.

  • Не требует покупки дополнительного ПО или специальных лицензий для работы.

  • Допускает подключение внешних модулей для расширения функциональных возможностей — так реализован доступ к объектам в документе.

Для создания макрокоманд в редакторах МойОфис можно использовать встроенные средства программирования или специальную функцию «Запись макрокоманды», которая фиксирует действия пользователя и сохраняет в виде программы.

Справочно о Lua

Язык Lua разработан в 1993 году, как средство программирования для пользователей, не являющихся профессиональными программистами. Малый размер интерпретатора, относительно высокая скорость исполнения и легкая расширяемость позволили этому языку найти применение в сфере разработки компьютерных игр. В 2003 году Lua был признан самым популярным скриптовым языком для разработки игр по версии сообщества GameDev.net. Также Lua активно используется для написания расширений и плагинов к программным продуктам, при создании пользовательских интерфейсов и в конфигурационных файлах. 

Таким образом, язык Lua – интерпретируемый язык, созданный специально для непрограммистов, прост в освоении и платформонезависимый, а также давно зарекомендовал себя на мировом рынке как эффективный скриптовый язык.

1.2. Обзор редактора макрокоманд в МойОфис

Диалоговое окно «Редактирование макроса» открывает доступ к редактору макрокоманд, с помощью которого пользователь создает и запускает макрокоманду.

Запустите приложение «МойОфис Текст», затем в командном меню выберите пункт «Инструменты» и «Редактирование макроса».

Окно приложения «МойОфис Текст»
Окно приложения «МойОфис Текст»

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

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

Окно редактора макрокоманд
Окно редактора макрокоманд

Окно редактора макрокоманд состоит из областей:

  1. Перечень созданных в документе макрокоманд.

  2. Кнопки для создания и удаления макрокоманд.

  3. Область ввода текста макрокоманд.

  4. Кнопки выполнения и отладки макрокоманд.

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

Рассмотрим эти области подробнее.

1.2.1 Перечень макрокоманд в документе

Перечень представляет собой список макрокоманд в открытом документе. Вновь созданный документ не содержит макрокоманд. Если в перечне содержится несколько макрокоманд, переход между ними выполняется с помощью щелчка мыши по названию макроса, активная макрокоманда в перечне подсвечивается.

1.2.2 Кнопки для создания и удаления макрокоманд

Для добавления новой макрокоманды необходимо нажать кнопку с изображением знака «+». После её нажатия, в перечне появится новый пункт под названием «Без имени». В области ввода текста макрокоманды (область 3) появится надпись: «Введите новый скрипт здесь».

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

Чтобы удалить макрокоманду, необходимо выделить ее и нажать кнопку с изображением знака «-» внизу списка макрокоманд.

Панель со списком макрокоманд в окне редактора макрокоманд
Панель со списком макрокоманд в окне редактора макрокоманд

1.2.3 Область ввода текста макрокоманды

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

Область ввода макрокоманды в окне редактора макрокоманд
Область ввода макрокоманды в окне редактора макрокоманд

Область ввода поддерживает операции копировать (Ctrl+C), вырезать (Ctrl+X), вставить (Ctrl+V) через буфер обмена и операцию отмены последнего действия (Ctrl+Z). Для ввода кода макрокоманды необходимо создать и назвать ее, а затем набрать код макроса в области 3. Чтобы редактировать макрокоманду, необходимо выбрать ее в перечне макрокоманд и внести изменения в ее текст в области 3.

1.2.4 Кнопки выполнения и отладки макрокоманд

Кнопки для выполнения и отладки становятся активными, изменяя цвет, после ввода текста макрокоманд в области 3. Чтобы выполнить код макрокоманды, необходимо нажать кнопку «Выполнить» (). Результат или статус выполнения макрокоманды отображается в области вывода результата выполнения макрокоманд (область 5 на рисунке 2). Макрокоманды также можно запускать, не открывая редактор. Для этого необходимо открыть список макросов, нажав на иконку «Макрокоманды» на правой боковой панели. Далее выбрать из списка макрос и нажать кнопку «Выполнить» (см. рисунок 5). Произойдет выполнение макроса без открытия редактора. Появится всплывающее сообщение «Макрокоманда выполнена».

Запуск макроса из списка на правой панели редактора
Запуск макроса из списка на правой панели редактора

При написании кода могут возникать ошибки. Помочь их выявить и локализовать может процесс отладки кода. Подробнее процесс отладки будет рассмотрен в занятии «Отладка кода макрокоманд».

1.2.5 Область вывода результата исполнения макрокоманды и процесса отладки

Область вывода результата также называется консоль. В консоль выводятся любые значения, которые пользователь может напечатать с помощью функции print(). После нажатия кнопки «Выполнить» начинается выполнение исходного кода макрокоманды. Когда в исходном коде встречается вызов функции print, происходит немедленный вывод на печать значения функции. Например, выражение

print("МойОфис!")

приведет к тому, что в консоли будет напечатан текст МойОфис!

Консоль редактора макрокоманд
Консоль редактора макрокоманд

Если в консоли есть результат выполнения макроса, то в правом верхнем углу появляется кнопка «Очистить». Нажатие на эту кнопку очищает консоль (удаляет ее содержимое), не затрагивая код макрокоманды. Также в область результата выводится информация о выполнении макрокоманды. Если макрос выполнен успешно, то в консоль будет выведена информация «Макрос выполнен успешно». Если предполагается, что код макроса вносит изменения в документ без вывода в консоль, то результаты макроса можно будет увидеть в самом файле после закрытия окна редактирования. При выполнении процесса отладки в области вывода результатов отображаются дополнительные поля, содержащие информацию о процессе выполнения команд кода. О них подробнее будет рассказано в следующих занятиях.

1.3. Запуск простой макрокоманды

Теперь давайте создадим первую макрокоманду и запустим ее. В окне редактирования макросов нажмите на кнопку «+» в перечне макрокоманд. В качестве имени макрокоманды укажем слово «Привет». В области ввода текста макрокоманды введем следующий текст:

print("Привет, МойОфис!")

Нажмем кнопку «Выполнить» для запуска макрокоманды. В консоли будет напечатан текст:

Привет, МойОфис!

Закроем окно редактора макрокоманд, нажав крестик в правом верхнем углу окна. Сохраним изменения (мы ведь создали макрокоманду!) в открытом документе нажатием кнопки «Сохранить» на панели команд или с помощью комбинации клавиш Ctrl+S. В качестве имени документа укажем «Макрокоманда-1».

Мы создали и выполнили первую макрокоманду, используя стандартную функцию print() языка программирования Lua. Функция print() предназначена для печати значения, переданного в качестве аргумента функции, то есть между круглых скобок (). Аргументом команды могут быть как текст, так и числа, переменные или целые выражения. Текст в качестве аргумента всегда пишется в кавычках, числа и переменные — без кавычек. Пример использования команды print() с различными аргументами:

Ввод в окне редактора макрокоманд

print( 8 )

print("Фрукты: Яблоки, Груши, Апельсины")

print( 2 + 2 + 2 )

Результат в консоли после нажатия кнопки «Выполнить»

> 8

> Фрукты: Яблоки, Груши, Апельсины

> 6

На следующем занятии будет рассмотрено более подробно, что называют переменными и с какими типами данных работает язык Lua. Для закрепления пройденного материала ответьте на вопросы и выполните практические задания в конце данного занятия.

Контрольные вопросы и задания

  1. В каких ситуациях рационально использовать макрокоманды?

  2. Чем обоснован выбор языка программирования Lua для написания макросов?

  3. Как запустить окно редактирование макросов в редакторах МойОфис?

  4. Наберите коды макрокоманд из примеров в редакторе макрокоманд. Попробуйте ввести свои данные в код и выполнить его.

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

И конечно, приглашаем вас ознакомиться с нашими вакансиями. Тем более что в наших продуктах можно пощупать разработку на Lua изнутри :)

Комментарии (27)


  1. Surrogate
    02.10.2025 15:41

    А летом 2025 года мы выпустили целый трёхтомник по Lua.

    А где эти книги можно купить или скачать?

    Также мы проводим специальный обучающий курс по Lua

    В разделе Программа курса, если кликать по плюсикам (просмотр разделов курса) не видно подробностей!


    1. pvpokr Автор
      02.10.2025 15:41

      добрый день!

      https://dmkpress.com/catalog/computer/programming/978-5-93700-427-7/
      и
      https://dmkpress.com/content/authors/8668961/

      по программе все и правда куда-то пропало :-/
      починим, спасибо


      1. Surrogate
        02.10.2025 15:41

        Спасибо, за ссылки!


        1. pvpokr Автор
          02.10.2025 15:41

          спасибо, что читаете :)


          1. Surrogate
            02.10.2025 15:41

            Месяц назад меня звали в одну контору на проект: нужно было для ВТБ, переписать на Lua, то что у них было написано на VBA в Excel!

            Хочу посмотреть, что за зверь Lua? Много ли я потерял, что отказался от проекта :)


      1. stmirage
        02.10.2025 15:41

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

        Почему был выбран этот вариант, а не выпустить на русском четвертое издание, тоже уже 9 лет как есть на английском? https://www.amazon.com/Programming-Lua-Fourth-Roberto-Ierusalimschy/dp/8590379868


        1. pvpokr Автор
          02.10.2025 15:41

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

          Что касается 4го издания, то да, есть такой вариант, если будет соответствующий широкий запрос у сообщества. Роберту, как мы полагаем, тоже будет только рад :)


  1. AuToMaton
    02.10.2025 15:41

    Круто. Курс, трёхтомник…

    Всегда считал, что пользовательская Lua изучается за вечер двумя путями на выбор - либо распоследний вариант прочтением доков, либо самый нужный вариант открытием Neovim. И даже приводил её в пример когда спрашивали как вкатиться в IT. Больше не буду - (мои) знания в IT действительно устаревают на глазах.


    1. TheNormalnij
      02.10.2025 15:41

      На самом деле 1-2 дня нужно потратить только на то, чтобы изучить сам синтаксис языка. Большую сложность представляет платформа, на которой Lua работает. Каждая платформа с которой я встречался, имела разные подходы к проектированию. Даже импортирование дополнительных Lua скриптов могло быть выполнено по-разному.

      Под сам язык руководств достаточно даже на русском.


    1. Groh
      02.10.2025 15:41

      VBA тоже тема огромная, но основы можно довольно быстро самому уяснить


      1. Surrogate
        02.10.2025 15:41

        в МойОфис объектная модель беднее MS Office по самый оптимистическим оценкам на 2 порядка…


  1. ivanopulos
    02.10.2025 15:41

    Вы хотите, чтобы пользователи переходили на ваш Офис, но курсы по макросам мы им будем продвать за деньги?

    Удачи, ребята!

    З.Ы. Mailion уже профукали...


    1. pvpokr Автор
      02.10.2025 15:41

      багодарю за комментарий, но сожалею, что вы как-то недостаточно внимательно читали
      1. по макросам -- бесплатный вебинар
      2. за деньги -- КУРС по Lua

      а Mailion -- единственное в своем роде сертифицированное ФСТЭК ПО
      у меня всё, всех вам благ! :)


  1. asmailiks
    02.10.2025 15:41

    А можно ссылку на цитату Роберту Иерузалимски в начале статьи?


    1. pvpokr Автор
      02.10.2025 15:41

      про то, что Луа для ряда задач лучше Си?
      вот пдфка со стартовыми страницами; 2й абзац введения


      1. asmailiks
        02.10.2025 15:41

        Нет про то, где он пишет про МойОфис)

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


        1. pvpokr Автор
          02.10.2025 15:41

          ух ты, вы серьезно)?
          а будет предположение, что мы его книгу без его ведома издали)))?

          не, если у вас правда сомнения -- вы скажите прямым текстом)
          а фотку счастливого автора с его книгой, тоже надо? )


          1. asmailiks
            02.10.2025 15:41

            Насчет книги я ничего не писал) Цитата как то сразу заинтересовала )


            1. pvpokr Автор
              02.10.2025 15:41

              ОК)?


              1. asmailiks
                02.10.2025 15:41

                Спасибо!)


        1. VADemon
          02.10.2025 15:41

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

          Sol:

          The main task of the interpreter was to read a description, to check whether the given objects and attributes were correctly typed, and then to present the information to the main program. To allow this communication between the main program and the interpreter, the latter was implemented as a C library, linked to the main program. Thus, the main program could access all configuration information through an API in this library.

          Lua:

          Finally, the implementation of the new language should be highly portable.

          The portability requirement turned out to be one of its main strengths: Those two applications should be fully portable, and so should the language. The state-owned PETROBRAS could not choose specific hardware because it could only purchase equipment under very strict rules for spending public money. PETROBRAS thus had a very diverse collection of computers

          At that point, we could have adopted an existing language, instead of creating a new one. The main contenders were Tcl [25] and, far behind, Forth [26] and Perl [30]. Perl is not an extension language. In 1993, Tcl and Perl ran only on Unix platforms.

          Lua also inherited from Sol the concept of being implemented as a library. The implementation followed a tenet now supported by Extreme Programming: "the simplest thing that could possibly work"

          Since the beginning, we designed Lua as an extension language, in the sense that C programs can register their own functions to be called from Lua transparently. In this way, it is easy to extend Lua with domain-specific primitives, so that the end user uses a language tailored to her needs.

          https://www.lua.org/history.html


  1. badsynt
    02.10.2025 15:41

    Мы в МойОфис любим Lua.

    Как люди не случайные и разбирающиеся в предмете, не могли бы Вы ответить на один вопрос.

    Как известно Lua 5.0 вышел в 2003г. Выйдет ли Lua 6.0? Или будет как с Perl на этих же самых, как оказалось опасных, цифрах?


    1. VADemon
      02.10.2025 15:41

      Для своей ниши Lua стабилен. Roberto минималист сишной закалки, то не ясно, будет ли он вносить большие изменения в язык или нет. Версии 4.0 и 5.0 привнесли большие изменения:

      Lua version 4

      Until version 3.2, only one Lua "state" could be active at a time. We did have an API function to change the state, but it was a little awkward to use. For simplicity, when we designed the API, we did not include an explicit state parameter in the functions – there was single, global state. In retrospect, that was a mistake. https://www.lua.org/history.html

      https://www.lua.org/versions.html#5.0

      А чисел бояться не надо. Что за суеверие? ;)


    1. domix32
      02.10.2025 15:41

      Тут скорее вопрос - а зачем? Уже сейчас имеется заметная фрагментация несовместимых версий языка. Каких ещё фич ему не хватает для полного счастья? Для остального есть альтернативные компиляторы/интерпретаторы языка, которые в том числе включают и нестандартные расширения.


  1. ZloyRabadaber
    02.10.2025 15:41

    В заголовке основы Lua, а в статье руководство программиста продукта.

    Или слово стек в заголовке имеет ввиду стек программного продукта компании? Кликбейт?


  1. Hesed
    02.10.2025 15:41

    Недавно пришлось искать утечку памяти в крайне отбитом на все байты lua скрипте в haproxy. Кастомный скрипт проверял специфические поля в сертификатах и потихоньку утекал. До этого lua использовал в скриптовании логики NPC в фановых игровых проектах, а тут такое. Столкнулся с тем, что нет единого удобного подхода к написанию юнит-тестов. Я понимаю, что язык немного про другое, но из-за портативности его куда только не запихивают.


  1. domix32
    02.10.2025 15:41

    забавно у вас конечно страницы курса верстают. А может не только его.

    Но самого главного не увидел - а где собственно ссылка на документацию с API для взаимодействия? Кажется это крайне необходимая вещь. Неужели где-то за пейволом?