---
metadata:
  - name: generator
    content: Diplodoc Platform v5.50.3
alternate:
  - https://divkit.tech/docs/en/concepts/variables.md
  - https://divkit.tech/docs/ru/concepts/variables.md
---
> **Documentation Index:** Fetch the complete configuration index at https://divkit.tech/docs/ru/llms.txt

# Переменные

Чтобы использовать переменные, объявите их в отдельном блоке `variables`. При объявлении переменной укажите параметры:

- `name` — имя, может состоять из латинских букв разных регистров, цифр и символов `_` и `.`. Не может начинаться с цифры или с точки.
- `type` — тип переменной. См. [Типы данных](#types).
- `value` — значение по умолчанию.

Например:

```json translate=no
{
    "variables": [
        {
            "name": "subscribed",
            "type": "boolean",
            "value": true
        }
    ],
}
```

## Типы данных {#types}

Поддерживаемые типы данных:
- логический: `boolean`
- строковый: `string`
- целочисленный: `integer`
- число с плавающей точкой: `number`
- цвет: `color`
- ссылка на ресурс: `url` (должен быть корректным URL)
- словарь: `dict`
- массив: `array`


{% cut "Примеры объявления переменных" %}


```json translate=no
{
    "variables": [
        {
            "name": "subscribed",
            "type": "boolean",
            "value": true
        },
        {
            "name": "likes",
            "type": "integer",
            "value": 0
        },
        {
            "name": "black",
            "type": "color",
            "value": "#f000"
        },
        {
            "name": "username",
            "type": "string",
            "value": "unknown"
        }
    ],
    "states": [ ... ]
}
```


{% endcut %}


## Выражения при инициализации переменных {#expressions}

Переменные поддерживают выражения в значениях инициализации. Это позволяет ссылаться на другие переменные или использовать функции при определении начального значения переменной. Выражение вычисляется один раз в момент инициализации переменной. Порядок объявления имеет значение — переменная может ссылаться только на переменные, которые были объявлены до неё.

{% cut "Пример выражения при инициализации переменных" %}

```json translate=no
{
  "variables": [
    {
      "name": "margin",
      "type": "integer",
      "value": 8
    },
    {
      "name": "padding",
      "type": "integer",
      "value": "@{margin * 2}"
    },
    {
      "name": "total_spacing",
      "type": "integer",
      "value": "@{margin + padding}"
    }
  ]
}
```

{% endcut %}

{% note warning %}

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

{% endnote %}


## Словари {#dictionary}

В качестве переменной можно объявлять словари — произвольные JSON-объекты, внутри которых могут храниться любые другие типы переменных.
Например, их удобно использовать для объявления палитры и получать из нее значения в зависимости от темы приложения:

```json translate=no
"variables": [
  {
    "name": "palette",
    "type": "dict",
    "value": {
      "light": {
        "text_color": "#ffffff",
        "text_background": "#0077FF"
      },
      "dark": {
        "text_color": "#000000",
        "text_background": "#0077FF"
      },
      "big": {
        "text_size": 20
      },
      "small": {
        "text_size": 16
      }
    }
  },
  {
    "name": "app_theme",
    "type": "string",
    "value": "light"
  },
  {
    "name": "font_size",
    "type": "string",
    "value": "small"
  }
]
```

Словарь не может самостоятельно определять типы, поэтому нужно правильно выбирать функции для того, чтобы получить переменную из словаря:

```json translate=no
getIntegerFromDict(dict_name, path_to_value)
getNumberFromDict(dict_name, path_to_value)
getStringFromDict(dict_name, path_to_value)
getColorFromDict(dict_name, path_to_value)
getUrlFromDict(dict_name, path_to_value)
getBooleanFromDict(dict_name, path_to_value)
getOptIntegerFromDict(fallback, dict_name, path_to_value)
getOptNumberFromDict(fallback, dict_name, path_to_value)
getOptStringFromDict(fallback, dict_name, path_to_value)
getOptColorFromDict(fallback, dict_name, path_to_value)
getOptUrlFromDict(fallback, dict_name, path_to_value)
getOptBooleanFromDict(fallback, dict_name, path_to_value)
```

В объявленном словаре из примера значения цветов и размера шрифта можно использовать так:

```json translate=no
"background": [
  {
    "type": "solid",
    "color": "@{getColorFromDict(palette, app_theme, 'text_background')}"
  }
],
"font_size": "@{getIntegerFromDict(palette, font_size, 'text_size')}",
"text_color": "@{getColorFromDict(palette, app_theme, 'text_color')}"
```

{% cut "Посмотреть интерактивный пример" %}

<iframe src="https://yastatic.net/s3/home/divkit/docs/1.0.8/index.html?url=https://yastatic.net/s3/home/divkit/doc_samples/common/variables_1.json" width="700" height="500" frameborder="1"></iframe>


{% endcut %}


## Массивы {#array}

Массивы содержат произвольные JSON-объекты.

```json translate=no
"variables": [
  {
    "type": "array",
    "name": "array",
    "value": [
      "string",
       123,
      "@{expression}"
    ]
  }
]
```
Массив, как и словарь, не может автоматически определять типы переменных, которые хранятся внутри него, поэтому нужно правильно выбирать функции для того, чтобы получить значение из массива:

```translate=no
getIntegerFromArray(array, index)
getNumberFromArray(array, index)
getStringFromArray(array, index)
getColorFromArray(array, index)
getUrlFromArray(array, index)
getBooleanFromArray(array, index)
getArrayFromArray(array, index)
getDictFromArray(array, index)
getOptIntegerFromArray(array, index, fallback)
getOptNumberFromArray(array, index, fallback)
getOptStringFromArray(array, index, fallback)
getOptColorFromArray(array, index, fallback)
getOptUrlFromArray(array, index, fallback)
getOptBooleanFromArray(array, index, fallback)
getOptArrayFromArray(array, index, fallback)
getOptDictFromArray(array, index, fallback)

len(array)
```

Если тип функции выбран неправильно или произошел выход за границы массива, возникнет ошибка. В этом случае можно использовать функцию `getOpt*` вместо `get*`, тогда вместо ошибки возвратится `fallback` значение. 

{% cut "Посмотреть интерактивный пример" %}

<iframe src="https://yastatic.net/s3/home/divkit/docs/1.0.8/index.html?url=https://yastatic.net/s3/home/divkit/doc_samples/common/variables_2.json" width="700" height="500" frameborder="1"></iframe>

{% endcut %}

## Методы {#methods}

Для работы с массивами и словарями удобно применять методы. В отличие от функций, они вызываются непосредственно из массива или словаря и возвращают требуемое значение.

#### Доступные методы

#|
|| Название | Описание | Тип результата ||
|| `toString` | Преобразует значение переменной любого типа в строку. | `string` ||
|| `getArray` | Позволяет получить массив из словаря (массива) по ключу (индексу). | `array` ||
|| `getDict` | Позволяет получить словарь из словаря (массива) по ключу (индексу). | `dict` ||
|| `getBoolean` | Позволяет получить логическое значение из словаря (массива) по ключу (индексу). | `boolean` ||
|| `getColor` | Позволяет получить значение цвета из словаря (массива) по ключу (индексу). | `color` ||
|| `getInteger` | Позволяет получить целое число из словаря (массива) по ключу (индексу). | `integer` ||
|| `getNumber` | Позволяет получить число с плавающей точкой из словаря (массива) по ключу (индексу). | `number` ||
|| `getString` | Позволяет получить строку из словаря (массива) по ключу (индексу). | `string` ||
|| `getUrl` | Позволяет получить URL из словаря (массива) по ключу (индексу). | `url` ||
|| `isEmpty` | Проверяет, является ли массив (словарь) пустым, и возвращает соответствующее логическое значение `boolean`. ||
|#

Полные описания полей методов и примеры использования доступны в [репозитории DivKit](https://github.com/divkit/divkit):

* `toString`: [поля](https://github.com/divkit/divkit/blob/main/test_data/expression_test_data/methods_signatures.json), [примеры](https://github.com/divkit/divkit/blob/main/test_data/expression_test_data/methods.json);

* методы для массивов: [поля](https://github.com/divkit/divkit/blob/main/test_data/expression_test_data/methods_signatures_array.json), [примеры](https://github.com/divkit/divkit/blob/main/test_data/expression_test_data/methods_array.json);

* методы для словарей: [поля](https://github.com/divkit/divkit/blob/main/test_data/expression_test_data/methods_signatures_dict.json), [примеры](https://github.com/divkit/divkit/blob/main/test_data/expression_test_data/methods_dict.json).

{% cut "Значения полей" %}

В описании метода заполнены следующие поля:

* `function_name` — название метода.

* `is_method` — флаг, показывающий, является ли функция методом. Для всех методов имеет значение `true`.

* `doc` — описание работы метода.

* `arguments` — список аргументов. Каждый аргумент описывается значениями:

  * `type` — тип;

  * `doc` — описание;

  * `vararang` — опциональный флаг, разрешающий передавать в качестве этого аргумента не одно, а несколько значений нужного типа.

* `result_type` — тип возвращамого значения.

{% endcut %}

{% cut "Посмотреть интерактивный пример" %}

<iframe src="https://yastatic.net/s3/home/divkit/docs/1.0.8/index.html?url=https://yastatic.net/s3/home/divkit/doc_samples/common/variables_3.json" width="700" height="500" frameborder="1"></iframe>

{% endcut %}

## Изменение значений переменных {#modify}

Для изменения значения переменной доступно [действие](https://divkit.tech/docs/ru/concepts/interaction.md)`set_variable`. Например:

```translate=no
div-action://set_variable?name=common_text_size&value=17
```

Чтобы задать значение переменной, можно использовать [вычисляемые выражения](https://divkit.tech/docs/ru/concepts/expressions.md) и [встроенные функции](https://divkit.tech/docs/ru/concepts/functions.md).

{% note info %}

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

{% endnote %}

{% note info %}

В URL actions можно использовать локальные переменные уровня элемента. Например, чтобы установить глобальную переменную на основе значения локальной переменной:

```translate=no
div-action://set_variable?name=result&value=@{local_value}
```

{% endnote %}


Примеры:

- изменить значение переменной с плавающей точкой:

    ```translate=no
    div-action://set_variable?name=price&value=3.889
    ```

- изменить значение логической переменной:

    - значение `true`: `div-action://set_variable?name=is_liked&value=1` или `div-action://set_variable?name=is_liked&value=true`
    - значение `false`: `div-action://set_variable?name=is_liked&value=0` или `div-action://set_variable?name=is_liked&value=false`

- изменить значение переменной типа `color` на зеленый цвет:

    ```translate=no
    div-action://set_variable?name=color_variable&value=@{encodeUri('#ff00ff00')}
    ```


- Установка словарных переменных с выражениями:

```translate=no
div-action://set_variable?name=result_dict&value=@{source_dict}

Или с использованием типизированного формата:

```json translate=no
{
  "type": "set_variable",
  "variable_name": "result_dict",
  "value": {
    "type": "dict",
    "value": "@{source_dict}"
  }
}
```

{% note info %}

Выражение словаря должно возвращать валидное значение словаря, соответствующее типу целевой переменной.

{% endnote %}

- Установка словарных переменных из объектов JSON:

    Словарные переменные можно обновлять с помощью типизированных действий, передавая значение словаря напрямую:
    
    ```json
    {
      "log_id": "set_palette",
      "typed": {
        "type": "set_variable",
        "variable_name": "palette",
        "value": {
          "type": "dict",
          "value": {
            "light": {
              "text_color": "#e0bae3"
            }
          }
        }
      }
    }
    ```

    {% cut "Пример с URL-кодированием" %}

    Словарные переменные также можно обновлять, предоставляя правильно URL-кодированное строковое представление JSON:

    ```translate=no
    div-action://set_variable?name=palette&value=%7B%22light%22%3A%7B%22text_color%22%3A%22%23e0bae3%22%7D%7D
    ```

    Это соответствует следующей структуре JSON:
    ```json
    {
      "light": {
        "text_color": "#e0bae3"
      }
    }
    ```

    {% endcut %}

## Внешние переменные {#global}

Переменные, которые объявляются в верстке, являются переменными уровня карточки и недоступны извне. Для совместного использования переменных между разными верстками нужно использовать внешние переменные.

Для этого объявите `DivVariableController` на клиенте и передайте в него переменные, к которым нужно обращаться из верстки.

## Хранимые значения {#stored-values}

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

### Области видимости хранимых значений

Хранимые значения поддерживают разные области видимости:

- `global` — значения доступны во всех карточках приложения
- `card` — значения доступны только в текущей карточке
- `default` — используется область видимости по умолчанию (эквивалентно `global`)

Если область видимости не указана, по умолчанию используется `global`.

### Действие set_stored_value

Для сохранения значений используется действие `set_stored_value`:

```json translate=no
{
  "type": "set_stored_value",
  "key": "user_preference",
  "value": "dark_theme",
  "scope": "global"
}
```

Параметры действия:
- `key` — ключ для сохранения значения
- `value` — сохраняемое значение (строка, число, массив, словарь)
- `scope` — область видимости (`global`, `card`, `default`)
- `lifetime` — время жизни значения в секундах (опционально)

### Функции для чтения хранимых значений

Для чтения хранимых значений используются функции:

- `getStoredStringValue(key, fallback, scope)` — чтение строкового значения
- `getStoredArrayValue(key, fallback, scope)` — чтение массива
- `getStoredDictValue(key, fallback, scope)` — чтение словаря

Параметр `scope` является необязательным. Если не указан, используется область видимости по умолчанию.

{% note info %}

Действие `set_stored_value` и функции для чтения хранимых значений поддерживаются на Android, iOS и Web платформах.

{% endnote %}

{% cut "Пример использования хранимых значений" %}

```json translate=no
{
  "variables": [
    {
      "name": "theme",
      "type": "string",
      "value": "@{getStoredStringValue('user_theme', 'light')}"
    }
  ],
  "states": [
    {
      "state_id": "default",
      "div": {
        "type": "container",
        "items": [
          {
            "type": "text",
            "text": "Текущая тема: @{theme}",
            "actions": [
              {
                "log_id": "switch_theme",
                "typed": {
                  "type": "set_stored_value",
                  "key": "user_theme",
                  "value": "@{theme == 'light' ? 'dark' : 'light'}",
                  "scope": "global"
                }
              }
            ]
          }
        ]
      }
    }
  ]
}
```

{% endcut %}

{% cut "Пример с различными областями видимости" %}

```json translate=no
{
  "variables": [
    {
      "name": "global_setting",
      "type": "string", 
      "value": "@{getStoredStringValue('global_setting', 'default_value', 'global')}"
    },
    {
      "name": "card_setting",
      "type": "string",
      "value": "@{getStoredStringValue('card_setting', 'card_default', 'card')}"
    }
  ],
  "states": [
    {
      "state_id": "default",
      "div": {
        "type": "container",
        "items": [
          {
            "type": "text",
            "text": "Глобальная настройка: @{global_setting}",
            "actions": [
              {
                "log_id": "set_global",
                "typed": {
                  "type": "set_stored_value",
                  "key": "global_setting",
                  "value": "new_global_value",
                  "scope": "global"
                }
              }
            ]
          },
          {
            "type": "text", 
            "text": "Настройка карточки: @{card_setting}",
            "actions": [
              {
                "log_id": "set_card",
                "typed": {
                  "type": "set_stored_value",
                  "key": "card_setting",
                  "value": "new_card_value",
                  "scope": "card"
                }
              }
            ]
          }
        ]
      }
    }
  ]
}
```

{% endcut %}

{% cut "Пример для Android" %}

Объявим `DivVariableController` при создании `DivConfiguration`:

```Kotlin translate=no
val variableController = DivVariableController()
val configuration = DivConfiguration.Builder(imageLoader)
    .divVariableController(variableController)
    .build()
```

Теперь в контроллер можно передать переменную. Для примера передадим строковую переменную `app_theme`:

```Kotlin translate=no
val theme = Variable.StringVariable("app_theme", "light")
variableController.putOrUpdate(theme)
```

Теперь во всех `Div2View`, созданных с помощью данной `DivConfiguration`, будет доступна переменная `app_theme`. Чтобы изменить значение переменной, в коде можно использовать метод `DivVariable#set` или `DivVariableController#putOrUpdate`. Если эта переменная уже объявленна в контроллере — ее значение также обновится.

{% endcut %}


{% cut "Пример для iOS" %}

Объявим глобальное хранилище переменных и `DivVariablesStorage` в `DivKitComponents`:

```Swift translate=no
let applicationStorage = DivVariableStorage()
let variablesStorage = DivVariablesStorage(outerStorage: applicationStorage)
let divkitComponents = DivKitComponents(variablesStorage: variablesStorage)
```

Теперь в глобальное хранилище можно передать переменную. Для примера передадим словарь с палитрой:

```Swift translate=no
let themeVariable: DivVariables = [
  DivVariableName(rawValue: "palette"): .dict([
    "text_color": "#ffffff",
    "text_background": "#0077FF"
  ])
]
applicationStorage.put(themeVariable)
```

Теперь во всех `DivView`, созданных с помощью данного `DivKitComponent`, будет доступна переменная `palette`.

DivKit использует два типа хранилищ:

- `DivVariableStorage` — базовое хранилище переменных. Используйте его для глобальных переменных приложения. Имеет метод `put()` для добавления переменных и поддерживает создание иерархии хранилищ через `outerStorage`.

- `DivVariablesStorage` — менеджер переменных на уровне `DivKitComponents`. Управляет переменными на уровне карточек через методы `set(cardId:variables:)` и `append(variables:for:)`. Может иметь `outerStorage` типа `DivVariableStorage` для доступа к глобальным переменным.

{% endcut %}

{% cut "Пример для Web" %}

Создадим `GlobalVariablesController`:

``` js translate=no
import {createVariable, createGlobalVariablesController} from '@divkitframework/divkit';

const controller = createGlobalVariablesController();
```

Теперь в контроллер можно передать переменную, например словарь с палитрой:

``` js translate=no
const palette = createVariable('palette', 'dict', {
  "text_color": "#ffffff",
  "text_background": "#0077FF"
});
controller.setVariable(palette);
```

Теперь во всех экземплярах класса, созданных с использованием данного `controller`, будет доступна переменная `pallete`.

{% endcut %}

{% note alert %}

Переменные уровня карточки имеют больший приоритет, чем внешние. Если объявить в верстке переменную уровня карточки с тем же названием, что и у внешней, то внешняя переменная станет недоступна. Также изменение внешней переменной из верстки поменяет ее и в `DivVariableController`, то есть и во всех остальных верстках, где используется эта переменная.

{% endnote %}

## Переменные уровня элемента {#local}

Переменные уровня элемента объявляются в верстке внутри элемента, который они характеризуют.

{% note info %}

Раньше можно было объявлять только переменные уровня карточки (для объекта `card`). Сейчас можно объявлять переменные для любого элемента.

{% endnote %}

{% cut "Посмотреть интерактивный пример" %}

<iframe src="https://yastatic.net/s3/home/divkit/docs/1.0.8/index.html?url=https://yastatic.net/s3/home/divkit/doc_samples/common/variables_4.json" width="700" height="500" frameborder="1"></iframe>

{% endcut %}

## Выполнение действий при изменении значений переменных {#actions}

После изменения значения переменной, кроме обновления всех свойств, в которых используется переменная, можно выполнить любое количество [действий](https://divkit.tech/docs/ru/concepts/interaction.md). Для этого добавьте описание триггера в блоке `variable_triggers`:

- Параметр `condition` — условие выполнения действия. Может содержать логическое выражение с использованием переменных или события, по которым будет запущен триггер.
- Параметр `mode` — определяет, в каком случае срабатывает действие:

    - `on_condition` — действие срабатывает, если при изменении значения переменной стало выполняться условие (до этого условие не выполнялось);
    - `on_variable` — действие срабатывает каждый раз, если при изменении значения переменной условие выполняется.

    Например, переменные меняются несколько раз и `condition` последовательно принимает значения `true → true → false → true`. При использовании значения `on_condition` действие сработает 2 раза, при использовании значения `on_variable` — 3 раза.

- Параметр `actions` — описание [действий](https://divkit.tech/docs/ru/concepts/interaction.md), которые требуется выполнить при выполнении условия.

Ограничения:

- Условия без использования переменных (к примеру `"condition": "@{1 == 1}"`) или с функциями, не зависящими от переменных, **не будут работать**, так как без переменных не ясно, когда именно следует запускать проверку условия.
- Триггер не будет срабатывать, если в условии сравниваемые между собой сущности будут иметь разные типы (к примеру, переменная логического типа сравнивается с переменной типа `integer`).

Например:

```json translate=no
{
    "states": { ... },
    "variables": { ... },
    "variable_triggers": [
        {
            "condition": "@{liked}",
            "actions": [
                {
                    "url": "div-action://set_variable?name=total_likes&value=@{sum(total_likes, 1)}"
                }
            ]
        },
        {
            "condition": "@{subscribed && !liked}",
            "mode": "on_condition",
            "actions": [
                {
                    "url": "div-action://set_state?state_id=0/subscriptions/expanded"
                },
                {
                    "log_id": "common_posts_shown",
                    "url": "div-action://set_state?state_id=0/common_posts/collapsed"
                }
            ]
        },
        {
            "condition": "@{total_likes > 100 || user_name == 'John'}",
            "mode": "on_variable",
            "actions": [ ... ]
        }
  ]
}
```
В примере выше первый триггер будет запускать действие, которое увеличивает значение переменной `total_likes` каждый раз, когда значение переменной `liked` сменится с `false` на `true` . По такой же логике будет работать и второй триггер.

Третий триггер, благодаря параметру `"mode": "on_variable"`, будет запускаться каждый раз при изменении значений переменных и выполнении условия в `condition` .

## Триггеры уровня элемента  {#local-triggers}

Триггеры уровня элемента срабатывают при изменении значения [переменной уровня элемента](#local). Их формат такой же, как у [внешних триггеров](#actions).

Триггер уровня элемента:

* имеет доступ к переменным уровня элемента у родительского объекта;

* срабатывает даже для невидимых элементов (с параметром `"visibility" = "gone"/"invisible"`);

* не срабатывает в состояних и табах, которые сейчас не активны;

* при использовании внутри прототипов [item_builder](https://divkit.tech/docs/ru/concepts/item_builder.md) имеет доступ к данным текущего элемента через переменную, указанную в `data_element_name`, и к индексу текущего элемента через переменную `index`.

При переходе в новое состояние или на другой таб:

* если состояние (таб) активируется впервые, то триггер срабатывает при выполнении условия в `condition`;

* если раньше уже произошла инициализация состояния (таба) и до выхода из него условие не выполнялось, то триггер сработает, когда условие начнет выполняться.

## Переменные для отслеживания состояния элементов {#element-state-variables}

Некоторые элементы DivKit предоставляют специальные переменные для отслеживания своего состояния. Например, элемент `div-pager` позволяет отслеживать количество элементов через переменную:

### Отслеживание количества элементов в пейджере

Элемент `div-pager` поддерживает свойство `item_count_variable`, которое позволяет задать имя переменной для хранения количества элементов пейджера, доступных пользователю.

```json translate=no
{
  "type": "pager",
  "item_count_variable": "pager_item_count",
  "items": [
    {
      "type": "text",
      "text": "Страница 1"
    },
    {
      "type": "text", 
      "text": "Страница 2"
    }
  ]
}
```

При инициализации пейджера в указанной переменной будет установлено количество элементов. Это полезно для создания индикаторов прогресса или отображения текущей позиции:

```json translate=no
{
  "variables": [
    {
      "name": "pager_item_count",
      "type": "integer",
      "value": 0
    }
  ],
  "states": [
    {
      "state_id": "default",
      "div": {
        "type": "container",
        "items": [
          {
            "type": "text",
            "text": "Всего страниц: @{pager_item_count}"
          },
          {
            "type": "pager",
            "item_count_variable": "pager_item_count",
            "items": [ ... ]
          }
        ]
      }
    }
  ]
}
```

{% cut "Посмотреть интерактивный пример" %}

<iframe src="https://yastatic.net/s3/home/divkit/docs/1.0.8/index.html?url=https://yastatic.net/s3/home/divkit/doc_samples/common/variables_5.json" width="700" height="500" frameborder="1"></iframe>

{% endcut %}

<!-- source: ru/_includes/index/troubleshooting.md -->
## Узнать больше {#troubleshooting}

Вы можете обсуждать интересующие вас темы в сообществе пользователей DivKit в Telegram: [https://t.me/divkit_community_ru](https://t.me/divkit_community_ru).



[Репозиторий DivKit](https://github.com/divkit/divkit)




<!-- endsource: ru/_includes/index/troubleshooting.md -->
