Дубли кодов в справочниках 1С: находим, правим и не допускаем снова

· 9 мин

Содержание

Чаще всего думают, что неуникальный код в 1С — это сбой платформы, и пытаются «починить базу». На деле платформа почти всегда ведёт себя ровно так, как настроен справочник. Если у справочника выключен контроль уникальности, два элемента с кодом 000000145 спокойно уживутся. А вот с проблемой столкнётесь позже: при загрузке данных, обмене или поиске по коду.

Поэтому исправление начинается не с кнопки, а с вопроса: как настроена уникальность кода у этого справочника и откуда взялся дубль. Ниже — диагностика, три способа правки от безопасного к радикальному и настройки, которые не дадут дублям вернуться.

Чем опасен неуникальный код и где он вообще проверяется

Код — не первичный ключ. Внутри базы элементы различаются по внутренней ссылке, а код — это «человеческий» идентификатор. Поэтому дубль не ломает базу мгновенно. Он бьёт по сценариям, где код используется как ключ поиска:

  • 🔁 обмен данными: приёмник ищет элемент по коду и находит не тот;
  • 📥 загрузка из Excel и внешних файлов, где сопоставление идёт по коду;
  • 🧾 печатные формы и выгрузки, где контрагента или товар опознают по коду;
  • 🔎 программный поиск НайтиПоКоду(): он вернёт один из дублей, и какой именно, заранее не угадать.

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

СвойствоНа что влияет
Контроль уникальностиВключает проверку при записи: повтор кода не даст записать элемент
Периодичность уникальности кодаОбласть проверки: во всём справочнике, внутри подчинения владельцу или внутри группы
АвтонумерацияПлатформа сама выдаёт следующий код при создании элемента
Тип и длина кодаЧисло или строка; от этого зависит, как формируется следующий номер

Важная деталь: «внутри подчинения владельцу» означает, что одинаковые коды у разных владельцев — норма. У подчинённого справочника, например «Договоры контрагентов», код 00001 у каждого контрагента — не ошибка. Прежде чем искать дубли, убедитесь, что ваша область проверки — весь справочник.

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

Причин немного, и каждая оставляет свой «почерк».

Ручной ввод и копирование

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

Загрузка и обработки

Обработка загрузки создаёт элементы и присваивает коды сама, не вызывая автонумерацию. Два прогона одной загрузки дают сотни пар с совпадающим кодом. Признак: у всех дублей одинаковое время создания.

Распределённая информационная база

Узлы РИБ создают элементы независимо. Если автонумерация в узлах не разведена по префиксам, два узла выдадут один и тот же 000000501. Подробнее об этом — отдельный раздел ниже.

Изменение настроек справочника

Разработчик сменил тип кода с числа на строку, изменил длину или область уникальности. Старые данные при этом не пересчитываются. Обновление конфигурации может заодно вернуть дубли, которые раньше «скрывала» другая область проверки.

Восстановление из копии и слияние баз

Данные из двух баз свели в одну через выгрузку и загрузку. У каждой базы своя нумерация, пересечения неизбежны.

Как найти неуникальные коды в базе

Начните с самого безопасного: запрос только читает данные.

Способ 1. Запрос в консоли

Откройте консоль запросов (внешняя обработка или встроенный инструмент вашей конфигурации) и выполните запрос к нужному справочнику. Пример для номенклатуры:

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

Результат — список кодов, которые встречаются больше одного раза. Чтобы увидеть сами элементы, соедините этот запрос с исходным справочником по полю Код и выведите Ссылка, Наименование, ПометкаУдаления, ВерсияДанных.

Если справочник иерархический, а уникальность настроена «внутри группы», добавьте в группировку поле Родитель. Иначе получите ложные дубли.

Способ 2. Тестирование и исправление информационной базы

В режиме «Конфигуратор» откройте Администрирование → Тестирование и исправление информационной базы. Эта проверка ищет нарушения целостности, но не заменяет запрос: уникальность кода в зависимости от версии платформы и настроек может оказаться вне её проверок.

Режим исправления на рабочей базе запускайте только с резервной копией и при отсутствии пользователей. Сначала — только проверка без изменений.

Способ 3. Журнал регистрации

Если сообщение о повторе кода появляется у пользователей при записи, откройте журнал регистрации: Администрирование → Журнал регистрации (доступен администратору в пользовательском режиме и в Конфигураторе). Отфильтруйте события по пользователю и времени ошибки. Так вы увидите, какой именно справочник и какая операция упали.

Три способа исправить дубли — от щадящего к радикальному

1. Перенумеровать лишний элемент

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

  1. Откройте элемент с лишним кодом.
  2. Очистите поле «Код» (если справочник с автонумерацией) или введите свободный номер вручную.
  3. Запишите элемент. Платформа выдаст следующий свободный код.

Когда дублей десятки, делайте это программно. Во внешней обработке:

Для Каждого Строка Из ТаблицаДублей Цикл
	Объект = Строка.Ссылка.ПолучитьОбъект();
	Объект.УстановитьНовыйКод();
	Объект.Записать();
КонецЦикла;

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

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

2. Объединить дубли в один элемент

Бывает, что дубль — это не новый товар, а тот же контрагент, введённый дважды. Тогда меняем не код, а склеиваем элементы.

В типовых конфигурациях на базе БСП есть обработка поиска и удаления дублей (раздел Администрирование, пункт про обслуживание, или поиск по названию «Поиск и удаление дублей»). Она ищет похожие элементы, подменяет ссылки в документах на оставшийся элемент и помечает лишние на удаление.

Для справочника «Контрагенты» объединение можно проводить по ИНН и КПП: это надёжнее, чем сверка по коду. Совпал код, но ИНН разные — это два разных контрагента, склеивать нельзя.

3. Прямая правка кода в данных (крайняя мера)

Если элементы связаны с большим объёмом документов, а на уровне настроек уникальность была выключена случайно, возможно, придётся править данные точечно из обработки с отключённым обменом и записью в режиме без контроля. Это делает программист, на копии базы, с проверкой результата. Для рядового пользователя этот путь закрыт — и это правильно.

МетодКогда подходитРиск
ПеренумерацияДубль случайный, связей малоТеряется связь с внешними системами
ОбъединениеОдин и тот же объект введён дваждыНужно выбрать «основной» элемент
Прямая правкаМассовые дубли со связямиТребует программиста и копии базы

Как закрепить результат: настройки против повторов

Исправить дубли — полдела. Если не поменять причину, через месяц получите их снова.

Что проверить в справочнике после чистки
Выполнено: 0 / 5

Несколько практических правил:

  • 🔢 для числовых кодов выбирайте длину с запасом: код из пяти цифр исчерпается на 99 999 элементах;
  • 🔒 уникальность включайте на этапе проектирования справочника: на заполненной базе с дублями включение проверки обернётся отказами при записи старых элементов, пока повторы не устранены;
  • 👥 ручной ввод кодов оставляйте только там, где код — осмысленный артикул, и тогда обязательно держите контроль включённым;
  • 📜 в обработках загрузки не придумывайте номера сами: вызывайте УстановитьНовыйКод() или оставляйте поле пустым при автонумерации.

Проверка после правки: как убедиться, что дублей не осталось

Повторите запрос из первого способа. Пустой результат означает, что в справочнике нет совпадающих кодов. Но этого мало, проверьте ещё три вещи.

  1. Запись элемента. Откройте один из ранее конфликтовавших элементов, измените любое поле и запишите. Если контроль уникальности включён, а ошибок нет, всё в порядке.
  2. Создание нового элемента. Создайте тестовый элемент с автонумерацией и посмотрите код. Он должен быть следующим за максимальным, а не повторять существующий. Тестовый элемент потом пометьте на удаление и удалите.
  3. Обмен и загрузки. Запустите обмен или пробную загрузку на копии базы. Если приёмник раньше путал элементы, сопоставление теперь должно пройти без предупреждений.

Если запрос снова показывает дубли через день-два, значит, их порождает процесс, а не человек: обработка загрузки, регламентное задание или узел РИБ без префикса. Посмотрите в данных время создания дублей: одинаковая минута у десятков элементов почти всегда указывает на загрузку.

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

Неуникальные коды в распределённой базе (РИБ)

В РИБ главная опасность — параллельная нумерация. Узел А создал контрагента с кодом 000000501, узел Б сделал то же. При синхронизации оба элемента приходят в каждый узел, и теперь в справочнике два «501-х».

Как с этим бороться:

  1. В типовых конфигурациях у каждого узла задаётся префикс информационной базы. Он подставляется в коды и номера документов, и узлы не пересекаются. Проверьте, что у всех узлов префиксы разные и не пустые.
  2. Если префикс добавили позже, уже созданные коды останутся прежними. Дубли придётся находить запросом (как выше) отдельно на каждом узле и в главном.
  3. Правку делайте в одном узле, чаще всего в главном, и пусть изменения уйдут остальным обменом. Если править в нескольких узлах одновременно, получите конфликт версий.
  4. После правки дождитесь полной синхронизации и повторите запрос во всех узлах.

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

Частые ошибки при исправлении

Здесь только то, что не вошло в способы выше:

  • ❌ Править код у используемого элемента без проверки внешних систем. Банк-клиент, сайт и складская программа могут хранить старый код.
  • ❌ Считать дублем элемент, помеченный на удаление. Пометка удаления не освобождает код: платформа сравнивает и такие элементы. Если дубль помечен на удаление, сначала удалите его через Удаление помеченных объектов, а потом проверяйте остальные.
  • ❌ Включить уникальность и не проверить, что запись обработок не сломалась. После включения прогоните загрузки на тестовой базе: если обработка присваивает коды сама, она начнёт получать отказ при записи.
  • ❌ Чистить дубли в рабочей базе в рабочее время. Массовая перезапись элементов блокирует их для пользователей.

Частые вопросы

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