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