Защита от "дурака" спасает только от неизобретательного дурака.
(С) Постулаты Трумена по программированию.
Любая система, зависящая от человеческой надежности, ненадежна.
(С) Законы ненадежности Джилба.
Отправляю документ по типовому маршруту, нельзя быть абсолютно уверенным, что все его исполнители выполнят только те действия, которые от них требуются. И вероятность выполнения ненужных или неправильных действий только увеличивается с количеством исполнителей.
Рассмотрим 2 метода исключения достаточно серьезного случая вероятного нарушения логики любого типового маршрута и, как следствие, построения листов согласования.
1. Запрет создания новой версии документа, вложенного в задачу (с разрешением в определенных заданиях).
Для запрета создания новой версии нам будет необходимы свойства 2го табличного раздела карточки документа (Информация о версиях хранится во 2ой табличной части карточки документа).
Добавляем в событие "Добавление После" Таблицы 2 карточки электронного документа:
CanCreateVersion = TRUE // изначально, при создании документа, новые версии создавать можно
if not Object.Inserted // необходимое условие для создания первой версии
// Поиск задач "в работе"
Search = Searches.Load('ATTACHED_TO_TASK_SEARCH')
EDocInfo = EDocuments.ObjectInfo(Object.ID)
Search.InitializeSearch(EDocInfo)
Criteria = Search.SearchCriteria
StateCriterion = Criteria.Add("TaskState")
StateCriterion.Add("В работе")
StateCriterion.ValuesBuildType = btOnly
StandardRouteCriterion = Criteria.Add("StandardRoute")
// код ТМ, по которому ищем вложенным наш документ
StandardRouteCriterion.Add(Конст("CMAgreementStandardRoute"))
StandardRouteCriterion.ValuesBuildType = btOnly
TasksInWork = Searches.Execute(Search)
// Анализ
if TasksInWork.Count > 0
CanCreateVersion = FALSE // если есть задачи в работе - запретим создавать новые версии
// пройдемся по всем найденным задачам
foreach TaskInfo in TasksInWork
Task = TaskInfo.Task
Jobss = Task.DetailDataSet(3)
if Jobss.RecordCount > 0
Jobss.First()
While not Jobss.EOF
// разрешим создание новых версий только на определенных этапах ТМ
if ((SubString(Jobss.Subject; ' '; 1) == 'Доработка')
or (SubString(Jobss.Subject; ' '; 1) == 'Контроль'))
and (Jobss.JobState == "В работе")
CanCreateVersion = TRUE
endif
Jobss.Next()
endwhile
endif
endforeach
endif
endif
// Запретим создание новых версий документа
if not CanCreateVersion
Raise(CreateException('';
'Создавать новые версии можно только на этапах доработки документа по ТМ.'; ecWarning))
endif
2. Запрет создания новой версии документа.
Запретим создавать новые версии документам по произвольным условиям без привязки к типовым маршрутам.
а) Набор реквизитов карточки электронного документа:
Добавить новый реквизит типа Признак со значениями "Да/Нет", допустим, "ДаНет5".
б) Событие "Добавление После" карточки электронного документа:
Object.ДаНет5 = 'Да' // Разрешим создавать новые версии документа
в) Событие "Добавление После" Таблицы 2 карточки электронного документа:
if Object.ДаНет5 == 'Нет'
Raise(CreateException(''; 'Создание новых версий запрещено.'; ecWarning))
endif
г) В необходимых вычислениях, например, при расчете какого-либо реквизита, присваеваем реквизиту "ДаНет5" значение "Нет", это не позволит пользователям создавать новые версии документов.