S-WEBS24

Битрикс24

CRM, процессы и приложения для вашей компании

Вернуться к списку Вернуться к статьям
Статьи

Почему после фильтрации каталог меняет режим цен с НДС и без НДС

Если каталог меняет режим цен после фильтрации, сравните контекст полной страницы и динамического запроса. Выбранный режим должен поступать из одного согласованного источника и одинаково применяться при фильтре, сортировке и пагинации. Проверять нужно число, подпись и ключи кэша. Сам фильтр не должен незаметно возвращать настройку по умолчанию.

Один режим для полной и динамической выдачи
Учебная схема состояния цен, без налоговых ставок и финансовых рекомендаций.
Фильтр не сбрасывает выбранный режим цены Учебная сумма без вычисления налоговой ставки. Полная и динамическая выдача должны сохранять выбранный режим «без НДС».

В исходном описании обычная выдача показывает цены без НДС, а применение фильтра переключает их на вариант с НДС. Причина не доказана. Ниже разобран учебный сценарий состояния интерфейса. Налоговые ставки, юридические рекомендации и реальные цены не используются: задача касается согласованного отображения уже определённых проектом данных.

Описать ожидаемое поведение

Зафиксируйте, кто выбирает режим: администратор для всего сайта, пользователь переключателем или профиль покупателя. Возможен приоритет нескольких источников, но он должен быть явным. Без этого невозможно понять, что считать ошибкой после фильтра. Фраза «показать правильно» должна превратиться в проверяемую таблицу состояния до и после действия.

Одинаковое состояние суммы на экране и в данных документа
Скриншот собственного учебного стенда: одинаковое состояние суммы на экране и в данных документа. Синтетические данные; это не интерфейс клиента или админка 1С-Битрикс.

Учебный пример использует два режима А и Б. Посетитель выбрал А, затем сузил каталог по характеристике. Ожидается тот же А у новых карточек и в подписи переключателя. Если проект намеренно меняет режим для другого типа покупателя, это отдельный переход, который должен быть объяснён. Обычная фильтрация состава списка сама по себе не является таким основанием.

Отдельно различайте исходную цену, расчёт и форматирование. Один режим может выбирать другой подготовленный тип цены, а может менять представление по согласованной формуле. Нельзя исправлять ошибку добавлением текста к числу, если само число взято из неверного источника. В этой статье не задаётся универсальная формула налога; она принадлежит правилам конкретного магазина.

Найти общий источник режима

Проследите, как выбор доходит до серверного компонента. Значение может храниться в настройке сайта, сессии, разрешённом параметре или профиле. Определите источник истины и запасное правило. Если полная страница читает одно место, а AJAX-обработчик другое, совпадение до первого фильтра будет случайным. Нужен общий контракт, а не две похожие ветви с разными значениями по умолчанию.

Проверьте тип значения. Строка «0», пустая строка и отсутствие параметра могут обрабатываться по-разному. Не используйте неявную проверку непустоты для режима, если допустимые значения требуют точного сопоставления. Валидация должна принимать только разрешённый набор и различать «не передано» и «выбрано значение А». Ошибка этого различия часто проявляется именно в динамическом запросе.

Сохранённый режим должен иметь понятную область. Если пользователь открыл другую витрину или вошёл в иной профиль, правила могут измениться. Не переносите состояние без проверки назначения. При этом текущая фильтрация на том же сайте должна сохранять согласованный контекст. Отдельная статья о глобальной модели цен не заменяет эту локальную проверку передачи состояния.

ИсточникПолная страницаДинамический запрос
Настройка сайтаСчитывается явноТа же область конфигурации
Выбор посетителяПрименяется по приоритетуНе теряется при обновлении
Профиль покупателяПроверяется серверомТот же разрешённый контекст
Запасное значениеИзвестно и документированоНе отличается случайно

Сравнить два фактических запроса

В инструментах браузера сохраните безопасное описание полного открытия и применения фильтра. Сравните путь, метод, разрешённые параметры и наличие контекста сессии. Не публикуйте cookie, токены и персональные данные. Достаточно отметить, где режим известен серверу, а где отсутствует. Само наличие переключателя в DOM не подтверждает, что новое состояние ушло в запросе.

Если обработчик находится на другом origin или вызывается иначе, проверьте правила передачи учётных данных. MDN описывает свойство Request.credentials и его влияние на запрос. Это не означает, что нужно безусловно расширить передачу credentials везде. Сначала подтвердите архитектуру и разрешённые источники; настройка должна соответствовать существующей модели безопасности.

Проверьте сериализацию фильтра. Иногда код собирает только отмеченные поля фильтра и забывает общую настройку режима. В другом случае режим приходит, но обработчик его не читает или перезаписывает. Найдите первый этап, где значение расходится с ожидаемым. Это точнее, чем менять шаблон цены наугад, пока визуальный пример не станет похожим.

Использовать одно правило отображения карточки

Полная и фильтрованная выдача должны применять согласованную логику цены. Если у них отдельные шаблоны, найдите различия и общий источник. Не копируйте формулу вручную во второй файл без проверки: следующая правка снова разойдётся. Повторное использование полезно для вычисления и форматирования, если оно соответствует существующей архитектуре.

Сверьте подпись валюты, налоговую пометку и дополнительные пояснения. Число может быть правильным, а подпись остаться от другого режима. Для посетителя это всё равно неверное предложение. Проверяйте карточку как смысловой блок, а не отдельный текстовый узел. Сводка, кнопка и связанные данные действия также должны соответствовать текущему режиму.

Если цена недоступна, состояние ошибки не должно превращаться в другой режим по умолчанию. Например, отсутствие значения А нельзя молча маскировать числом Б без согласованного правила. Покажите предусмотренное ограничение или запасной вариант с понятным смыслом. Не подменяйте модель данных косметическим исправлением подписи.

Проверить кэш динамической выдачи

Если результат зависит от режима, кэш должен учитывать существенное различие либо отделять изменяемую часть. Иначе первый запрос А может прогреть ответ для Б. Ошибка будет выглядеть плавающей: после очистки правильный результат, после посещения другим контекстом неправильный. Составьте учебный тест с двумя независимыми сессиями и измените порядок запросов.

Проверьте ключи кэша полного компонента и динамического обработчика отдельно. Они могут использовать разные наборы параметров. Фильтр включён в ключ, а режим забыли, поэтому новая выдача зависит от того, кто обратился первым. Не очищайте весь кэш после каждого переключения как постоянный обход. Нужно сохранить правильное разделение данных.

Композитная оболочка и персональные цены требуют дополнительной проверки, если технология используется. Не помещайте выбранное значение одного посетителя в общий HTML. На учебной копии сравните исходный ответ и состояние после фонового обновления. Исправление финального числа не оправдывает краткий показ чужой персональной информации или ложной подписи.

Сохранить режим при остальных действиях

После фильтра проверьте сортировку, следующую страницу, сброс и подгрузку новых карточек. Они могут использовать другие обработчики. Если исправлена только одна кнопка, режим снова потеряется на соседнем действии. Реестр точек обновления помогает объединить их в один законченный сценарий, не запуская полный регресс всего магазина после каждой мелкой функции.

Проверьте прямое открытие URL с фильтром. Состояние не должно быть правильным только после предварительного посещения главной. Если режим хранится в сессии, новый посетитель получает согласованное значение по умолчанию. Если он передаётся в адресе, сервер проверяет допустимость. В обоих случаях прямой переход должен быть воспроизводимым.

Кнопка «Назад» может восстановить страницу из браузерного состояния, а затем запустить обновление. Сверьте переключатель и новые карточки после такого возврата. Поздний ответ прежнего режима не должен перезаписать актуальный выбор. Каждый асинхронный результат должен относиться к текущему запросу и контексту, а не просто быть последним завершившимся.

Согласовать переключатель с обновляемой областью

Переключатель может находиться вне фрагмента, который заменяет AJAX. Тогда его состояние сохраняется визуально, а новые карточки приходят с другим режимом. Возможна и обратная ошибка: карточки правильные, а новая копия переключателя сбрасывается. В учебной проверке сравните оба направления и определите, какой компонент владеет состоянием. Два независимых переключателя не должны конкурировать за него.

Во время запроса человек может изменить режим ещё раз. Решите, отменяется ли прежний запрос либо его ответ просто не применяется. Карточки, подпись и выбранный пункт должны соответствовать актуальному действию, а не старому ответу. Не блокируйте весь каталог бессрочно ради упрощения: отказ запроса должен возвращать понятное рабочее состояние с сохранённым выбором.

Проверьте доступное название переключателя и сообщения после обновления. Посетитель, который не видит цвет выделения, тоже должен понимать активный режим. Удаление и создание элемента не должно неожиданно терять клавиатурный фокус. Это локальная часть приёмки фильтра, непосредственно связанная с сохранением состояния, а не отдельный редизайн.

Не доверять клиентскому расчёту окончательно

Браузер может показывать режим и предварительное значение, но сервер проверяет данные при добавлении в корзину или другом бизнес-действии. Посетитель способен изменить отправляемый запрос. Если цена зависит от роли, нельзя разрешать произвольный режим только по скрытому полю. Различайте настройку отображения и доступ к коммерческому типу цены.

Проверьте, что выбранный режим не меняет числовые данные заказа непредусмотренным образом. Иногда требование касается только показа, а разработчик случайно переносит переключатель в расчёт. В другом проекте режим действительно влияет на используемую цену. Это должно следовать из контракта, а не из названия кнопки. Статья не даёт универсального ответа за неизвестную систему.

Письма и документы здесь не являются основной областью, но если они используют тот же снимок, проверьте сохранение смысла. Нельзя считать исправление AJAX доказательством согласованности всех каналов. Отметьте соседние зависимости и проверяйте их только в необходимом объёме, не превращая локальную регрессию в бесконечный аудит ценового учёта.

Локализовать причину по этапам

Сравните выбранное состояние в интерфейсе, переданные данные, решение сервера, рассчитанное значение и вывод. Первое расхождение указывает на участок. Если режим исчез в запросе, исправляют сбор контекста. Если сервер получил А, но выбрал Б, проверяют приоритеты. Если данные правильные, а текст иной, исследуют шаблон и клиентское обновление.

Не ставьте жёсткий режим в AJAX-шаблоне только ради исходного примера. Это сделает правильным А и сломает Б. Регрессия должна включать оба разрешённых режима и переключение между ними. Исправление восстанавливает передачу состояния, а не заменяет её постоянным значением. Такая формулировка помогает выбрать минимальную правку.

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

Подготовить матрицу приёмки

ДействиеРежим АРежим Б
Полное открытиеЧисло и подпись АЧисло и подпись Б
Применение фильтраА сохраняетсяБ сохраняется
Пагинация и сортировкаКонтекст не теряетсяКонтекст не теряется
Сброс условийНе меняет режим случайноНе меняет режим случайно
Прогрев другой сессиейНет чужого ответаНет чужого ответа
Ошибка запросаПонятное состояниеПонятное состояние

Используйте синтетические цены и явно заданную учебную модель без действующих налоговых ставок. Сначала сохраните ожидаемые число и подпись для режимов А и Б. Примените одинаковый фильтр в обоих режимах, затем запросите пустую выдачу и сбросьте условия. Сверьте переключатель, новые карточки и серверное решение. Эта последовательность проверяет сохранение режима независимо от состава результатов.

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

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

Связанный разбор: Разработка B2B-интернет-магазина: роли и согласование.

Документация и источники

  • MDN: Request.credentials: Передача контекста учётных данных в запросе; конкретный источник режима проверяется в проекте