Ситуация, когда при попытке провести или записать документ система выдает ошибку о неуникальности номера, является одной из самых распространенных в практике сопровождения 1С:Предприятие 8.3. Особенно часто это встречается в конфигурациях вроде «Управление торговлей 11.4», где пользователи имеют возможность редактировать номера вручную. Давайте разберем эту проблему подробно, выясним скрытые причины и рассмотрим пошаговые алгоритмы её решения.
Прежде всего, проанализируем ситуацию: вы открываете список документов, применяете фильтр по нужному номеру и ничего не находите. Однако база данных продолжает утверждать, что номер занят. Рассмотрим основные причины такого поведения системы:
Нумератор. Например, «Реализация товаров и услуг» и «Акт выполненных работ» могут иметь общую очередь номеров.Первым делом попробуем самый быстрый и безопасный способ — программное обновление нумерации. Многие пользователи опасаются, что использование функции ОбновитьНумерациюОбъектов() сотрет их ручные номера. Разберем этот миф: данная функция не меняет номера в существующих документах. Она лишь заставляет систему пересчитать «последний использованный номер» на основе данных в таблицах.
Для выполнения этого действия создадим внешнюю обработку или воспользуемся консолью кода и выполним следующую команду:
// Обновление нумерации для конкретного типа документа
ОбновитьНумерациюОбъектов(Метаданные.Документы.РеализацияТоваровУслуг);
Если в конфигурации используется общий нумератор для нескольких видов документов, рассмотрим более широкий подход — обновление нумерации по всем метаданным. После выполнения этого кода система заново проанализирует максимальный номер в базе и предложит следующий свободный. Для автоматической синхронизации кэша нумератора можно использовать обработку для исправления ошибки неуникальности номера.
Если обновление нумерации не помогло, значит, документ с таким номером действительно существует в базе, но скрыт от ваших глаз. Чтобы найти «виновника», воспользуемся консолью запросов. Обычный поиск через стандартные фильтры может не дать результата из-за RLS или особенностей индексации.
Проанализируем ситуацию с помощью запроса, который игнорирует ограничения прав. Запустите консоль запросов под пользователем с полными правами и выполните следующий текст:
ВЫБРАТЬ
Ссылка,
Номер,
Дата,
Проведен,
ПометкаУдаления
ИЗ
Документ.РеализацияТоваровУслуг КАК Реализация
ГДЕ
Реализация.Номер ПОДОБНО "%12345%"
Обратите внимание на оператор ПОДОБНО и проценты. Это поможет найти документы, где номер может содержать лишние префиксы, лидирующие нули или скрытые символы. Если запрос ничего не вернул по конкретному типу документа, попробуйте выполнить поиск по всем документам в базе, так как номер мог «прилететь» из другого связанного объекта через общий нумератор.
Выясним, не делит ли наша «Реализация» номер с кем-то еще. Для этого нам понадобится зайти в Конфигуратор (или попросить администратора):
РеализацияТоваровУслуг.Нумератор. Если там указан объект (например, ОбщийНумераторОрганизаций), нам нужно проверить все остальные документы, которые используют этот же нумератор.Ошибка может возникать из-за того, что документ типа «Возврат товаров от клиента» уже занял номер 001, и «Реализация» пытается создать документ с таким же номером, так как у них общее пространство имен.
В редких случаях из-за сбоев при обмене данными в базе могут появиться фактические дубли номеров, которые уже записаны. Чтобы их обнаружить, выполним запрос с группировкой по номеру:
ВЫБРАТЬ
Номер,
КОЛИЧЕСТВО(Ссылка) КАК КоличествоДублей
ИЗ
Документ.РеализацияТоваровУслуг
СГРУППИРОВАТЬ ПО
Номер
ИМЕЮЩИЕ
КОЛИЧЕСТВО(Ссылка) > 1
Если такой запрос вернет строки, значит, в вашей базе нарушена логическая целостность. Вам придется вручную изменить номера у найденных дублей, чтобы восстановить уникальность индекса. Для пакетного исправления сбитой нумерации подойдёт инструмент для перенумерации документов с учетом префикса.
Чтобы в будущем не сталкиваться с подобными ситуациями в «1С:Управлении торговлей 11.4», рекомендуем придерживаться следующих правил:
Номер для всех, кроме ответственных лиц или администраторов.Таким образом, мы рассмотрели все основные пути решения проблемы. В большинстве случаев сочетание ОбновитьНумерациюОбъектов() и поиска через консоль запросов под полными правами позволяет устранить ошибку за несколько минут.