--- title: GetComponentData, GetMacroData и GetWareData summary: Как выбирать объект запроса, читать несколько свойств и сохранять порядок результатов Lua. section: ui kind: guide status: reference updated: 2026-10-27 tags: ["GetComponentData","GetMacroData","GetWareData","Lua","типы"] sources: ["https://chemodun.github.io/x4/modding-support/ui-modding/lua-globals/","https://www.lua.org/manual/5.1/manual.html","https://github.com/chemodun/X4-LuaLSAddon"] --- ## Выберите правильный идентификатор | Функция | Первый аргумент | Результат | | --- | --- | --- | | `GetComponentData(component, ...)` | Handle существующего компонента в UI | Одно значение на каждый ключ | | `GetMacroData(macro, ...)` | `string`: имя macro-шаблона | Одно значение на каждый ключ | | `GetWareData(wareID, ...)` | `string`: ID товара | Одно значение на каждый ключ | Это функции UI Lua X4, не стандартной Lua и не MD. Указатель C, имя macro и ware ID не взаимозаменяемы. Набор допустимых ключей зависит от функции и версии игры. Регистр значим: у товара встречается `groupName`, а не `groupname`. Полный перечень ключей есть в карточках первоисточника. Карточки вызовов: [GetComponentData](wiki:api-lua-getcomponentdata-466ba6e8), [GetMacroData](wiki:api-lua-getmacrodata-53e483cc), [GetWareData](wiki:api-lua-getwaredata-e67f517f). ## Пример чтения товара В работающем addon-контексте X4: ```lua local wareName, volume = GetWareData("energycells", "name", "volume") if type(wareName) == "string" and type(volume) == "number" then DebugError("[WIKI] ware=" .. wareName .. "; volume=" .. tostring(volume)) end ``` **Что произойдёт:** первый результат попадёт в `wareName`, второй в `volume`. При указанных типах появится диагностическая строка с локализованным названием и прочитанным объёмом. Точные значения зависят от данных игры и модов; фиксированное название или число здесь не обещается. Общий контракт - `any, ...`, потому что тип определяется ключом. Для приведённого запроса ожидаются `string` и `number`; это не превращает результаты любого другого ключа в те же типы. Неизвестный ключ может дать `nil` в своей позиции и сообщение движка. ## Несколько значений не являются таблицей Самостоятельный пример чистой Lua, без игры: ```lua local function sample() return "Demo", nil, 4 end local title, missing, amount = sample() local first = sample() ``` **Значения:** `title == "Demo"`, `missing == nil`, `amount == 4`, `first == "Demo"`. Несколько переменных сохраняют позиции. Одна переменная принимает первый результат. Список в `{...}` с промежуточным `nil` не следует перебирать через `ipairs` как плотный массив. ## Практическое продолжение Для компонента сначала установите источник корректного UI handle и его срок жизни. Для macro не нужен живой экземпляр, но нужно действительное имя шаблона. Сверяйте ключи и версию, проверяйте тип перед арифметикой или форматированием. Наши примеры не запускались в игре; результаты исследований автора не выдаются за нашу проверку. Подсказки редактора: [X4-LuaLSAddon](https://github.com/chemodun/X4-LuaLSAddon). Это определения для Lua Language Server; их не нужно подключать как исполняемые файлы мода. Далее: [типы](wiki:types), [граница Lua и C ID](wiki:ids-and-precision), [UI и MD](wiki:md-lua-bridge).