getIncrementCode() без сдвига итератора или его откат ?

Для встроенного механизма авто-нумерации описанного в этой статье академии

Предлагается 2 варианта использования, собственно на стороне сервера через БП и в UI через вызов специализированного метода getIncrementCode()
Остановимся на втором варианте.
Так вот; есть тут небольшая проблема: если мы хотим показывать собственно сгенерированный номер в поле открывшейся карточки то мы вызываем его при инициализации (собственно аналогично примеру из статьи помещая вызов в onEntityInitialized.
Проблема: Итератор сдвигается при каждом вызове, т.е. открывая карточку в режиме добавления новой записи или копирования номер сдвинется, но это не гарантирует нам того что эта запись в конечном итоге вообще произойдет, т.е. пользователь может просто нажать "Отмена" или уйти с карточки - а номерок уже прирос на один.
Мы конечно можем привязаться к методу save и осуществлять вызов getIncrementCode() там, но номерок-то хочется получить на этапе открытия карточки.

Можно ли как-то вызвать его без сдвига итератора ?
PS: я безусловно понимаю что очевидный ответ - не мороч голову делай сервер-сайд, а для показа сделай ESQ запрос в системную настройку напрямую и добавь еденичку :)
Или получай номерок при открытии, ESQ Update запросом в сист.настройку делай роллбек ее на 1 назад, и повторно вызывай метод уже при сохранении.
Но может есть какие-то более лаконичные способы ?

Нравится

2 комментария

Добрый день, Илья!

К сожалению, изменить это логику возможности нет. Также, менять ее, как и использовать Ваш вариант с запросом в системную настройку - не очень хорошая идея, так как есть ненулевая верояность того, что несколько пользователей одновременно начнут создавать, допустим, счет, в результате получим несколько счетов с одинаковым номером. Если все-таки есть желание получать данные номера строго по порядку, можно вызвать данный метод в save.

Понятно,
Хотя кстати для тех же счетов законодательство РФ требует соблюдения строгой очередности, так что надо как-то этот момент контролировать.
Идеальный вариант:
Выдавать очередной номер для демонстрации.
Но в процессе сохранения снова проверять его доступность, и в случае если за время редактирования карточки другим пользователем уже был создан документ (получил текущий номер), то получать следующий и извещать об этом пользователя, мол при сохранении номер документа был изменен т.к. текущий уже занят.
т.е. разделить на метод получения без итерирования:
showIncrementCode()
И собственно метод запроса, установки и итерирования
getIncrementCode()
незначительно расширив логи последнего проверкой на факт предоставления номера для другой записи.

Показать все комментарии