Дубль номера или кода в базе 1С 8.3: поиск причины и исправление
Содержание
Ошибка Значение поля "Номер" не уникально! значит, что в базе уже есть документ того же вида с таким же номером в том же периоде нумерации. Быстрое решение — открыть документ, стереть номер (программа присвоит следующий свободный при записи) или вписать другой вручную. Если дубль появился после обмена, загрузки или аварии сервера, одного исправления мало: нужно найти источник повторов, иначе ошибка вернётся.
Есть три сценария, и способ исправления зависит от того, какой у вас. Ручной ввод или копирование — правим один документ. Синхронизация двух баз с одинаковым префиксом — меняем префикс и перенумеровываем пришедшие объекты. Ошибка СУБД с упоминанием уникального индекса — это уже повреждение таблиц, тут нужны тестирование и исправление базы. Та же логика работает для справочников: там сообщение звучит как Значение поля "Код" не уникально.
Почему 1С считает номер или код неуникальным
Платформа проверяет уникальность не всегда, а только если это включено в метаданных объекта. У документа за это отвечают два свойства на вкладке «Нумерация»:
- 🔢 Контроль уникальности — включён флажок, значит, при записи платформа ищет такой же номер;
- 📅 Периодичность — в каких пределах номер должен быть уникален: непериодический (за всё время), в пределах года, квартала, месяца или дня.
В типовых конфигурациях (Бухгалтерия 3.0, ЗУП 3.1, УТ 11) у большинства документов периодичность «в пределах года». Поэтому номер 0000-000015 может законно встречаться и в январе 2025-го, и в январе 2026-го. Ошибку даст только повтор внутри одного года.
У справочников аналог — «Контроль уникальности» кода и «Серии кодов»: во всём справочнике, в пределах подчинения родителю или в пределах подчинения владельцу. Код 00-000123 в одной группе и тот же код в другой группе — не ошибка, если серия «в пределах подчинения».
Откуда берутся повторы на практике:
- ✍️ Ручной ввод. Пользователь вписал номер, который уже занят. Самый безобидный случай.
- 🔄 Обмен данными. Две базы с одинаковым префиксом нумерации независимо выдали
000001,000002… При синхронизации документы встретились. - 📥 Загрузка из файла или внешней обработки. Обработка записывает объекты с готовыми номерами из Excel или другой программы.
- 🏢 Префикс организации. У двух организаций пустой или одинаковый префикс, а номер формируется из префикса базы, префикса организации и счётчика.
- 📆 Перенос даты. Документ из декабря передвинули на январь — теперь он попал в другой период нумерации, где его номер уже занят.
- 💥 Сбой индексов. После аварийного отключения сервера или диска индекс таблицы повреждён. Тут сообщение другое — об ошибке СУБД.
Если ошибка всплывает у одного пользователя на одном документе — почти всегда это ручной ввод. Если массово, сразу после синхронизации — ищите проблему в префиксах.
Что искать в журнале регистрации при ошибке уникальности
Журнал регистрации показывает, кто, когда и с какого компьютера записал конфликтующий объект. В пользовательском режиме Бухгалтерии 3.0 его открывают через Администрирование → Обслуживание → Журнал регистрации. В Конфигураторе — меню Администрирование → Журнал регистрации.
Порядок поиска:
- Нажмите «Установить отбор» и задайте интервал — день, когда появилась ошибка.
- В отборе по уровню важности оставьте «Ошибка».
- В поле «Метаданные» выберите вид документа или справочника из сообщения.
- Найдите строку с текстом про неуникальное значение. Откройте её двойным щелчком — в комментарии будет полный текст ошибки.
- Теперь снимите отбор по важности и посмотрите события «Данные. Добавление» и «Данные. Изменение» по этому виду документа за тот же период.
Что даёт журнал:
| Что видите в журнале | Вывод |
|---|---|
| Пользователь — служебный, приложение — фоновое задание или обмен | Дубль пришёл через синхронизацию |
| Сеанс внешней обработки или загрузки | Номера проставила обработка |
| Обычный пользователь, событие «Изменение» с новой датой | Документ перенесли в другой период |
Текст Ошибка СУБД или Попытка вставки неуникального значения в уникальный индекс | Проблема на уровне таблиц базы |
Журнал хранится ограниченное время, а в файловой базе его могут периодически очищать. Если событие старше настроек хранения, переходите сразу к поиску дублей запросом.
Как найти дубли номеров запросом
Когда дублей много или вы не знаете, какой документ конфликтует, удобнее спросить базу напрямую. Откройте консоль запросов: в Бухгалтерии 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С.
Как исправить ошибку «Значение поля не уникально»: способы по сценариям
Методы — от самого безопасного к самому тяжёлому:
| Способ | Когда подходит | Риски |
|---|---|---|
| Сменить номер одного документа | Ручной ввод, перенос даты | Нет, если номер не напечатан и не отправлен контрагенту |
| Перенумеровать пришедшие из обмена объекты | Повторы после синхронизации | Нужно согласовать с бухгалтером: номера уже могли уйти в счета-фактуры |
| Тестирование и исправление базы | Ошибка СУБД, уникальный индекс | Нужен монопольный доступ, сеансы пользователей будут закрыты |
| Восстановление из резервной копии | Индексы и данные повреждены сильно | Потеря данных после момента копии |
Сменить номер у одного документа
- Откройте документ, который вы пытаетесь записать.
- Очистите поле «Номер» полностью. При записи программа сама присвоит следующий свободный номер в текущем периоде.
- Если номер нужен конкретный (например, совпадает с бумажным договором), впишите его, но сначала проверьте вторым запросом выше, что он свободен.
- Запишите и проведите документ.
Если поле «Номер» недоступно для редактирования, это ограничение прав или формы. Тогда номер правит пользователь с ролью полных прав.
Разобраться с дублями после обмена
- Откройте
Администрирование → Синхронизация данныхи проверьте префикс этой информационной базы. У каждой базы в обмене он должен быть свой. - Если префиксы совпали, поменяйте префикс в одной из баз. Новые документы пойдут уже с другим номером.
- Старые повторы перенумеруйте: в документе, который пришёл из другой базы, очистите номер и запишите заново.
- Проверьте карточки организаций: поле «Префикс» в карточке организации тоже участвует в номере. У разных организаций в одной базе префиксы должны отличаться.
Если документ уже распечатан, отправлен по ЭДО или по нему выставлен счёт-фактура, номер менять нельзя без согласования с бухгалтерией. Номер в базе разойдётся с номером на бумаге у контрагента.
Тестирование и исправление при ошибке СУБД
Перед любым исправлением сделайте резервную копию базы
— выгрузку .dt или бэкап средствами СУБД.
- Попросите всех пользователей выйти. Режим требует монопольного доступа: активные сеансы придётся завершить, а несохранённая работа в них пропадёт. Делайте это вечером или в выходной.
- Запустите Конфигуратор и выберите
Администрирование → Тестирование и исправление. - Отметьте «Реиндексация таблиц информационной базы» и «Проверка логической целостности информационной базы».
- В режиме «Тестирование и исправление» выберите действия для битых ссылок и частичной потери объектов. Для первого прогона безопаснее режим «Тестирование» без исправлений — посмотреть масштаб.
- Запустите и дождитесь отчёта. Затем повторите запись документа.
Для файловой базы есть ещё утилита chkdbfl.exe в каталоге bin платформы. Она проверяет физическую целостность файла 1Cv8.1CD. Запускайте её только при закрытой базе.
Для клиент-серверной базы реиндексацию индексов можно сделать и средствами СУБД — это работа администратора сервера баз данных, в регламентное окно.
Если ошибка уникальности не уходит
Бывает, что номер очищен, база проверена, а сообщение повторяется. Что проверить дальше:
- 🧩 Расширения и доработки. Подписка на событие или код в модуле объекта может сам проставлять номер при записи. Отключите расширения в
Администрирование → Печатные формы, отчёты и обработки → Расширенияи повторите запись в копии базы. - 🔁 Помеченные на удаление двойники. Документ с пометкой удаления всё равно занимает номер. Найдите его запросом выше: поле
ПометкаУдаленияпокажет, что «пустышка» мешает. Удалите помеченные объекты или смените их номер. - 📊 Регистр, а не документ. Если в сообщении фигурирует регистр сведений , речь о записи с теми же значениями измерений и периодом. Откройте регистр и ищите запись с тем же набором ключей.
- 🗂️ Кэш и зависшие сеансы. Если документ только что записал другой пользователь, а у вас открыта старая форма — закройте форму и откройте документ заново.
Если ничего не помогло, выгрузите базу в .dt и загрузите в новую пустую базу. Загрузка перестраивает все таблицы и индексы с нуля. Делайте это на копии и сравнивайте результат до переноса пользователей.
Профилактика: префиксы, обмены и обслуживание СУБД
Повторная ошибка почти всегда следствие одной из настроек. Что держать под контролем:
- Уникальный префикс каждой базы в любом обмене — центральная база, филиал, база кассира, мобильное приложение.
- Свой префикс у каждой организации в карточке организации, если в базе их несколько.
- Загрузки без готовых номеров. При переносе из Excel и других программ лучше оставить нумерацию 1С, а старый номер сохранить в комментарии.
- Запрет переноса дат закрытого периода: дата запрета изменения данных в
Администрирование → Пользователи и праване даст сдвинуть документ в соседний год. - Регламентное обслуживание СУБД. Для MS SQL и PostgreSQL — регулярное обновление статистики и перестроение индексов по расписанию, в ночное окно.
- Резервные копии. Ежедневная копия даёт возможность откатиться, если индексы повредит сбой питания или диска.
- Корректное завершение сервера. Источник бесперебойного питания для сервера с базой снимает большую часть случаев с повреждёнными индексами.