Рассмотрим распространенную и крайне неприятную ситуацию: в информационной базе годами успешно работали несколько организаций с односимвольными префиксами (например, «А», «О», «Э»). После добавления новой организации с двухсимвольным префиксом «АО» и создания первого документа нумерация по первой организации внезапно ломается. Новый документ организации с префиксом «А» неожиданно получает префикс «АО» и продолжает нумерацию новой организации. Выясним причину такого поведения платформы и разберем по шагам, как исправить нумерацию и предотвратить подобные коллизии в будущем.
Проанализируем, как именно встроенный менеджер нумерации платформы 1С формирует следующий номер документа. При генерации номера система выполняет строковый парсинг справа налево:
Когда для документа организации «А» вызывается назначение номера, платформа ищет существующие номера, начинающиеся на подстроку «А». При наличии номера АО000001 система сравнивает его со строками вида А0000001. В строковом сравнении символ «О» идет после любых цифр, поэтому строка АО000001 оказывается строго больше, чем А9999999.
Обнаружив максимальную строку АО000001, платформа отсекает справа числовую часть 000001, а оставшуюся часть «АО» ошибочно воспринимает как текущий префикс серии. В результате числовая часть увеличивается на единицу, префикс заимствуется из найденной максимальной записи, и документ организации «А» получает номер АО000002.
Таким образом, префиксы никогда не должны являться подмножеством друг друга. Префикс «А» и любой префикс вида «Ах» (где «х» — любой символ) неизбежно будут конфликтовать между собой.
Платформа 1С оптимизирует обращение к базе данных: менеджер автонумерации кэширует последний выданный номер в оперативной памяти сервера или сеанса. Если документ с ошибочным номером уже был записан, простое изменение префикса в справочнике организаций не исправит ситуацию мгновенно. Система продолжит выдавать ошибочные номера из кэша.
Для гарантированного обновления счетчиков номеров в кодовой базе предусмотрен глобальный метод платформы ОбновитьНумерациюОбъектов(). Посмотрим на пример вызова этого метода:
// Сброс кэша нумерации для конкретного вида документа
ОбновитьНумерациюОбъектов(Метаданные.Документы.РеализацияТоваровУслуг);
// Либо полное обновление нумерации для всех объектов конфигурации
ОбновитьНумерациюОбъектов();
В файловом режиме работы для очистки кэша достаточно перезапустить сеанс всех пользователей, а в клиент-серверном варианте — перезапустить службу сервера 1С:Предприятия или выполнить вызов метода программно через внешнюю обработку.
Разберем по шагам порядок действий для восстановления правильного порядка номеров:
А1 (или А0), для остальных — О1, Э1 и АО. Это исключит ситуацию, когда один префикс входит в состав другого.АО. Изменим их номера вручную или с помощью группового изменения реквизитов, вернув префикс А (или установив новый стандартный префикс). Обязательно сохраняем ведущие нули: потеря нулей (например, номер А1 вместо А0000001) также вызовет сбой последующей нумерации.ОбновитьНумерациюОбъектов(), чтобы платформа перечитала максимальные номера из таблиц базы данных.Рассмотрим подробнее рекомендации, которые помогут навсегда избежать наложения префиксов:
А-000001 и АО-000001 не приводят к коллизии, так как символ дефиса четко разделяет префиксную и числовую части.[ПрефиксОрганизации(2)][ПрефиксИБ(2)]-. Строгое следование этому шаблону гарантирует корректную нумерацию даже при сложном обмене данными между распределенными информационными базами.
Процедура ПриУстановкеНовогоНомера(СтандартнаяОбработка, Префикс)
// Отключаем стандартный алгоритм поиска максимума платформой
СтандартнаяОбработка = Ложь;
// Реализуем собственный алгоритм генерации номера запросом
КонецПроцедуры
Применяя эти правила на практике, мы защитим учетную систему от путаницы в первичных документах и обеспечим непрерывную и корректную нумерацию по всем организациям предприятия.