В практике работы с конфигурацией «Управление торговлей 10.3» (и другими решениями на обычных формах) программисты часто сталкиваются с загадочным поведением автонумерации. Представьте ситуацию: в базе ведется учет по нескольким организациям, у каждой задан свой уникальный префикс. Однако при создании документа для одной конкретной организации система упорно подставляет префикс другой компании. При этом визуально «неправильных» номеров в списке документов нет, а программный код установки префикса отрабатывает корректно. Рассмотрим подробнее, почему это происходит и как окончательно решить проблему.
Для начала проанализируем, как платформа 1С генерирует новый номер. Когда пользователь создает новый документ и система вызывает процедуру УстановитьНовыйНомер(), платформа обращается к таблице базы данных, чтобы найти «самый большой» существующий номер с заданным префиксом. Поиск происходит по строковой маске.
Проблема кроется в лексикографическом сравнении строк. В системе 1С префикс не отделен от цифровой части на уровне структуры базы данных — номер хранится как единая строка. Если в вашей базе есть организация с префиксом С и организация с префиксом СМ, возникают следующие сложности:
СМ начинается на букву С. При поиске максимального номера для первой организации (префикс С) платформа анализирует все номера, начинающиеся на С.С000000001 и номер СМ00000001. При сравнении строк система увидит, что во второй позиции у первого номера стоит 0, а у второго — буква М. Поскольку М «больше» чем 0, номер с префиксом СМ будет признан максимальным для маски С....СМ..., она воспринимает С как префикс, а М — как часть номера, что приводит к сбою логики инкремента или подстановке чужого префикса целиком.Проанализируем ситуацию, описанную в теме: нужный префикс — С, а ошибочно подставляется СМ. Как мы выяснили, это происходит из-за того, что СМ лексикографически перекрывает С. Самым надежным и быстрым решением здесь является изменение системы префиксации. Разберем основные правила:
С1, а второй — СМ, проблема исчезнет, так как на второй позиции в обоих случаях будут буквы (или цифры), не создающие вложенности.С- и СМ- гораздо легче обрабатываются платформой, так как разделитель четко отсекает текстовую часть от цифровой.После изменения префикса в справочнике Организации или Стратегии настройки нумерации, новые документы начнут создаваться корректно. Однако старые документы со «спорным» префиксом могут продолжать влиять на систему.
Иногда визуальное исправление номеров не помогает, так как платформа кэширует значения или во внутренних таблицах индексов сохраняются старые «максимумы». В этом случае нам поможет метод встроенного языка ОбновитьНумерациюОбъектов(). Рассмотрим пример кода, который можно запустить через внешнюю обработку:
// Обновим нумерацию для документа "ЗаказПокупателя"
МетаданныеДокумента = Метаданные.Документы.ЗаказПокупателя;
ОбновитьНумерациюОбъектов(МетаданныеДокумента);
Сообщить("Нумерация объектов успешно обновлена для: " + МетаданныеДокумента.Имя);
Этот метод принудительно пересчитывает текущие индексы номеров в таблицах базы данных. Это гораздо эффективнее, чем простое «Тестирование и исправление», так как процедура узкоспециализирована на решении проблем автонумерации.
Если проблема сохраняется, проанализируем базу на наличие скрытых ошибок. В файловом режиме (база 1С на 3 Гб и более) таблицы индексов могут работать нестабильно. Выполним следующие действия:
chdbfl.exe (находится в папке bin установленной платформы). Она проверяет физическую целостность файла .1CD и исправляет ошибки в структуре таблиц.СМ, которые помечены на удаление, но не удалены физически. Платформа учитывает их при поиске максимального номера.%AppData%\1C\1Cv8\
%LocalAppData%\1C\1Cv8\В конфигурации УТ 10.3 установка номера часто происходит в подписке на событие ПриУстановкеНовогоНомера. Проанализируем типичный код обработки префикса:
Процедура ПриУстановкеНовогоНомераДокумента(Источник, СтандартнаяОбработка, Префикс) Экспорт
// Выясним организацию документа
Организация = Источник.Организация;
Если ЗначениеЗаполнено(Организация) Тогда
// Получаем префикс из реквизита организации
ПрефиксОрганизации = Организация.Префикс;
// Устанавливаем префикс для платформенного механизма
Префикс = ПрефиксОрганизации + Префикс;
КонецЕсли;
КонецПроцедуры
Если вы видите, что в этой процедуре Префикс заполняется правильно (например, значением "С"), но после записи в документе появляется "СМ", значит, в базе точно присутствует документ, чей номер начинается на "С", но содержит "М" в позициях, предназначенных для цифр. Система просто продолжает этот "ложный" числовой ряд.
Подведем итог. Чтобы забыть о проблемах с префиксами в 1С навсегда, придерживайтесь следующих правил:
chdbfl.exe, если ваша база работает в файловом режиме и достигла объема в несколько гигабайт.ОбновитьНумерациюОбъектов().В случае, описанном в обсуждении, именно изменение префикса на уникальный (не пересекающийся с другими) стало окончательным решением. Это исключило возможность ошибочного срабатывания алгоритма MAX() при поиске нового номера.