Почему в 1С:Управление торговлей 10.3 документу присваивается чужой префикс и как это исправить

Программист 1С v8.3 (Обычные формы) 1С:Управление торговлей Управленческий учет Торговля и дистрибуция
← На главную

В практике работы с конфигурацией «Управление торговлей 10.3» (и другими решениями на обычных формах) программисты часто сталкиваются с загадочным поведением автонумерации. Представьте ситуацию: в базе ведется учет по нескольким организациям, у каждой задан свой уникальный префикс. Однако при создании документа для одной конкретной организации система упорно подставляет префикс другой компании. При этом визуально «неправильных» номеров в списке документов нет, а программный код установки префикса отрабатывает корректно. Рассмотрим подробнее, почему это происходит и как окончательно решить проблему.

Выясняем причину: как работает механизм поиска максимального номера

Для начала проанализируем, как платформа 1С генерирует новый номер. Когда пользователь создает новый документ и система вызывает процедуру УстановитьНовыйНомер(), платформа обращается к таблице базы данных, чтобы найти «самый большой» существующий номер с заданным префиксом. Поиск происходит по строковой маске.

Проблема кроется в лексикографическом сравнении строк. В системе 1С префикс не отделен от цифровой части на уровне структуры базы данных — номер хранится как единая строка. Если в вашей базе есть организация с префиксом С и организация с префиксом СМ, возникают следующие сложности:

  1. Вложенность префиксов: Для системы префикс СМ начинается на букву С. При поиске максимального номера для первой организации (префикс С) платформа анализирует все номера, начинающиеся на С.
  2. Порядок символов: В кодировке символов буквы стоят после цифр. Допустим, у нас есть номер С000000001 и номер СМ00000001. При сравнении строк система увидит, что во второй позиции у первого номера стоит 0, а у второго — буква М. Поскольку М «больше» чем 0, номер с префиксом СМ будет признан максимальным для маски С....
  3. Смещение разрядности: Платформа пытается прибавить единицу к найденному «максимальному» номеру. Видя СМ..., она воспринимает С как префикс, а М — как часть номера, что приводит к сбою логики инкремента или подстановке чужого префикса целиком.

Шаг 1: Проверка и изменение префиксов

Проанализируем ситуацию, описанную в теме: нужный префикс — С, а ошибочно подставляется СМ. Как мы выяснили, это происходит из-за того, что СМ лексикографически перекрывает С. Самым надежным и быстрым решением здесь является изменение системы префиксации. Разберем основные правила:

После изменения префикса в справочнике Организации или Стратегии настройки нумерации, новые документы начнут создаваться корректно. Однако старые документы со «спорным» префиксом могут продолжать влиять на систему.

Шаг 2: Программное обновление нумерации

Иногда визуальное исправление номеров не помогает, так как платформа кэширует значения или во внутренних таблицах индексов сохраняются старые «максимумы». В этом случае нам поможет метод встроенного языка ОбновитьНумерациюОбъектов(). Рассмотрим пример кода, который можно запустить через внешнюю обработку:


// Обновим нумерацию для документа "ЗаказПокупателя"
МетаданныеДокумента = Метаданные.Документы.ЗаказПокупателя;
ОбновитьНумерациюОбъектов(МетаданныеДокумента);
Сообщить("Нумерация объектов успешно обновлена для: " + МетаданныеДокумента.Имя);

Этот метод принудительно пересчитывает текущие индексы номеров в таблицах базы данных. Это гораздо эффективнее, чем простое «Тестирование и исправление», так как процедура узкоспециализирована на решении проблем автонумерации.

Шаг 3: Поиск «фантомных» номеров и очистка кэша

Если проблема сохраняется, проанализируем базу на наличие скрытых ошибок. В файловом режиме (база 1С на 3 Гб и более) таблицы индексов могут работать нестабильно. Выполним следующие действия:

  1. Физическая проверка файла БД: Используем утилиту chdbfl.exe (находится в папке bin установленной платформы). Она проверяет физическую целостность файла .1CD и исправляет ошибки в структуре таблиц.
  2. Удаление помеченных объектов: Убедимся, что в базе нет старых документов с префиксом СМ, которые помечены на удаление, но не удалены физически. Платформа учитывает их при поиске максимального номера.
  3. Очистка локального кэша: Бывают случаи, когда клиентское приложение «запоминает» последний номер. Необходимо полностью очистить содержимое папок:
    %AppData%\1C\1Cv8\
    %LocalAppData%\1C\1Cv8\

Шаг 4: Анализ подписок на события

В конфигурации УТ 10.3 установка номера часто происходит в подписке на событие ПриУстановкеНовогоНомера. Проанализируем типичный код обработки префикса:


Процедура ПриУстановкеНовогоНомераДокумента(Источник, СтандартнаяОбработка, Префикс) Экспорт
    // Выясним организацию документа
    Организация = Источник.Организация;
    Если ЗначениеЗаполнено(Организация) Тогда
        // Получаем префикс из реквизита организации
        ПрефиксОрганизации = Организация.Префикс;
        // Устанавливаем префикс для платформенного механизма
        Префикс = ПрефиксОрганизации + Префикс;
    КонецЕсли;
КонецПроцедуры

Если вы видите, что в этой процедуре Префикс заполняется правильно (например, значением "С"), но после записи в документе появляется "СМ", значит, в базе точно присутствует документ, чей номер начинается на "С", но содержит "М" в позициях, предназначенных для цифр. Система просто продолжает этот "ложный" числовой ряд.

Резюме и рекомендации

Подведем итог. Чтобы забыть о проблемах с префиксами в 1С навсегда, придерживайтесь следующих правил:

В случае, описанном в обсуждении, именно изменение префикса на уникальный (не пересекающийся с другими) стало окончательным решением. Это исключило возможность ошибочного срабатывания алгоритма MAX() при поиске нового номера.

← На главную