При выполнении практических задач или прохождении технических тестов по разработке на платформе «1С:Предприятие 8.3» начинающие программисты часто сталкиваются с размытыми формулировками в технических заданиях (ТЗ). Типичный пример — требование спроектировать «документ установки причин риска, периодический регистр» и связать это с бизнес-процессом, отобразив карту маршрута. На первый взгляд это может показаться запутанным, однако за этими словами скрывается классическая архитектурная связка объектов метаданных.
В этой статье мы подробно разберем, как правильно интерпретировать подобные требования ТЗ, спроектируем структуру метаданных с нуля, настроим периодический регистр сведений, подчиненный регистратору, создадим работающий бизнес-процесс и научимся выводить интерактивную карту маршрута прямо на форму элемента справочника.
Для начала проанализируем терминологию и выясним причину возникновения сложностей. Требование «Документ установка причин риска, периодический регистр» означает, что в системе должна храниться история изменения причин возникновения рисков. Нам необходимо создать:
Фраза «Риск (отобразить процесс)» означает, что в интерфейсе системы (например, в форме риска) пользователь должен наглядно видеть, на каком этапе выполнения (в рамках запущенного бизнес-процесса) сейчас находится работа по минимизации или устранению данного риска. Нам предстоит создать механизм бизнес-процессов и вывести специальное поле графической схемы на форму.
Рассмотрим по шагам весь процесс реализации этой задачи в конфигураторе.
Прежде чем переходить к регистрам и документам, подготовим базовую нормативно-справочную информацию. Нам понадобятся два простых справочника:
1. Создадим справочник ПричиныРисков. В нем пользователи будут задавать возможные варианты причин, например: «Сбой в оборудовании», «Человеческий фактор», «Форс-мажорные обстоятельства». Никаких дополнительных реквизитов здесь не требуется, достаточно стандартного наименования.
2. Создадим справочник Риски. В нем будут регистрироваться сами инциденты или потенциальные угрозы. Для удобства работы и будущей интеграции с бизнес-процессами добавим в справочник Риски дополнительный реквизит:
АктуальныйПроцессБизнесПроцессСсылка.УстранениеРиска (данный тип мы укажем сразу после создания самого бизнес-процесса на соответствующем шаге).Теперь создадим объект, который будет отвечать за хранение истории. Создаем новый Регистр сведений под именем ПричиныРисковИстория. Перейдем на вкладку «Основные» и настроим ключевые свойства:
В пределах секунды. Это позволит нам фиксировать изменения оперативно и точечно.Подчинен регистратору. Это заблокирует ручной ввод записей в регистр и потребует наличия документа-регистратора.Переходим на вкладку «Данные» и создаем структуру регистра:
Риск. Тип данных — СправочникСсылка.Риски. Установим свойство «Ведущее», чтобы при удалении риска из системы связанные записи в регистре удалялись автоматически.Причина. Тип данных — СправочникСсылка.ПричиныРисков.Чтобы наполнять наш регистр данными, создадим документ УстановкаПричинРиска. Этот документ будет фиксировать, по какой причине произошел тот или иной риск на определенный момент времени.
На вкладке «Данные» добавим табличную часть под названием СписокРисков. Внутри табличной части создадим два реквизита:
Риск (тип: СправочникСсылка.Риски)Причина (тип: СправочникСсылка.ПричиныРисков)Перейдем на вкладку «Движения» нашего документа. В списке регистров найдем созданный ранее регистр сведений ПричиныРисковИстория и установим напротив него флажок. Теперь этот документ официально является регистратором для нашего регистра.
Нажмем кнопку «Конструктор движений» для автоматического создания кода проведения документа. В открывшемся окне конструктора выберем табличную часть СписокРисков, заполним выражение для периода (это будет дата документа Период = Дата) и сопоставим реквизиты табличной части с измерениями и ресурсами регистра. Нажмем «ОК». Система автоматически сгенерирует в модуле документа следующий обработчик:
Процедура ОбработкаПроведения(Отказ, РежимПроведения)
// {УДАЛЕНИЕ_ШАБЛОНА_ДВИЖЕНИЙ}
// Запись движений по регистру ПричиныРисковИстория
Движения.ПричиныРисковИстория.Записывать = Истина;
Для Каждого ТекСтрокаСписокРисков Из СписокРисков Цикл
Движение = Движения.ПричиныРисковИстория.Добавить();
Движение.Период = Дата;
Движение.Риск = ТекСтрокаСписокРисков.Риск;
Движение.Причина = ТекСтрокаСписокРисков.Причина;
КонецЦикла;
КонецПроцедуры
Любой бизнес-процесс в платформе «1С:Предприятие» неразрывно связан с механизмом задач. Задача — это конкретная точка действия, которая назначается исполнителю. Поэтому сначала мы создадим объект адресации и задачу.
1. Создадим справочник РолиИсполнителей. Он понадобится нам для групповой адресации задач (например, чтобы задачу мог выполнить любой сотрудник с ролью «Аналитик» или «Инженер»).
2. Создадим объект Задача под названием ЗадачиИсполнителей. На вкладке «Адресация» настроим параметры распределения задач. Добавим реквизиты адресации:
Исполнитель (тип: СправочникСсылка.Пользователи)Роль (тип: СправочникСсылка.РолиИсполнителей)3. Теперь создадим сам Бизнес-процесс с именем УстранениеРиска. На вкладке «Основные» свяжем его с созданной задачей, указав в поле «Задача» объект ЗадачиИсполнителей.
4. На вкладке «Данные» добавим реквизит бизнес-процесса:
Риск (тип: СправочникСсылка.Риски) — благодаря этому реквизиту каждый экземпляр процесса будет точно знать, по какому именно риску ведется работа.5. Настроим Карту маршрута бизнес-процесса. Перейдем на соответствующую вкладку в редакторе бизнес-процесса. Построим стандартную последовательность шагов:
Разберем самый сложный и интересный момент ТЗ: как отобразить запущенный процесс на форме риска. Поместить интерактивную карту маршрута непосредственно в табличную часть физически невозможно, так как это графический объект. Правильным решением будет разместить графическую схему на форме элемента справочника Риски.
Выясним причину, как платформа понимает, какие шаги процесса уже пройдены, а какой активен прямо сейчас. Платформа 1С делает это автоматически, если мы передадим в специальный элемент формы — Поле графической схемы — карту маршрута конкретного экземпляра бизнес-процесса.
Откроем форму элемента справочника Риски и выполним следующие настройки:
КартаМаршрута и типом данных ГрафическаяСхема.Напишем программный код в модуле формы справочника Риски, который будет отрабатывать при открытии элемента пользователем. Нам нужно найти активный бизнес-процесс, запущенный по этому риску, и загрузить его карту маршрута:
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
// Получаем ссылку на текущий элемент справочника "Риски"
ТекущийРиск = Объект.Ссылка;
// Ищем активный бизнес-процесс, связанный с этим риском
АктивныйПроцесс = ПолучитьАктивныйПроцесс(ТекущийРиск);
Если ЗначениеЗаполнено(АктивныйПроцесс) Тогда
// Получаем объект бизнес-процесса на сервере
ПроцессОбъект = АктивныйПроцесс.ПолучитьОбъект();
// Извлекаем карту маршрута с подсветкой текущих шагов
КартаМаршрута = ПроцессОбъект.ПолучитьКартуМаршрута();
Иначе
// Если процесс еще не запускался, создаем пустую схему
КартаМаршрута = Новый ГрафическаяСхема;
КонецЕсли;
КонецПроцедуры
&НаСервереБезКонтекста
Функция ПолучитьАктивныйПроцесс(ТекущийРиск)
// Используем запрос для быстрого поиска незавершенного процесса
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ ПЕРВЫЕ 1
| УстранениеРиска.Ссылка КАК Ссылка
|ИЗ
| БизнесProcess.УстранениеРиска КАК УстранениеРиска
|ГДЕ
| УстранениеРиска.Риск = &Риск
| И УстранениеРиска.Завершен = ЛОЖЬ";
Запрос.УстановитьПараметр("Риск", ТекущийРиск);
Выборка = Запрос.Выполнить().Выбрать();
Если Выборка.Следующий() Тогда
Возврат Выборка.Ссылка;
КонецЕсли;
Возврат Неопределено;
КонецФункции
Этот код при открытии карточки риска найдет выполняемый в данный момент бизнес-процесс, считает его текущее состояние и выведет карту маршрута в поле формы. Платформа 1С автоматически подсветит активную точку действия (например, красной или пунктирной рамкой в зависимости от настроек интерфейса), наглядно демонстрируя текущий прогресс.
Рассмотрим еще одну частую подзадачу: как быстро узнать, какая именно причина риска актуальна на текущую дату. Поскольку наш регистр сведений является периодическим, мы можем эффективно задействовать виртуальную таблицу СрезПоследних.
Проанализируем пример функции, которую можно разместить в общем модуле или модуле менеджера регистра сведений для программного получения оперативных данных:
Функция ПолучитьАктуальнуюПричинуНаДату(ВыбранныйРиск, ДатаАнализа) Экспорт
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ПричиныРисковИсторияСрезПоследних.Причина КАК Причина
|ИЗ
| РегистрСведений.ПричиныРисковИстория.СрезПоследних(&Период, Риск = &Риск) КАК ПричиныРисковИсторияСрезПоследних";
Запрос.УстановитьПараметр("Период", ДатаАнализа);
Запрос.УстановитьПараметр("Риск", ВыбранныйРиск);
Выборка = Запрос.Выполнить().Выбрать();
Если Выборка.Следующий() Тогда
Возврат Выборка.Причина;
КонецЕсли;
Возврат Справочники.ПричиныРисков.ПустаяСсылка();
КонецФункции
Благодаря этому методу мы всегда сможем получить точную причину риска на любой исторический момент времени, передав в параметр ДатаАнализа нужную дату, либо текущую дату для получения оперативных данных.
Мы полностью разобрали логику построения взаимосвязанных объектов. Спроектированная архитектура отвечает всем стандартам разработки на платформе «1С:Предприятие 8.3»: