---
metadata:
  - name: generator
    content: Diplodoc Platform v5.62.0
style:
  - _assets/styles/custom.css
  - _assets/fonts-golos-text.css
  - _assets/styles/hero-gradient.css
  - _assets/styles/hero-decoration.css
script:
  - _assets/scripts/latex-trust.js
description: Руководство пользователя (новая версия) - Объекты в шаблонах
title: Объекты в шаблонах
vcsPath: sintaksis-shablonov/obekty-v-shablonakh.md
alternate:
  - href: sintaksis-shablonov/obekty-v-shablonakh.md
    type: text/markdown
    title: Markdown version
  - href: ../llms.txt
    rel: describedby
theme: _assets/style/theme.css
---

# Объекты в шаблонах

Объекты — элементы данных проекта с атрибутами. Объект может содержать другие объекты или сам входить в состав другого объекта.

## Отображение атрибутов объекта
Атрибут объекта выводится через точку:

```jinja
{{ object.attribute }}
```


У самого объекта нет кода, как у переменной, поэтому к конкретному объекту обращаются через специальные конструкции (см. ниже).

## Обращение к объектам
### Простое обращение
Чтобы обратиться к конкретному объекту, пройдите циклом по объектам его типа и добавьте условие на уникальный атрибут (например, название):

```jinja
{% for comp in component %} 
{% if comp.name == "Подсистема управления данными" %}
{{ comp.description }}
{% endif %}
{% endfor %}
```


Такая конструкция выведет описание объекта типа «component» с названием «Подсистема управления данными».

### Обращение к подчиненным объектам
Для объектов, вложенных в другие объекты, используются вложенные циклы. Например, в проекте есть структура «страна» -> «регион»:

```jinja
{% for cou in country %}       - начинает цикл, проходящий по странам
Страна:{{ cou.name }}          - выводит название страны
Список регионов:
{% for reg in cou.region %}    - начинает цикл, проходящий по регионам в рамках текущей страны
1. {{ reg.name }}              - отображает название региона
{% endfor %}                   - завершает цикл по регионам

{% endfor %}                   - завершает цикл по странам
```


**Результат:**
Страна: Австралия
Список регионов:
1. Австралийская столичная территория
2. Виктория
3. Западная Австралия
4. Квинсленд
5. Новый Южный Уэльс
6. Тасмания
7. Южная Австралия

Страна: Австрия
Список регионов:
...

## Встроенные объекты
В ГОСТ-ОН есть встроенные объекты: их нет в данных проекта, а набор атрибутов у них фиксированный.

### Текущий документ
Объект, представляющий текущий документ
Название - «current_doc»
Атрибуты:
- «name» - название документа
- «stage» - стадия документа (например, «ТЗ»)
- «status» - статус документа
- «full_code» - полный код документа
- «short_code» - короткий код (тип) документа
- «code», «type» - синонимы «full_code» и «short_code» соответственно
- «folder» - название папки, в которой находится документ
- «pages» - количество страниц
- «attachments» - список приложений документа
Атрибуты приложений:
- «kind» - тип приложения (document или file)
- «name» - название документа/файла
- «full_code» - полный код документа
- «short_code» - короткий код документа
- «code», «type» - синонимы «full_code» и «short_code»
- «pages» - количество страниц документа

### Документы
Объект, содержащий все документы текущего проекта
Название - «documents»

### Проход цикла
Объект, представляющий текущий проход цикла
Название - «loop»
Атрибуты:
- «index» - порядковый номер прохода
- «index0» - порядковый номер прохода, если считать с 0
- «length» - общее количество проходов цикла
- «first» - атрибут заполнен, если loop.index = 1
- «last» - атрибут заполнен, если loop.index = loop.length

## Вспомогательные объекты
Вспомогательный объект внутри документа создается командой «set» и функцией «namespace»: после «set» указывается имя объекта, а в скобках после «namespace» — атрибуты и их значения через запятую:

```jinja
{% set triangle = namespace(name = "Египетский треугольник", A = 3, B = 4, C = 5) %}
Длина гипотенузы: {{ triangle.C }}
```


**Результат:**
Длина гипотенузы: 5

В отличие от обычных переменных, изменения атрибутов такого объекта внутри цикла сохраняются и после него:

```jinja
{% set n = namespace(counter=0) %}  - создается объект "n" с атрибутом "counter" (значение атрибута - 0)
{% for cou in country %}
{% if cou.name | first == "А" %}
{% set n.counter = n.counter + 1 %} - значение атрибута "counter" увеличивается на один и сохраняется
{% endif %}
{% endfor %}
Кол-во стран, начинающихся на "А" - {{ n.counter }}
```


**Результат:**
Кол-во стран, начинающихся на «А» - 12

## Фильтры над объектами
1. «max» («min») - выбирает объект с наибольшим (наименьшим) значением атрибута. Атрибут для сравнения указывается после «attribute=». Чтобы вывести атрибут найденного объекта, выражение с фильтром берется в скобки:

```jinja
country - тип объекта
max(attribute="land_area") - фильтр поиска объекта с наибольшим значением  атрибута "land_area"
(country | max(attribute="land_area")) - объект типа "country" с наибольшим значением "land_area"
```



```jinja
Название наибольшей страны: {{ (country | max(attribute="land_area")).name }}
Площадь наименьшей страны: {{ (country | min(attribute="land_area")).land_area }} кв. км
```


**Результат:**
Название наибольшей страны: Российская Федерация
Площадь наименьшей страны: 0,44 кв. км

Так можно создать переменную-объект для дальнейшего использования в документе:

```jinja
{% set smallest_country = country | min(attribute="land_area") %}
{{ smallest_country.name }}
```


**Результат:**
Ватикан

2. «map» - собирает значения выбранного атрибута

```jinja
{{ country | map(attribute="name") | join(", ") }}
```


**Результат:**
Австралия, Австрия, ...

3. «sort» - сортирует объекты по значениям выбранного атрибута (строки сортируются по алфавиту, а числа по возрастанию)

```jinja
{% for cou in country | sort(attribute="land_area") %}
1. {{ cou.name }}
{% endfor %}
```


**Результат:**
1. Ватикан
2. Монако
...

Для формирования обратного порядка используется «reverse=true»:

```jinja
{% for cou in country | sort(attribute="name", reverse=true) %}
1. {{ cou.name }}
{% endfor %}
```


**Результат:**
1. Япония
2. Ямайка
...

4. «unique» - оставляет по одному объекту на каждое значение атрибута:

```jinja
{% for cou in country | unique(attribute="government_type") %}
1. {{ cou.name }} - пример формы правления "{{ cou.government_type }}"
{% endfor %}
```


**Результат:**
1. Австралия - пример формы правления «Монархия»
2. Австрия - пример формы правления «Республика»

5. «selectattr»(«rejectattr») - обрабатывает только объекты, выбранный атрибут которых (не) соответствует условию

```jinja
{% for obj in object_type | selectattr(attribute_condition) %}
(Содержание)
{% endfor %}
Эквивалентно
{% for obj in object_type %}
{% if attribute_condition %}
(Содержание)
{% endif %}
{% endfor %}
```



```jinja
{% for obj in object_type | rejectattr(attribute_condition) %}
(Содержание)
{% endfor %}
Эквивалентно
{% for obj in object_type %}
{% if attribute_condition %}
{% else %}
(Содержание)
{% endif %}
{% endfor %}
```


Условие сравнения в этих фильтрах записывается иначе: атрибут, знак сравнения и значение указываются в кавычках через запятую (числовое значение — без кавычек):

```jinja
{% if attribute == value %} эквивалентно | selectattr("attribute", "equalto", "value")
```


Сравнивающие знаки заменяются на команды:
| Знак в условии | Команда для фильтра |
|---|---|
| == | equalto |
| != | ne |
| > | gt |
| < | lt |
| >= | ge |
| <= | le |

6. «groupby» - создает группы объектов с одинаковым значением выбранного атрибута (при этом группы сортируются по значению группирующего атрибута)

```jinja
{% for group in country | groupby("continent") %} - формируются группы по значению атрибута "continent"; запускается цикл по этим группам
Континент: {{ group.grouper }} - атрибут группы "grouper" эквивалентен группирующему атрибуту (в данном случае "continent")
{% for cou in group.list %} - запускается цикл по объектам внутри текущей группы
1. {{ cou.name }}
{% endfor %}
{% endfor %}
```


**Результат:**
Континент: Азия
1. Азербайджан
2. Армения
...
Континент: Европа
1. Австрия
...

### Создание списка объектов
Фильтры «map», «sort», «unique», «selectattr» и «rejectattr» возвращают не настоящий список. Чтобы получить список, добавьте фильтр «list»:

```jinja
{{ country | map(attribute="name") | list | as_bullet_list }}
```


**Результат:**
- Австралия
- Австрия
...


```jinja
{% set countries_by_size = country | sort(attribute="land_area", reverse=true) | list %}
{{ countries_by_size[1].name }}
```


**Результат:**
Канада
