При разработке интеграций и обработок в 1С часто возникает задача: документы, созданные пользователями вручную, должны иметь стандартный префикс организации, а документы, генерируемые программно (например, загружаемые из другой базы или создаваемые обработкой), должны получать уникальный служебный префикс (например, Спц-). Разберем по шагам, почему простая установка номера не всегда работает, проанализируем поведение платформы и найдем надежное решение.
Самый очевидный подход — перед записью документа вызвать метод объекта с нужным префиксом: ДокРеализации.УстановитьНовыйНомер("Спц-"). Однако на практике, сразу после вызова Записать(), платформа сбрасывает этот номер и заменяет его на стандартный префикс организации.
Выясним причину: в типовых конфигурациях (таких как УПП, УТ, БП) существует подписка на событие платформы ПриУстановкеНовогоНомера. Когда документ записывается, платформа генерирует номер, вызывает это событие, и в коде стандартного обработчика префикс переопределяется настройками организации. Любые ваши предварительные действия просто затираются типовой логикой.
Чтобы платформа не затирала ваш префикс, необходимо "научить" типовой обработчик уважать уже заполненное значение. Посмотрим на пример классической доработки функции добавления префикса организации. Суть в том, чтобы сделать возврат из процедуры, если префикс уже был передан извне.
Процедура ДобавитьПрефиксОрганизации(ДокументОбъект, Префикс) Экспорт
// Если префикс уже передан (например, программно), не меняем его
Если ЗначениеЗаполнено(Префикс) Тогда
Возврат;
КонецЕсли;
Префикс = "0";
Если ДокументОбъект.Метаданные.Реквизиты.Найти("Организация") <> Неопределено Тогда
ПрефиксОрганизации = ПолучитьЗначениеРеквизита(ДокументОбъект.Организация, "Префикс");
Если ЗначениеЗаполнено(ПрефиксОрганизации) Тогда
Префикс = ПрефиксОрганизации;
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Теперь, если при генерации документа вы программно вызовете этот алгоритм и передадите нужный префикс, он не будет перезаписан.
Чтобы система понимала, откуда пришел документ, добавим в документ служебный реквизит СозданОбработкой (булево). В модуле обработки при создании документа будем устанавливать его в Истина.
ДокРеализации = Документы.РеализацияТоваровУслуг.СоздатьДокумент();
// ... заполнение реквизитов ...
ДокРеализации.СозданОбработкой = Истина;
ДокРеализации.Организация = Справочники.Организации.НайтиПоКоду("000000006");
ДокРеализации.Записать(РежимЗаписиДокумента.Запись);
Далее в модуле самого документа в обработчике ПередЗаписью перехватим этот флаг:
Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)
Если ЭтоНовый() И СозданОбработкой Тогда
Если ЭтотОбъект.Организация = Справочники.Организации.НайтиПоКоду("000000006") Тогда
ЭтотОбъект.УстановитьНовыйНомер("Спц-");
ИначеЕсли ЭтотОбъект.Организация = Справочники.Организации.НайтиПоКоду("000000010") Тогда
ЭтотОбъект.УстановитьНовыйНомер("Мсн-");
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Даже с правильным кодом вы можете столкнуться с тем, что номера не присваиваются корректно, либо префикс игнорируется. Важно понимать особенность автонумерации 1С: типовая нумерация не видит префикс, если в базе данных нет ни одного документа, начинающегося с этого префикса.
Платформа должна от чего-то начать отсчет. Если база пустая в разрезе данного префикса, автонумерация не сработает. Чтобы решить это, создайте первый документ с нужным префиксом (например, Спц-000000001) вручную. После этого платформа закэширует его, и обработка начнет успешно создавать документы Спц-000000002, Спц-000000003 и так далее.
Если нумерация все равно сбоит, используйте глобальный метод ОбновитьНумерациюОбъектов(). Он заставит платформу сбросить закэшированные в оперативной памяти значения и заново прочитать максимальные номера напрямую из таблиц СУБД.
Рассмотрим подводный камень, который может испортить всю логику. Допустим, ваш программный префикс Спц-, а стандартный префикс организации в базе — Сп. В этом случае, когда пользователи будут создавать документы вручную, платформа может ошибочно продолжить нумерацию с префиксом Спц-!
Почему это происходит? В 1С номер является простой строкой. Механизм автонумерации ищет максимальный номер поиском по строке. Если один префикс является точным началом другого (строка "Сп" — это левая часть строки "Спц-"), внутренний алгоритм платформы путается. Он не может корректно отделить префикс от числовой части и берет самый длинный совпавший префикс как основу.
Решение: Всегда делайте префиксы уникальными. Если префикс организации состоит из 2 символов, делайте служебный префикс тоже из 2 уникальных символов (например ЦЦ или ММ), чтобы избежать бага левого вхождения.
Если вы работаете в современных конфигурациях (ERP, УТ 11, БП 3.0), построенных на Библиотеке стандартных подсистем (БСП), вам не нужно вручную менять подписки на события. В БСП внедрен жесткий стандарт префиксации формата ААББ-ДД000123.
ПрефиксацияОбъектовПереопределяемый.ПриУстановкеНовогоНомера (или аналогичной переопределяемой) вы можете внедрить свою логику проверки реквизитов документа и безопасно подменить префикс.Используя описанные методы, вы сможете настроить гибкую и независимую нумерацию документов как для ручного ввода, так и для автоматизированных обработок.