Условие отбора
Условие — это то, чем шаги «Найти объекты» и «Взять N-й» отбирают объекты. Оно живёт внутри самого шага, отдельными строками, и правится там же.

Первая строка условия подписана «Где» — так же, как строки шага. Справа от каждой строки стоит цифра: сколько объектов её пережило.
Из чего состоит строка условия
Section titled “Из чего состоит строка условия”| Графа | Что в ней |
|---|---|
| Свойство | Что спрашиваем у объекта. Подсказка у поля: «Свойство объекта или колонка проекта». Список раскрывается деревом — свойства модели и колонки проекта. Вписать своё имя можно всегда. |
| Замена | Необязательная. Заменить что-то в прочитанном значении перед сравнением. Пока замены нет, на её месте стоит узкая кнопка «⇄» с подсказкой «Заменить в значении поля перед сравнением — например “-” на “_”». Нажатие добавляет две клетки: «Что заменить в значении поля» и «На что заменить; пусто — убрать». |
| Операция | Что со свойством делаем. Список зависит от того, чем свойство является — см. ниже. |
| Значение | С чем сравниваем. Подсказка: «С чем сравнить пришедшее. У “одно из” — значения через запятую». Значение бывает вписано, а бывает приходит аргументом вызова: источник выбирается в самой клетке, пункт «вписать значение» либо имя аргумента. |
| Отсев | Цифра справа: сколько объектов осталось после этой строки. Появляется после пробного запуска. |
Замена перед сравнением
Section titled “Замена перед сравнением”
Тот же язык условий работает и в развилке: ромб с вопросом, под ним строки «Где» и «или» — то же дерево условий, что у «Найти объекты».
Группы: «все» и «хотя бы одно»
Section titled “Группы: «все» и «хотя бы одно»”Строки условия складываются в группы. У группы есть режим, который выбирается в её первой графе:
| Режим | Что означает | Как читается отсев |
|---|---|---|
| все | Объект подходит, когда сошлись все строки группы. | Счёт накопительный: каждая строка сужает то, что осталось от предыдущей. |
| хотя бы одно | Достаточно одной сошедшейся строки. | Строка показывает своё совпадение, а накопленным итогом становится объединение, приписанное самой группе. |
Кнопка «+ условие» добавляет строку, «+ группа» — вложенную группу, «✕ убрать группу» убирает её вместе с условиями.
Какие операции у какого свойства
Section titled “Какие операции у какого свойства”Список операций зависит от того, чем свойство является. Это одно правило на редактор и на движок: предлагать операцию, которую шаг потом не выполнит, нельзя.
Свойство читается строкой: текст
Section titled “Свойство читается строкой: текст”| Операция | Что делает |
|---|---|
| равно | Совпадает целиком, регистр не важен. |
| не равно | Не совпадает целиком. |
| содержит | Значение встречается внутри. |
| начинается с | Значение стоит в начале. |
| заканчивается на | Значение стоит в конце. |
| подходит под образец | Регулярное выражение. С учётом регистра и в любом месте строки; без регистра — (?i) в начале, целиком — ^…$. |
| пусто / не пусто | Поля нет либо оно пустое / поле есть и непустое. Сравнивать не с чем — графа значения пропадает. |
Свойство — число, дата или время
Section titled “Свойство — число, дата или время”Те же «равно / не равно» и «пусто / не пусто», плюс сравнения по величине: больше, меньше, не меньше, не больше. «Содержит» и «начинается с» у числа не предлагаются — кусок числа искать нечего.
Свойство — признак «да / нет»
Section titled “Свойство — признак «да / нет»”Только равно и не равно, а значение выбирается из списка «да / нет» — это список, а не ввод. «Содержит» и «начинается с» у признака бессмысленны.
Свойство — словарь
Section titled “Свойство — словарь”У словаря нет значения, у него есть ключи. Поэтому операции другие.
| Операция | Что делает |
|---|---|
| есть ключ | Ключ с таким именем в словаре есть — независимо от того, заполнен ли он. |
| значение ключа | Под ключом лежит это значение. |
| значение ключа задано | Ключ есть и значение под ним непустое. |
| значение ключа пусто | Ключа нет либо значение под ним пустое. |
| есть такой, у которого | Ходит по записям «ключ — значение»: так находится колонка по образцу имени, а не только по имени целиком. |
| пусто / не пусто | Про сам словарь: есть он вообще или нет. |
Свойство — список
Section titled “Свойство — список”Две операции: «есть такой, у которого» и пусто / не пусто.
«Есть такой» задаёт вопрос к одному элементу списка, и два условия внутри говорят об одном и том же элементе: «есть датчик с Tag = X и Line = 2» — это один датчик, а не два разных. Ради этого переносился GetKauDeviceFrameArray: кадр ищется как «тот, у которого среди датчиков есть датчик с этим тегом».
Свойство — вложенный объект
Section titled “Свойство — вложенный объект”Сравнивать его нечем — у объекта берут свойство внутри. Остаётся спросить, есть ли он вообще: пусто / не пусто.
Порядок: «+ порядок»
Section titled “Порядок: «+ порядок»”У корневой группы условия есть кнопка «+ порядок». Порядок стоит между отбором и взятием — как ORDER BY между WHERE и выбором строки: он нужен ровно тому, кто берёт по счёту.
Ключом упорядочивания служит то же условие, что и в отборе, плюс сторона: подходящие идут первыми или последними. Сортировки по значению поля нет намеренно — в GAP оба ранжирования написаны так же: OrderByDescending(x => x.SheetName == "OBJ.AiProc"). Сортировать по значению там не понадобилось ни разу.
Порядок пуст — объекты идут в том порядке, в каком их отдал источник.
Регистр букв
Section titled “Регистр букв”Что попадает в условие «в пришедшем»
Section titled “Что попадает в условие «в пришедшем»”Шаг с источником в пришедшем спрашивает не объект проекта, а то, что пришло по связи. Поэтому и подсказки полей у него другие:
- пришли объекты — поля их типа;
- пришёл словарь — его ключи (словарь это та же строка данных);
- пришли тексты или числа — полей у них нет, условием их не спросить. Из них берут по номеру, и шаг это скажет прямо: «Условие спрашивает поля, а пришли тексты — полей у них нет. Уберите условие и порядок: из текстов берут по номеру.»