Динамический просмотр задач на любую дату в Obsidian: Meta Bind + DataviewJS
Если тема управления задачами в Obsidian вам близка — заглядывайте в мой тг-канал, там я разбираю подобные вещи регулярно.
Контекст: дашборд есть, но чего-то не хватает
Моя стартовая страница в Obsidian — это Canvas-файл с Tasks-запросами. Он показывает задачи на сегодня, завтра и просроченные. Для ежедневной работы этого достаточно.

Но периодически возникает другая потребность: посмотреть, что запланировано на конкретную дату в будущем. Например:
-
проверить загрузку перед отпуском
-
посмотреть, что стоит на дату переговоров через две недели
-
убедиться, что в конкретный день не стоит ничего лишнего
Для таких случаев нужна отдельная страница с выбором произвольной даты.
Что работает, но не удобно
Первое, что приходит в голову — написать Tasks-запрос с конкретной датой:
not done
due on 2025-12-30
Или аналог на Dataview:
TASK
WHERE !completed AND due = date("2025-12-30")
Оба варианта работают. Но у них общая проблема: дату нужно менять вручную прямо в коде каждый раз. Это значит — открыть файл, найти нужную строку, переключиться в режим редактирования, поменять дату, выйти обратно. Для разового запроса терпимо, для регулярного использования — нет.

Следующая идея — вынести дату в свойства файла (YAML-блок в начале заметки) и менять её там. Но это всё равно требует переключаться в режим редактирования и лезть в начало файла. Неудобство другое, суть та же.
Хотелось чего-то другого: кликнул на поле с датой прямо в режиме чтения — выбрал дату — список задач обновился.
Идея решения
Связка из трёх компонентов:
-
Свойства файла (YAML-блок в начале заметки) — хранят выбранную дату в поле
selected-date -
Meta Bind — рендерит интерактивную кнопку выбора даты, которая пишет значение прямо в это поле
-
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, ни на Хабре. Если у вас есть альтернативные подходы — пишите в комментариях, интересно сравнить. А также не забывайте подписываться на мой тг-канал.
Автор: psheno322

