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