В процессе работы с программами на платформе 1С:Предприятие пользователи и администраторы часто сталкиваются с ситуацией, когда автоматическая нумерация документов внезапно «замирает». Новые документы начинают получать один и тот же номер (например, с окончанием 999), либо система выдает ошибку о нарушении уникальности номера. Рассмотрим подробно, почему это происходит и как исправить ситуацию, не нарушая логику учета.
В системе 1С номер документа по умолчанию имеет строковый тип. Это позволяет использовать в номере префиксы организаций, коды подразделений и тире. Однако у строковой нумерации есть особенность — лексикографический порядок сортировки. Проанализируем, как компьютер сравнивает строки: он делает это посимвольно слева направо.
Представим два номера: СБЕП-П999 и СБЕП-П1000. С точки зрения человека, 1000 больше 999. Но с точки зрения системы 1С, числовая часть "999" больше, чем "1000", потому что первый символ "9" больше "1". Когда платформа пытается создать следующий номер после 999, она ищет «максимальный» существующий номер. Найдя 999, она понимает, что увеличить его до 1000 невозможно без увеличения общей длины числового блока, либо считает 999 самым большим из возможных значений в текущем формате.
Основные причины сбоя:
СБЕП-П1000 в нее просто не помещается.00999 стало 999), механизм автонумерации не сможет корректно вычислить следующее значение.ZZZZZZ), автонумерация сломается.Прежде чем приступать к программным изменениям, проанализируем настройки объекта. Откроем конфигуратор и найдем документ (в нашем случае СписаниеБезналичныхДенежныхСредств).
Посмотрим на закладку «Нумерация». Здесь важны два параметра:
СБЕП-П1000 (это 10 символов). Рекомендуем устанавливать длину с запасом — 11 или 12 символов.Выясним причину ошибки, выполнив простой запрос или просто отсортировав список документов по номеру в обратном порядке. Если мы видим номер СБЕП-П999, а за ним нет номеров с ведущими нулями (например, СБЕП-П00999), значит, проблема именно в разрядности.
Важный момент: если проблема проявляется только по одной организации, значит, именно в ее префиксе произошел сбой формата. Платформа 1С хранит историю нумерации отдельно для каждого уникального префикса.
Самый эффективный способ исправить ситуацию — привести все номера к единому формату с ведущими нулями. Вместо номера СБЕП-П999 нам нужно получить СБЕП-П00999. В таком случае следующий номер СБЕП-П01000 будет корректно воспринят системой как «больший».
Для простых случаев можно воспользоваться типовой обработкой Групповое изменение реквизитов:
Списание безналичных ДС.Номер. Однако, просто заменить номера через «изменение реквизитов» сложно, так как каждому документу нужен уникальный номер. Поэтому лучше использовать программный метод.Рассмотрим пример кода, который может написать начинающий программист для исправления ситуации. Нам нужно добавить недостающие нули в середину номера. Посмотрим на пример кода для внешней обработки:
Выборка = Документы.СписаниеБезналичныхДенежныхСредств.Выбрать();
Пока Выборка.Следующий() Цикл
Объект = Выборка.ПолучитьОбъект();
СтарыйНомер = Объект.Номер;
// Проверяем, если номер содержит префикс и короткую числовую часть
Если СтрНайти(СтарыйНомер, "СБЕП-П") > 0 И СтрДлина(СтарыйНомер) < 11 Тогда
// Формируем новый номер, добавляя нули после префикса
ЧастьПрефикса = "СБЕП-П";
ЧисловаяЧасть = Сред(СтарыйНомер, 7); // Извлекаем цифры после префикса
НоваяЧисловаяЧасть = ЧисловаяЧасть;
// Добавляем нули до нужной длины (например, до 5 знаков в числовой части)
Пока СтрДлина(НоваяЧисловаяЧасть) < 5 Цикл
НоваяЧисловаяЧасть = "0" + НоваяЧисловаяЧасть;
КонецЦикла;
Объект.Номер = ЧастьПрефикса + НоваяЧисловаяЧасть;
Попытка
Объект.Записать(РежимЗаписиДокумента.Запись);
Сообщить("Номер изменен: " + СтарыйНомер + " -> " + Объект.Номер);
Исключение
Сообщить("Не удалось изменить номер: " + СтарыйНомер);
КонецПопытки;
КонецЕсли;
КонецЦикла;
После того как мы изменили номера существующих документов, нам нужно «сообщить» об этом платформе. Для этого используем метод ОбновитьНумерациюОбъектов. Это заставит 1С заново проанализировать все имеющиеся номера в таблицах базы данных и начать отсчет от действительно максимального.
Выполним следующую команду в консоли кода или в модуле обработки:
ОбновитьНумерациюОбъектов(Метаданные.Документы.СписаниеБезналичныхДенежныхСредств);
Проанализируем еще несколько нюансов, которые помогут избежать проблемы в будущем:
Объект.УстановитьНовыйНомер(Организация.Префикс). Это гарантирует, что система применит правильный префикс и найдет свободный номер в правильной последовательности.Таким образом, мы выяснили, что «упор» в номер 999 — это не системный сбой, а следствие нарушения строковой логики. Исправив длину существующих номеров и добавив ведущие нули, вы полностью восстановите работоспособность автоматической нумерации в 1С.