Как восстановить правильную автонумерацию документов в 1С при сбое формата номера?

Программист 1С v8.3 (Обычные формы) 1С:Управление торговлей Управленческий учет Торговля и дистрибуция
← На главную

Нередко при работе в программах «1С:Предприятие» пользователи вручную вмешиваются в автоматическую генерацию номеров. Например, вместо установленного формата с лидирующими нулями СФ-000006 вводят сокращенный вариант СФ-006. После этого штатный механизм автонумерации ломается: следующие документы продолжают создаваться с укороченной разрядностью (СФ-007, СФ-008), а простое удаление ошибочного документа не возвращает прежний формат. Разберем внутренние механизмы платформы, выясним причины такого поведения и рассмотрим надежные способы восстановления корректной нумерации.

Почему платформа переходит на короткие номера

Чтобы понять, почему платформа отказывается возвращаться к исходному шаблону, проанализируем базовые правила работы системного нумератора «1С»:

  1. Лексикографическое (посимвольное) сравнение строк. Номер документа в базе данных хранится в виде строки. При определении следующего номера платформа ищет максимальное строковое значение в текущем периоде. При посимвольном сравнении строка СФ-006 оказывается строго больше, чем строка СФ-000005, так как на шестой позиции символ «6» больше символа «0». Следовательно, именно документ с сокращенным количеством нулей платформа считает «старшим».
  2. Определение разрядности числовой части. Платформа вычисляет числовую часть справа налево до первого нечислового знака (дефиса, буквы или префикса). Если разрядность числовой части у максимального обнаруженного номера сократилась до трех знаков, платформа автоматически фиксирует эту новую длину для всех последующих документов.
  3. Кэширование номеров в памяти. В целях оптимизации производительности последние сгенерированные значения номеров кэшируются в процессах кластера серверов или в локальной памяти сеанса. Обычная пометка документа на удаление или даже его физическое удаление не приводит к мгновенному пересчету этого кэша, из-за чего система продолжает выдавать ошибочный следующий номер.
  4. Пометка на удаление не исключает номер. Если документ просто помечен на удаление, для платформы он остается существующим объектом базы данных. Его номер продолжает участвовать в выборке максимального значения. Для исчисления нового диапазона ошибочный номер должен быть либо изменен, либо физически удален из информационной базы.

Основное решение: непосредственное удаление и сброс нумератора

Разберем по шагам наиболее быстрый и надежный алгоритм действий, когда ошибочный документ еще не ушел контрагентам и может быть безболезненно удален.

  1. Физическое удаление ошибочных документов. Если документы с короткими номерами были только помечены на удаление, их необходимо удалить окончательно через стандартную процедуру «Удаление помеченных объектов» либо непосредственно средствами встроенного языка.
  2. Программный сброс кэша нумерации. Чтобы платформа заново выполнила сканирование таблиц и определила истинный максимальный номер среди оставшихся документов, вызывается метод ОбновитьНумерациюОбъектов().

Для выполнения сброса откроем внешнюю обработку или обработку «Групповая обработка справочников и документов» с возможностью выполнения произвольного кода. Крайне важно помнить: вызов метода без параметров сбрасывает нумераторы абсолютно всех объектов конфигурации, что в рабочей базе может вызвать кратковременные блокировки таблиц. Рекомендуется передавать в метод метаданные конкретного проблемного документа.

Посмотрим на пример вызова метода для конкретного вида документов:


// Сброс кэша нумератора для конкретного типа документа
ОбновитьНумерациюОбъектов(Метаданные.Документы.СчетФактураВыданный);

Если требуется сбросить нумерацию сразу по всей информационной базе, процедура вызывается без параметров:


// Полный сброс нумерации для всех объектов конфигурации
ОбновитьНумерациюОбъектов();

После выполнения данного кода создадим новый документ: платформа заново обратится к таблице, найдет правильный максимальный номер СФ-000005 и автоматически назначит новому документу корректный номер СФ-000006.

Альтернативный вариант: исправление номеров без удаления документов

Бывают ситуации, когда ошибочные документы уже проведены, подписаны, отправлены клиентам или зафиксированы в регламентированной отчетности. В этом случае физически удалять их нельзя. Рассмотрим, как восстановить порядок в такой ситуации:

  1. Переименование ошибочного номера. Изменим номер у проблемного документа вручную, дополнив его недостающими нулями до стандартной длины конфигурации (например, переименуем СФ-006 в СФ-000006). Если номер уже занят, проблемный документ можно временно перенести в технический префикс, например СФ-ОШ-000001.
  2. Массовая перенумерация. Если с короткими номерами успело записаться много документов, воспользуемся универсальной обработкой «Универсальный подбор и обработка объектов» или специальной обработкой «Перенумерация документов». Сначала всем документам периода назначается временный технический префикс (например, ТЕМП-000001), а затем повторным проходом восстанавливается штатный префикс с правильным количеством ведущих нулей.
  3. Обновление нумерации. После выравнивания разрядности обязательным шагом остается вызов метода ОбновитьНумерациюОбъектов() для закрепления правильного максимального значения в системном кэше.

Как предотвратить повторение сбоев автонумерации

Чтобы исключить возникновение подобных инцидентов в будущем, настроим превентивные ограничения для пользователей:

  1. Настройка стратегии редактирования номеров объектов. В типовых решениях (например, «Управление торговлей» редакции 10.3, «Комплексная автоматизация» или «Управление производственным предприятием») предусмотрен специальный регистр сведений «Настройка стратегии редактирования номеров (кодов) объектов». Для большинства пользователей следует установить режим «Недоступно», чтобы исключить возможность ручной корректировки строкового номера в формах документов.
  2. Разграничение прав доступа. На уровне ролей конфигурации снимем право «Интерактивное изменение номера» для менеджеров и операторов, оставив его только администраторам системы.
  3. Контроль длины номера при наличии префиксов. Если в информационной базе используются префиксы узлов распределенной информационной базы (РИБ) или префиксы организаций, длина свободной числовой части уменьшается. Необходимо заранее проинструктировать ответственных сотрудников о недопустимости стирания ведущих нулей и разделителей (дефисов), так как это приводит к искажению формата в пределах всего расчетного года.
← На главную