В практической работе с конфигурациями на платформе 1С:Предприятие 8 часто возникает ситуация, когда пользователям необходимо внести документ «задним числом» или вклинить его в уже существующую последовательность. Самый очевидный для обывателя способ — добавить к существующему номеру дробную часть (например, создать документ с номером 290/1, чтобы он находился между 290 и 291). Однако такое действие практически всегда приводит к сбою встроенного механизма автонумерации 1С. Последующие новые документы начинают получать некорректные номера (например, 290/2 или 500/1 вместо ожидаемого 501).
В рамках этой статьи мы подробно разберем, почему платформа 1С так реагирует на появление спецсимволов в номерах документов, как устроен механизм автонумерации изнутри, и рассмотрим несколько эффективных способов решения этой проблемы — от простых пользовательских манипуляций до изменения архитектуры базы данных в самописных конфигурациях.
Для того чтобы понять, почему ломается автонумерация, проанализируем алгоритм, по которому платформа генерирует новый номер. Номер документа в 1С чаще всего имеет текстовый тип. Это необходимо для поддержки префиксов организаций, касс, филиалов или узлов распределенной информационной базы (РИБ).
Когда вы создаете новый документ, система анализирует уже существующие номера в базе данных и пытается выделить в них три составляющие:
Когда пользователь вручную записывает номер 290/1, символ косой черты (слэш /) воспринимается платформой как разделитель. Система считает, что числовая часть номера теперь закончилась на символе дроби, а единица после нее — это новая независимая числовая часть или суффикс. При создании следующего документа система ищет максимальный номер. Согласно правилам алфавитно-цифровой сортировки, строка 290/1 может распознаваться платформой как «старшая» по отношению к чистым числовым номерам, либо система зафиксирует новую структуру номера. В результате автонумератор переключается на этот формат и начинает предлагать номера 290/2, 290/3 и так далее.
Особенно критичной ситуация становится, если в конфигурации используется фиксированная длина номера с лидирующими нулями (например, 000000500). Если в такую последовательность вручную записать номер 0290/1, то из-за изменения структуры строки и нарушения разрядности автонумерация сбивается окончательно, и восстановить её автоматически платформа уже не может.
Многие администраторы замечают странность: даже если удалить ошибочный дробный документ или вручную исправить его номер обратно на правильный, платформа все равно продолжает предлагать при создании новых документов сбившиеся дробные номера. Почему так происходит?
Дело в том, что в целях оптимизации производительности платформа 1С кэширует последний сгенерированный или максимальный номер в оперативной памяти текущего сеанса работы пользователя. Простое удаление документа из базы данных не очищает этот кэш мгновенно.
Для принудительного сброса закэшированных номеров на уровне платформы разработчик или администратор может использовать специальный программный метод. Мы можем выполнить следующую команду в контексте сервера:
ОбновитьНумерациюОбъектов(Метаданные.Документы.РеализацияТоваровУслуг);
Этот метод принудительно обновляет нумераторы в соответствии с фактически записанными в базу данных номерами документов и очищает «застрявшие» в памяти дробные или некорректные шаблоны.
---
Если вы работаете с самописной конфигурацией (как и автор рассматриваемой темы на форуме), самым надежным и архитектурно правильным решением будет разделение данных. Не стоит заставлять стандартный механизм автонумерации 1С обрабатывать нетипичные для него символы дробей.
Рекомендуем применить следующий подход:
Номер исключительно для системной автонумерации платформы. Он всегда должен оставаться строго целочисленным и последовательным (500, 501, 502...).СуффиксНомера (тип: Строка, длина: 3–5 символов) или ИндексНомера.290, а в поле суффикса — /1.При этом для вывода документа во внешние печатные формы, для отправки контрагентам или для отображения в списках мы будем динамически объединять эти два поля. Посмотрим на пример функции, которая формирует красивое представление номера для пользователя:
Функция ПолучитьПредставлениеНомера(ДокументСсылка) Экспорт
СтандартныйНомер = СокрЛП(ДокументСсылка.Номер);
// Удаляем лидирующие нули для удобства восприятия
Пока Лев(СтандартныйНомер, 1) = "0" Цикл
СтандартныйНомер = Сред(СтандартныйНомер, 2);
КонецЦикла;
Если ЗначениеЗаполнено(ДокументСсылка.СуффиксНомера) Тогда
Возврат СтандартныйНомер + СокрЛП(ДокументСсылка.СуффиксНомера);
Иначе
Возврат СтандартныйНомер;
КонецЕсли;
КонецФункции
Используя этот метод, вы гарантируете, что системный нумератор 1С никогда не встретит символ дроби в основном поле Номер, а значит, автонумерация продолжит работать стабильно и без сбоев.
Для алгоритмов платформы 1С гораздо «безболезненнее» работать с префиксами в начале номера, чем с дробями в конце строки. Префиксы изначально заложены в логику автонумерации.
Если пользователям крайне необходимо выделить группу документов или вставить документ вне очереди, вместо суффикса с дробью (290/1) предложите им использовать буквенный или символьный префикс в начале номера, например, ОБ-290 или ДР-290.
Символы префикса, отделенные дефисом, воспринимаются системой как указание на то, что это отдельный, независимый диапазон нумерации. Основная ветка нумерации (без префиксов) продолжит благополучно увеличиваться: 501, 502, а для документов с префиксом ОБ- начнется своя собственная цепочка.
Рассмотрим ситуацию, когда дробный номер 290/1 уже был записан в информационную базу пользователем, и последующие новые документы начали создаваться с ошибками. Как исправить эту ситуацию вручную, не прибегая к программированию?
Разберем по шагам алгоритм восстановления автонумерации:
290/2).501). Обязательно соблюдайте общую длину номера и количество лидирующих нулей, если они используются в вашей системе.После этой ручной корректировки платформа примет номер 501 как новый максимальный ориентир для автонумератора. При создании следующего документа (уже без вашего вмешательства) система автоматически предложит номер 502, затем 503, и нормальный порядок будет восстановлен.
Этот способ основан на чувствительности автонумератора 1С к длине строкового номера и наличию в нем лидирующих нулей. Он позволяет изолировать дробные номера от основной числовой последовательности.
Если ваши стандартные документы имеют строгий формат с нулями, например, 000000500 (длина строки — 9 символов), то для дробного документа можно использовать формат без лидирующих нулей, написав просто 290/1 (длина строки — 5 символов).
Поскольку длина строки изменилась, платформа при поиске максимального номера для следующего стандартного документа проигнорирует короткую строку 290/1 и продолжит отсчет от девятисимвольного шаблона 000000500, выдав корректный следующий номер 000000501.
---
Подводя итоги, проанализируем рассмотренные методы и выберем оптимальный путь внедрения изменений: