При настройке обмена данными между конфигурациями (например, между «1С:Бухгалтерией предприятия» и «1С:Розницей») системе нередко задается префикс информационной базы — например, буквенное сочетание БП. В результате платформа начинает автоматически присваивать этот префикс номерам всех создаваемых документов и кодам элементов справочников. Нередко даже после удаления префикса в параметрах синхронизации новые позиции продолжают нумероваться с нежелательными буквами, а в справочнике БанковскиеСчета пользователи и вовсе не могут найти поле кода для ручной правки. Разберем детально, как устроен этот механизм, где хранятся префиксы и как вернуть стандартную автонумерацию.
Проанализируем логику работы встроенного механизма автонумерации платформы 1С. При формировании нового кода или номера объекта система определяет следующее значение, анализируя максимальный существующий код в соответствующей таблице базы данных. Код справочника хранится в виде строки фиксированной длины.
С точки зрения строкового сравнения символы алфавита (включая буквы кириллицы) располагаются в таблице кодировки после цифр. Таким образом, код БП00000001 считается платформой строго «старше», чем чисто числовой код с ведущими нулями 0000000099. Если в информационной базе остается хотя бы один элемент с префиксом БП, платформа берет его за основу, прибавляет единицу к числовой части и продолжает генерировать коды с буквами. По этой причине простое отключение синхронизации или удаление префикса в настройках обмена не возвращает старую нумерацию автоматически.
Прежде чем приступать к исправлению существующих кодов, выясним причину их формирования и проверим все системные настройки, из которых префикс может продолжать подставляться в подписках на события:
Организации откроем карточки всех юридических лиц и индивидуальных предпринимателей. На вкладке основных сведений проверим реквизит Префикс. Если туда ошибочно внесли буквы «БП», их необходимо удалить, так как этот реквизит добавляется ко всем номерам и подчиненным справочникам конкретной организации.Код или Префикс также не должны содержать старых обозначений.Справочник БанковскиеСчета обладает рядом специфических особенностей, из-за которых пользователи испытывают затруднения при попытке исправить нумерацию:
Организации или Контрагенты. Нумерация справочника может быть настроена как сквозная («Во всем справочнике»), так и раздельная («В пределах подчинения владельцу»). При раздельной нумерации элементы с префиксом могут скрываться внутри карточки только одного конкретного контрагента или банка.Код, чтобы избежать случайного нарушения ссылочной целостности и системной нумерации. Однако в форме списка мы можем отобразить его стандартными средствами интерфейса. Для этого в табличной части справочника нажмем правую кнопку мыши, перейдем в пункт Настройка списка, найдем в перечне колонок строку Код и установим напротив нее флажок видимости. После применения настроек колонка отобразится в таблице, что позволит визуально выявить проблемные записи.Чтобы восстановить автонумерацию, нам необходимо найти и переименовать абсолютно все коды, содержащие буквы «БП». Для точечного поиска записей воспользуемся консолью запросов или напишем короткий запрос к табличной части:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| БанковскиеСчета.Ссылка КАК Ссылка,
| БанковскиеСчета.Код КАК Код,
| БанковскиеСчета.Владелец КАК Владелец
|ИЗ
| Справочник.БанковскиеСчета КАК БанковскиеСчета
|ГДЕ
| БанковскиеСчета.Код ПОДОБНО ""БП%""";
РезультатЗапроса = Запрос.Выполнить();
Важное правило платформы: при ручном изменении или программной перезаписи кода критически важно строго сохранять общую длину строки, заданную в метаданных справочника. Если просто стереть первые две буквы «БП» и записать оставшийся короткий номер, строка сместится влево, а справа или слева возникнут пробелы. Это окончательно разрушит строковую автонумерацию. Код всегда должен дополняться ведущими нулями слева до исходной длины (например, правильный вид — 000000001).
Для исправления можно использовать типовую внешнюю обработку «Перенумерация кодов справочников» с диска ИТС или выполнить групповую обработку. Если необходимо решить задачу программно, напишем процедуру, которая обнулит префиксные коды, назначит корректные новые значения и сбросит кэш автонумератора.
Рассмотрим пример кода внешней обработки:
Выборка = Справочники.БанковскиеСчета.Выбрать();
Пока Выборка.Следующий() Цикл
ТекущийКод = СокрЛП(Выборка.Код);
Если Лев(ТекущийКод, 2) = "БП" Тогда
ОбъектСчета = Выборка.ПолучитьОбъект();
// Очищаем ошибочный код перед назначением нового
ОбъектСчета.Код = "";
// Метод платформы вычисляет правильный следующий код
ОбъектСчета.УстановитьНовыйКод();
ОбъектСчета.Записать();
КонецЕсли;
КонецЦикла;
// Сбрасываем внутренний счетчик платформы для справочника банковских счетов
ОбновитьНумерациюОбъектов(Метаданные.Справочники.БанковскиеСчета);
Обратим внимание на метод ОбновитьНумерациюОбъектов(). Платформа 1С кэширует последний выданный номер в оперативной памяти текущего сеанса. Если просто переименовать объекты в базе данных, сеанс может продолжать выдавать старые значения из памяти. Вызов процедуры ОбновитьНумерациюОбъектов() с передачей объекта метаданных сбрасывает этот кэш и принудительно заставляет платформу перечитать максимальный код из физической таблицы базы данных.
Выполнять вызов ОбновитьНумерациюОбъектов() имеет смысл строго после того, как из базы физически устранены все элементы с префиксами. Если запустить обновление при наличии хотя бы одной записи с кодом «БП...», платформа снова найдет ее как максимальную и продолжит присваивать префикс новым счетам.
После последовательного выполнения описанных шагов — очистки префиксов в настройках, перезаписи кодов с сохранением разрядности и сброса кэша нумератора — создание новых банковских счетов и элементов других справочников вернется к стандартной числовой последовательности.