# amoCRM: как работает коннектор

В этой статье вы узнаете, как коннектор amoCRM выгружает данные в хранилище ROMI center: что именно попадает в таблицу, с какой периодичностью идёт выгрузка и как устроена перезапись прошлых дней. Полный список полей — в статье [amoCRM: описание выгружаемых полей](https://help-ru.romi.center/amocrm-opisanie-vygruzhaemyh-polej).

## Что попадает в таблицу: события по сделкам

Коннектор выгружает события amoCRM, а не карточки: смену этапа сделки и другие изменения. По каждому событию он забирает саму сделку и её главный контакт, и в таблицу пишется одна строка.

> **Важно**
> Воронки и этапы в настройках не выбираются: коннектор берёт события по всем сделкам, а на шаге «Выбор полей» отмечаются только поля. У одной сделки в таблице по строке на каждое её изменение, попавшее в окно выгрузки — у каждой строки своя воронка и свой этап, те, что были у сделки в момент этого события.

Повторное попадание на тот же этап той же воронки по умолчанию считается дублем и в таблицу не попадает. Настройка «Учитывать повторные переходы в этап» добавляет к сравнению дату события: с ней каждый возврат сделки на пройденный этап даёт отдельную строку.

Поля сделки и поля её контакта лежат в одной строке одной таблицы — отдельных таблиц под контакты, компании или другие сущности amoCRM у коннектора нет. Значения полей берутся на момент выгрузки, то есть показывают карточку такой, какой её увидел коннектор. Исключение — воронка и этап: они пишутся такими, какими были в момент события.

## Периодичность

Коннектор опрашивает amoCRM каждые 30 минут (для отдельных аккаунтов расписание настраивается индивидуально) и заливает собранное в таблицу каждую минуту. Если данных накопилось за несколько дней — коннектор стоял или был сбой, — он догоняет их посуточно: за один прогон берётся ограниченное окно, остальное подхватят следующие запуски.

## За какой период забираются данные

Обычный прогон берёт данные с момента, на котором остановился прошлый прогон (курсор хранится по подключению), по текущий момент. Первый прогон нового подключения — с даты создания подключения минус 7 дней (если подключение создано раньше вчерашнего дня, отсчёт начинается с сегодняшнего — иначе первая загрузка растянулась бы на месяцы и задержала бы остальные подключения).

> **Примечание**
> Даты строк пересчитываются в часовой пояс из настроек подключения — если он указан неверно, события съедут на несколько часов и могут попасть в соседние сутки. Исключение — колонка «Дата события», если вы её выбрали: она пишется в UTC, поэтому со служебной датой строки может расходиться на величину смещения.

## Как сохраняет данные

*   **Куда:** хранилище ROMI center на движке ClickHouse.
*   **Имя таблицы:** `amocrm_<поддомен аккаунта>_<id подключения>` (например `amocrm_mycompany_412`).
*   **Один аккаунт можно подключить несколько раз** — например, чтобы выгружать разные наборы полей. Каждое подключение пишет в свою таблицу и опрашивает amoCRM само по себе, то есть нагрузка на API аккаунта растёт кратно числу подключений.
*   **Структура таблицы:** движок `MergeTree`, сортировка по `rc_data_id`. Разбиения на партиции нет.
*   **Структура догоняется, а не пересоздаётся.** Новое поле, выбранное в настройках, добавляется командой `ALTER TABLE … ADD COLUMN`. Колонки никогда не удаляются: если снять поле в настройках, колонка останется со старыми значениями, а новые строки будут писаться в неё пустыми.
*   **Повторная заливка того же события не плодит дубли.** У каждой строки есть `rc_data_id` — номер события в очереди ROMI. При повторной заливке строка с тем же `rc_data_id` удаляется и вставляется заново, а дата первой заливки (`rc_created_at`) переносится со старой строки.
*   **Одинаковые события отсеиваются ещё до таблицы.** Событие считается повтором, если по тому же подключению уже есть событие с той же сделкой, тем же этапом, той же воронкой и тем же назначением (а при включённой настройке «Учитывать повторные переходы в этап» — ещё и с той же датой события). Если значения пользовательских полей отличаются, повтором событие не считается.

## Перезапись прошлых дней

Сделки в amoCRM меняются задним числом, поэтому коннектор регулярно перечитывает недавние дни. Глубина — настройка «Перезагрузка прошлых дней»: 0, 1, 3 (по умолчанию), 7 или 14. При нуле автоматическая перезагрузка не запускается.

Автоматическая перезагрузка за выбранное число дней назад по вчерашний день удаляет из таблицы строки этого периода, эти же события — из очереди, и ставит на каждый день отдельное задание на повторный сбор. Функция «Загрузить исторические данные» в меню подключения работает за любой период: данные догружаются, уже загруженные события не задваиваются.

> **Важно**
> Галочка «Удалить ранее загруженные данные за период» у amoCRM удаляет таблицу целиком и очищает всю очередь событий подключения — не только выбранный период. После такой перезагрузки в таблице останется только перезагруженный период. Ставьте галочку, только если готовы перезагрузить всю историю.

## Дополнительные настройки

| Настройка | Что делает |
| --- | --- |
| Часовой пояс аккаунта | В нём читаются даты событий. Ставится один раз при настройке: при смене старые строки пересчитаны не будут. |
| Перезагрузка прошлых дней (0 / 1 / 3 / 7 / 14) | Глубина ежедневной перезаписи. Больше дней — больше нагрузка на API и дольше прогон. |
| Учитывать повторные переходы в этап | Включено — каждый возврат сделки на пройденный этап даёт отдельную строку, и данных становится заметно больше. Выключено (по умолчанию) — учитывается только первое попадание на этап. |

Набор выгружаемых полей задаётся на шаге «Выбор полей»: список приходит из вашего аккаунта amoCRM — стандартные поля плюс пользовательские поля сделок и контактов. Поле, добавленное позже, начинает заполняться со следующего прогона; задним числом оно появится только после перезагрузки.

> **Примечание**
> Конвертации валют в хранилище ROMI center нет. Колонки вида `<поле>_converted_<валюта>` создаются только у подключений с приёмником «ClickHouse»; в хранилище ROMI center суммы выгружаются как есть.

## Технические поля

| Колонка | Что внутри |
| --- | --- |
| `rc_data_id` | Номер события в очереди ROMI. По нему строка обновляется при повторной заливке. Заполнен всегда, проиндексирован. |
| `rc_created_at` | Дата и время события (если его нет — момент заливки). При перезаливке того же события сохраняется прежнее значение. |
| `rc_created_date` | Та же дата в UTC, без времени. По ней ночная перезагрузка удаляет строки за период. |

Других служебных колонок нет: `rc_updated_at`, `rc_import_id` и `rc_datasource`, которые встречаются у рекламных коннекторов, здесь не создаются.
