При работе в конфигурации 1С:Зарплата и Управление Персоналом 2.5 пользователи часто сталкиваются с ситуацией, когда после ручного ввода или программной загрузки данных сбивается привычная автонумерация справочника ФизическиеЛица. Вместо привычного формата, например, АА-АА-000001, система начинает предлагать совершенно другие коды, ориентируясь на последний введенный символ. В этой статье мы подробно разберем, почему это происходит и как вернуть нумерацию в нужное русло.
Для начала проанализируем, как платформа «1С:Предприятие» определяет следующий номер. Система выполняет поиск максимального значения кода в таблице справочника. Важно понимать, что сравнение строк происходит посимвольно слева направо в соответствии с таблицей кодировки Unicode.
Рассмотрим ситуацию: в базе были коды АА-АА-000001, и вы добавили запись с кодом К000001. Поскольку буква «К» (особенно если она русская) в алфавите стоит значительно дальше буквы «А», система считает код на «К» максимальным. С этого момента алгоритм автонумерации «цепляется» за этот префикс и будет предлагать К000002, К000003 и так далее.
Дополнительную сложность вносят дефисы. Формат АА-АА-000001 является сложным для стандартного механизма. Платформе гораздо проще инкрементировать «чистые» коды, где буквы стоят только в начале, а остальная часть — цифры. Если в справочнике появляется простая структура типа К000001, система отдает ей приоритет, так как в ней числовая часть выделяется однозначно.
Если записей с «неправильным» префиксом (например, «К») немного или вы готовы их изменить, лучшим решением будет привести их к общему формату. Рассмотрим, как это сделать правильно:
АА-АА-0000150.УниверсальныйПодборИОбработкаОбъектов. С ее помощью можно отобрать все записи, код которых начинается на «К», и переименовать их в формат АА-АА-0000151, АА-АА-0000152 и так далее.Однако простого изменения кодов в базе часто бывает недостаточно. Система может продолжать предлагать «К», так как последнее значение закэшировано на сервере приложений.
Чтобы заставить платформу заново просканировать справочник и найти актуальный максимальный код после того, как вы исправили «ошибочные» записи, необходимо выполнить специальную команду. В версии 1С 8.2 и выше для этого существует встроенный метод.
Выясним, как программно сбросить кэш нумерации. Для этого можно создать внешнюю обработку и в модуле прописать следующий код:
Процедура ОбновитьНумерацию()
ОбновитьНумерациюОбъектов(Метаданные.Справочники.ФизическиеЛица);
Сообщить("Нумерация справочника Физические лица успешно обновлена!");
КонецПроцедуры
Этот метод ОбновитьНумерациюОбъектов() заставляет сервер 1С очистить старые значения и вычислить новый номер на основании реально существующих данных в базе. После выполнения этого кода при создании нового физического лица система должна подставить следующий номер после АА-АА-nnnnnn.
Если ваша задача — сохранить записи с префиксом «К» (например, для выделения определенной группы сотрудников), но при этом вы хотите, чтобы все остальные продолжали нумероваться по старинке, стандартная автонумерация вам не поможет. В этом случае придется вмешаться в логику работы справочника.
Разберем, как реализовать свой алгоритм установки кода. В модуле объекта справочника ФизическиеЛица существует предопределенная процедура ПриУстановкеНовогоКода. Рассмотрим пример реализации:
Процедура ПриУстановкеНовогоКода(СтандартнаяОбработка, Префикс)
// Если мы хотим управлять нумерацией вручную,
// можно отключить стандартный механизм:
// СтандартнаяОбработка = Ложь;
// Либо принудительно задать нужный нам префикс
Префикс = "АА-АА-";
КонецПроцедуры
В этом случае при нажатии кнопки «Создать» система будет использовать указанный префикс для поиска максимального номера именно в этой последовательности. Однако будьте осторожны: ЗУП 2.5 — это типовая конфигурация, и внесение изменений в модуль объекта потребует снятия с поддержки, что усложнит дальнейшие обновления.
Проанализируем две часто встречающиеся ошибки, которые делают восстановление нумерации невозможным:
АА были набраны английскими буквами, а в новых вы случайно ввели русскую А, для системы это будут абсолютно разные префиксы. Кириллические символы стоят в таблице Unicode позже латинских, поэтому «русская А» будет всегда считаться «больше» английской. При перенумерации убедитесь, что используете одну и ту же раскладку.ФизическиеЛица задана фиксированная длина кода (например, 10 или 12 символов). Если ваш новый префикс вместе с номером превышает эту длину, номер будет обрезаться. Также система может дополнять короткие коды невидимыми пробелами при сравнении, что сбивает сортировку. Всегда заполняйте код ведущими нулями до установленной длины (например, АА-АА-000001, а не АА-АА-1).Подведем итог: для быстрого решения проблемы лучше всего перенумеровать «выбивающиеся» записи с помощью обработки УниверсальныйПодборИОбработкаОбъектов, а затем обязательно выполнить команду ОбновитьНумерациюОбъектов() для сброса серверного кэша.