Некорректный рефреш страницы с заказами Принято
Эта тема уже поднималась здесь: https://support.webasyst.ru/fo... , по традиции ей присвоена плашка «разберёмся когда-нибудь (т.е. никогда» («Принято» если кратко).
Штош. Будем жечь свои токены, раз такое дело. Ничего для вебассиста не жалко. Вот тут Opus всё исследовал.
==========================================
- shopOrders.action.php:303 — getLastUpdateDatetime() возвращает max(array_column($orders,'update_datetime')), то есть ровно timestamp самого свежего заказа в списке.
- Это значение уходит в JS как options.update_process.last_update_datetime, и list.js:1528 updateProcess() каждые 60 сек (orders_update_list) дёргает loadList.
- Первый тик спрашивает search=update_datetime >=<то же самое значение> — сравнение включающее (list.js:1524). Сервер честно возвращает тот же самый заказ как «обновлённый», хотя ничего не менялось.
- order_update() → updateOrderList(isSelected) → list.js:1683 self.loadOrder(order.id) — панель заказа перерисовывается, и любая открытая в ней форма уничтожается.
- Дальше last_update_datetime сдвигается на +60 сек, и до следующего рефреша баг не повторяется — ровно как вы и описали.
Поэтому это бьёт и по штатной «Изменить параметры доставки»: форма живёт внутри той же панели.
initial last_update_datetime = 2026-08-17 18:10:41 (= update_datetime заказа 13) sec 42 search=update_datetime>=2026-08-17 18:10:41 → upd: ["13@2026-08-17 18:10:41"] sec 42 list.loadOrder(13) → форма «Изменить параметры доставки» уничтожена sec 45 (следующий тик) → upd: [] больше не повторяется
Предусловие: выбранный заказ должен быть тем, у кого max(update_datetime) среди загруженных. Сортировка по умолчанию — create_datetime (shopOrderListAction.class.php:386), так что формально не гарантировано, но в реальном магазине свежий заказ обычно и есть последний изменённый — отсюда «всегда воспроизводится».
Как блокировать
$.order_list.options.update_process.last_update_datetime = max + 1s
Это объект по ссылке, который читает замыкание опроса, так что мутация до первого тика работает. Оговорка: это митигация, а не гарантия — если форму открыть ровно на 60-й секунде, правка может не успеть.
Для отчёта разработчикам
- shopOrders.action.php:303 — возвращать max(...) + 1 секунда;
- list.js:1524 — использовать > вместо >=.
Заодно рядом: list.js:1531 timeout = options.timeout || 60000; объявлена без var — утечка в глобальную область.










3 комментария
Я правильно понимаю, что если, пока какая-либо форма открыта, заказ как-то изменится (или добавится новый), то форма всё равно схлопнется?
===========================
Это уже не баг, а штатное поведение: list.js:1683 намеренно перезагружает панель, когда выбранный заказ изменился. Считается любой bump update_datetime — смена статуса коллегой, коллбэк платёжки, крон, правка из соседней вкладки.
isSelectedOrder = false → updateOrderList(false) → перерисовывается только его строка в списке, без loadOrder.
const nextOrder = orderElem.next(); if (nextOrder.length) { self.loadOrder(nextOrder.data('order-id')); // грузим СОСЕДНИЙ заказ } orderElem.remove();А вот такое поведение является вариацией бага с last_update или это совсем другое? "При запросе вида /webasyst/shop/?action=orders#/orders/search/id=25 если выдается не новый заказ, через минуту список обновляется, и в нем помимо запрошенного появляются и другие заказы. Если заказ новый, этого не происходит. Проблема воспроизводится как в режиме сплита, так и в табличном представлении."
=============
Поиск id=13 (самый свежеобновлённый заказ)
Что происходит
if (order_update_datetime && this.filter_params_str && this.filter_params_str.includes('hash')) { // ... подмешать update_datetime>= внутрь существующего фильтра order_update_datetime = null; }Она существует ровно для того, чтобы слить условие по дате с уже действующим фильтром, а не затереть его. Но срабатывает только если в filter_params_str есть подстрока hash. При поиске id=7 там лежит updated_orders=id=7 — подстроки hash нет, слияние пропускается, и &search=update_datetime>=… уходит
Спасибо за подробный разбор проблемы! Всё передал разработчикам для изучения и устранения неудобств в работе с приложением.