Если тема управления задачами в 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-dateMeta 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, ни на Хабре. Если у вас есть альтернативные подходы - пишите в комментариях, интересно сравнить. А также не забывайте подписываться на мой тг-канал.
