Писать кастом. Без кастомизации - никак. Проектируешь новые таблицы. (Города, склады-города и т.п.). Делаешь дополненительные поля к существующим таблицам, дорабатываешь интерфейс и обработку запросов, чтобы это и в админке корректировалось и работало во фронтофисе. Заново настраиваешь синхронизацию с 1С и т.д и т.п.
В общем, это глобальная переработка всей Престы. Сложное это дело (даже для профессионального программиста).
Настолько сложное, что к примеру, даже в самой дорогой версии Битрикса(Бизнес) этого функционала в коробке тоже нет. Только собираются делать... (пример Битрикса я привел не в качестве самой лучшего решения, а в качестве самой дорогого).
Зачем так усложнять ???
Я примерно думаю что так можно...
Добавить поле CITY например в таблицу (таблицы) products.
И при добавлении товара это поле из списка выбирать (предварительно список создать, что бы названия руками не писать и что бы было все однозначно).
Вот а потом в модулях где выводятся товары добавить соответствие условию и фильтр. Типа выбрал город такой то он записался в какую то глобальную переменную и потом выводятся товары которые соответствуют заданному городу.
И все. Если ошибаюсь подскажите, что не так думаю.