Ведёт Google Календарь голосом и текстом: ставит, переносит, отменяет
Вшивает в каждую встречу ссылку Google Meet (Zoom — по желанию, если дадите его ключи), приглашает участников по email
Понимает повторяющиеся серии: «йога каждый ПН и ПТ на 8 недель»
Считает часовые пояса, ловит накладки и сразу предлагает свободные окна
Напоминает перед встречей, утром присылает план дня, в понедельник — план недели
Массовые команды одной фразой, всё опасное — только после подтверждения кнопками
⏳ Время прохождения: 3–4 часа
Прогресс0 / 0
01
Зачем это нужно
🚫Планирование съедает внимание каждый день. Переписка «когда вам удобно», забытые встречи, перенос одной встречи тянет за собой три. У кого был живой помощник, тот платил ему в основном за ведение календаря.
💡ИИ-секретарь живёт в вашем Telegram и ведёт Google Календарь.
• Понимает голос и текст. Сказали «встреча с Иваном завтра в 15:00 по Москве», встреча в календаре.
• Ставит, переносит и отменяет встречи.
• Меняет у встречи длительность, описание, место и участников.
• Добавляет ссылку на видеовстречу: Google Meet — всегда, Zoom — если настроен.
• Приглашает участников по email, приглашение уходит им на почту.
• Показывает расписание на сегодня, завтра, неделю или конкретную дату.
• Считает часовые пояса и показывает обе зоны, когда встреча в другом городе.
• Переключает вашу зону, когда вы переехали или улетели.
• Ловит накладку на занятое время, предлагает три варианта (поставить всё равно, перенести, отменить) и сразу показывает свободные окна дня, куда встреча влезает.
• Показывает свободные окна: на сегодня, на эту неделю и на следующую.
• Удаляет только после подтверждения кнопками «Да» и «Нет» — случайно ничего не снесёт.
• Если встреч с одним названием несколько, даёт выбрать кнопкой с номером.
• Понимает массовые команды: «удали все встречи сегодня», «перенеси все встречи на неделю вперёд».
• Ведёт повторяющиеся встречи: «йога каждый ПН и ПТ с 11:00 на 8 недель» — серия одной фразой; чего не хватает (как часто, во сколько, докуда) — доспросит по одному.
• При удалении и переносе серии спрашивает объём кнопками: только эту, эту и все следующие или всю серию.
• Конфликты серии видит по датам и умеет «Пропустить эти дни» — серия встаёт, занятые даты остаются пустыми.
• Переспрашивает время, если вы его не назвали, вместо того чтобы придумать своё.
• Обычную встречу ставит и переносит сразу, карточка приходит уже как результат. Подтверждения спрашивает там, где цена ошибки высока: удаление, накладка по времени, время в прошлом.
• Напоминает перед встречей прямо в личку: за сутки, за час, за 30, 10 или 5 минут — какие включите в настройках.
• Утром присылает план дня, в понедельник план недели. Дни и время меняются кнопками в настройках.
Что вы говорите
Что делает ИИ-секретарь
«Встреча с Иваном завтра в 15:00 по Москве»
Сразу создаёт событие, добавляет ссылку на созвон и присылает карточку — уже как результат
«Перенеси встречу с Иваном на пятницу на 20:00 по времени Москвы»
Двигает встречу, длительность сохраняет
«Отмени встречу с Петей в четверг»
Удаляет после подтверждения
«Какие встречи у меня на неделе?»
Присылает список по дням
«Увеличь встречу с Иваном до двух часов»
Меняет длительность
«Добавь во встречу описание и позови petya@example.com»
Дописывает описание и отправляет приглашение на почту
«Переключи мой часовой пояс на Тбилиси»
Меняет зону календаря, дальше считает всё в ней
«Какая у меня сейчас зона?»
Показывает зону и текущее время
«Йога каждый ПН и ПТ с 11:00 до 12:30 на 8 недель»
Ставит серию: карточка «еженедельно по ПН и ПТ · до … (16 занятий)» с подтверждением
«Удали йогу»
Спрашивает объём: только эту / эту и все следующие / всю серию
📱А ещё у бота есть меню. Слева внизу в чате — синяя кнопка «Меню». Эти команды отрабатывают мгновенно, программным кодом, без обращения к модели — токены не тратятся.
Кнопка в меню
Что делает
/today · /tomorrow · /week · /next_week
Расписание на сегодня, на завтра, на эту и следующую неделю
/next
Ближайшая встреча со ссылками на созвон
/add
Добавить встречу: бот сам спросит, что и когда
/free · /free_week · /free_next
Свободные окна: сегодня, на этой неделе, на следующей
/reminders
Настройки напоминаний кнопками: дни, время, за сколько предупреждать
/tz
Показать текущую часовую зону
/help
Напомнить, что умеет бот
/new
Сброс: начать с чистого листа
✅Программный код руками писать не нужно. Вы отдаёте ссылку и промпт в Claude Code, дальше он всё делает сам и ведёт вас по шагам.
02
Что нужно иметь до старта
💡Всё из этого списка вы уже настраивали на курсе. Пробегитесь и отметьте, что живо. Если чего-то нет, сначала закройте этот пункт, иначе сборка встанет посередине.
VPN
Нужен для доступа к зарубежным сервисам.
Claude Code
Установлен и запускается на вашем компьютере. Для регистрации нужны почта, зарубежный номер для СМС и зарубежная карта — вы это уже проходили на курсе.
Сервер VPS с установленным OpenClaw
OpenClaw обязателен: через него бот подключается к вашей подписке ChatGPT.
Подписка ChatGPT
Подключается к боту через OpenClaw, отдельно за токены не платите.
Ключ Groq для распознавания голосовых
Тот же ключ, что делали на курсе (console.groq.com). Держите под рукой: Claude Code сам попросит его, когда будет собирать секретаря. Без него секретарь не поймёт голосовые.
✅Это настроим дальше по чек-листу, заранее ничего делать не нужно:
• Telegram-бот — заводим нового у @BotFather, отдельно под секретаря (блок 03, по промпту)
• Google OAuth и Calendar API(блок 04, руками)
• Ключи API от Zoom — по желанию (блок 06)
03
Репозиторий и главный промпт
📦Все файлы и инструкция лежат в репозитории. Вы отдаёте ссылку и промпт в Claude Code, он делает всё по инструкции и ведёт вас за руку.
Сам агент — самописный код в докер-контейнере на вашем VPS. Модель (LLM) нужна, чтобы понять вашу фразу и превратить её в команду. Если фраза не про календарь, бот отдаёт её модели и присылает свободный ответ — эти ответы каждый раз свои. А вот все календарные сценарии считает код: там одна и та же фраза даёт побайтово одинаковый ответ.
Всё остальное делает программный код: считает часовые пояса, проверяет накладки, собирает ответы по готовым шаблонам. Поэтому секретарь отвечает всегда одинаково и не фантазирует.
Модель — подписка ChatGPT (Codex) через OpenClaw. У подписки нет своего API, поэтому мостом работает OpenClaw: он авторизуется в вашу подписку и выдаёт боту обычный API-эндпоинт. OpenClaw на сервере обязателен, зато за токены отдельно платить не нужно.
⚠Сначала пройдите блок 04 и настройте доступ к Google. Без этого промпт остановится на втором шаге.
📋 Промпт: собрать ИИ-секретаря (в Claude Code)
Ты разворачиваешь мне личного ИИ-секретаря в Telegram. Готовый код, тесты и документация лежат здесь: https://github.com/stavzzz/svyazka-1 — с нуля ничего не пиши, работай с этим репозиторием.
ВАЖНО: при любой работе с OpenClaw используй скилл openclaw-docs. Команды и ключи конфигурации не выдумывай из памяти, сверяй по документации.
АРХИТЕКТУРА (не нарушать): модель превращает мою фразу в строгий JSON с командой, а если фраза не про календарь — отвечает свободным текстом (freeAnswer). Всё календарное делает программный код из репозитория: часовые пояса, конфликты, шаблоны сообщений, кнопки, напоминания. Проверка: одна и та же КАЛЕНДАРНАЯ фраза, отправленная несколько раз, даёт побайтово одинаковый ответ.
Веди меня по шагам. После каждого шага показывай результат и жди моего «дальше».
Шаг 1. Модель-классификатор — подписка ChatGPT (Codex) через OpenClaw. OpenClaw на сервере ОБЯЗАТЕЛЕН (он — мост к подписке, отдельно за токены платить не нужно). Проверь, что OpenClaw на сервере установлен и gateway работает.
Шаг 2. Проверь, что сервер жив и Docker установлен. Склонируй репозиторий, поставь зависимости и прогони тесты: npm install и npm test. Все 191 тест должны быть зелёными.
Шаг 3. Настрой модель через OpenClaw (образец — .env.example, подробности — README репозитория, раздел «Модель-классификатор»): (а) подключи мою подписку командой openclaw models auth login --provider openai — я залогинюсь в браузере; (б) в ~/.openclaw/openclaw.json включи gateway.http.endpoints.chatCompletions.enabled: true и добавь лёгкого агента-классификатора secretary-clf по готовому образцу из README; (в) скопируй docs/SOUL-classifier.md из репозитория в воркспейс этого агента как SOUL.md; (г) перезапусти gateway: openclaw gateway restart; (д) в .env: MODEL_FORMAT=openai, MODEL_BASE_URL=http://127.0.0.1:18789/v1 (контейнер работает в host-сети, это уже настроено в docker-compose.yml), MODEL_API_KEY=gateway-токен (gateway.auth.token из ~/.openclaw/openclaw.json), MODEL_NAME=openclaw/secretary-clf. Проверь мост тестовым запросом: в ответ должен прийти строгий JSON.
Шаг 4. Заведи Telegram-бота и распознавание голоса, веди меня по шагам:
— Бот: нужен НОВЫЙ бот отдельно под секретаря, даже если у меня уже есть другие боты. Продиктуй, что нажимать в @BotFather (/newbot, имя, username). Токен в чат не проси — скажи, в какую строку .env его вписать, я сделаю это сам.
— Мой Telegram id: подскажи написать @userinfobot и пришли мне, что оттуда скопировать (OWNER_CHAT_ID).
— Голосовые: ключ Groq у меня уже есть с курса — попроси его и впиши. Если я его потерял, проведи меня по шагам на console.groq.com (вход, раздел API Keys, создать ключ) — он бесплатный.
Затем впиши всё это в .env.
Шаг 5. Подключи Google Календарь: возьми креды (client_id, client_secret, refresh_token) — например, из файла кредов Google Workspace MCP — и пропиши путь к этому файлу в docker-compose.yml. OAuth Client ID я уже создал и Calendar API включил (блок 04).
Шаг 6. Zoom (опционально): скажи, какие строки .env заполнить (ZOOM_ACCOUNT_ID, ZOOM_CLIENT_ID, ZOOM_CLIENT_SECRET) — значения от Server-to-Server приложения я впишу сам, в чат их не присылаю. Если пропускаем — во встречах будет только Google Meet, он ставится всегда.
Шаг 7. Запусти бота: docker compose up -d --build. В логах должно появиться «calendar tz: …» и «menu registered». Учти: содержания переписки в логах нет — только технические события вида «msg len=42», «intent today», «done today». Если для отладки понадобится сам текст фраз, поставь LOG_DIALOG=1 в .env и верни обратно, когда закончишь. Затем прогони живую проверку: docker compose run --rm secretary-bot node scripts/live-smoke.js — все пункты зелёные. Кстати, в docker logs secretary-bot виден ход работы без содержания переписки: msg len=… → intent <название> → done — этого хватает, чтобы дебажить.
Шаг 8. Я нажимаю Start у бота. Покажи мне, что проверить руками: меню из 13 кнопок, создание встречи голосом, вопрос «Как назвать встречу?» если название не сказано, поиск «найди встречу …», конфликт с тремя кнопками и свободными окнами, настройки /reminders, день недели в каждой карточке.
Шаг 9. Прогони со мной чек-лист приёмки docs/ТЕСТЫ-ПРИЁМКИ.md из репозитория и покажи результат по каждому блоку.
Отправить промпт в Claude Code
Он начнёт с проверки и будет останавливаться после каждого шага.
04
Доступ к Google: делаем руками
⚠Единственная часть, которую нельзя поручить Claude Code: он не может зайти в вашу консоль Google. Дальше каждый шаг со ссылкой, которая открывает сразу нужный экран. Займёт минут пятнадцать.
💰Платить не нужно. Google Calendar API бесплатен, карту в консоли привязывать не требуется, платный Google Workspace тоже не нужен. Обычного Gmail достаточно.
Лимиты: 600 запросов в минуту на пользователя и миллион в сутки на проект. Секретарь делает несколько десятков запросов в день, упереться невозможно.
💡Google периодически переносит эти экраны и переименовывает разделы. Если увидите другое название, ориентируйтесь по смыслу: нужен доступ к календарю, согласие приложения и пара ключей.
Шаг 1. Открыть консоль и выбрать проект
Слева сверху выпадающий список проектов. Если проект уже заводили в уроке 5, выберите его и ничего не создавайте. Если проекта нет, нажмите «Создать проект», имя любое, например secretary.
Ссылка открывает сразу карточку нужного API. Нажмите синюю кнопку «Включить». Если вместо неё написано «Управлять», значит API уже включён, идите дальше.
Тип пользователя выберите «Внешний» и нажмите «Создать». Заполните три поля: название приложения, ваша почта для поддержки, ваша почта разработчика. Название увидите только вы, можно написать «Мой секретарь».
На шаге «Области доступа» нажмите «Добавить или удалить области». В поиске наберите calendar и отметьте две строки: .../auth/calendar и .../auth/calendar.events. Нажмите «Обновить», затем «Сохранить и продолжить».
Шаг 5. Опубликовать приложение
Вернитесь на экран согласия. В блоке «Статус публикации» нажмите «Опубликовать приложение» и подтвердите. Статус должен смениться с «Тестирование» на «В эксплуатации».
Нажмите «Создать учётные данные», выберите «Идентификатор клиента OAuth». Тип приложения: Веб-приложение. В разделе «Разрешённые URI перенаправления» добавьте адрес, который даст Claude Code на втором шаге промпта. Нажмите «Создать».
После создания появится окно с двумя строками: «Идентификатор клиента» и «Секрет клиента». Скопируйте обе в надёжное место. Позже их можно посмотреть там же, в списке учётных данных.
🚫Не пропускайте шаг 5. Если приложение останется в режиме тестирования, доступ к календарю отвалится ровно через семь дней, и секретарь замолчит. Это самая частая причина поломки.
⚠Секрет клиента это пароль от доступа к вашему календарю. Не выкладывайте его в открытый репозиторий и не пересылайте в общие чаты.
05
Настройка секретаря
💡Всё в этом блоке делает Claude Code по промпту из блока 03. Ваша задача: подтверждать шаги и проверять результат.
Подключить Google Календарь
Claude Code берёт из Google Workspace MCP только файл с доступами к Календарю — дальше боту сам MCP не нужен.
Войти в свой Google-аккаунт по ссылке
Секретарь пришлёт ссылку. Открываете, входите, разрешаете доступ. Больше ничего вводить не нужно.
Задать правила секретаря
Часовой пояс, рабочие часы, длительность по умолчанию, подтверждение на опасных действиях.
Включить проверку накладок
Если новая встреча пересекается с существующей, секретарь предложит три варианта вместо того, чтобы молча поставить.
Включить работу с часовыми поясами
Секретарь считает время по названному городу и показывает обе зоны, когда они различаются.
Включить ссылку Google Meet
Добавляется к новым событиям автоматически.
Настроить напоминания
За сутки, за час и за пять минут до встречи, в личку.
Настроить план дня и план недели
План дня в 08:00, план недели по понедельникам в 09:00.
✅Подтверждения стоят там, где цена ошибки высока: удаление, накладка по времени, время в прошлом и операции с сериями. Обычное создание и перенос идут сразу — иначе бот превращается в бесконечное «вы уверены?».
06
Zoom дополнительно к Google Meet
💡Google Meet подключается сам и работает сразу. Этот блок нужен, только если вы проводите встречи в Zoom. Можно пропустить и вернуться позже.
💰Бесплатного тарифа Zoom хватает для этой связки. Приложение создаётся бесплатно, агент создаёт встречи и получает ссылку, ссылка вшивается в календарь.
Деньги нужны не за доступ к API, а за саму встречу: на бесплатном тарифе групповой созвон выключается на 40-й минуте, и одновременно вести две встречи нельзя.
⏱У Google Meet на бесплатном личном аккаунте свои лимиты: встреча один на один держится до 24 часов, а встреча с тремя и более участниками обрывается через час.
👤Входите владельцем аккаунта Zoom. Создать такое приложение может только пользователь с правами на приложения Server-to-Server OAuth. На личном аккаунте это вы сами. Если вы участник чужого рабочего аккаунта, права выдаёт его администратор.
Создать приложение в Zoom
1. Откройте Zoom App Marketplace и войдите своим аккаунтом Zoom. 2. Откройте раздел для разработчиков, нажмите Develop и выберите Build App. 3. Выберите Server-to-Server OAuth App и нажмите Create. 4. Введите название, например «Секретарь». Его видите только вы.
Этот тип приложения работает без окна входа: бот сам получает доступ по ключам, вам не нужно ничего подтверждать.
Впишите название компании, своё имя и почту в разделе с контактами разработчика. Без имени и почты Zoom не даст активировать приложение. Описание можно оставить коротким.
Выдать право на создание встреч
Вкладка Scopes → Add Scopes. В поиске наберите meeting:write и отметьте право meeting:write:meeting:admin и сохраните.
Боту нужно только это право: он создаёт встречу и забирает ссылку на неё. Лишних прав не добавляйте.
Активировать приложение
Вкладка Activation, нажмите кнопку активации. Пока приложение не активировано, ключи не работают и бот получит отказ. Если кнопка неактивна, Zoom покажет, какое поле ещё не заполнено. Чаще всего это имя или почта на вкладке Information.
Скопировать три ключа
Вкладка App Credentials. Там лежат Account ID, Client ID и Client Secret. Сохраните все три в менеджер паролей.
⚠Client Secret работает как пароль от вашего Zoom. Не вставляйте ключи в чат, не выкладывайте в репозиторий и не пересылайте в общие чаты. Вписывайте их в файл настроек сами.
📋 Промпт: подключить Zoom к секретарю (в Claude Code)
Подключи Zoom к моему ИИ-секретарю из связки 1. Сервер: ssh my-server.
1. Ключи Zoom в чат не проси. Открой .env секретаря и скажи, в какие строки я впишу их сам: ZOOM_ACCOUNT_ID, ZOOM_CLIENT_ID, ZOOM_CLIENT_SECRET.
2. Когда я напишу «вписал», перезапусти контейнер секретаря.
3. Попроси меня поставить в боте тестовую встречу. После этого проверь логи секретаря: строки «zoom create failed» быть не должно.
4. Если строка есть, объясни простыми словами, что не так: приложение не активировано, не хватает права meeting:write:meeting:admin или неверный ключ.
Ключи никуда не выводи.
Подключить Zoom к секретарю
Отправьте промпт выше в Claude Code. Он покажет, куда вписать ключи, перезапустит бота и после тестовой встречи проверит, что Zoom не вернул ошибку.
Проверить ссылку на Zoom во встрече
Попросите бота: «Поставь встречу завтра в 15:00». Когда Zoom настроен, бот сам добавляет ссылку на встречу в Zoom. Проверьте, что она есть в карточке встречи и в Google Календаре.
07
Проверьте, что всё работает
🎯Отправляйте фразы боту одну за другой и отмечайте, что получилось. Голосом и текстом результат должен быть одинаковый.
«Поставь встречу с Иваном завтра в 15:00 по Москве»
Секретарь создаёт встречу сразу и присылает карточку — событие уже в Google Календаре. Спрашивать он будет только там, где цена ошибки высока.
Проверить ссылку на созвон
Откройте созданное событие: в нём должна быть ссылка на видеовстречу.
«Поставь встречу с Петей в четверг»
Время не названо. Секретарь обязан переспросить, а не выдумать время сам.
«Поставь встречу завтра на 23:00» — без названия
Название не прозвучало. Секретарь обязан спросить «Как назвать встречу?», а не создать безликую «Встречу». Ответьте названием — оно попадёт в календарь.
«Найди встречу <название>»
Секретарь показывает карточку найденной встречи. Падежи не мешают: «найди встречУ тест» найдёт «Тест».
День недели в каждой карточке
Во всех сообщениях с датой она пишется с днём недели: «ЧТ, 23 июля 2026» — в карточках создания, напоминаниях, плане дня и списках.
Поставить вторую встречу на то же время
Секретарь предупреждает о накладке и предлагает три варианта: поставить всё равно, перенести, отменить.
«Перенеси встречу с Иваном на пятницу на 20:00 по времени Москвы»
Встреча переезжает, длительность сохраняется.
«Увеличь встречу с Иваном до двух часов»
Меняется только длительность, остальное остаётся.
«Добавь во встречу с Иваном описание и позови petya@example.com»
Появляется описание, участнику уходит приглашение на почту.
«Какие встречи у меня на неделе?»
Приходит список, сгруппированный по дням.
«Какая у меня сейчас часовая зона?»
Секретарь называет зону и текущее время в ней.
«Переключи мой часовой пояс на Тбилиси»
Зона меняется. Следующее расписание приходит уже в новой зоне.
Поставить встречу в другом городе
Например «встреча в Дубае в 10:00». В карточке должны быть обе зоны: ваша и города встречи.
«Отмени встречу с Петей в четверг»
Секретарь показывает карточку с кнопками «Да, удалить» и «Нет». Удаляет только после «Да». После нажатия кнопки исчезают, в карточке остаётся выбранный статус.
Проверить напоминание
Поставьте встречу через десять минут и дождитесь напоминания за пять минут.
Проверить план дня
Не ждите утра: попросите Claude Code запустить рассылку вручную и убедитесь, что сообщение пришло.
Открыть меню и нажать /free
Синяя кнопка «Меню» слева внизу. Приходят свободные окна на сегодня с длительностью каждого. Заодно проверьте /next и /week.
Создать две встречи с одинаковым названием и попросить удалить
Секретарь спрашивает «какую именно?» и даёт кнопки с номерами. Есть и кнопка «Удалить все».
«Удали все встречи сегодня»
Секретарь показывает список всего за день и спрашивает подтверждение. Нажмите «Нет» — ничего не удалится. Так же работает «перенеси все встречи на неделю вперёд».
«Поставь йогу каждый ПН и ПТ с 11:00 до 12:30 на 8 недель»
Секретарь показывает карточку серии: «Первая встреча в …», «еженедельно по ПН и ПТ · до … (16 занятий)». После подтверждения серия появляется в Google Календаре.
«Поставь повторяющуюся встречу Ретро» — без деталей
Секретарь доспрашивает по одному: как часто → во сколько → докуда повторять («до конца августа», «10 раз» или «бессрочно»).
«Удали йогу» (серия) — потом то же с переносом: «перенеси йогу на 12:00»
Секретарь спрашивает объём кнопками: только эту / эту и все следующие / всю серию. «Удали серию йоги» — сработает сразу, без вопроса.
Поставить серию поверх занятых дней
Секретарь перечисляет конфликтные даты и предлагает: поставить всё равно / пропустить эти дни (серия встаёт, занятые даты остаются пустыми) / отменить.
Ответить на вопрос о времени голосом с деталями
Например: «на 22:00, на полтора часа, место — офис». Время, длительность и место должны попасть в одну встречу, ничего не теряется.
Открыть /reminders и выключить субботу
Настройки меняются кнопками прямо в карточке: дни и время плана дня, план недели, за сколько напоминать. Нажали — карточка обновилась.
Отправить одну и ту же фразу несколько раз
Календарный ответ должен приходить слово в слово одинаковый. Если плавают формулировки карточек и списков, значит их сочиняет модель, а не код, — это надо чинить. Свободные ответы на вопросы не про календарь каждый раз свои, так и задумано.
08
Если что-то пошло не так
Что видите
Что делать
Секретарь не видит календарь
Попросите Claude Code проверить подключение календаря и переподключить его
Работал неделю и перестал
Приложение осталось в режиме Testing. Переведите в Production и войдите в Google заново
Голосовые не понимает
Проверьте, что ключ Groq вписан в .env
Встречи встают не в то время
Не задан часовой пояс. Попросите дописать его в правила секретаря
Удаляет или двигает поверх занятого времени, ничего не спросив
Потерялись подтверждения на опасных действиях. Обычное создание без вопроса — это норма
Zoom не создаёт конференции
Проверьте, что приложение активировано и выданы права на встречи
Напоминания не приходят
Попросите Claude Code показать расписания и проверить, куда настроена доставка
💬Любую ошибку отправляйте в Claude Code целиком, вместе с текстом из терминала. Он разберёт и починит.
💡На будущее: секретарь это первый сотрудник вашего AI-офиса. Тот же приём работает для задач, финансов и почты: один агент, понятные правила, расписание.