Привет, Хабр! Меня зовут Илья Кербатов, я старший консультант в компании «ДАР» (ГК «КОРУС Консалтинг»). В прошлой статье я разобрал, как с помощью ИИ ускорил KPI-панель Qlik Sense. В этот раз кейс другой: странный баг с переменными, который сам по себе оказался редким, но привел к созданию небольшого набора инструментов для аудита приложений. Собрать его получилось за несколько промптов, и это сильно сэкономило время.

Странный баг

Все началось с необычного поведения в одном из приложений. После частичной перезагрузки (partial reload) часть переменных переставала отдавать вычисленное значение. В скрипте при перезагрузке переменные не переопределялись, их определение наследовалось с прошлой полной перезагрузки (full reload). На листах вместо результата было пусто.

Баг переменной
Баг переменной

Самым странным был способ «лечения». Стоило открыть проблемную переменную в редакторе и закрыть окно без единого изменения, как значение тут же появлялось и дальше считалось корректно. Тот же эффект давало переопределение значения в скрипте при частичной перезагрузке. Проблема была не в самих формулах, а в том, как движок Qlik Sense вычислял или кэшировал эти переменные после частичной перезагрузки.

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

Что нужно было собрать

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

Способов получить метаданные приложения несколько. Я начал их перебирать.

Поиск решения

У заказчика был установлен QsAppMetadataConnector, но он не работал, решил не тратить время на анализ причин и искать более простой путь.

Далее попробовал штатный Engine API Explorer, который идет в комплекте с Qlik Sense. Через него можно подключиться к движку и вызывать методы вручную, в формате удобного «конструктора» запросов.

Engine API Explorer: подключение к движку и вызов методов по одной переменной
Engine API Explorer: подключение к движку и вызов методов по одной переменной

Проблема в том, что для полной метаинформации по каждой переменной нужно делать отдельные вызовы: получить хэндл переменной, GetProperties, GetLayout, GetInfo. Для одной переменной это секунды. Для сотен переменных в десятках приложений — бессмысленная ручная работа. Нужна была автоматизация.

Решение: Engine API по WebSocket

Engine API доступен напрямую по WebSocket в формате JSON-RPC. Один скрипт может за один проход открыть приложение, забрать список всех переменных и по каждой вытащить нужные методы. Дальше остается сохранить результат в файл.

Чтобы открыть WebSocket к движку из браузера, пришлось снять одну проверку безопасности. По умолчанию прокси Qlik Sense проверяет CSRF-токен при установке WebSocket-соединения. На стороне заказчика через поддержку в файле Proxy.exe.config (папка C:\Program Files\Qlik\Sense\Proxy\) параметр WebSocketCSWSHCheckEnabled был переключён в false (Статья на этот счет). Далее нужно проверить доступность через WebSocket Connectivity Tester.

Описание: Qlik Sense WebSocket Connectivity Tester - Page 3 - Qlik Community - 1716909
Проверка соединения через WebSocket Connectivity Tester

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

Как запускали

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

Отладка кода
Отладка кода

Запускал код через консоль Chrome DevTools. По умолчанию консоль не дает вставлять код из буфера в целях безопасности, поэтому сначала нужно один раз разрешить вставку (allow pasting). Дальше остается подставить в скрипт AppID нужного приложения. Его видно прямо в адресной строке браузера при открытии приложения.

После нескольких итераций получился рабочий скрипт. Он подключается к движку, открывает приложение методом OpenDoc, получает список переменных через GetVariables, а затем по каждой переменной вызывает GetProperties, GetLayout и GetInfo. Все собранное складывает в два файла: JSON с полной структурой и CSV для быстрого просмотра в таблице. В CSV попадает имя переменной, ее определение, вычисленный текст и число, теги, даты создания, изменения и прочая информация.

Ответ в виде JS-скрипта из чата с ИИ
Ответ в виде JS-скрипта из чата с ИИ

Анализ в Qlik Sense

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

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

Вывод

Сам баг оказался редким и «лечился» пересозданием переменных. Но более удивительным результатом стал опыт создания инструмента для проведения анализа всех приложений. Раньше на разбор документации по API и тонкостей WebSocket-подключения ушло бы несколько дней, а теперь весь путь от анализа найденного бага до исправления списка «сломанных» переменных занял часы.

Вывод для меня тот же, что и в прошлый раз. Умение поставить задачу нейросети и проверить ее результат постепенно становится обычным рабочим навыком инженера наравне со знанием SQL и скриптов загрузки. С такой связкой даже узкая диагностическая задача в закрытой корпоративной среде решается в течение разумного времени без недель чтения документации.