Если тема управления задачами в Obsidian вам близка - заглядывайте в мой тг-канал, там я разбираю подобные вещи регулярно.

Контекст: дашборд есть, но чего-то не хватает

Моя стартовая страница в Obsidian - это Canvas-файл с Tasks-запросами. Он показывает задачи на сегодня, завтра и просроченные. Для ежедневной работы этого достаточно.

Но периодически возникает другая потребность: посмотреть, что запланировано на конкретную дату в будущем. Например:

  • проверить загрузку перед отпуском

  • посмотреть, что стоит на дату переговоров через две недели

  • убедиться, что в конкретный день не стоит ничего лишнего

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

Что работает, но не удобно

Первое, что приходит в голову - написать Tasks-запрос с конкретной датой:

not done
due on 2025-12-30

Или аналог на Dataview:

TASK
WHERE !completed AND due = date("2025-12-30")

Оба варианта работают. Но у них общая проблема: дату нужно менять вручную прямо в коде каждый раз. Это значит - открыть файл, найти нужную строку, переключиться в режим редактирования, поменять дату, выйти обратно. Для разового запроса терпимо, для регулярного использования - нет.

Следующая идея - вынести дату в свойства файла (YAML-блок в начале заметки) и менять её там. Но это всё равно требует переключаться в режим редактирования и лезть в начало файла. Неудобство другое, суть та же.

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

Идея решения

Связка из трёх компонентов:

  1. Свойства файла (YAML-блок в начале заметки) - хранят выбранную дату в поле selected-date

  2. Meta Bind - рендерит интерактивную кнопку выбора даты, которая пишет значение прямо в это поле

  3. DataviewJS - читает поле и строит список задач на выбранную дату

Логика простая: Meta Bind отвечает за ввод, DataviewJS - за вывод. YAML-свойства - общая шина между ними.

Реализация

Шаг 1. Установить плагины

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

  • Meta Bind - устанавливается через Настройки → Сторонние плагины → Обзор

  • Dataview - там же. В настройках Dataview обязательно включить Enable JavaScript Queries

Шаг 2. Создать файл Someday.md

Создайте новый файл, например Someday.md. В начале файла добавьте YAML-блок со свойством для даты:

---
selected-date: 2025-12-30
---

Начальное значение не важно - оно будет перезаписываться через кнопку выбора даты.

Шаг 3. Добавить кнопку выбора даты

Сразу под YAML-блоком вставьте Meta Bind-виджет:

```meta-bind
INPUT[datePicker: selected-date]
```

Этот виджет рендерится прямо в заметке в режиме чтения. При клике открывается календарь, выбранная дата записывается в свойство selected-date.

Шаг 4. Добавить DataviewJS-скрипт

После кнопки выбора даты вставьте скрипт:

```dataviewjs
const targetDate = dv.current().file.frontmatter["selected-date"];

const pages = dv.pages('"Work"')
  .where(p => p.file.tasks
    .where(t => !t.completed && t.due && t.due.toISODate() === targetDate)
    .length > 0);

for (let page of pages) {
  dv.el("div", dv.fileLink(page.file.path, false), {
    attr: {
      style: "display:inline-block; margin:8px 0 4px 0; padding:3px 8px; border-radius:6px; background:#e0f0ff; color:#0366d6; font-weight:500;"
    }
  });

  dv.taskList(
    page.file.tasks
      .where(t => !t.completed && t.due && t.due.toISODate() === targetDate),
    false
  );
}
```

Разберём скрипт по частям.

Строка 1 - читаем выбранную дату из YAML-свойства файла. Dataview возвращает её как строку в формате YYYY-MM-DD, что важно для сравнения ниже:

const targetDate = dv.current().file.frontmatter["selected-date"];

Строки 3–6 - ищем все файлы в папке Work, у которых есть хотя бы одна незавершённая задача с дедлайном на выбранную дату. Метод .toISODate() конвертирует объект даты задачи в строку того же формата, что и targetDate:

const pages = dv.pages('"Work"')
  .where(p => p.file.tasks
    .where(t => !t.completed && t.due && t.due.toISODate() === targetDate)
    .length > 0);

Замените "Work" на название своей папки с задачами.

Строки 8–18 - для каждого найденного файла рендерим бейдж со ссылкой на файл задачи и список задач из него:

for (let page of pages) {
  dv.el("div", dv.fileLink(page.file.path, false), { ... });
  dv.taskList(
    page.file.tasks
      .where(t => !t.completed && t.due && t.due.toISODate() === targetDate),
    false
  );
}

Параметр false в dv.taskList означает, что задачи отображаются без автоматической группировки по файлу - мы группируем вручную через бейджи, это даёт больше контроля над внешним видом.

Шаг 5. Встроить в дашборд

Перетащите файл Someday.md на Canvas. Obsidian создаст карточку-ссылку на файл. При необходимости настройте размер карточки. Дальше можно либо работать с ней прямо на Canvas, либо переходить в файл по клику.

Нюансы

Задачи должны использовать синтаксис Tasks. Скрипт читает поле due из задач. Оно заполняется автоматически, если задачи создаются через плагин Tasks с эмодзи-синтаксисом (📅 2025-12-30). Обычные Markdown-чекбоксы без дедлайна в выборку не попадут.

Задержка обновления. После выбора даты DataviewJS-скрипт перезапускается автоматически, но с небольшой задержкой - около секунды. Это штатное поведение Dataview.


Итог

Готовое решение - это файл из трёх частей: YAML-свойство, кнопка выбора даты от Meta Bind и DataviewJS-скрипт. Каждая часть делает одно простое дело, и вместе они дают то, чего не хватало в стандартном наборе инструментов Obsidian.

Аналогичного решения на момент написания я не встречал ни на Reddit, ни на форуме Obsidian, ни на Хабре. Если у вас есть альтернативные подходы - пишите в комментариях, интересно сравнить. А также не забывайте подписываться на мой тг-канал.