В процессе работы с конфигурацией «Управление производственным предприятием» (УПП 1.3) пользователи часто сталкиваются с ситуацией, когда при записи нового документа, например, Прием на работу в компанию (упр.), система выдает ошибку: «Значение поля "Номер" не уникально». Особое коварство этой проблемы заключается в том, что стандартная процедура ОбновитьНумерациюОбъектов не всегда приносит результат, а визуально в списке документов следующий номер кажется свободным. В данной статье мы подробно разберем, почему нумерация «застревает» на значениях вроде 099, и как восстановить корректную работу системы.
Для начала проанализируем механику работы платформы 1С. В большинстве типовых конфигураций на обычных формах, таких как УПП, номер документа является строковым полем. Для корректной работы инкремента (прибавления единицы к последнему номеру) платформа ищет в базе данных «максимальный» номер для данного вида документа в пределах установленной периодичности (обычно — год).
Рассмотрим основные причины, по которым механизм поиска максимального номера дает сбой:
"099 " (с пробелами в конце) и строка "00000000099" — это разные значения, которые могут некорректно обрабатываться механизмом автонумерации."99" (длиной 2 символа), платформа может начать отсчет заново или конфликтовать при попытке создать номер "100".rmngr или сбоях СУБД кэш может стать неактуальным.Прежде чем что-то исправлять, нам нужно найти «виновника» — тот самый документ, который система считает максимальным. Проанализируем ситуацию с помощью простого запроса. Мы не будем просто смотреть список, так как сортировка в динамическом списке может отличаться от логики автонумерации.
Выполним следующий запрос в консоли:
ВЫБРАТЬ
ПриемНаРаботу.Ссылка,
ПриемНаРаботу.Номер,
ДЛИНА(ПриемНаРаботу.Номер) КАК ДлинаНомера
ИЗ
Документ.ПриемНаРаботуВКомпанию КАК ПриемНаРаботу
ГДЕ
ПриемНаРаботу.Дата МЕЖДУ &НачалоГода И &КонецГода
УПОРЯДОЧИТЬ ПО
ПриемНаРаботу.Номер УБЫВ
Посмотрим на результат. Если мы видим номер "099", за которым следуют пробелы, или номера с разной длиной, значит, мы нашли причину. Важный момент: если поле ДлинаНомера показывает значение, отличное от установленного в конфигураторе (в нашем случае 11), значит, нумерация гарантированно будет давать сбой.
Просто перезаписать один документ вручную часто недостаточно, так как ошибка может «расползтись» по нескольким записям. Разберем алгоритм написания обработки для массового исправления номеров. Нам необходимо привести все номера к единому стандарту: фиксированная длина, наличие лидирующих нулей, отсутствие пробелов.
Рассмотрим пример кода для исправления ситуации:
Выборка = Документы.ПриемНаРаботуВКомпанию.Выбрать(НачалоГода, КонецГода);
Пока Выборка.Следующий() Цикл
Объект = Выборка.ПолучитьОбъект();
СтарыйНомер = Объект.Номер;
// Удаляем лишние пробелы
НовыйНомер = СокрЛП(СтарыйНомер);
// Проверяем длину и дополняем нулями слева до 11 знаков
Пока СтрДлина(НовыйНомер) < 11 Цикл
НовыйНомер = "0" + НовыйНомер;
КонецЦикла;
Если СтарыйНомер <> НовыйНомер Тогда
Объект.Номер = НовыйНомер;
Попытка
Объект.Записать(РежимЗаписиДокумента.Запись);
Сообщить("Исправлен номер: " + СтарыйНомер + " -> " + НовыйНомер);
Исключение
Сообщить("Не удалось исправить: " + СтарыйНомер + ". Возможно, номер уже занят.");
КонецПопытки;
КонецЕсли;
КонецЦикла;
Совет: Перед запуском обработки в рабочей базе обязательно протестируйте ее на копии! После исправления существующих номеров система увидит правильную последовательность и сможет корректно вычислить следующий номер (например, "00000000100").
После того как данные в базе приведены в порядок, нам нужно «сообщить» об этом серверу 1С. Для этого используем встроенный метод:
ОбновитьНумерациюОбъектов(Метаданные.Документы.ПриемНаРаботуВКомпанию);
Если это не помогло (что бывает при сильном кэшировании на стороне SQL), проанализируем радикальный, но эффективный метод — рестарт службы агента сервера 1С:Предприятия. Это полностью очистит оперативную память сервера от старых кэшированных значений номеров.
Если ваша база УПП работает в распределенном режиме (РИБ) или по нескольким организациям, проверьте наличие префиксов. В 1С:УПП номер формируется как ОПППННННННН, где:
ОП — префикс организации;ПП — префикс узла РИБ;ННН... — порядковый номер.Если кто-то случайно ввел документ с «чужим» префиксом или вообще без него, механизм УстановитьНовыйНомер() может начать искать свободные значения в неверном диапазоне. Выясним, не менялись ли префиксы в константах или справочнике «Организации» незадолго до появления ошибки.
Также стоит помнить о настройке «Периодичность». Для кадровых документов это обычно «Год». Если вы обнаружили, что нумерация сбилась из-за документов прошлого года, проверьте, не была ли случайно изменена периодичность в конфигураторе на «Непериодическую».
Резюме: Решение проблемы «неуникального номера» всегда сводится к трем этапам: очистка номеров от мусора (пробелов), приведение их к единой длине с лидирующими нулями и сброс кэша нумерации через метод ОбновитьНумерациюОбъектов или перезапуск службы сервера.