S-WEBS24

Битрикс24

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

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

Как согласовать показ цен с налогом и без налога во всём интернет-магазине

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

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

Исходное требование задаёт переключение и административную настройку для нескольких частей магазина. Оно не устанавливает налоговую ставку или юридический режим продажи. В учебной модели используются состояния А/Б и условные суммы. Статья рассматривает техническую согласованность отображения; реальные налоговые правила и коммерческие условия должны быть определены владельцем процесса отдельно.

Сначала определить значение двух режимов

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

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

Для каждой цены укажите единицы, валюту, точность и происхождение. Если блок набора суммирует несколько позиций, он должен знать, на каком этапе применяется согласованное правило и округление. Не выводите формулу из названия переключателя. Числовой контракт должен быть понятен до вёрстки и тестов, иначе разные компоненты будут «правильно» считать по разным предположениям.

Задать режим по умолчанию

Административная настройка определяет исходное состояние в своей области: сайт, витрина или другой согласованный контекст. Покажите редактору эту область до сохранения. Если установка обслуживает несколько сайтов, изменение одного не должно неожиданно менять остальные. Глобальная переменная без принадлежности может быть слишком широкой моделью.

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

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

Описать приоритет источников

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

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

СостояниеОткуда берётся режим
Новый посетительРазрешённая настройка сайта
Посетитель сделал выборЯвный выбор по правилам срока
Профиль ограничивает режимСерверное разрешение имеет согласованный приоритет
Старое значение больше не допустимоПонятное нормализованное состояние

Отделить расчёт от форматирования

Внутренние суммы должны оставаться числами в согласованной модели. Форматирование добавляет разряды, локальные разделители и обозначение валюты. MDN описывает Intl.NumberFormat как инструмент локализованного представления, но он не выбирает налоговые правила и не подтверждает правильность исходной суммы. Не считайте красивую строку результатом бизнес-проверки.

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

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

Согласовать подписи

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

Для нескольких языков подпись локализуется, а технический режим остаётся устойчивым ключом. Не используйте перевод как значение в запросе: смена текста редактором не должна менять логику. Условные А/Б в учебной модели подчёркивают это разделение. Реальные публичные формулировки должны соответствовать согласованным условиям предложения.

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

Провести режим через все ценовые блоки

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

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

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

Выбрать срок жизни пользовательского выбора

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

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

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

Учесть серверные и динамические ответы

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

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

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

Сохранить доступность управления

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

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

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

Зафиксировать эталонные расчёты

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

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

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

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

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

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

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

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

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

  • MDN: Intl.NumberFormat: Локализованное форматирование чисел; расчёт и налоговые правила задаются отдельно