Перенумерация справочника «Контрагенты» в 1С: ручной способ и скрипт
Содержание
Перенумеровать контрагентов в 1С можно двумя путями: вручную поправить код в карточке элемента или прогнать весь справочник внешней обработкой со скриптом. Ручной способ годится для десятка записей, скрипт — когда коды нужно выстроить по порядку по всему справочнику.
Код контрагента — это служебный идентификатор внутри справочника, он не связан с ИНН и ни на что в учёте не влияет. Поэтому менять его безопасно, но делать это нужно по правилам: с резервной копией и в монопольном режиме, иначе можно получить дубли кодов или оборвать чужие сеансы.
Ниже — порядок действий для 1С 8.3 (Бухгалтерия, УТ, ERP, УНФ — механизм один и тот же, справочник «Контрагенты» общий), рабочий скрипт перенумерации, разбор префиксов в распределённой базе и что делать, когда нумерация сбилась после переноса данных.
С чего начать: копия базы и монопольный доступ
Перенумерация массово переписывает записи справочника. Если во время обработки с базой работают пользователи, два элемента могут получить один код. Поэтому сначала — подготовка.
Перед любой массовой правкой кодов сделайте резервную копию базы . Это единственная страховка, если скрипт отработает не так, как ожидалось.
Монопольный режим нужен, чтобы в момент перенумерации никто не создавал и не записывал контрагентов. Предупредите пользователей заранее: при установке монополии их сеансы завершатся, несохранённые данные пропадут.
Монопольный доступ в файловой базе проще всего получить, запустив её из Конфигуратора
через Администрирование → Блокировка соединений либо закрыв базу у всех и открыв одним
сеансом. В клиент-серверном варианте сеансы снимает администратор кластера.
Как изменить код контрагента вручную в режиме «Предприятие»
Для единичной правки Конфигуратор не нужен — всё делается в обычном режиме.
- Откройте список контрагентов: раздел
Справочники → Контрагенты(в разных конфигурациях пункт лежит в разделе покупок, продаж или в общем блоке справочников). - Включите отображение колонки «Код», если её не видно: меню
Ещё → Изменить форму→ поставьте галочку у поля «Код». - Откройте карточку нужного контрагента.
- Поле «Код» по умолчанию недоступно для прямого ввода. Разблокируйте его командой
Ещё → Разрешить редактирование кода(в части конфигураций —Все действия → Редактировать код). - Впишите нужное значение и запишите элемент.
Если поля «Код» в форме нет вообще и команда редактирования недоступна — значит, в конфигурации автонумерация жёстко закрыта настройками. Тогда остаётся внешняя обработка (следующий раздел) или правка через Конфигуратор.
Ручная правка подходит, когда надо подвинуть один-два кода. Перебивать так весь справочник на сотни строк бессмысленно — для этого есть скрипт.
Массовая перенумерация внешней обработкой: готовый скрипт
Когда коды нужно выстроить заново по всему справочнику (например, по алфавиту или сплошным диапазоном без пропусков), пишут внешнюю обработку . Она перебирает элементы и присваивает каждому новый код по счётчику.
Сквозная перенумерация оправдана в нескольких случаях: после объединения баз, когда коды задвоились; после многолетней работы, когда в диапазоне остались «дыры» от удалённых элементов; при переходе на новую схему кодирования с префиксами. Если же коды просто идут не по порядку, но уникальны и ни на что не влияют, перенумерация не нужна — это косметика.
Перед запуском на рабочей базе прогоните обработку на свежей копии: убедитесь, что скрипт отрабатывает без ошибок уникальности и диапазона длины кода хватает на всех контрагентов.
Создайте в Конфигураторе внешнюю обработку (Файл → Новый → Внешняя обработка), добавьте
модуль с процедурой и вставьте код. Запускать — в режиме «Предприятие» через
Файл → Открыть, по-прежнему в монопольном режиме и после копии.
// Внешняя обработка: перенумерация справочника «Контрагенты».
// Выполнять ТОЛЬКО после резервной копии и в монопольном режиме.
ДлинаКода = 9; // уточните в Конфигураторе: свойство «Длина кода»
Счётчик = 1; // с какого номера начинать
Запрос = Новый Запрос(
"ВЫБРАТЬ Контрагенты.Ссылка КАК Ссылка
|ИЗ Справочник.Контрагенты КАК Контрагенты
|ГДЕ НЕ Контрагенты.ПометкаУдаления
|УПОРЯДОЧИТЬ ПО Контрагенты.Наименование");
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
Объект = Выборка.Ссылка.ПолучитьОбъект();
Номер = Строка(Счётчик);
// для строкового кода — с ведущими нулями:
Объект.Код = СтрДублировать("0", ДлинаКода - СтрДлина(Номер)) + Номер;
Попытка
Объект.Записать();
Исключение
Сообщить("Пропущен: " + Объект.Наименование + " — " + ОписаниеОшибки());
КонецПопытки;
Счётчик = Счётчик + 1;
КонецЦикла;
Сообщить("Готово. Обработано элементов: " + (Счётчик - 1));
Что здесь важно:
- 🔢 Если код справочника имеет числовой тип, строку с ведущими нулями присвоить нельзя —
уберите
СтрДублироватьи пишитеОбъект.Код = Счётчик. Тип кода смотрите в Конфигураторе. - 📂 Группы (папки) справочника выбираются отдельно и обычно нумеруются своим диапазоном.
Если группы не нужно трогать — добавьте в запрос условие
И НЕ Контрагенты.ЭтоГруппа. - 🧱 Иерархия. Когда справочник иерархический и код должен нести структуру группы — простой сквозной счётчик это ломает. Такую нумерацию считают отдельно по каждой группе.
- ⚠️ Проверяйте уникальность. Если в середине диапазона уже занят код, платформа при записи
может выдать ошибку или заменить значение. Блок
Попытка … Исключениевыведет такие записи в сообщения, их потом правят вручную.
Готовую обработку перенумерации не обязательно писать с нуля. В типовых конфигурациях на
БСП есть обработка Групповое изменение реквизитов — она умеет менять в том числе код, но
присваивает одно значение, а не последовательность. Для сквозной нумерации по счётчику
всё равно удобнее отдельный скрипт.
Префиксы кодов в распределённой базе (РИБ)
В распределённой информационной базе справочник ведут сразу несколько узлов: центральный и периферийные. Если бы все они нумеровали контрагентов с единицы, после обмена коды бы столкнулись. Чтобы этого не было, каждому узлу задают свой префикс — он подставляется в начало кода.
Префикс узла задаётся в карточке узла плана обмена: откройте список узлов РИБ
(Администрирование → Настройки синхронизации данных или раздел обменов в вашей
конфигурации), выберите узел и заполните поле «Префикс» (обычно 1–2 символа). Центральный
узел, например, получает префикс Ц, магазин — М1.
| Что задаём | Где | Для чего |
|---|---|---|
| Префикс узла | Карточка узла плана обмена | Чтобы коды разных узлов не пересекались |
| Префикс информационной базы | Настройки программы / параметры учёта | Общий префикс всей базы в номерах и кодах |
| Длина кода | Конфигуратор, свойство справочника | Должна вмещать префикс + номер |
Если вы перенумеровываете контрагентов в РИБ, делайте это в одном узле и дайте изменениям разойтись штатным обменом. Параллельная перенумерация на двух узлах почти гарантированно даст конфликт кодов.
Важный момент при записи в РИБ: обычная запись Объект.Записать() формирует изменение для
выгрузки в другие узлы — это правильно, именно так новые коды доедут до периферии. Отключать
регистрацию (Объект.ОбменДанными.Загрузка = Истина) при перенумерации нельзя, иначе узлы
останутся со старыми кодами и обмен разойдётся.
Длина кода и технические ограничения
Автонумерация работает в пределах длины кода, заданной в Конфигураторе (свойство справочника «Длина кода»). Когда свободные значения в этом диапазоне заканчиваются, новые элементы перестают получать код автоматически или получают пустой.
Что ограничивает перенумерацию:
- 📏 Длина кода. Префикс занимает часть разрядов. Если длина кода 9 знаков, а префикс
узла — 2 символа, на сам номер остаётся 7 разрядов, то есть максимум до
9999999— свыше девяти миллионов контрагентов, запас почти всегда избыточный. - 🔤 Тип кода. Строковый код допускает буквы и ведущие нули, числовой — только числа. Префиксы-буквы возможны только при строковом типе.
- 🔁 Уникальность. Код должен быть уникален в пределах справочника (а в иерархическом — в пределах установленной области контроля уникальности). Два одинаковых кода платформа не даст записать.
Если диапазона не хватает, длину кода увеличивают в Конфигураторе. Изменение длины кода — это правка структуры конфигурации, её выполняют в монопольном режиме и только на снятой с поддержки или дорабатываемой конфигурации. На типовой конфигурации, стоящей на полной поддержке, менять длину кода без необходимости не стоит — это усложнит обновления.
После увеличения длины кода старые короткие коды остаются как есть; при перенумерации скрипт приведёт их к новой длине.
Как восстановить нумерацию после загрузки данных
После переноса данных (загрузка из другой базы, свёртка, объединение) коды контрагентов часто выглядят не так, как ожидали: появляются чужие префиксы, разрывы в диапазоне или задвоения. Это нормальное следствие механизма загрузки — коды переносятся «как есть» из источника.
Порядок восстановления:
- Сделайте копию базы уже после загрузки — чтобы было к чему вернуться.
- Проверьте справочник на дубли кодов. Удобно вывести список
с группировкой по коду
(стандартный отчёт по справочнику или запрос с группировкой и
КОЛИЧЕСТВО). - Решите, нужна ли сквозная перенумерация или достаточно развести конфликтующие коды.
- Прогоните обработку перенумерации из раздела выше, задав начальный номер и длину кода.
- Проверьте, что документы, где код контрагента печатается (если такие есть), не потеряли смысл.
Коды контрагентов почти никогда не печатаются в первичке и договорах — там идут наименование, ИНН, КПП. Поэтому сквозная перенумерация обычно безопасна и не требует переоформления документов.
Если данные загружались в РИБ-узел, восстанавливайте нумерацию в том узле, где это допустимо правилами обмена, и дайте обмену синхронизировать результат.
Частые ошибки при перенумерации и как их избежать
Большинство проблем возникает не из-за скрипта, а из-за пропущенной подготовки.
Ещё две типичные ловушки:
- 🗂 Забыли про группы. Если не исключить группы из запроса, папки получат коды из общего диапазона и перемешаются с элементами. Решайте заранее: трогать группы или нет.
- 🧷 Код использовали как бизнес-идентификатор. Иногда код вручную выставляют равным артикулу или внутреннему номеру. Перед сквозной перенумерацией проверьте, не завязаны ли на код выгрузки, интеграции или печатные формы.