При работе с документами в типовых конфигурациях (например, 1С:Управление торговлей 11.4) пользователи и администраторы иногда сталкиваются с ситуацией: необходимо изменить номер документа, но платформа выдает сообщение «Значение поля 'Номер' не уникально». При этом стандартный поиск по журналу документов показывает, что документа с таким номером в списке нет.
Рассмотрев архитектуру 1С и практические примеры, разберем подробно, почему возникает эта ошибка, где скрывается документ с повторяющимся номером и как правильно решить проблему.
Главная причина, по которой номер кажется «свободным», но не принимается системой — использование Общего нумератора в конфигурации. В типовых решениях (включая 1С:Управление торговлей) для обеспечения сквозной нумерации разных видов документов применяется единый нумератор метаданных.
Например, один и тот же нумератор может использоваться одновременно в документах:
Реализация товаров и услугПередача между организациямиПлатформа 1С:Предприятие проверяет уникальность номера не только внутри текущего вида документа, но и по всем видам документов, подведенным к данному нумератору. Если номер ААББ-00041 уже задействован в документе Передача между организациями, платформа заблокирует установку этого же номера для Реализации товаров и услуг.
Помеченный на удаление документ физически остается в базе данных и продолжает занимать свой номер. Проанализируем этот момент: если какой-либо документ из тех, что входят в общий нумератор, был помечен на удаление, его номер 00041 остается заблокированным до момента полного физического удаления объекта из базы.
Часто разработчики пытаются решить проблему вызовом метода ОбновитьНумерациюОбъектов(). Однако необходимо учитывать особенности работы этого метода:
Метод ОбновитьНумерациюОбъектов(Метаданные.Документы.РеализацияТоваровУслуг) сбрасывает кэш генерации следующего нового номера при автоматическом создании документов. Он не снимает контроль уникальности при ручном вводе и не исправляет конфликты номеров, если номер уже присутствует в базе данных.
Выясним, как быстро найти объект, удерживающий номер. Для этого можно воспользоваться поиском через код или консолью запросов.
Рассмотрим пример кода на встроенном языке 1С для проверки конкретного вида документа в привилегированном режиме (чтобы исключить ограничение прав RLS):
ИскомыйНомер = "ААББ-00041";
НайденныйДокумент = Документы.РеализацияТоваровУслуг.НайтиПоНомеру(ИскомыйНомер, ТекущаяДата());
Если Не НайденныйДокумент.Пустая() Тогда
Сообщить("Документ найден: " + Строка(НайденныйДокумент));
Иначе
Сообщить("В реализациях номер свободен, проверяем другие типы документов...");
КонецЕсли;
Если среди реализаций номер не найден, используем консоль запросов для поиска по смежным таблицам. Например, выполним запрос к таблице Документ.ПередачаМеждуОрганизациями по полю Номер.
Разберем по шагам алгоритм действия для исправления нумерации:
Передача между организациями), содержащий номер 00041.ТМП-00041), записываем его.Реализация товаров и услуг и устанавливаем нужный номер ААББ-00041.Удаление помеченных объектов.1C:Enterprise Server для очистки серверного кэша номеров.