Перенумерация справочника «Контрагенты» в 1С: ручной способ и скрипт

· 9 мин

Содержание

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

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

Ниже — порядок действий для 1С 8.3 (Бухгалтерия, УТ, ERP, УНФ — механизм один и тот же, справочник «Контрагенты» общий), рабочий скрипт перенумерации, разбор префиксов в распределённой базе и что делать, когда нумерация сбилась после переноса данных.

С чего начать: копия базы и монопольный доступ

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

Перед любой массовой правкой кодов сделайте резервную копию базы . Это единственная страховка, если скрипт отработает не так, как ожидалось.

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

Подготовка к перенумерации
Выполнено: 0 / 5

Монопольный доступ в файловой базе проще всего получить, запустив её из Конфигуратора через Администрирование → Блокировка соединений либо закрыв базу у всех и открыв одним сеансом. В клиент-серверном варианте сеансы снимает администратор кластера.

Как изменить код контрагента вручную в режиме «Предприятие»

Для единичной правки Конфигуратор не нужен — всё делается в обычном режиме.

  1. Откройте список контрагентов: раздел Справочники → Контрагенты (в разных конфигурациях пункт лежит в разделе покупок, продаж или в общем блоке справочников).
  2. Включите отображение колонки «Код», если её не видно: меню Ещё → Изменить форму → поставьте галочку у поля «Код».
  3. Откройте карточку нужного контрагента.
  4. Поле «Код» по умолчанию недоступно для прямого ввода. Разблокируйте его командой Ещё → Разрешить редактирование кода (в части конфигураций — Все действия → Редактировать код).
  5. Впишите нужное значение и запишите элемент.

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

Ручная правка подходит, когда надо подвинуть один-два кода. Перебивать так весь справочник на сотни строк бессмысленно — для этого есть скрипт.

Массовая перенумерация внешней обработкой: готовый скрипт

Когда коды нужно выстроить заново по всему справочнику (например, по алфавиту или сплошным диапазоном без пропусков), пишут внешнюю обработку . Она перебирает элементы и присваивает каждому новый код по счётчику.

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

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

Создайте в Конфигураторе внешнюю обработку (Файл → Новый → Внешняя обработка), добавьте модуль с процедурой и вставьте код. Запускать — в режиме «Предприятие» через Файл → Открыть, по-прежнему в монопольном режиме и после копии.

// Внешняя обработка: перенумерация справочника «Контрагенты».
// Выполнять ТОЛЬКО после резервной копии и в монопольном режиме.

ДлинаКода = 9;          // уточните в Конфигураторе: свойство «Длина кода»
Счётчик   = 1;          // с какого номера начинать

Запрос = Новый Запрос(
    "ВЫБРАТЬ Контрагенты.Ссылка КАК Ссылка
    |ИЗ Справочник.Контрагенты КАК Контрагенты
    |ГДЕ НЕ Контрагенты.ПометкаУдаления
    |УПОРЯДОЧИТЬ ПО Контрагенты.Наименование");

Выборка = Запрос.Выполнить().Выбрать();

Пока Выборка.Следующий() Цикл
    Объект = Выборка.Ссылка.ПолучитьОбъект();
    Номер  = Строка(Счётчик);
    // для строкового кода — с ведущими нулями:
    Объект.Код = СтрДублировать("0", ДлинаКода - СтрДлина(Номер)) + Номер;
    Попытка
        Объект.Записать();
    Исключение
        Сообщить("Пропущен: " + Объект.Наименование + " — " + ОписаниеОшибки());
    КонецПопытки;
    Счётчик = Счётчик + 1;
КонецЦикла;

Сообщить("Готово. Обработано элементов: " + (Счётчик - 1));

Что здесь важно:

  • 🔢 Если код справочника имеет числовой тип, строку с ведущими нулями присвоить нельзя — уберите СтрДублировать и пишите Объект.Код = Счётчик. Тип кода смотрите в Конфигураторе.
  • 📂 Группы (папки) справочника выбираются отдельно и обычно нумеруются своим диапазоном. Если группы не нужно трогать — добавьте в запрос условие И НЕ Контрагенты.ЭтоГруппа.
  • 🧱 Иерархия. Когда справочник иерархический и код должен нести структуру группы — простой сквозной счётчик это ломает. Такую нумерацию считают отдельно по каждой группе.
  • ⚠️ Проверяйте уникальность. Если в середине диапазона уже занят код, платформа при записи может выдать ошибку или заменить значение. Блок Попытка … Исключение выведет такие записи в сообщения, их потом правят вручную.

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

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

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

Префикс узла задаётся в карточке узла плана обмена: откройте список узлов РИБ (Администрирование → Настройки синхронизации данных или раздел обменов в вашей конфигурации), выберите узел и заполните поле «Префикс» (обычно 1–2 символа). Центральный узел, например, получает префикс Ц, магазин — М1.

Что задаёмГдеДля чего
Префикс узлаКарточка узла плана обменаЧтобы коды разных узлов не пересекались
Префикс информационной базыНастройки программы / параметры учётаОбщий префикс всей базы в номерах и кодах
Длина кодаКонфигуратор, свойство справочникаДолжна вмещать префикс + номер

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

Важный момент при записи в РИБ: обычная запись Объект.Записать() формирует изменение для выгрузки в другие узлы — это правильно, именно так новые коды доедут до периферии. Отключать регистрацию (Объект.ОбменДанными.Загрузка = Истина) при перенумерации нельзя, иначе узлы останутся со старыми кодами и обмен разойдётся.

Длина кода и технические ограничения

Автонумерация работает в пределах длины кода, заданной в Конфигураторе (свойство справочника «Длина кода»). Когда свободные значения в этом диапазоне заканчиваются, новые элементы перестают получать код автоматически или получают пустой.

Что ограничивает перенумерацию:

  • 📏 Длина кода. Префикс занимает часть разрядов. Если длина кода 9 знаков, а префикс узла — 2 символа, на сам номер остаётся 7 разрядов, то есть максимум до 9999999 — свыше девяти миллионов контрагентов, запас почти всегда избыточный.
  • 🔤 Тип кода. Строковый код допускает буквы и ведущие нули, числовой — только числа. Префиксы-буквы возможны только при строковом типе.
  • 🔁 Уникальность. Код должен быть уникален в пределах справочника (а в иерархическом — в пределах установленной области контроля уникальности). Два одинаковых кода платформа не даст записать.

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

После увеличения длины кода старые короткие коды остаются как есть; при перенумерации скрипт приведёт их к новой длине.

Как восстановить нумерацию после загрузки данных

После переноса данных (загрузка из другой базы, свёртка, объединение) коды контрагентов часто выглядят не так, как ожидали: появляются чужие префиксы, разрывы в диапазоне или задвоения. Это нормальное следствие механизма загрузки — коды переносятся «как есть» из источника.

Порядок восстановления:

  1. Сделайте копию базы уже после загрузки — чтобы было к чему вернуться.
  2. Проверьте справочник на дубли кодов. Удобно вывести список с группировкой по коду (стандартный отчёт по справочнику или запрос с группировкой и КОЛИЧЕСТВО).
  3. Решите, нужна ли сквозная перенумерация или достаточно развести конфликтующие коды.
  4. Прогоните обработку перенумерации из раздела выше, задав начальный номер и длину кода.
  5. Проверьте, что документы, где код контрагента печатается (если такие есть), не потеряли смысл.

Коды контрагентов почти никогда не печатаются в первичке и договорах — там идут наименование, ИНН, КПП. Поэтому сквозная перенумерация обычно безопасна и не требует переоформления документов.

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

Частые ошибки при перенумерации и как их избежать

Большинство проблем возникает не из-за скрипта, а из-за пропущенной подготовки.

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

Ещё две типичные ловушки:

  • 🗂 Забыли про группы. Если не исключить группы из запроса, папки получат коды из общего диапазона и перемешаются с элементами. Решайте заранее: трогать группы или нет.
  • 🧷 Код использовали как бизнес-идентификатор. Иногда код вручную выставляют равным артикулу или внутреннему номеру. Перед сквозной перенумерацией проверьте, не завязаны ли на код выгрузки, интеграции или печатные формы.

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

Повлияет ли перенумерация контрагентов на проводки и остатки?
Нет. Код — это внутренний идентификатор справочника, в движениях и регистрах используются ссылки на элементы, а не коды. Остатки, обороты и проводки не изменятся.
Можно ли перенумеровать контрагентов без Конфигуратора?
Да, если нужно изменить несколько кодов — вручную в карточке через команду разрешения редактирования кода. Конфигуратор нужен только для создания внешней обработки или изменения длины кода.
Что будет, если два контрагента получат одинаковый код?
Платформа не даст записать второй элемент с занятым кодом и выдаст ошибку уникальности. Поэтому перенумерацию ведут в монопольном режиме и проверяют диапазон на дубли.
Как задать единый префикс для всех новых контрагентов?
Префикс задаётся в настройках программы (параметрах учёта) или в карточке узла обмена для РИБ. Он подставляется в начало новых кодов автоматически; на уже существующие коды влияет только перенумерация.
Почему новые контрагенты перестали получать код автоматически?
Закончился свободный диапазон в пределах длины кода. Увеличьте длину кода в Конфигураторе или перенумеруйте справочник, освободив диапазон.