Что делать, если при старте бизнес-процесса в 1С появляется ошибка «Номер не уникален»?

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

При программном создании и запуске бизнес-процессов разработчики иногда сталкиваются с ситуацией, когда запись самого объекта происходит без ошибок, однако на этапе вызова метода Старт() платформа выдает сообщение: «Значение поля "Номер" не уникально». Проанализируем причину возникновения этой проблемы и разберем варианты ее решения.

Анализ проблемы: почему ошибка возникает именно при старте

Рассмотрим стандартный фрагмент кода программного создания и запуска бизнес-процесса:


БПОбъект = БизнесПроцессы.СогласованиеЗаявкиНаПриобретениеТоваровРаботУслуг.СоздатьБизнесПроцесс();
БПОбъект.Основание = Объект.Ссылка;
БПОбъект.Дата = ТекущаяДата();
БПОбъект.Записать(); 
БПОбъект.Старт(); // Ошибка возникает на данном этапе

При первичной записи объекта с помощью метода Записать() платформа назначает бизнес-процессу номер и успешно сохраняет его в базе данных. Однако при вызове метода Старт() происходят дополнительные действия:

  1. Бизнес-процесс переходит в состояние «Запущен».
  2. Платформа автоматически продвигается по карте маршрута и создает связанные объекты типа Задача на первой точке маршрута.
  3. При генерации задачи или при повторном формировании номера бизнес-процесса механизм нумерации платформы пытается присвоить номер, который уже существует в информационной базе.

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

Способ 1. Обновление нумерации объектов

В платформе 1С предусмотрен специальный метод для сброса и актуализации счетчиков номеров в кэше сервера. Если нумератор «застрял» на определенном значении, выполним процедуру обновления нумерации для бизнес-процессов и связанных задач.

Для этого в обработке или внешнем коде вызовем процедуру:


ОбновитьНумерациюОбъектов(Метаданные.БизнесПроцессы.СогласованиеЗаявкиНаПриобретениеТоваровРаботУслуг);
ОбновитьНумерациюОбъектов(Метаданные.Задачи.ЗадачаИсполнителю);

Этот метод заставляет платформу заново пересчитать максимальный существующий номер в базе данных для указанного типа объектов.

Способ 2. Явный вызов установки нового номера в коде

Перед записью или стартом объекта можно принудительно заставить платформу сформировать новый уникальный номер. Для этого перед вызовом метода Записать() используем следующий метод:

БПОбъект.УстановитьНовыйНомер();

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

Способ 3. Перенумерация с использованием префикса (Основное решение)

Если простая перенумерация или обновление нумерации объектов не помогают, это означает, что в базе данных присутствует запись с некорректным форматом номера (например, с усеченными лидирующими нулями или специальными символами), которая сбивает алгоритм поиска максимального значения.

Наиболее эффективным решением в данной ситуации является массовая перенумерация существующих объектов с добавлением нового префикса.

Разберем порядок действий по шагам:

  1. Создадим групповую обработку или используем стандартную обработку «Групповое изменение реквизитов».
  2. Выберем все созданные ранее бизнес-процессы данного вида (включая помеченные на удаление).
  3. Назначим объектам номера с явным префиксом (например, зафиксируем префикс БП- перед числовым кодом).
  4. После назначения номеров с новым префиксом выполним команду ОбновитьНумерациюОбъектов().

Благодаря смене формата и добавлению префикса счетчик нумератора сбрасывается и начинает корректно выдавать последующие уникальные номера при каждом вызове метода Старт().

← На главную