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