Как исправить ошибку «Неверный тип значения» при записи нового бизнес-процесса в конфигурации с БСП?

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

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

Проанализируем текст типичной ошибки, с которой начинается наша проблема:


Ошибка при вызове метода контекста (Записать)
НовыйБП.Записать();
по причине: Ошибка при выполнении обработчика - 'ПриЗаписи'
по причине: {ОбщийМодуль.БизнесПроцессыИЗадачиСобытия.Модуль(25)}: Ошибка при вызове метода контекста (Заблокировать)
по причине: Неверный тип значения: РегистрСведений.ДанныеБизнесПроцессов.Владелец

На первый взгляд кажется, что проблема в коде самого объекта, однако, если заглянуть в модуль объекта бизнес-процесса, обработчик ПриЗаписи может быть абсолютно пустым. Выясним причину такого поведения системы и по шагам разберем, как правильно интегрировать новый бизнес-процесс в инфраструктуру БСП.

Почему возникает конфликт с подсистемой БСП?

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

Посмотрим на пример кода управляемой блокировки из общего модуля, на котором происходит падение:


Блокировка = Новый БлокировкаДанных;
ЭлементБлокировки = Блокировка.Добавить("РегистрСведений.ДанныеБизнесПроцессов");
ЭлементБлокировки.УстановитьЗначение("Владелец", Источник.Ссылка);
Блокировка.Заблокировать();

Система пытается установить транзакционную блокировку на служебный регистр сведений ДанныеБизнесПроцессов, передавая в измерение Владелец ссылку на наш новый объект. Ошибка «Неверный тип значения» возникает именно здесь, потому что измерение регистра имеет строгий тип данных, заданный через платформенный механизм «Определяемые типы». Поскольку наш новый бизнес-процесс только что создан, БСП о нем еще ничего не знает, и тип ссылки нашего объекта не входит в состав определяемого типа.

Шаг 1. Настройка определяемых типов

Рассмотрим, как устранить эту первопричину. Нам необходимо расширить состав типов, с которыми умеет работать БСП. Откроем дерево метаданных конфигурации, перейдем в ветку «Общие» – «Определяемые типы».

В зависимости от версии БСП и закладываемой логики, нам нужно включить ссылку на наш новый бизнес-процесс в следующие определяемые типы:

  1. БизнесПроцесс — это базовый определяемый тип. Добавление в него обязательно устранит ошибку записи в регистр ДанныеБизнесПроцессов.
  2. ПредметЗадачи (или ПредметЗадачиОбъект) — включите сюда ваш объект, если бизнес-процесс будет выступать основанием для других задач или привязываться к справочникам и документам.
  3. ВладелецПрисоединенныхФайлов — если по логике работы пользователи должны прикреплять к карточке бизнес-процесса сканы, договоры или другие файлы.

Шаг 2. Добавление обязательных реквизитов

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

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

  1. Автор — тип СправочникСсылка.Пользователи. Указывает, кто инициализировал процесс.
  2. Важность — тип ПеречислениеСсылка.ВариантыВажностиЗадачи. Необходим для сортировки и раскраски задач в списке исполнителя.
  3. ДатаНачала — тип Дата.
  4. ДатаЗавершения — тип Дата. Используется для фиксации фактического времени закрытия маршрута.
  5. Наименование — тип Строка. Текстовое представление процесса (БСП часто генерирует его автоматически, но сам реквизит должен физически существовать).
  6. Состояние — тип ПеречислениеСсылка.СостоянияБизнесПроцессов. Определяет текущий статус (Активен, Остановлен, Прерван, Завершен).
  7. ВедущаяЗадача (или ГлавнаяЗадача) — тип ЗадачаСсылка.ЗадачаИсполнителя. Критически важный реквизит для связи вложенных процессов.

Шаг 3. Настройка полей блокировки данных

На этом шаге мы решим проблему безопасного удаления объектов. Как упоминалось в обсуждении проблемы, стандартный реквизит ВедущаяЗадача играет ключевую роль при пометке на удаление. Если пользователь помечает на удаление задачу-родителя, система попытается рекурсивно пометить и все подчиненные бизнес-процессы, используя механизм управляемых блокировок.

Чтобы избежать дэдлоков (взаимоблокировок) и обеспечить консистентность, выполним настройку:

  1. Откроем свойства нашего нового бизнес-процесса в конфигураторе.
  2. Перейдем на вкладку «Данные».
  3. Найдем свойство «Поля блокировки данных» и нажмем на кнопку выбора.
  4. В открывшемся окне добавим реквизит ВедущаяЗадача (или ГлавнаяЗадача).

Эта простая настройка гарантирует, что платформа корректно наложит управляемую блокировку при групповом изменении статусов или удалении.

Дополнительные аспекты интеграции

Проанализируем еще несколько важных моментов, которые стоит учесть при полноценном внедрении.

Ввод на основании: Если наш процесс должен создаваться из других объектов (договоры, заказы), логику заполнения нужно описать в модуле объекта, в обработчике ОбработкаЗаполнения. Также не забудьте добавить процесс в подписки на события, отвечающие за проверку наличия процессов по предмету, чтобы избежать дублирования.

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

Выполнив все описанные шаги, мы корректно внедрим новый бизнес-процесс в типовую конфигурацию. Объект будет безошибочно записываться, маршрутизироваться и прозрачно взаимодействовать с Библиотекой стандартных подсистем без нарушения логики целостности данных.

← На главную