Всем привет, меня зовут Алина, я работаю системным аналитиком. Я не программист. Но в какой‑то момент на нашем проекте передо мной встала задача, которую вручную невозможно было решить в разумные сроки. Пришлось взять в руки VBA‑скрипты, нейросеть, немного упрямства и находчивости. Но обо всём по порядку…
Сначала был вызов
Наш проект — создание системы мониторинга уровня MES для энергокомплексов. Задача не сводится к тому, чтобы «просто нарисовать красивые схемы энергообъектов». Это цифровой диспетчерский щит, который в реальном времени показывает состояние и параметры оборудования: трансформаторов, разъединителей, выключателей (телеизмерения и телесигнализация). Система собирает данные с оборудования, но не напрямую: сначала они попадают в системы‑коллекторы, а уже оттуда — в нашу платформу. Ошибка здесь может привести к серьёзным последствиям для бизнеса и сотрудников на физических объектах. Если на схеме отображается неверное состояние участка сети, специалист может подойти к проводнику под высоким напряжением.

Срок выполнения проекта по контракту — полгода (вот такие современные темпы бизнеса!). Объём работ колоссальный: нужно автоматизировать не одну конкретную организацию, а целое ПАО, включающее 12 дочерних и зависимых обществ: две сотни мнемосхем, десятки тысяч объектов, сотни тысяч параметров.
«Обычные компании говорят: нереально. Мы же говорим: беремся, потому что знаем, что найдем способ решения».
Вот тут‑то я и решила придумать, как не утонуть в рутинной обработке такого объёма информации и подготовке решений.
Задача первая: объектная модель, генерация тэгов‑приёмников информации
Современные системы мониторинга уже не строятся на «тегах» напрямую, как раньше, а формируются на универсальной объектной модели. Это стройная иерархическая «ёлка», на которую потом вешаются «игрушки» в виде различного функционала.
Вот как выглядит иерархия объектной модели, которую мы построили, выделив основные сущности (упрощенный вид)
Объект вложен в помещение, помещение — в энергетический комплекс и так далее.
У каждого элемента объектной модели десятки атрибутов. Для некоторых атрибутов, данные по которым поступают от оборудования, генерируется уникальный тег — хранилище входного значения. В его имени закодированы вся иерархия и тип показателя.
Кроме того, потребовалось выстроить и внутреннюю топологию электрической сети — не просто структуру, а эмулятор реальной схемы с узлами и связями для отображения участков сети под напряжением. То есть модель должна была одновременно быть и иерархической, и топологической.
Почему вручную — это смерть
Платформа вендора, на базе которой мы работаем, позволяет компоновать объектную модель в интерфейсе — прямо в админке, с помощью множества полей, выпадающих списков и вкладок. Это похоже на сборку конструктора, где каждый кирпичик надо вручную выбрать, назвать, привязать.
Я записала видео, как выглядит этот процесс для одного объекта: клики, переходы, ввод текста, выбор родителя… Теперь представьте это для десятков тысяч объектов. При ручной работе здесь легко допустить множество ошибок.
Да, у каждой современной платформы есть функционал импорта/экспорта объектной модели через загрузочные файлы (Excel). Это ускоряет процесс «набивки» данных в платформу. Но ускорять загрузку таким образом — не новинка. Остался вопрос: как ускорить формирование самих файлов, чтобы не добавлять одни и те же строки вручную.
Вот тут я и решила: а что если автоматизировать генерацию этих файлов, чтобы человек заполнял только самую суть, а всё остальное доделывала машина?
Решение: макрос VBA для Excel + нейросеть = генератор файлов за 3 клика
Я сделала инструмент на основе макросов VBA в Excel. Человек вручную заполняет всего одну страницу — объектную модель схемы: указывает элементы в иерархическом порядке, их типы и топологические связи. Набор атрибутов для каждого элемента и справочные данные заполняются один раз для всей этой «утилиты». Никаких лишних полей — только самое важное.
Дальше — несколько нажатий кнопок, после которых инструмент:
-
генерирует полные и краткие наименования объектов по строгим правилам с учётом иерархической вложенности элемента;
-
формирует список тегов для необходимых атрибутов;
-
создает готовые файлы импорта в нужном формате платформы;
-
явные ошибки заполнения и логические несоответствия.
В итоге вместо дней ручного копирования и переименования — пара минут, а вместо целой команды — один аналитик.
Я покажу этот процесс на видео: вот объектная модель (заполнена ручками), вот сгенерированные теги, вот готовые файлы импорта. Для сравнения можно вернуться к предыдущей демонстрации заполнения объектной модели в интерфейсе платформы.
«Изнанка»: как выглядит код и как я его создавала
Напоминаю, я не программист. Весь код — семь модулей, в каждом в среднем по 700 строк VBA‑кода — я написала в паре с нейросетью. Но чтобы было понятно, что это не просто «нажала — и готово», покажу пару фрагментов.
Вот, например, фрагмент, который формирует название тега (просьба сильно не кидаться тапочками):
Public Function ТРАНСЛИТ(ТЕКСТ As String) As String
Dim Rus As Variant, Eng As Variant
Dim i As Long, j As Integer
Dim simb As String, simbtrans As String, MergeText As String
Dim words() As String, word As String, k As Long
ТЕКСТ = Replace(ТЕКСТ, " ", "-")
Do While InStr(ТЕКСТ, "Яч. ") > 0
i = InStr(ТЕКСТ, "Яч. ")
ТЕКСТ = Left(ТЕКСТ, i - 1) & "Cell" & Mid(ТЕКСТ, i + 4)
Loop
Do While InStr(ТЕКСТ, "Ввод-№") > 0
i = InStr(ТЕКСТ, "Ввод-№")
ТЕКСТ = Left(ТЕКСТ, i - 1) & "Vv" & Mid(ТЕКСТ, i + 6)
Loop
ТЕКСТ = Replace(ТЕКСТ, "Яч.", "Cell", 1, -1, vbTextCompare)
Rus = Array("а", "б", "в", "г", "д", "е", "ё", "ж", "з", "и", "й", "к", "л", "м", "н", "о", "п", "р", "с", "т", "у", "ф", "х", "ц", "ч", "ш", "щ", "ъ", "ы", "ь", "э", "ю", "я", _
"А", "Б", "В", "Г", "Д", "Е", "Ё", "Ж", "З", "И", "Й", "К", "Л", "М", "Н", "О", "П", "Р", "С", "Т", "У", "Ф", "Х", "Ц", "Ч", "Ш", "Щ", "Ъ", "Ы", "Ь", "Э", "Ю", "Я")
Eng = Array("a", "b", "v", "g", "d", "e", "jo", "zh", "z", "i", "j", "k", "l", "m", "n", "o", "p", "r", "s", "t", "u", "f", "kh", "ts", "ch", "sh", "sch", "'", "y", "", "e", "yu", "ya", _
"A", "B", "V", "G", "D", "E", "Jo", "Zh", "Z", "I", "J", "K", "L", "M", "N", "O", "P", "R", "S", "T", "U", "F", "Kh", "Ts", "Ch", "Sh", "Sch", "'", "Y", "", "E", "Yu", "Ya")
For i = 1 To Len(ТЕКСТ)
simb = Mid(ТЕКСТ, i, 1)
For j = 0 To 65
If Rus(j) = simb Then
simbtrans = Eng(j)
MergeText = MergeText & simbtrans
Exit For
End If
Next
If j > 65 Then MergeText = MergeText & simb
Next
words = Split(MergeText, "-")
MergeText = ""
For k = 0 To UBound(words)
word = words(k)
If Len(word) > 0 Then
Dim p As Integer
p = 1
Do While p <= Len(word) And IsNumeric(Mid(word, p, 1))
p = p + 1
Loop
If p <= Len(word) Then
MergeText = MergeText & Left(word, p - 1) & UCase(Mid(word, p, 1)) & LCase(Mid(word, p + 1))
Else
MergeText = MergeText & word
End If
End If
If k < UBound(words) Then MergeText = MergeText & "-"
Next k
ТРАНСЛИТ = MergeText
End Function
Выглядит просто, но именно из таких «кирпичиков» сложена вся логика: обход дерева, проверка типов, формирование строк, запись в файлы.
Важный момент, о котором хочется сказать честно: нейросеть пишет код не по правилам «хорошего тона». Она использует конструкции, которые опытный разработчик оформил бы иначе. Мой муж — программист и мастер своего дела — просмотрел код и, если выражаться приличными словами, сказал именно это. Но код работает, решает внутренние задачи проекта — и это главное.
Как я это сделала? Я чётко формулировала нейросети задачу (как истинный системный аналитик): «У меня есть лист с колонками A, B, C. Надо для каждой строки взять значения, объединить по правилу, записать в другой лист, если поле пустое — подсветить красным». Нейросеть выдавала код, я его прогоняла, смотрела на результат, при ошибках возвращалась с уточнениями.
Мои диалоги с нейросетью:
Тестирование проводилось «вручную» — прогоняла свои скрипты по составленным тест кейсам, если что‑то отрабатывало не ожидаемо — дальше «мучала» ИИшку.
Пару раз мы даже поругались. В процессе работы начинаешь забывать, что это машина, а не коллега. Но и с ней приходится выстраивать доброжелательную коммуникацию: чётко ставить задачу и заранее продумывать логику.
Так, шаг за шагом, мы вместе собрали рабочий инструмент.
Задача вторая: динамические линии на сотнях схем
Мнемосхема должна «ожить»: коммутационные элементы — менять положение в зависимости от приходящих сигналов, линии — менять цвет и стиль в зависимости от состояния участка сети. Есть напряжение — линия сплошная, цвета соответствующего класса напряжения (цвет устанавливается ГОСТом); нет напряжения — пунктирная, того же цвета; заземлено — жёлтая пунктирная. Оживление линий — задача, выходящая за рамки базовой функциональности платформы.
Линии на подготовленных ранее статических мнемосхемах (по сути, картинках) оживляет надстройка для Visio от вендора платформы. Надстройка умеет менять только цвет, но не штриховку. Поэтому технический руководитель, который курирует проект и продумывает основные решения, нашёл обходной путь: под каждой основной линией прячется дубликат‑пунктир. Логика:
-
есть напряжение → показываем основную (цветную), пунктир скрыт;
-
нет напряжения → скрываем основную, показываем пунктир;
-
заземлено → пунктир жёлтый.
Вручную настроить такую логику для сотен линий — значит для каждой открыть диалоговое окно, выбрать путь к атрибуту, задать условия и цвет. Это недели работы над каждой мнемосхемой (проще поменять работу).
Решение: макрос для Visio, который делает всё за один клик
Я написала в паре с нейросетью скрипт VBA для Visio. Выделяешь группу элементов (линии и точки), которые входят в узел — запускаешь макрос.
Узел — это «набор» проводников между элементами, которые могут поменять состояние участка сети (заземляющие ножи, выключатели, трансформаторы и так далее). Когда коммутационные элементы будут менять свое положение, состояние узла тоже будет меняться.
Что скрипт делает:
-
один раз за сеанс работы с документом запрашивает базовые параметры (к какому ДЗО относится мнемосхема, к какому месторождению и так далее);
-
при каждом запуске спрашивает наименование Узла (важно указывать то же самое, что и в объектной модели);
-
для каждой линии создаёт дубликат‑пунктир;
-
проставляет привязки к атрибутам и условия отображения;
-
применяет всё это к выделенной группе.
На выходе — мнемосхема, готовая к публикации в платформе. Меняется значение параметра коммутационного элемента — и линия мгновенно перерисовывается.
Примеры по данному кейсу для тех, кому интересно:
Результат
Генерация тегов и файлов импорта: занимала недели и месяцы → теперь занимает пару минут и три клика мышью.
Настройка динамики сотен линий: занимала недели и месяцы → теперь достаточно одного прогона скрипта для каждого узла, состоящего из нескольких линий и точек.
Всё сделано одним человеком (не программистом) за две недели вместо команды на полгода.
Главный вывод
Системное мышление и умение чётко формулировать задачу стоят не меньше, чем навыки программирования — особенно сейчас, когда нейросети позволяют переводить словесный алгоритм в код. Пусть он и не «товарного вида», но эффективно решает поставленную задачу.
Я не изобрела велосипед: функционал импорта/экспорта был, макросы VBA были, нейросети были. Но я объединила их в один рабочий поток, настроила под свою задачу и сильно ускорила работу.
Все говорят: «Лень — двигатель прогресса», и это абсолютная правда. Мне очень не хотелось заниматься рутиной — и тем более перекладывать её на коллег. В результате вместе с ИИ я написала рабочий код, выросла профессионально и теперь точно знаю: если задача на первый взгляд кажется нерешаемой, значит, вы просто ещё не нашли способ её автоматизировать. Не бойтесь потратить на это время — оно окупится с лихвой. Главное — не лениться думать.
Забирай стикерпак, если понравилась моя история.
Автор: Alinator3k


