Понимание Expressions: сопоставление $json, $node и items без кода

Самый большой барьер в обучении n8n простыми словами: что означают Items, $json и $node и как вы сопоставляете значения через Drag-and-Drop без кода.

Когда вы впервые создаёте Workflow в n8n, рано или поздно наступает момент, когда фиксированной настройки в интерфейсе уже недостаточно: значение должно приходить из предыдущего Node, меняться в зависимости от входных данных или браться из совсем другого узла, расположенного раньше в Workflow. Именно здесь для многих новых пользователей начинается самый большой барьер в обучении, ведь внезапно появляются понятия вроде $json, $node и items, которые без пояснения выглядят как загадочный код. На самом деле за этим стоит довольно простой принцип, как только становится понятно, как n8n передаёт данные между узлами.

В этой статье на конкретных примерах объясняется, что такое Item в n8n на самом деле, как связаны $json и $node и как вы сопоставляете значения с помощью Drag-and-Drop, не написав ни строки кода. Основой служит официальная документация n8n по Expressions и внутренней структуре данных по состоянию на июль 2026 года.

Что такое Item в n8n на самом деле?

n8n всегда передаёт данные между узлами в виде массива объектов, и каждый отдельный элемент этого массива называется Item. Согласно документации n8n по структуре данных каждый Item имеет фиксированную форму `{ json: {...} }`, при этом полезные данные всегда находятся под ключом json. Пример с двумя Items выглядит так:

  • Item 1: `{ json: { name: "Anna", plz: "18055" } }`
  • Item 2: `{ json: { name: "Jonas", plz: "23552" } }`

Важно для понимания: Node в n8n обычно обрабатывает каждый Item по отдельности и повторяет настроенное действие для каждого элемента массива. Если HTTP-Request-Node получает два Items, по умолчанию он отправляет и два запроса, по одному на каждый Item. Тот, кто это усвоил, понимает и то, почему Expressions в n8n всегда относятся к текущему обрабатываемому Item, а не ко всему списку.

$json: доступ к текущему Item

$json — самая часто используемая переменная в Expressions n8n, она обозначает json-данные того Item, который в данный момент обрабатывает текущий узел. При этом $json является сокращением от $input.item.json, то есть входного Item текущего узла. Если вы, например, хотите вывести в следующем узле имя из приведённого выше примера, то в текстовое поле вы вписываете:

`{{ $json.name }}`

При выполнении n8n заменяет это выражение фактическим значением соответствующего Item, то есть при двух Items один раз на "Anna" и один раз на "Jonas". До вложенных полей вы добираетесь через точечную нотацию, например `{{ $json.adresse.plz }}`, при условии что данные структурированы соответствующим образом.

$node и $(): получение данных из других узлов

Как только значение должно приходить не из непосредственно предыдущего узла, а из любого другого узла, расположенного раньше в Workflow, $json уже недостаточно. Именно для этого существует $node, а точнее его преемник $(). В более старых Workflows и руководствах вы часто ещё встречаете запись `$node["Node-Name"].json.feld`, но этот синтаксис уже считается устаревшим. Актуальная форма, описанная в документации n8n по обращению к предыдущим узлам, выглядит так:

`{{ $('Node-Name').item.json.feld }}`

Если вы хотите получить не только текущий связанный Item, а именно первый, последний или все Items определённого узла, в вашем распоряжении дополнительно есть `$('Node-Name').first()`, `$('Node-Name').last()` и `$('Node-Name').all()`. Если в Workflow вам попадается старое выражение, написанное через $node, стоит при случае перевести его на запись $(), чтобы оно надёжно работало и после будущих обновлений n8n.

Пример: получение адреса электронной почты из более раннего узла формы

Предположим, Workflow начинается с узла формы под названием "Kontaktformular", который среди прочего собирает адрес электронной почты. Через три узла дальше, в запросе HTTP-Request к CRM, вам снова нужен именно этот адрес, даже если промежуточные узлы сами уже не содержат никаких данных электронной почты. Выражение для этого выглядит так:

`{{ $('Kontaktformular').item.json.email }}`

Таким образом вы обращаетесь напрямую к исходному Item из Kontaktformular, независимо от того, что промежуточные узлы сделали с данными.

Mapping без кода: Drag-and-Drop в n8n

Самый удобный вход в Expressions вообще не связан с набором кода. В Input-Panel узла n8n отображает входящие данные в виде списка или таблицы, и каждое отдельное поле можно мышью перетащить прямо в поле параметра. Из этого n8n автоматически создаёт подходящее выражение, например `{{ $json.fruit }}`, при этом вам не нужно самим знать синтаксис. Согласно документации n8n о сравнении Expressions и узлов преобразования данных, этот метод особенно оправдан, когда вы хотите перенять всего одно значение из предыдущих данных, ведь n8n сразу показывает в предпросмотре, какое конкретное значение будет подставлено при выполнении. Для операций вроде сортировки, объединения или удаления дубликатов документация, напротив, рекомендует готовые узлы преобразования данных, поскольку они обходятся без каких-либо Expression и управляются через удобный интерфейс с пошаговым сопровождением.

Типичные подводные камни на старте

  • Путаница между Item и всем списком: $json всегда возвращает только текущий Item и никогда все Items сразу. Тому, кто хочет пройти по всем Items, нужен $input.all() или $('Node-Name').all() и, как правило, логика цикла или узел Code.
  • Устаревший синтаксис $node из старых руководств: Многие старые инструкции в сети до сих пор показывают $node["Name"].json, что в актуальных версиях n8n может приводить к ошибкам. Справочник по Expressions в документации вместо этого последовательно использует запись $().
  • Отсутствующий ключ json в собственном коде: Тот, кто в узле Code сам возвращает данные, должен учитывать, что каждый возвращаемый объект снова должен быть упакован в `{ json: {...} }`, иначе n8n сообщит об ошибке.
  • Expression не показывает значение: Чаще всего причина в том, что узел, на который вы ссылаетесь, в этом пути выполнения ещё вообще не отработал, или поле в текущем Item действительно пустое. Взгляд в Input-Panel соответствующего узла проясняет это быстрее, чем любой поиск ошибок в коде.

Тот, кто усвоил эти четыре пункта, преодолел самый большой барьер на входе в n8n и с этого момента сохраняет контроль над собственными Workflows, даже без опыта разработки. Тот, кто при построении более сложных автоматизаций всё же предпочитает опереться на опытную поддержку, найдёт у n8n-автоматизации от NordFlux реализацию с фиксированной ценой и немецким суверенитетом данных.

Частые вопросы

В чём разница между $json и $input.item?

$json — это сокращение от $input.item.json, и она напрямую возвращает json-данные текущего Item. $input.item, напротив, возвращает полный объект Item, включая возможный ключ binary, поэтому на практике $json почти всегда более короткий и распространённый путь, если вам нужен доступ только к обычным значениям полей.

Почему в старых Workflows я вижу $node вместо $()?

$node["Name"].json был изначальным синтаксисом для обращения к данным из определённого узла, но теперь считается устаревшим. Вместо него n8n рекомендует запись $('Name'), которая устойчивее к переименованиям и будущим изменениям версий. Старые Workflows с $node в большинстве случаев продолжают работать, но при ближайшей возможности их стоит перевести на новую запись.

Могу ли я с помощью $json получить доступ и к полю из совсем другого узла?

Нет, $json всегда относится только к Item непосредственно входящего потока данных на текущем узле. Для полей из любого другого, расположенного раньше узла вам нужна запись $('Node-Name').item.json.feldname, как описано в документации по обращению к предыдущим узлам.

Обязательно ли всегда набирать Expressions вручную?

Нет, чаще всего нет. Вы можете перетаскивать поля из Input-Panel прямо через Drag-and-Drop в поле параметра, и n8n автоматически создаёт подходящее выражение. Набирать вручную имеет смысл прежде всего тогда, когда вы хотите обратиться к данным из более отдалённого узла или дополнительно обработать значения методами вроде .toUpperCase() или .map().

Что происходит, если Item вообще не содержит поля, на которое ссылаются?

Тогда Expression чаще всего возвращает undefined или пустое значение вместо ошибки, за исключением случая, когда вы обращаетесь к полю вложенного объекта, который сам не существует. В таких случаях помогает функция $ifEmpty() из справочника по Expressions, чтобы автоматически подставить значение по умолчанию, вместо того чтобы прерывать выполнение.

О NordFlux

NordFlux UG (haftungsbeschränkt)

NordFlux создаёт цифровых сотрудников для организаций: автоматизации и КИ-агентов, которые берут на себя повторяющуюся работу. Вы сохраняете контроль.

Больше о нас
Бесплатный первичный анализ

Конкретные вопросы по автоматизации или КИ?

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

Понимание Expressions: $json, $node и items