Дубль номера или кода в базе 1С 8.3: поиск причины и исправление

· 10 мин

Содержание

Ошибка Значение поля "Номер" не уникально! значит, что в базе уже есть документ того же вида с таким же номером в том же периоде нумерации. Быстрое решение — открыть документ, стереть номер (программа присвоит следующий свободный при записи) или вписать другой вручную. Если дубль появился после обмена, загрузки или аварии сервера, одного исправления мало: нужно найти источник повторов, иначе ошибка вернётся.

Есть три сценария, и способ исправления зависит от того, какой у вас. Ручной ввод или копирование — правим один документ. Синхронизация двух баз с одинаковым префиксом — меняем префикс и перенумеровываем пришедшие объекты. Ошибка СУБД с упоминанием уникального индекса — это уже повреждение таблиц, тут нужны тестирование и исправление базы. Та же логика работает для справочников: там сообщение звучит как Значение поля "Код" не уникально.

Почему 1С считает номер или код неуникальным

Платформа проверяет уникальность не всегда, а только если это включено в метаданных объекта. У документа за это отвечают два свойства на вкладке «Нумерация»:

  • 🔢 Контроль уникальности — включён флажок, значит, при записи платформа ищет такой же номер;
  • 📅 Периодичность — в каких пределах номер должен быть уникален: непериодический (за всё время), в пределах года, квартала, месяца или дня.

В типовых конфигурациях (Бухгалтерия 3.0, ЗУП 3.1, УТ 11) у большинства документов периодичность «в пределах года». Поэтому номер 0000-000015 может законно встречаться и в январе 2025-го, и в январе 2026-го. Ошибку даст только повтор внутри одного года.

У справочников аналог — «Контроль уникальности» кода и «Серии кодов»: во всём справочнике, в пределах подчинения родителю или в пределах подчинения владельцу. Код 00-000123 в одной группе и тот же код в другой группе — не ошибка, если серия «в пределах подчинения».

Откуда берутся повторы на практике:

  • ✍️ Ручной ввод. Пользователь вписал номер, который уже занят. Самый безобидный случай.
  • 🔄 Обмен данными. Две базы с одинаковым префиксом нумерации независимо выдали 000001, 000002… При синхронизации документы встретились.
  • 📥 Загрузка из файла или внешней обработки. Обработка записывает объекты с готовыми номерами из Excel или другой программы.
  • 🏢 Префикс организации. У двух организаций пустой или одинаковый префикс, а номер формируется из префикса базы, префикса организации и счётчика.
  • 📆 Перенос даты. Документ из декабря передвинули на январь — теперь он попал в другой период нумерации, где его номер уже занят.
  • 💥 Сбой индексов. После аварийного отключения сервера или диска индекс таблицы повреждён. Тут сообщение другое — об ошибке СУБД.

Если ошибка всплывает у одного пользователя на одном документе — почти всегда это ручной ввод. Если массово, сразу после синхронизации — ищите проблему в префиксах.

Что искать в журнале регистрации при ошибке уникальности

Журнал регистрации показывает, кто, когда и с какого компьютера записал конфликтующий объект. В пользовательском режиме Бухгалтерии 3.0 его открывают через Администрирование → Обслуживание → Журнал регистрации. В Конфигураторе — меню Администрирование → Журнал регистрации.

Порядок поиска:

  1. Нажмите «Установить отбор» и задайте интервал — день, когда появилась ошибка.
  2. В отборе по уровню важности оставьте «Ошибка».
  3. В поле «Метаданные» выберите вид документа или справочника из сообщения.
  4. Найдите строку с текстом про неуникальное значение. Откройте её двойным щелчком — в комментарии будет полный текст ошибки.
  5. Теперь снимите отбор по важности и посмотрите события «Данные. Добавление» и «Данные. Изменение» по этому виду документа за тот же период.

Что даёт журнал:

Что видите в журналеВывод
Пользователь — служебный, приложение — фоновое задание или обменДубль пришёл через синхронизацию
Сеанс внешней обработки или загрузкиНомера проставила обработка
Обычный пользователь, событие «Изменение» с новой датойДокумент перенесли в другой период
Текст Ошибка СУБД или Попытка вставки неуникального значения в уникальный индексПроблема на уровне таблиц базы

Журнал хранится ограниченное время, а в файловой базе его могут периодически очищать. Если событие старше настроек хранения, переходите сразу к поиску дублей запросом.

Как найти дубли номеров запросом

Когда дублей много или вы не знаете, какой документ конфликтует, удобнее спросить базу напрямую. Откройте консоль запросов: в Бухгалтерии 3.0 она есть среди обработок, в других конфигурациях — как внешняя обработка. Запрос ниже ищет повторяющиеся номера счетов покупателю в пределах года:

ВЫБРАТЬ
    НАЧАЛОПЕРИОДА(Док.Дата, ГОД) КАК Год,
    Док.Номер КАК Номер,
    КОЛИЧЕСТВО(Док.Ссылка) КАК Штук
ИЗ
    Документ.СчетНаОплатуПокупателю КАК Док
СГРУППИРОВАТЬ ПО
    НАЧАЛОПЕРИОДА(Док.Дата, ГОД),
    Док.Номер
ИМЕЮЩИЕ
    КОЛИЧЕСТВО(Док.Ссылка) > 1

Замените СчетНаОплатуПокупателю на имя своего документа. Если периодичность документа другая, поменяйте ГОД на КВАРТАЛ, МЕСЯЦ или ДЕНЬ. Для непериодической нумерации выражение с датой уберите полностью.

Чтобы увидеть сами документы-двойники, выполните второй запрос по найденному номеру:

ВЫБРАТЬ
    Док.Ссылка,
    Док.Дата,
    Док.Номер,
    Док.Организация
ИЗ
    Документ.СчетНаОплатуПокупателю КАК Док
ГДЕ
    Док.Номер = &Номер
УПОРЯДОЧИТЬ ПО
    Док.Дата

Для справочника логика та же, только группируем по полю Код. Если серия кодов «в пределах подчинения», добавьте в группировку Родитель или Владелец, иначе запрос покажет законные повторы как дубли.

Посмотрите на колонку «Организация». Если двойники принадлежат разным организациям с одинаковым префиксом — причина найдена.

Дубли на уровне СУБД: таблицы и уникальные индексы

Иногда текст ошибки другой и длиннее, например:

Ошибка СУБД:
Microsoft SQL Server Native Client 11.0: Cannot insert duplicate key row in object 'dbo._Document...' with unique index '...'

Для PostgreSQL похожее сообщение начинается с duplicate key value violates unique constraint. В файловой базе — Попытка вставки неуникального значения в уникальный индекс.

Это уже не контроль номера платформой, а отказ самой СУБД. Уникальный индекс по ссылке, по номеру с датой или по измерениям регистра наткнулся на повтор. Частые причины — повреждённый индекс после сбоя, прерванная реструктуризация, некорректная загрузка данных в обход платформы.

Чтобы понять, о каком объекте 1С идёт речь, сопоставьте имя таблицы из ошибки с метаданными. Платформа отдаёт эту карту функцией ПолучитьСтруктуруХраненияБазыДанных(). Её можно выполнить в консоли кода или во внешней обработке:

Структура = ПолучитьСтруктуруХраненияБазыДанных(, Истина);
Для Каждого Строка Из Структура Цикл
    Если Строка.ИмяТаблицыХранения = "_Document123" Тогда
        Сообщить(Строка.Метаданные + " / " + Строка.Назначение);
    КонецЕсли;
КонецЦикла;

Вместо _Document123 подставьте имя из текста ошибки. Второй параметр Истина возвращает имена таблиц и полей так, как их видит СУБД.

Дальше DBA может посмотреть дубль прямо в SQL — только на чтение:

SELECT _Number, COUNT(*) AS cnt
FROM dbo._Document123
GROUP BY _Number
HAVING COUNT(*) > 1;

Не исправляйте данные 1С прямыми UPDATE и DELETE в таблицах СУБД. Платформа хранит связанные записи в нескольких таблицах: табличные части, движения, регистрация изменений для обмена. Удаление строки в одной таблице оставит «битые» ссылки в других. Исправлять нужно средствами 1С.

Как исправить ошибку «Значение поля не уникально»: способы по сценариям

Методы — от самого безопасного к самому тяжёлому:

СпособКогда подходитРиски
Сменить номер одного документаРучной ввод, перенос датыНет, если номер не напечатан и не отправлен контрагенту
Перенумеровать пришедшие из обмена объектыПовторы после синхронизацииНужно согласовать с бухгалтером: номера уже могли уйти в счета-фактуры
Тестирование и исправление базыОшибка СУБД, уникальный индексНужен монопольный доступ, сеансы пользователей будут закрыты
Восстановление из резервной копииИндексы и данные повреждены сильноПотеря данных после момента копии

Сменить номер у одного документа

  1. Откройте документ, который вы пытаетесь записать.
  2. Очистите поле «Номер» полностью. При записи программа сама присвоит следующий свободный номер в текущем периоде.
  3. Если номер нужен конкретный (например, совпадает с бумажным договором), впишите его, но сначала проверьте вторым запросом выше, что он свободен.
  4. Запишите и проведите документ.

Если поле «Номер» недоступно для редактирования, это ограничение прав или формы. Тогда номер правит пользователь с ролью полных прав.

Разобраться с дублями после обмена

  1. Откройте Администрирование → Синхронизация данных и проверьте префикс этой информационной базы. У каждой базы в обмене он должен быть свой.
  2. Если префиксы совпали, поменяйте префикс в одной из баз. Новые документы пойдут уже с другим номером.
  3. Старые повторы перенумеруйте: в документе, который пришёл из другой базы, очистите номер и запишите заново.
  4. Проверьте карточки организаций: поле «Префикс» в карточке организации тоже участвует в номере. У разных организаций в одной базе префиксы должны отличаться.

Если документ уже распечатан, отправлен по ЭДО или по нему выставлен счёт-фактура, номер менять нельзя без согласования с бухгалтерией. Номер в базе разойдётся с номером на бумаге у контрагента.

Тестирование и исправление при ошибке СУБД

Перед любым исправлением сделайте резервную копию базы — выгрузку .dt или бэкап средствами СУБД.

  1. Попросите всех пользователей выйти. Режим требует монопольного доступа: активные сеансы придётся завершить, а несохранённая работа в них пропадёт. Делайте это вечером или в выходной.
  2. Запустите Конфигуратор и выберите Администрирование → Тестирование и исправление.
  3. Отметьте «Реиндексация таблиц информационной базы» и «Проверка логической целостности информационной базы».
  4. В режиме «Тестирование и исправление» выберите действия для битых ссылок и частичной потери объектов. Для первого прогона безопаснее режим «Тестирование» без исправлений — посмотреть масштаб.
  5. Запустите и дождитесь отчёта. Затем повторите запись документа.

Для файловой базы есть ещё утилита chkdbfl.exe в каталоге bin платформы. Она проверяет физическую целостность файла 1Cv8.1CD. Запускайте её только при закрытой базе.

Для клиент-серверной базы реиндексацию индексов можно сделать и средствами СУБД — это работа администратора сервера баз данных, в регламентное окно.

Диагностика: выберите симптом

Если ошибка уникальности не уходит

Бывает, что номер очищен, база проверена, а сообщение повторяется. Что проверить дальше:

  • 🧩 Расширения и доработки. Подписка на событие или код в модуле объекта может сам проставлять номер при записи. Отключите расширения в Администрирование → Печатные формы, отчёты и обработки → Расширения и повторите запись в копии базы.
  • 🔁 Помеченные на удаление двойники. Документ с пометкой удаления всё равно занимает номер. Найдите его запросом выше: поле ПометкаУдаления покажет, что «пустышка» мешает. Удалите помеченные объекты или смените их номер.
  • 📊 Регистр, а не документ. Если в сообщении фигурирует регистр сведений , речь о записи с теми же значениями измерений и периодом. Откройте регистр и ищите запись с тем же набором ключей.
  • 🗂️ Кэш и зависшие сеансы. Если документ только что записал другой пользователь, а у вас открыта старая форма — закройте форму и откройте документ заново.

Если ничего не помогло, выгрузите базу в .dt и загрузите в новую пустую базу. Загрузка перестраивает все таблицы и индексы с нуля. Делайте это на копии и сравнивайте результат до переноса пользователей.

Профилактика: префиксы, обмены и обслуживание СУБД

Повторная ошибка почти всегда следствие одной из настроек. Что держать под контролем:

  1. Уникальный префикс каждой базы в любом обмене — центральная база, филиал, база кассира, мобильное приложение.
  2. Свой префикс у каждой организации в карточке организации, если в базе их несколько.
  3. Загрузки без готовых номеров. При переносе из Excel и других программ лучше оставить нумерацию 1С, а старый номер сохранить в комментарии.
  4. Запрет переноса дат закрытого периода: дата запрета изменения данных в Администрирование → Пользователи и права не даст сдвинуть документ в соседний год.
  5. Регламентное обслуживание СУБД. Для MS SQL и PostgreSQL — регулярное обновление статистики и перестроение индексов по расписанию, в ночное окно.
  6. Резервные копии. Ежедневная копия даёт возможность откатиться, если индексы повредит сбой питания или диска.
  7. Корректное завершение сервера. Источник бесперебойного питания для сервера с базой снимает большую часть случаев с повреждёнными индексами.

Частые вопросы об уникальности номеров

Можно ли просто отключить контроль уникальности номера?
Технически да, это свойство документа в Конфигураторе. Но это изменение типовой конфигурации, которое усложнит каждое обновление. В бухгалтерии дубли номеров счетов-фактур и актов — проблема для контрагентов и проверок, поэтому так не делают.
Почему номер одинаковый, а ошибки нет?
Документы лежат в разных периодах нумерации (например, в разных годах) или относятся к разным видам документов. У каждого вида свой счётчик.
Документ с дублем уже проведён и отправлен — что делать?
Номер в базе не трогайте. Перенумеруйте второй, ещё не отправленный документ. Если отправлены оба — согласуйте с контрагентом исправление через корректировочные или исправительные документы.
Помогает ли «Пересчёт итогов» от этой ошибки?
Нет. Итоги регистров не связаны с уникальностью номеров и кодов. Против ошибки СУБД нужна реиндексация таблиц.
Почему после обмена у документа появились буквы перед номером?
Это префикс базы-источника. Он и нужен, чтобы документы разных баз не пересекались по номерам.