Как принудительно установить префикс документа при программном создании в 1С?

Программист 1С v8.3 (Обычные формы) IT и автоматизация бизнеса
← На главную

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

Почему не работает метод УстановитьНовыйНомер() напрямую?

Самый очевидный подход — перед записью документа вызвать метод объекта с нужным префиксом: ДокРеализации.УстановитьНовыйНомер("Спц-"). Однако на практике, сразу после вызова Записать(), платформа сбрасывает этот номер и заменяет его на стандартный префикс организации.

Выясним причину: в типовых конфигурациях (таких как УПП, УТ, БП) существует подписка на событие платформы ПриУстановкеНовогоНомера. Когда документ записывается, платформа генерирует номер, вызывает это событие, и в коде стандартного обработчика префикс переопределяется настройками организации. Любые ваши предварительные действия просто затираются типовой логикой.

Шаг 1: Корректировка обработчика подписки на событие

Чтобы платформа не затирала ваш префикс, необходимо "научить" типовой обработчик уважать уже заполненное значение. Посмотрим на пример классической доработки функции добавления префикса организации. Суть в том, чтобы сделать возврат из процедуры, если префикс уже был передан извне.


Процедура ДобавитьПрефиксОрганизации(ДокументОбъект, Префикс) Экспорт 
    // Если префикс уже передан (например, программно), не меняем его
    Если ЗначениеЗаполнено(Префикс) Тогда
        Возврат; 
    КонецЕсли;

    Префикс = "0"; 
    Если ДокументОбъект.Метаданные.Реквизиты.Найти("Организация") <> Неопределено Тогда 
        ПрефиксОрганизации = ПолучитьЗначениеРеквизита(ДокументОбъект.Организация, "Префикс"); 
        Если ЗначениеЗаполнено(ПрефиксОрганизации) Тогда 
            Префикс = ПрефиксОрганизации; 
        КонецЕсли; 
    КонецЕсли; 
КонецПроцедуры

Теперь, если при генерации документа вы программно вызовете этот алгоритм и передадите нужный префикс, он не будет перезаписан.

Шаг 2: Создание признака программного создания

Чтобы система понимала, откуда пришел документ, добавим в документ служебный реквизит СозданОбработкой (булево). В модуле обработки при создании документа будем устанавливать его в Истина.


ДокРеализации = Документы.РеализацияТоваровУслуг.СоздатьДокумент();
// ... заполнение реквизитов ...
ДокРеализации.СозданОбработкой = Истина;
ДокРеализации.Организация = Справочники.Организации.НайтиПоКоду("000000006");
ДокРеализации.Записать(РежимЗаписиДокумента.Запись);

Далее в модуле самого документа в обработчике ПередЗаписью перехватим этот флаг:


Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)
    Если ЭтоНовый() И СозданОбработкой Тогда 
        Если ЭтотОбъект.Организация = Справочники.Организации.НайтиПоКоду("000000006") Тогда 
            ЭтотОбъект.УстановитьНовыйНомер("Спц-"); 
        ИначеЕсли ЭтотОбъект.Организация = Справочники.Организации.НайтиПоКоду("000000010") Тогда 
            ЭтотОбъект.УстановитьНовыйНомер("Мсн-"); 
        КонецЕсли; 
    КонецЕсли;
КонецПроцедуры

Шаг 3: Особенности кэша нумерации и "Первый документ"

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

Платформа должна от чего-то начать отсчет. Если база пустая в разрезе данного префикса, автонумерация не сработает. Чтобы решить это, создайте первый документ с нужным префиксом (например, Спц-000000001) вручную. После этого платформа закэширует его, и обработка начнет успешно создавать документы Спц-000000002, Спц-000000003 и так далее.

Если нумерация все равно сбоит, используйте глобальный метод ОбновитьНумерациюОбъектов(). Он заставит платформу сбросить закэшированные в оперативной памяти значения и заново прочитать максимальные номера напрямую из таблиц СУБД.

Шаг 4: Проблема "Левого вхождения" (пересечения префиксов)

Рассмотрим подводный камень, который может испортить всю логику. Допустим, ваш программный префикс Спц-, а стандартный префикс организации в базе — Сп. В этом случае, когда пользователи будут создавать документы вручную, платформа может ошибочно продолжить нумерацию с префиксом Спц-!

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

Решение: Всегда делайте префиксы уникальными. Если префикс организации состоит из 2 символов, делайте служебный префикс тоже из 2 уникальных символов (например ЦЦ или ММ), чтобы избежать бага левого вхождения.

Шаг 5: Современный подход в конфигурациях на базе БСП

Если вы работаете в современных конфигурациях (ERP, УТ 11, БП 3.0), построенных на Библиотеке стандартных подсистем (БСП), вам не нужно вручную менять подписки на события. В БСП внедрен жесткий стандарт префиксации формата ААББ-ДД000123.

  1. Для реализации нестандартного префикса достаточно использовать общий модуль ПрефиксацияОбъектовПереопределяемый.
  2. В процедуре ПриУстановкеНовогоНомера (или аналогичной переопределяемой) вы можете внедрить свою логику проверки реквизитов документа и безопасно подменить префикс.
  3. БСП сама позаботится о том, чтобы префикс информационной базы и организации склеились в правильном порядке, не сломав типовые обмены (РИБ).

Используя описанные методы, вы сможете настроить гибкую и независимую нумерацию документов как для ручного ввода, так и для автоматизированных обработок.

← На главную