Сбой автонумерации документов — распространенная проблема при ведении учета в 1С. Ситуация обычно выглядит следующим образом: документы формировались со стандартными номерами вида К0000000077, К0000000078, но в определенный момент платформа начинает автоматически присваивать номера совсем другого формата, например К0000000А67, К0000000А68. При этом поиск исходного документа, с которого начался сбой, часто не дает результатов стандартными средствами журнала.
Разберем детально, почему платформа 1С меняет формат номеров, где искать первоисточник ошибки и как восстановить непрерывную последовательность номеров в информационной базе.
Для правильного решения задачи выясним, по какому принципу платформа 1С:Предприятие генерирует следующий порядковый номер. Алгоритм платформы анализирует текстовый номер справа налево, выделяя непрерывную цепочку цифр как числовую часть. Любой символ, находящийся левее этой цепочки, система автоматически считает префиксом.
Когда в номере К0000000077 вместо одного из нулей случайно вводится буква (например, русская или английская «А»), платформа воспринимает строку К0000000А как новый префикс документа, а идущие следом цифры — как отдельный числовой счетчик. С этого момента система ищет максимальный номер только среди документов с новым префиксом и продолжает нумеровать их дальше: К0000000А67, К0000000А68 и так далее.
Почему же первоначальный документ с ошибочным номером часто не удается найти в журнале? Проанализируем возможные причины:
Самый быстрый способ вернуть нумерацию в рабочее русло без остановки работы пользователей — найти все ошибочные документы, исправить их номера вручную или обработкой, после чего программно сбросить кэш нумератора.
Для обнаружения документа без учета установленных фильтров журнала выполним поиск через консоль запросов, проверив русскую и английскую раскладки:
ВЫБРАТЬ
Ссылка,
Номер,
Дата,
ПометкаУдаления
ИЗ
Документ.РеализацияТоваровУслуг
ГДЕ
Номер ПОДОБНО "%А%"
ИЛИ Номер ПОДОБНО "%A%"
После того как все ошибочные номера в базе исправлены на правильные (например, К0000000079, К0000000080), простого переименования может оказаться недостаточно. Менеджер нумерации платформы кэширует максимальные значения в оперативной памяти рабочих процессов кластера серверов. Чтобы заставить систему пересчитать счетчик заново по фактическим данным, выполним программный вызов метода ОбновитьНумерациюОбъектов() во внешней обработке:
ОбновитьНумерациюОбъектов(Метаданные.Документы.РеализацияТоваровУслуг);
Важное ограничение: метод ОбновитьНумерациюОбъектов() сработает только в том случае, если в информационной базе не осталось ни одного проведенного или помеченного на удаление документа со сбитым префиксом внутри текущего периода нумерации.
Если документов с неправильными номерами накопилось много, править их вручную нецелесообразно. Для массового исправления номеров применим штатные сервисные инструменты платформы:
Если требуется принудительно назначить номер программно из кода обработки, используем метод объекта документа УстановитьНовыйНомер() с явным указанием требуемого префикса:
ДокументОбъект = ВыбраннаяСсылка.ПолучитьОбъект();
ДокументОбъект.УстановитьНовыйНомер("К");
ДокументОбъект.Записать();
В клиент-серверном варианте работы платформа 1С резервирует диапазоны номеров в памяти процессов кластера. Если пользователь открыл форму нового документа, система зарезервировала номер, но документ не был сохранен, номер может «пропасть», а счетчик сместиться. Если после ручного исправления номеров платформа упорно продолжает подставлять ошибочный префикс, выполним перезапуск сессий пользователей либо перезапуск службы агента сервера 1С:Предприятия (ragent). Это полностью очистит оперативную память рабочих процессов и заставит менеджер автонумерации пересчитать диапазоны заново.
В ситуациях, когда источник сбоя установить не удается, а стандартные методы не сбрасывают нумерацию, проблему решает выгрузка информационной базы в файл .dt с последующей обратной загрузкой. Посмотрим, почему этот способ гарантированно устраняет ошибку:
.dt таблицы базы данных в СУБД полностью создаются заново.Применяя выгрузку и загрузку информационной базы, предварительно убедимся, что все лишние и тестовые документы с некорректными префиксами окончательно удалены из базы через процедуру «Удаление помеченных объектов», иначе после перезапуска нумератор снова вернется к максимальному ошибочному номеру.