Дубли кодов в справочниках 1С: находим, правим и не допускаем снова
Содержание
Чаще всего думают, что неуникальный код в 1С — это сбой платформы, и пытаются «починить базу». На деле платформа почти всегда ведёт себя ровно так, как настроен справочник. Если у справочника выключен контроль уникальности, два элемента с кодом 000000145 спокойно уживутся. А вот с проблемой столкнётесь позже: при загрузке данных, обмене или поиске по коду.
Поэтому исправление начинается не с кнопки, а с вопроса: как настроена уникальность кода у этого справочника и откуда взялся дубль. Ниже — диагностика, три способа правки от безопасного к радикальному и настройки, которые не дадут дублям вернуться.
Чем опасен неуникальный код и где он вообще проверяется
Код — не первичный ключ. Внутри базы элементы различаются по внутренней ссылке, а код — это «человеческий» идентификатор. Поэтому дубль не ломает базу мгновенно. Он бьёт по сценариям, где код используется как ключ поиска:
- 🔁 обмен данными: приёмник ищет элемент по коду и находит не тот;
- 📥 загрузка из Excel и внешних файлов, где сопоставление идёт по коду;
- 🧾 печатные формы и выгрузки, где контрагента или товар опознают по коду;
- 🔎 программный поиск
НайтиПоКоду(): он вернёт один из дублей, и какой именно, заранее не угадать.
Платформа проверяет уникальность в момент записи элемента, но только если проверка включена. Настраивается это в конфигураторе, в свойствах справочника, на закладке «Данные». Нас интересуют четыре параметра:
| Свойство | На что влияет |
|---|---|
| Контроль уникальности | Включает проверку при записи: повтор кода не даст записать элемент |
| Периодичность уникальности кода | Область проверки: во всём справочнике, внутри подчинения владельцу или внутри группы |
| Автонумерация | Платформа сама выдаёт следующий код при создании элемента |
| Тип и длина кода | Число или строка; от этого зависит, как формируется следующий номер |
Важная деталь: «внутри подчинения владельцу» означает, что одинаковые коды у разных владельцев — норма. У подчинённого справочника, например «Договоры контрагентов», код 00001 у каждого контрагента — не ошибка. Прежде чем искать дубли, убедитесь, что ваша область проверки — весь справочник.
Откуда берутся повторяющиеся коды
Причин немного, и каждая оставляет свой «почерк».
Ручной ввод и копирование
Пользователь переписал код вручную или скопировал элемент и забыл его сменить. Если контроль уникальности выключен, платформа промолчит. Дубли в этом случае единичные и обычно рядом по дате создания.
Загрузка и обработки
Обработка загрузки создаёт элементы и присваивает коды сама, не вызывая автонумерацию. Два прогона одной загрузки дают сотни пар с совпадающим кодом. Признак: у всех дублей одинаковое время создания.
Распределённая информационная база
Узлы РИБ создают элементы независимо. Если автонумерация в узлах не разведена по префиксам, два узла выдадут один и тот же 000000501. Подробнее об этом — отдельный раздел ниже.
Изменение настроек справочника
Разработчик сменил тип кода с числа на строку, изменил длину или область уникальности. Старые данные при этом не пересчитываются. Обновление конфигурации может заодно вернуть дубли, которые раньше «скрывала» другая область проверки.
Восстановление из копии и слияние баз
Данные из двух баз свели в одну через выгрузку и загрузку. У каждой базы своя нумерация, пересечения неизбежны.
Как найти неуникальные коды в базе
Начните с самого безопасного: запрос только читает данные.
Способ 1. Запрос в консоли
Откройте консоль запросов (внешняя обработка или встроенный инструмент вашей конфигурации) и выполните запрос к нужному справочнику. Пример для номенклатуры:
ВЫБРАТЬ
Номенклатура.Код КАК Код,
КОЛИЧЕСТВО(*) КАК Количество
ИЗ
Справочник.Номенклатура КАК Номенклатура
СГРУППИРОВАТЬ ПО
Номенклатура.Код
ИМЕЮЩИЕ
КОЛИЧЕСТВО(*) > 1
Результат — список кодов, которые встречаются больше одного раза. Чтобы увидеть сами элементы, соедините этот запрос с исходным справочником по полю Код и выведите Ссылка, Наименование, ПометкаУдаления, ВерсияДанных.
Если справочник иерархический, а уникальность настроена «внутри группы», добавьте в группировку поле Родитель. Иначе получите ложные дубли.
Способ 2. Тестирование и исправление информационной базы
В режиме «Конфигуратор» откройте Администрирование → Тестирование и исправление информационной базы. Эта проверка ищет нарушения целостности, но не заменяет запрос: уникальность кода в зависимости от версии платформы и настроек может оказаться вне её проверок.
Режим исправления на рабочей базе запускайте только с резервной копией и при отсутствии пользователей. Сначала — только проверка без изменений.
Способ 3. Журнал регистрации
Если сообщение о повторе кода появляется у пользователей при записи, откройте журнал регистрации: Администрирование → Журнал регистрации (доступен администратору в пользовательском режиме и в Конфигураторе). Отфильтруйте события по пользователю и времени ошибки. Так вы увидите, какой именно справочник и какая операция упали.
Три способа исправить дубли — от щадящего к радикальному
1. Перенумеровать лишний элемент
Если у дубля нет внешних связей (не использован в документах, не выгружался), проще всего дать ему новый код.
- Откройте элемент с лишним кодом.
- Очистите поле «Код» (если справочник с автонумерацией) или введите свободный номер вручную.
- Запишите элемент. Платформа выдаст следующий свободный код.
Когда дублей десятки, делайте это программно. Во внешней обработке:
Для Каждого Строка Из ТаблицаДублей Цикл
Объект = Строка.Ссылка.ПолучитьОбъект();
Объект.УстановитьНовыйКод();
Объект.Записать();
КонецЦикла;
ТаблицаДублей — результат вашего запроса с колонкой Ссылка (оставьте в ней все элементы, кроме одного «основного» для каждого кода). Метод УстановитьНовыйКод() берёт следующий свободный номер по правилам справочника.
Перед массовой перенумерацией проверьте, что код не зашит в регламентные выгрузки и интеграции. Если внешняя система хранит ваши коды, она потеряет связь.
2. Объединить дубли в один элемент
Бывает, что дубль — это не новый товар, а тот же контрагент, введённый дважды. Тогда меняем не код, а склеиваем элементы.
В типовых конфигурациях на базе БСП есть обработка поиска и удаления дублей (раздел Администрирование, пункт про обслуживание, или поиск по названию «Поиск и удаление дублей»). Она ищет похожие элементы, подменяет ссылки в документах на оставшийся элемент и помечает лишние на удаление.
Для справочника «Контрагенты» объединение можно проводить по ИНН и КПП: это надёжнее, чем сверка по коду. Совпал код, но ИНН разные — это два разных контрагента, склеивать нельзя.
3. Прямая правка кода в данных (крайняя мера)
Если элементы связаны с большим объёмом документов, а на уровне настроек уникальность была выключена случайно, возможно, придётся править данные точечно из обработки с отключённым обменом и записью в режиме без контроля. Это делает программист, на копии базы, с проверкой результата. Для рядового пользователя этот путь закрыт — и это правильно.
| Метод | Когда подходит | Риск |
|---|---|---|
| Перенумерация | Дубль случайный, связей мало | Теряется связь с внешними системами |
| Объединение | Один и тот же объект введён дважды | Нужно выбрать «основной» элемент |
| Прямая правка | Массовые дубли со связями | Требует программиста и копии базы |
Как закрепить результат: настройки против повторов
Исправить дубли — полдела. Если не поменять причину, через месяц получите их снова.
Несколько практических правил:
- 🔢 для числовых кодов выбирайте длину с запасом: код из пяти цифр исчерпается на 99 999 элементах;
- 🔒 уникальность включайте на этапе проектирования справочника: на заполненной базе с дублями включение проверки обернётся отказами при записи старых элементов, пока повторы не устранены;
- 👥 ручной ввод кодов оставляйте только там, где код — осмысленный артикул, и тогда обязательно держите контроль включённым;
- 📜 в обработках загрузки не придумывайте номера сами: вызывайте
УстановитьНовыйКод()или оставляйте поле пустым при автонумерации.
Проверка после правки: как убедиться, что дублей не осталось
Повторите запрос из первого способа. Пустой результат означает, что в справочнике нет совпадающих кодов. Но этого мало, проверьте ещё три вещи.
- Запись элемента. Откройте один из ранее конфликтовавших элементов, измените любое поле и запишите. Если контроль уникальности включён, а ошибок нет, всё в порядке.
- Создание нового элемента. Создайте тестовый элемент с автонумерацией и посмотрите код. Он должен быть следующим за максимальным, а не повторять существующий. Тестовый элемент потом пометьте на удаление и удалите.
- Обмен и загрузки. Запустите обмен или пробную загрузку на копии базы. Если приёмник раньше путал элементы, сопоставление теперь должно пройти без предупреждений.
Если запрос снова показывает дубли через день-два, значит, их порождает процесс, а не человек: обработка загрузки, регламентное задание или узел РИБ без префикса. Посмотрите в данных время создания дублей: одинаковая минута у десятков элементов почти всегда указывает на загрузку.
Ещё один приём практиков: перед массовой чисткой выгрузите результат запроса в таблицу значений и сохраните в файл. Это журнал того, какой элемент какой код имел раньше. Когда внешняя система через неделю спросит, куда делся код 000000145, ответ найдётся за минуту.
Неуникальные коды в распределённой базе (РИБ)
В РИБ главная опасность — параллельная нумерация. Узел А создал контрагента с кодом 000000501, узел Б сделал то же. При синхронизации оба элемента приходят в каждый узел, и теперь в справочнике два «501-х».
Как с этим бороться:
- В типовых конфигурациях у каждого узла задаётся префикс информационной базы. Он подставляется в коды и номера документов, и узлы не пересекаются. Проверьте, что у всех узлов префиксы разные и не пустые.
- Если префикс добавили позже, уже созданные коды останутся прежними. Дубли придётся находить запросом (как выше) отдельно на каждом узле и в главном.
- Правку делайте в одном узле, чаще всего в главном, и пусть изменения уйдут остальным обменом. Если править в нескольких узлах одновременно, получите конфликт версий.
- После правки дождитесь полной синхронизации и повторите запрос во всех узлах.
Если обмен настроен по правилам конвертации, где сопоставление идёт по коду, неуникальность приведёт к тому, что приёмник свяжет несколько разных элементов с одним. Перед исправлением временно приостановите обмен и сделайте копию базы приёмника.
Частые ошибки при исправлении
Здесь только то, что не вошло в способы выше:
- ❌ Править код у используемого элемента без проверки внешних систем. Банк-клиент, сайт и складская программа могут хранить старый код.
- ❌ Считать дублем элемент, помеченный на удаление. Пометка удаления не освобождает код: платформа сравнивает и такие элементы. Если дубль помечен на удаление, сначала удалите его через
Удаление помеченных объектов, а потом проверяйте остальные. - ❌ Включить уникальность и не проверить, что запись обработок не сломалась. После включения прогоните загрузки на тестовой базе: если обработка присваивает коды сама, она начнёт получать отказ при записи.
- ❌ Чистить дубли в рабочей базе в рабочее время. Массовая перезапись элементов блокирует их для пользователей.