Направление работ: WebLk Код раздела: 6.4 Отчеты > Клиенты Раздел: Клиенты Статус: черновик Ответственный: Панкова Л.А. Версия: 0.1 Обновлено: 20.07.26


1. Назначение

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

Партнер просматривает список клиентов, ищет и фильтрует клиентов, добавляет клиента, запускает действия со списком и переходит в карточку клиента.

Раздел зависит от Back: 1.3 Аккаунты и пользователи > Клиенты.

2. Ключевые понятия

Клиент — пользователь, данные которого отображаются партнеру в отчете и карточке клиента.

Отчет по клиентам — раздел WebLk со списком клиентов и действиями над этим списком.

Карточка клиента — детальный экран клиента, в который пользователь переходит из отчета. Описывается отдельно в https://wiki.yandex.ru/homepage/d750da42741c/texnicheskaja-dokumentacija/brd/f0421948614f/b8f68698b64f/ebbe7d6c3aef/6.4.1-kartochka-klienta/ и https://wiki.yandex.ru/homepage/d750da42741c/texnicheskaja-dokumentacija/brd/dokumentacija-po-funkcionalurazdelam/1-akkaunty-i-polzovateli/1.3-klienty/ .

Группа клиента — признак, по которому партнер может сегментировать клиентов и использовать фильтрацию.

Статус клиента — признак клиента, доступный для фильтрации и отображения в отчете.

Скидка / сбор / промокод — признаки клиента, которые используются в фильтрах отчета.

3. Scope

Входит

S1: Открытие отчета по клиентам S2: Просмотр списка клиентов S3: Поиск и фильтрация списка S4: Добавление клиента S5: Действия со списком клиентов S6: Переход в карточку клиента S7: Состояния интерфейса

Не входит

  • WebLk 6.4.1 Карточка клиента
  • WebLk 6.2 Заказы и заявки
  • WebLk 5.3 Работа с заказами
  • Back 1.3.2 / 1.3.3 Управление характеристиками, группами и справочниками клиентов
  • Back 3 Бэковская логика заказов, заявок и оплат
  • AdmLk 3.2 / 3.2.1 Административная работа с клиентами и карточкой клиента
  • Backend/API-контракты, структура БД и техническая реализация

4. BR

Указаны в пункте 4 раздела Back: 1.3 Аккаунты и пользователи > Клиенты.

5. Функциональные требования (UC + FR) {#5-funkcionalnye-trebovaniya-uc-fr}

FR — functional requirement: что интерфейс должен уметь делать в рамках конкретного пользовательского сценария.

IDСценарийФункциональное требованиеBRВесСтатус
S1: FR6.4-1Партнер открывает раздел «Клиенты»Интерфейс открывает отчет по клиентам как основной экран раздела.1Реализовано
S1: FR6.4-2Партнер работает с отчетом по клиентамИнтерфейс показывает основные действия раздела: поиск, фильтрацию, добавление клиента, выгрузку и меню дополнительных действий.1Реализовано
S2: FR6.4-3Партнер просматривает список клиентов и их признакиИнтерфейс показывает список клиентов с данными и признаками, необходимыми для идентификации клиента и работы с отчетом: группу (на будущее), статус и признаки, связанные со скидкой, сбором или промокодом, если эти данные есть у клиента, а также кол-во заказов и действующий способ оплаты.
Почта и телефон кликабельные – написать на почту или позвонить
При наведении на Промокод со значением”Есть” появляется всплывающее окно с информацией о промокоде
1Частично \ #OQ6.4-6
S2: FR6.4-4Партнер ищет клиентаИнтерфейс позволяет искать клиента из отчета через поле поиска или / и применить фильтрацию по датам регистрации.1Частично \ #OQ6.4-3
S3: FR6.4-5Партнер фильтрует список клиентовИнтерфейс позволяет фильтровать список клиентов по группе клиента (на будущее), наличию скидки, наличию сбора, промокоду и статусу клиента.1Реализовано
S3: FR6.4-6Партнер просматривает примененные фильтрыИнтерфейс показывает примененные фильтры и позволяет удалить отдельный фильтр без сброса остальных.1Частично \ #OQ6.4-1
S3: FR6.4-7Партнер изменяет условия фильтрацииИнтерфейс обновляет список клиентов после применения или удаления фильтра.2Реализовано
S3: FR6.4-8Партнер добавляет клиентаИнтерфейс открывает форму «Добавить клиента».1Реализовано
S4: FR6.4-9Партнер заполняет данные клиентаФорма добавления клиента содержит поля: имя, фамилия, телефон и email.1Реализовано
S4: FR6.4-10Партнер сохраняет клиентаИнтерфейс не позволяет сохранить клиента, пока обязательные поля имя и телефон не заполнены корректно.2Частично \ #OQ6.4-2 \ #OQ6.4-8
S4: FR6.4-11Партнер закрывает форму добавления клиентаИнтерфейс позволяет закрыть форму добавления клиента без сохранения данных.2Реализовано
S4: FR6.4-12Партнер добавляет клиента в группу (на будущую реализацию)Интерфейс позволяет выбрать группу клиента при добавлении клиента, если партнеру доступны группы клиентов.3Не реализовано (по плану)
S5: FR6.4-13Интерфейс позволяет скачать отчет по клиентам в формате XLS или CSV.Интерфейс позволяет запустить выгрузку списка клиентов из отчета.2Частично \ #OQ6.4-4
S5: FR6.4-14Партнер открывает дополнительные действияИнтерфейс открывает меню «Настройки отображения», где партнер может выбрать отображение по умолчанию, скрывать и показывать колонки отчета, менять порядок колонок.2Реализовано
S6: FR6.4-15Партнер выбирает клиента из отчетаИнтерфейс позволяет перейти из выбранного клиента в карточку клиента WebLk 6.4.1.1Реализовано
S6: FR6.4-16Партнер переходит в карточку клиентаИнтерфейс открывает карточку выбранного клиента и переходит в раздел https://wiki.yandex.ru/homepage/d750da42741c/texnicheskaja-dokumentacija/brd/f0421948614f/b8f68698b64f/ebbe7d6c3aef/6.4.1-kartochka-klienta/ .1Реализовано
S6: FR6.4-17Партнер открывает отчет или меняет условия отображенияИнтерфейс показывает состояние загрузки при получении списка клиентов, применении фильтров и запуске действий со списком.2Реализовано
S7: FR6.4-18Партнер ищет или фильтрует клиентов, но результатов нетИнтерфейс показывает пустое состояние, если по текущим условиям поиска или фильтрации клиенты не найдены.2Не реализовано \ #OQ6.4-7
S7: FR6.4-19Партнер выполняет действие, которое недоступно или завершилось ошибкойИнтерфейс показывает ошибку, если список клиентов, фильтры, сохранение клиента или выгрузка недоступны.2Реализовано
S7: FR6.4-20Партнер использует страницу на разных ширинах экранаИнтерфейс адаптирует страницу площадки, карточки, связанные блоки, формы редактирования и таблицы для desktop, laptop и tablet и mobile.2Частично \ #OQ6.4-5

6. Открытые вопросы {#6-otkrytye-voprosy}

IDИсточникВопросКомуСтатусРекомендацииИтоговое решение
OQ6.4-1Код FR6.4-6Требование говорит: интерфейс показывает применённые фильтры и даёт снять отдельный без сброса остальных. В коде отдельного отображения (чипов) нет — все фильтры живут внутри выпадающего меню «Фильтр», снаружи не видны; снять один можно, только заново открыв меню и вернув значение в «Все». \ ClientsReportFilters.vue:16-89; ClientReport.vue:26-57Бизнес/РазработкаOpen(А, рекоменд.) добавить ряд чипов активных фильтров (дата/скидка/сбор/промокод/статус) с «×», снимающим только свой фильтр через существующий setFilters({…:'all'/[]}); (Б) признать чипы избыточными для v0.1 и перенести «на будущее» в BRD. Продуктовое решение о наличии чипов.Вариант Б
OQ6.4-2Код FR6.4-10Требование говорит: сохранение блокируется, пока не заполнены обязательные имя и телефон (фамилия — необязательная, FR6.4-9). В коде обязательны имя, телефон И фамилия: схема требует lastName (min 2), поле подписано «Фамилия*». \ create-client-form.schema.ts:11-16; CreateClient.vue:97РазработкаЗакрывает PMBRD прямо относит к обязательным только имя+телефон — код это нарушает. Закрываю сам: сделать lastName необязательным и снять «*» с подписи → тикет в Bitrix. Если продукт хочет фамилию обязательной — это правка BRD (перечень обязательных), тогда вернуть.Я бы оставил фамилию обязательной. Насколько я помню, Это изабвляет он лишних проверок в коде на наличие фамилии, также во всех интерфейсах в фигме расчитано, что у клиента есть фамилия
OQ6.4-3Код FR6.4-4Проблема: фильтр по датам регистрации есть, но по умолчанию задан диапазон «последний месяц» и применён сразу при открытии — клиенты, зарегистрированные раньше, в отчёте по умолчанию не видны, пока партнёр не расширит диапазон. \ clients-report.ui.ts:12-13,69,120-121Бизнес (Герман)OpenВлияет на то, каких клиентов партнёр видит сразу. Нужно подтверждение: предустановленный «последний месяц» задуман? (А) подтвердить как осознанный дефолт и отразить в BRD; (Б, реком. проверить) по умолчанию не ограничивать по дате (или расширить окно), чтобы отчёт не выглядел неполным.Тут требуется решение со стороны бизнеса. Для сокращения времени разработки стоит до релиза оставить выбор по последнему месяцу в фильтре. В дальнейшем, если будет запрос от пользователей поменять дефотлную фильтрацию
OQ6.4-4Код FR6.4-13Требование говорит: запустить выгрузку списка клиентов из отчёта (XLS/CSV). В коде выгрузка в CSV/XLSX есть, но выгружается только текущая страница (в кнопку передаётся текущая пачка, размер страницы = 10), а не весь отфильтрованный отчёт. \ ClientReport.vue:23,36; clients-report.ui.ts:68; useTableExport.ts:28-36Бизнес/РазработкаOpen«Выгрузить отчёт» ≠ «10 строк текущей страницы». (А, рекоменд.) выгружать весь отфильтрованный список (запросить все страницы / увеличенный размер перед экспортом); (Б) осознанно оставить постраничную выгрузку и описать это в BRD.Решение: (Б) Есть техническое ограничение. Бек присылает только актуальную страницу, которую пользователь видит на экране. Чтобы реализовать всю выгрузку, потруется отдельный запрос на получаение всех клиентов. Решение: оставить постраничную выгрузку на стадии mvp
OQ6.4-5Код FR6.4-20Требование говорит: адаптив под desktop, laptop, tablet, mobile. В коде найдены только частичные приёмы: перенос панели действий (flex-wrap) и горизонтальный скролл таблицы; отдельной раскладки таблицы под tablet/mobile не найдено. \ ClientReport.vue:29; DataTable.vue:270-274; pages/reports-page/index.vue:105-108Бизнес/РазработкаOpenТаблица широкая → на узких экранах уходит в горизонтальный скролл. Нужно подтверждение полноты адаптива. (А, рекоменд.) уточнить требования к tablet/mobile и при необходимости добавить компактную/карточную раскладку; (Б) зафиксировать горизонтальный скролл как принятое поведение.Решение: (Б) оставить горизонтальный скрол до релиза. Далее смотреть по реакции пользователей.
OQ6.4-6Код FR6.4-3Проблема: телефон корректно tel:, а колонка «Электронная почта» тоже отдаёт href="tel:${email}" вместо mailto: — клик по почте пытается позвонить, «написать на почту» не работает. \ defaultColumns.ts:46 (ср. телефон :30)РазработкаЗакрывает PMЯвная ошибка, продуктового выбора нет. Закрываю сам: заменить в колонке email href на mailto:${item.email} → тикет в Bitrix. Заодно косметическая опечатка заголовка «Статуc» (латинская c) — defaultColumns.ts:104.Это баг, его надо исправить. Нужно завести баг-репорт, исправить
OQ6.4-7Код FR6.4-18Требование говорит: показывать пустое состояние, если по условиям клиенты не найдены. В коде пустого состояния нет: при нулевом результате DataTable рисует только заголовки колонок, без строк и без сообщения; ошибка загрузки даёт тост, но тело таблицы выглядит так же — «пусто» и «ошибка» визуально не различить. \ DataTable.vue:144-215РазработкаЗакрывает PMFR веса 2 не реализован, продуктового выбора нет. Закрываю сам: добавить в DataTable пустой блок (при !isLoading && items.length===0) с текстом и по возможности различать «нет данных» и «ошибка загрузки» → тикет в Bitrix.Решение: сделать интерфейс с пустой таблицей и добавить это отображение, если пользователи не найдены
OQ6.4-8Код FR6.4-10Требование говорит: не сохранять, пока обязательные поля не заполнены корректно. В коде маска имени/фамилии допускает только буквы одного алфавита (латиница ИЛИ кириллица) и требует минимум 2 символа: «Анна-Мария», имена с апострофом/пробелом, из разных алфавитов или из 1 буквы не проходят и клиента не сохранить. \ create-client-form.schema.ts:5-16РазработкаЗакрывает PMМаска рискует отклонять легитимные имена. Закрываю сам: ослабить regex (разрешить пробел, дефис, апостроф; при необходимости оба алфавита) → тикет в Bitrix. Оговорка: минимальную длину имени согласовать с продуктом (сейчас 2).Решение: Составить четки требования к валидации полей ВСЕГО приложения

Вопросы по сверке с кодом

BRD 6.4 v0.1 · musbooking_personal_account · commit b9a7a706/test · 2026-07-09 · якорь pages/reports-page/clients.vuewidgets.fsd/client-report/ (+ features.fsd/clients-report/, features.fsd/create-client-form/) Сводка: вопросов 8 (бизнесовых 5 / программных 3) · подтверждено без вопросов 12 (FR6.4-1, FR6.4-2, FR6.4-5, FR6.4-7, FR6.4-8, FR6.4-9, FR6.4-11, FR6.4-14, FR6.4-15, FR6.4-16, FR6.4-17, FR6.4-19) · отрезано находок обратного прохода 5 На будущее (в коде нет — ожидаемо по BRD): FR6.4-12 (выбор группы при добавлении клиента). Под особым вниманием: FR6.4-3 (кликабельная почта), FR6.4-6 (чипы применённых фильтров), FR6.4-10 (обязательные поля и проверка), FR6.4-18 (пустое состояние).

Бизнесовые

Связано сЧто в BRDЧто в кодеГде в коде
Б1FR6.4-6Интерфейс показывает применённые фильтры и позволяет удалить отдельный фильтр без сброса остальныхОтдельного отображения применённых фильтров (чипов) нет: все фильтры живут внутри выпадающего меню «Фильтр», снаружи не видны. Снять один фильтр можно только заново открыв меню и вернув значение в «Все» — нужно решение: нужен ли ряд чипов применённых фильтров с удалением по одномуClientsReportFilters.vue:16-89; ClientReport.vue:26-57
Б2FR6.4-10Сохранение блокируется, пока не заполнены обязательные имя и телефонОбязательными в коде являются имя, телефон И фамилия: схема требует lastName (min 2 символа), поле подписано «Фамилия*». BRD относит фамилию к необязательным — нужно решение: делать ли фамилию обязательнойcreate-client-form.schema.ts:11-16; CreateClient.vue:97
Б3FR6.4-4Поиск и/или фильтрация по датам регистрацииФильтр по датам есть, но по умолчанию задан диапазон «последний месяц» (from = месяц назад, to = сегодня) и применён сразу при открытии. Клиенты, зарегистрированные раньше, в отчёте по умолчанию не видны, пока партнёр не расширит диапазон — нужно подтверждение: такой предустановленный диапазон задуманclients-report.ui.ts:12-13, 69, 120-121
Б4FR6.4-13Запустить выгрузку списка клиентов из отчёта (XLS или CSV)Выгрузка в CSV и XLSX есть, но выгружается только текущая страница (в кнопку передаётся текущая пачка клиентов, размер страницы = 10), а не весь отфильтрованный отчёт — нужно решение: выгружать весь отчёт или достаточно текущей страницыClientReport.vue:23, 36; clients-report.ui.ts:68; useTableExport.ts:28-36
Б5FR6.4-20Адаптив страницы, таблиц и форм под desktop, laptop, tablet и mobileЗа обход найдены только частичные приёмы: перенос панели действий (flex-wrap) и горизонтальный скролл таблицы; отдельной раскладки под tablet/mobile у таблицы отчёта не найдено — нужно подтверждение полноты адаптиваClientReport.vue:29; DataTable.vue:270-274; pages/reports-page/index.vue:105-108

Рекомендация / варианты решения

  • Чипы применённых фильтров (Б1) — сейчас партнёр не видит активные фильтры, не открыв меню. Вариант А (рекоменд.): добавить ряд чипов активных фильтров (дата, скидка, сбор, промокод, статус) с «×», снимающим только свой фильтр через существующий setFilters({ … : 'all'/[] }). Вариант Б: признать требование избыточным для v0.1, перенести чипы «на будущее» и отразить это в BRD.
  • Обязательность фамилии (Б2) — расхождение спецификации и кода. Вариант А (рекоменд.): привести код к BRD — сделать lastName необязательным и снять «*» с подписи. Вариант Б: если продукт хочет фамилию обязательной — обновить BRD (перечень обязательных полей) под код.
  • Предустановленный диапазон дат (Б3) — влияет на то, каких клиентов партнёр видит сразу. Вариант А: подтвердить «последний месяц» как осознанный дефолт и отразить в BRD. Вариант Б (рекоменд. проверить с продуктом): по умолчанию не ограничивать по дате или расширить окно, чтобы отчёт не выглядел неполным.
  • Объём выгрузки (Б4) — экспорт текущей страницы (10 строк) вероятно расходится с ожиданием «выгрузить отчёт». Вариант А (рекоменд.): выгружать весь отфильтрованный список (запросить все страницы или увеличенный размер перед экспортом). Вариант Б: осознанно оставить постраничную выгрузку и описать это в BRD.
  • Адаптив (Б5) — таблица широкая, на узких экранах уходит в горизонтальный скролл. Вариант А (рекоменд.): подтвердить требования к tablet/mobile и при необходимости добавить компактную/карточную раскладку. Вариант Б: зафиксировать горизонтальный скролл как принятое поведение для узких экранов.

Программные

Связано сЧто в BRDЧто в кодеГде в коде
П1FR6.4-3Почта и телефон кликабельные — написать на почту или позвонитьТелефон корректно tel:, а колонка «Электронная почта» тоже отдаёт href="tel:${email}" вместо mailto: — клик по почте пытается позвонить, «написать на почту» не работаетdefaultColumns.ts:46 (ср. телефон :30)
П2FR6.4-18Показывать пустое состояние, если по условиям клиенты не найденыПустого состояния нет: при нулевом результате DataTable рисует только заголовки колонок, без строк и без сообщения «ничего не найдено». Ошибка загрузки списка при этом даёт тост, но тело таблицы выглядит так же (пусто) — состояния «пусто» и «ошибка» визуально не различитьDataTable.vue:144-215
П3FR6.4-10Не сохранять, пока обязательные поля не заполнены корректноМаска имени/фамилии допускает только буквы одного алфавита (латиница ИЛИ кириллица) и требует минимум 2 символа: имена с пробелом, дефисом, апострофом, из разных алфавитов или из 1 буквы (напр. «Анна-Мария», двойные имена) проверку не проходят и клиента не сохранитьcreate-client-form.schema.ts:5-16

Рекомендация / варианты решения

  • Ссылка на почту (П1) — явная ошибка. Вариант А (рекоменд.): заменить в колонке email href на mailto:${item.email} (по аналогии с телефоном tel:). Заодно стоит поправить косметическую опечатку заголовка «Статуc» (латинская c) в defaultColumns.ts:104.
  • Пустое состояние (П2) — Вариант А (рекоменд.): добавить в DataTable пустой блок (когда не isLoading и items.length === 0) с текстом и по возможности различать «нет данных» и «ошибка загрузки». Вариант Б: обрабатывать пустоту над таблицей — в ClientReport/ClientReportTable.
  • Строгость проверки имени (П3) — маска рискует отклонять легитимные имена. Вариант А (рекоменд.): ослабить regex (разрешить пробел, дефис, апостроф, при необходимости — оба алфавита) и согласовать минимальную длину с продуктом. Вариант Б: подтвердить текущие ограничения как намеренные и описать их в BRD.
  • Отрезанные находки обратного прохода (5, в вопросы не вынесены): (1) колонка «Сбор» показывает сумму ${forfeit}₽, в т.ч. «0₽», а не признак есть/нет — defaultColumns.ts:97; (2) колонка «Группа клиентов» видима по умолчанию, но в типе ClientI поля группы нет → всегда «—» (согласуется с «на будущее») — defaultColumns.ts:53, entities.fsd/client/types.ts:17-33; (3) легаси-стор stores/client.ts (useClientStore) и старый ClientsService в отчёте не используются — отчёт работает через useClientReportStore — stores/client.ts:17; (4) форма CreateClient подключена без onSuccess, поэтому после сохранения drawer не закрывается (форма очищается, список обновляется инвалидацией) — ClientReport.vue:55; (5) косметическая опечатка заголовка «Статуc» — defaultColumns.ts:104.

1 item under this folder.