Одной из самых распространенных и при этом раздражающих проблем в работе программиста 1С является сбой автоматической нумерации документов. Ситуация, когда система упорно выдает ошибку «Номер не уникален» или перестает инкрементировать (увеличивать) номер, может возникнуть даже в самописных конфигурациях на обычных формах. В этой статье мы подробно разберем, почему это происходит и как «победить» нумератор, основываясь на практическом опыте коллег.
Прежде чем приступать к активным действиям, давайте проанализируем ситуацию. Рассмотрим пример: документ имеет длину номера 9 символов, периодичность не установлена, а последний проблемный номер выглядит как УТ-9999/9. На первый взгляд, всё в порядке, но именно здесь кроется несколько ловушек.
1. Превышение длины номера. Проанализируем строку УТ-9999/9. Посчитаем количество символов: «У», «Т», «-», «9», «9», «9», «9», «/», «9» — итого ровно 9 символов. Когда 1С пытается создать следующий номер, она пробует увеличить последнюю цифру. Однако после «9» должна идти «10», что увеличит длину всей строки до 10 символов. Поскольку в метаданных жестко задано ограничение ДлинаКода = 9, система не может записать новый номер и выдает ошибку. Это «тупиковое» значение, которое невозможно преодолеть без изменения структуры номера.
2. Особенности строковой сортировки. Важно понимать, как платформа ищет «максимальный» номер. В 1С используется строковое сравнение. Рассмотрим ситуацию: в базе есть номера УТ-9 и УТ-10. С точки зрения логики системы, строка УТ-9 будет больше, чем УТ-10, так как символ «9» при посимвольном сравнении идет после символа «1». Если в базе появился «кривой» короткий номер, механизм автонумерации может постоянно цепляться за него, считая его максимальным.
3. Смешивание кириллицы и латиницы в префиксах. Проанализируем префиксы УТ (русские буквы) и UT (английские буквы). Визуально они могут быть идентичны, но для базы данных — это разные наборы символов. Если пользователь один раз ввел номер вручную, используя другой алфавит, система создаст новую цепочку нумерации для этого префикса, что приведет к конфликтам в будущем.
Начиная с версии платформы 8.2, 1С активно использует кэширование номеров на стороне сервера (обычно порциями по 10 штук) для повышения производительности. Если вы удалили «плохой» документ или исправили его номер вручную, сервер всё равно может помнить старое «следующее» значение. Чтобы заставить систему пересчитать нумерацию, необходимо использовать встроенный метод.
Рассмотрим применение метода ОбновитьНумерациюОбъектов(). Его можно запустить через консоль запросов или простую внешнюю обработку. Выполните следующий код:
// Обновление нумерации для конкретного типа документа
ОбновитьНумерациюОбъектов(Метаданные.Документы.ИмяВашегоДокумента);
Этот метод сбрасывает кэш в оперативной памяти сервера приложений и заставляет систему заново проанализировать существующие номера в таблице базы данных. Во многих случаях этого достаточно, чтобы решить проблему.
Если обновление нумерации не помогло, значит, в базе данных физически присутствует номер, который мешает алгоритму. Нам нужно найти его и исправить. Разберем алгоритм действий:
Номер в убывающем порядке (УБЫВ).Ищите номера, которые выбиваются из общего формата: имеют лишние пробелы, спецсимволы в конце или достигли предела длины. Если вы нашли номер типа УТ-9999/9, измените его вручную на формат, оставляющий место для маневра, например, УТ-00001. Важно, чтобы новый номер был меньше по длине, чем максимально разрешенная, или имел достаточный запас нулей в цифровой части.
Если вы хотите гарантировать правильность префиксов, стоит задействовать стандартное событие модуля объекта. Даже если изначально процедура отсутствовала, её стоит добавить для контроля логики.
Проанализируем пример кода в модуле документа:
Процедура ПриУстановкеНовогоНомера(СтандартнаяОбработка, Префикс)
// Явно задаем префикс, чтобы исключить влияние пользовательского ввода
Префикс = "УТ-";
КонецПроцедуры
Обратите внимание: если в вашей конфигурации используется Библиотека Стандартных Подсистем (БСП), установка префикса может происходить в подписках на события. В этом случае ручное переопределение в модуле документа может не сработать. Проверьте наличие подписки ПриУстановкеНовогоНомераОбъекта.
В исключительных ситуациях, когда метод ОбновитьНумерациюОбъектов() не помогает (что бывает на старых релизах платформы или при специфических ошибках кэша rphost), может потребоваться перезапуск службы 1С:Предприятия. Это гарантированно очистит все серверные пулы номеров. Однако перед этим обязательно убедитесь, что вы исправили все «битые» номера в самой базе данных, иначе после перезапуска проблема вернется.
Как показывает практика, наиболее надежным способом в современных конфигурациях является подключение документа к обработчику БСП. Это позволяет динамически управлять префиксами и нумерацией без «затыков» даже при работе базы 24/7. Если ваша база поддерживает БСП, выполните следующие действия:
ОбъектСНомером.Подведем итог: если вы столкнулись с проблемой уникальности, в первую очередь проверьте длину номера и наличие «тупиковых» значений типа ...9/9. Затем используйте ОбновитьНумерациюОбъектов() и проверьте строковую сортировку номеров. В большинстве случаев проблема кроется в данных, а не в коде.