---
title: "Скрипты"
id: "2266"
type: "page"
slug: "scripts"
published_at: "2026-10-04T04:39:13+00:00"
modified_at: "2026-10-19T18:55:42+00:00"
url: "https://pastukhov.com/agents/crm/addons/scripts/"
markdown_url: "https://pastukhov.com/agents/crm/addons/scripts.md"
excerpt: "Надстройка «Скрипты» — это свой код на Python для всего, что не покрывают готовые инструменты:…"
---

# Скрипты

[https://pastukhov.com/agents/crm/addons/scripts/.md](https://pastukhov.com/agents/crm/addons/scripts/.md)

Надстройка **«Скрипты»** — это свой код на Python для всего, что не покрывают готовые инструменты: забрать данные из внешней системы, отправить их куда нужно, посчитать, разложить по местам, разово прибраться в старых записях. Скрипт живёт файлом прямо в проекте, рядом с остальными настройками, и версионируется вместе с ними. Каждый запуск виден в «Консоли скриптов»: вкладки «Определения» и «Настройки» показывают список скриптов и состояние среды, а журнал запусков отвечает, чем закончился каждый прогон.

![Консоль скриптов CRM-агента, вкладка «Определения»: доска определений пуста, видны состояние среды и аварийный выключатель](https://pastukhov.com/wp-content/uploads/2026/10/crm-agent-addon-scripts.png)## Зачем это нужно

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

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

## Что умеет

- **Скрипт — файл проекта.** Код можно держать прямо в описании скрипта или отдельным файлом `.py` рядом. Источник кода всегда один: если задать и то и другое, продукт откажет. Правки вступают в силу без перезапуска, а сами файлы версионируются вместе с проектом.
- **Четыре способа запустить.** По расписанию, вручную из консоли, по обращению внешней системы на публичный адрес с ключом и шагом в правиле «Автоматизации». Один и тот же скрипт можно повесить сразу на несколько поводов.
- **Расписание.** Задаётся простым интервалом — «каждые пятнадцать минут», «раз в сутки». Продукт сам считает, пора ли запускать: если скрипт не запускался дольше своего интервала, он сработает при ближайшем обходе. Одновременно идёт один запуск, наложений не бывает; неудачный запуск не отменяет расписание.
- **Публичный адрес для внешних систем.** Внешняя программа обращается по адресу скрипта со своим ключом и присылает данные; тело и заголовки запроса доходят до кода. Неверный ключ — ничего не запускается, слишком большой запрос — отказ, слишком частые обращения — тоже отказ.
- **Что видит скрипт.** Повод запуска, параметры и пришедшие данные, объявленные переменные окружения и постоянный рабочий каталог для своих заметок и состояния — им удобно хранить, до какого места дочитали в прошлый раз. Ключа управления продуктом среди этого нет: скрипт не может распоряжаться продуктом от его имени.
- **Секреты остаются секретами.** Пароли и ключи для внешних систем задаются в описании скрипта и хранятся только на запись: в ответе консоли вместо значения видно `***`. Прочитать их обратно нельзя, и в журналах запусков они не появляются.
- **Библиотеки — один общий набор.** Список нужных библиотек задаётся один раз на все скрипты и устанавливается автоматически. Отдельных наборов на каждый скрипт не бывает — зато и следить не за чем.
- **Журнал запусков.** На каждый запуск — строка: чем запущен, когда, сколько шёл, чем кончился и с какой ошибкой. Ошибка сохраняется вместе с хвостом сообщения от Python, поэтому разбираться можно по факту, а не по догадке. Консоль обновляется в живом режиме: результат виден, как только запуск завершился.
- **Проверка перед вводом в строй.** Пробный запуск с образцом данных отвечает прямо в консоли: видно результат и ошибку, если что-то не так, и при этом ничего лишнего не происходит.
- **Состояние среды.** Над списком скриптов видно главное: включены ли скрипты вообще, готов ли Python, установлены ли библиотеки, сколько запусков и падений за сутки и сколько дней хранится журнал. Если чего-то не хватает, продукт говорит об этом прямо, а не молчит зелёным огоньком.
- **Пределы — видимые числа.** Есть общий выключатель, которым скрипты останавливаются разом. На запуск отводится минута по умолчанию и десять минут в пределе; при превышении процесс снимается целиком, вместе с порождёнными им. Одновременно выполняется не больше двух скриптов, размер передаваемых данных ограничен, журнал хранится тридцать дней по умолчанию.
- **Неверная правка не ломает работу.** Если в описании скрипта ошибка, продукт продолжает использовать последний рабочий вариант, а ошибки показывает в консоли. Одна опечатка не остановит работу, которая уже налажена.
- **Скрипт под защитой.** Скрипт, на который ссылается правило автоматизации, не удалится: отказ назовёт правила, которые на него опираются. Сначала снимается зависимость — потом удаляется файл.

## Как это связано с другими надстройками

«Скрипты» — самостоятельная надстройка: она ни от чего не зависит и работает на одном ядре, а её запуск по расписанию и публичный адрес никого больше не требуют. Главный её потребитель — [«Автоматизация»](/agents/crm/addons/automation)
: там запуск скрипта становится обычным действием правила, наравне с письмом или задачей. При сохранении правила продукт проверяет, что такой скрипт существует, и не даст сохранить ссылку в пустоту; если надстройку скриптов выключили, шаг честно назовёт причину отказа, а остальные шаги правила выполнятся.

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

## Честные границы

- Песочницы нет. Скрипт работает с правами сервера и имеет доступ к его файлам и сети. Это код доверенного администратора, и проверять его нужно так же, как остальные настройки проекта.
- Поддерживается только Python. Другие языки не запускаются, и добавлять их нельзя.
- Набор библиотек — один на все скрипты. Разные версии одной библиотеки под разные задачи не поддерживаются.
- Скрипт ничего не утверждает сам: он выполняет работу и возвращает результат. Согласования, отправка писем клиентам и другие решения остаются за продуктом и за человеком.
- Ключ управления продуктом скрипту не выдаётся: распоряжаться продуктом от его имени скрипт не может, даже если очень нужно.
- Публичный адрес ограничен по частоте обращений, но повторные события не склеивает: если внешняя система пришлёт одно и то же дважды, скрипт выполнится дважды. Защита от повторов остаётся на стороне того, кто присылает.
- Журнал не вечен: по умолчанию он хранится тридцать дней, и старые строки удаляются. Нужна долгая история — её выгружают отдельно.
- Консоль только показывает. Меняются скрипты через управляющий доступ — агентом, а не кликами в браузере: это осознанное правило, а не недоделка.

Все надстройки → [Каталог надстроек](/agents/crm/addons)

Подробнее в документации: [Свои скрипты на Python](/agents/crm/docs/scripts)

[← Документация CRM-агента](/agents/crm/docs)
