Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Павел Чистов. Конспект к курсу Комплексная подг...docx
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
28.21 Mб
Скачать

Занятие 1.17

Создадим Перечисление «Роли исполнителей»:

Свойство

Значение

Имя

РолиИсполнителей

Синоним

Роли исполнителей

Закладка «Данные»

Значения

Менеджер

Имя

Менеджер

Синоним

Менеджер

Руководитель

Имя

Руководитель

Синоним

Руководитель

Бухгалтер

Имя

Бухгалтер

Синоним

Бухгалтер

Создадим Регистр сведений «Адресация»:

Свойство

Значение

Имя

Адресация

Синоним

Адресация

Закладка «Подсистемы»

Предприятие

Закладка «Данные»

Измерения

Исполнитель

Имя

Исполнитель

Синоним

Исполнитель

Тип

СправочникСсылка.Сотрудники

Ведущее

Истина

Основной отбор

Истина

Свойство

Значение

Закладка «Данные»

Измерения

Исполнитель

Запрет незаполненных значений

Истина

Контрагент

Имя

Контрагент

Синоним

Контрагент

Тип

СправочникСсылка.Контрагенты

Ведущее

Истина

Основной отбор

Истина

Роль

Имя

Роль

Синоним

Роль

Тип

ПеречислениеСсылка.РолиИсполнителей

Ведущее

Истина

Основной отбор

Истина

У измерения «Контрагент» свойство «Запрет незаполненных значений - Ложь», т.к. надо, чтобы можно было назначить задачу всем руководителям и не важно, по каким контрагентам. В созданном Регистре сведений будут храниться правила адресации.

Объект «Задачи» - содержит список задач.

Создадим Задачу «Задачи исполнителей»:

Свойство

Значение

Имя

ЗадачиИсполнителей

Синоним

Задачи исполнителей

Закладка «Подсистемы»

Предприятие

Закладка «Адресация»

Адресация

Адресация

Основной реквизит адресации

Исполнитель

Текущий исполнитель

ТекущийПользователь

Реквизиты адресации

Исполнитель

Имя

Исполнитель

Синоним

Исполнитель

Тип

СправочникСсылка.Сотрудники

Измерение адресации

Исполнитель

Контрагент

Имя

Контрагент

Синоним

Контрагент

Тип

СправочникСсылка.Контрагенты

Измерение адресации

Контрагент

Роль

Имя

Роль

Синоним

Роль

Тип

ПеречислениеСсылка.РолиИсполнителей

Измерение адресации

Роль

Таблица задач (состав):

Плюс дополнительные реквизиты, создаваемые самостоятельно.

Пример:

Если есть Задача и Исполнитель, то системе все равно, что записано в «Роль» и «Контрагент»:

Если в Задаче указана только «Роль»:

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

На закладке «Адресация» надо указать связь создаваемой таблицы задач с другими объектами, в частности с Регистром сведений «Адресация».

Адресация – указывается место, где хранятся правила адресации задач.

Реквизиты адресации – как правило, аналогичны Измерениям Регистра сведений.

В Правилах адресации (регистр сведений «Адресация») обязательно должен быть указан «Исполнитель» (Запрет незаполненных значений - Истина), а в Задаче исполнителя можно не указывать (если он не указан, то система будет искать его в правилах адресации).

Мы указали, что правила адресации хранятся в регистре сведений «Адресация» - теперь мы можем каждый Реквизит адресации связать с соответствующим полем в Регистре сведений (свойство «Измерение адресации»). Т.е. мы указываем, где в Регистре сведений система должна наложить отбор, чтобы найти конкретного исполнителя.

Основной реквизит адресации – один из Реквизитов адресации, который в итоге должен быть найден, в нем должен храниться текущий исполнитель. Отсюда система берет Исполнителя Задачи. Если реквизит не заполнен, то система ищет конкретного исполнителя в Регистре сведений «Адресация».

Текущий исполнитель – хранит информацию о сотрудниках, авторизовавшихся (зашедших) в БД. Поле ссылается на «Параметр сеанса».

Параметр сеанса – это что-то типа глобальной публичной переменной, которая доступна в любом режиме исполнения. Это переменная, которой при старте системы присваивается значение.

«Конфигурация – Общие – Параметры системы»

Создадим Параметр сеанса «Текущий пользователь»:

Свойство

Значение

Имя

ТекущийПользователь

Синоним

Текущий пользователь

Тип

СправочникСсылка.Сотрудники

Укажем созданный Параметр сеанса в свойстве «Текущий исполнитель» Задачи «Задачи исполнителей»

Теперь надо определить, в какой момент Параметр сеанса «Текущий пользователь» примет значение (кто работает с БД).

По идее данное значение определяется при запуске системы. В примере с запуском системы мы работали в «Модуле управляемого приложения». Но «Модуль управляемого приложения» активен только когда пользователь входит в систему интерактивно в режиме управляемого приложения. Если пользователь входит в режиме обычного приложения (для совместимости с 8.1) или запускает базу программно (например, как COM-сервер), то «Модуль управляемого приложения» не запускается.

В этом случае используется «Модуль сеанса» - неважно как запускается БД, данный модуль будет отработан в любом случае. В данном модуле обрабатывается только одна процедура:

«УстановкаПараметровСеанса(ТребуемыеПараметры)»

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

При первом запуске в Требуемые параметры передается «Неопределено», что означает, что процедура запускается впервые при запуске программы.

ИмяПользователя() – функция, возвращающая имя пользователя (как оно задано в «Администрирование - Пользователи»), авторизовавшегося в БД.

В зависимости от этого имени попробуем найти пользователя в БД, если такового нет, то создадим его.

Процедура УстановкаПараметровСеанса(ТребуемыеПараметры)

Имя = ?(ПустаяСтрока(ИмяПользователя()), "НеАвторизован", ИмяПользователя());

НайденныйЭлемент = Справочники.Сотрудники.НайтиПоНаименованию(Имя, Истина);

Если НайденныйЭлемент.Пустая() Тогда

НовыйЭлемент = Справочники.Сотрудники.СоздатьЭлемент();

НовыйЭлемент.Наименование = Имя;

НовыйЭлемент.Записать();

НайденныйЭлемент = НовыйЭлемент.Ссылка;

КонецЕсли;

ПараметрыСеанса.ТекущийПользователь = НайденныйЭлемент;

КонецПроцедуры

«НайтиПоНаименованию(Имя, Истина)» - «Истина» означает, что ищем точное соответствие. Если «Ложь» или совсем не ставить этот параметр, то, например, если ищем по «Ива», то найдется и «Иванов» и «Иванюхин».

Теперь мы знаем, кто зашел в БД (в Параметре сеанса хранится ссылка на элемент справочника). В Задаче в Реквизитах адресации задано, где искать текущего исполнителя. Если в Реквизитах адресации он не найден, то указано где искать правила, по которым его можно найти (свойство «Адресация»), и с каким значением его надо сравнивать, когда найдем (свойство «Текущий исполнитель»).

Сделаем форму списка задач, чтобы показывать пользователю список его невыполненных задач. Реквизиты формы:

И в свойствах списка:

Свойство

Значение

ОсновнаяТаблица

Задача.ЗадачиИсполнителей.ЗадачиПоИсполнителю

Это виртуальная таблица, автоматом накладывающая отбор по правилам адресации (показывает задачи только конкретного пользователя).

В режиме исполнения:

Сделаем, чтобы при запуске режима исполнения из конфигуратора, появлялось окно выбора пользователя:

«Сервис – Параметры – Запуск 1С:Предприятия – Пользователь - Имя»

И создадим нового пользователя с правами администратора

Войдем в программу под Ивановым и создадим Задачу:

И запишем ее:

Пользователю будут показываться как не выполненные, так и выполненные Задачи.

Создадим еще одну Задачу:

После записи, в списке задач Иванова она отображаться не будет, т.к. не указано, что она связана с Ивановым. Но если указать связь в Адресации:

То в списке задач Иванова она станет доступной:

Бизнес-процессы

При создании бизнес-процесса задача создается автоматом.

Создадим бизнес-процесс «Продажа с контролем оплаты»

Свойство

Значение

Имя

ПродажаСКонтролемОплаты

Тип

Продажа с контролем оплаты

Задачи

ЗадачиИсполнителей

Закладка «Подсистемы»

Предприятие

Свойство

Значение

Закладка «Данные»

Док продажи

Имя

ДокПродажи

Синоним

Док продажи

Тип

ДокументСсылка.Расходная

Закладка «Прочее»

Задачи – задается объект Задачи, в котором будут создаваться записи Задач бизнес-процесса.

Карта маршрута – описание логического поведения системы. Нарисуем карту маршрута:

Бизнес-процесс начинается с точки Старта. Имеет один обработчик события – «ПередСтартом». Влиять на Старт не рекомендуется, т.к. эта точка не интерактивная, т.е. пользователь не должен иметь возможность взаимодействовать с ней. Ее можно отметить программно – есть флаг «Отказ»:

Процедура СтартПередСтартом(ТочкаМаршрутаБизнесПроцесса, Отказ)

// Вставить содержимое обработчика.

КонецПроцедуры

Точка Действия – по ним система формирует задачи.

Создадим точку Действия «Выписать накладную»:

Исполнитель задачи указывается на закладке «Адресация» - либо конкретный Исполнитель, либо Контрагент, либо Роль, либо сочетание. Значения признаков адресации можно задавать программно, например, в событии «ПриСозданииЗадач»

Свойство

Значение

Имя

ВыписатьНакладную

Заголовок

Выписать накладную

Роль

Менеджер

После выписки Накладной, будем ждать оплату. Создадим точку Условия «Есть оплата?»

Свойство

Значение

Имя

ЕстьОплата

Заголовок

Есть оплата?

Здесь есть событие «ПроверкаУсловия», которое в результат должно вернуть «Истина» или «Ложь».

Процедура ЕстьОплатаПроверкаУсловия(ТочкаМаршрутаБизнесПроцесса, Результат)

// Вставить содержимое обработчика.

КонецПроцедуры

Если оплаты нет, то пометим Накладную на удаление. Создадим точку Обработки «Пометить на удаление накладную». Точка Обработки не интерактивная, т.е. это как функция/процедура:

Свойство

Значение

Имя

ПометитьНаУдалениеНакладную

Заголовок

Пометить на удаление накладную

Событие точки:

Процедура ПометитьНаУдалениеНакладнуюОбработка(ТочкаМаршрутаБизнесПроцесса)

// Вставить содержимое обработчика.

КонецПроцедуры

Если оплата есть, то проведем Накладную. Создадим точку Действия «Провести накладную»:

Свойство

Значение

Имя

ПровестиНакладную

Заголовок

Провести накладную

Роль

Руководитель

По Накладной выпишем Счет-фактуру. Создадим точку Действия «Выписать счет фактуру»:

Свойство

Значение

Имя

ВыписатьСчетФактуру

Заголовок

Выписать счет фактуру

Роль

Бухгалтер

Теперь опишем поведение программы по точкам:

В точке «Выписать накладную» выполним проверку того, что документ-ссылка (из реквизита Задачи) указан (записан):

Процедура ВыписатьНакладнуюОбработкаПроверкиВыполнения(ТочкаМаршрутаБизнесПроцесса, Задача, Результат)

Если ДокПродажи.Пустая() Тогда

Результат = Ложь;

Иначе

Результат = Истина;

КонецЕсли;

КонецПроцедуры

В точке «Есть оплата?» опишем событие:

Запрос:

Установим параметр виртуальной таблицы:

Итого код:

Процедура ЕстьОплатаПроверкаУсловия(ТочкаМаршрутаБизнесПроцесса, Результат)

Запрос = Новый Запрос;

Запрос.Текст =

"ВЫБРАТЬ

| ВзаиморасчетыОстатки.СуммаОстаток

|ИЗ

| РегистрНакопления.Взаиморасчеты.Остатки(, Контрагент = &Контрагент) КАК ВзаиморасчетыОстатки

|ГДЕ

| ВзаиморасчетыОстатки.СуммаОстаток < 0";

Запрос.УстановитьПараметр("Контрагент", ДокПродажи.Контрагент);

РезультатЗапроса = Запрос.Выполнить();

Если РезультатЗапроса.Пустой() Тогда

Результат = Ложь;

Иначе

Результат = Истина;

КонецЕсли;

КонецПроцедуры

В регистре накопления «Взаиморасчеты» учитываем долг контрагента, т.е. если долг есть, то сумма будет «+» и запрос ничего не вернет (действие не выполняем).

В точке «Пометить на удаление накладную» опишем событие:

Сделаем форму, где пользователь будет видеть выполнение шагов Карты маршрута бизнес-процесса:

Создадим обработку «Карта маршрута»:

Свойство

Описание

Имя

КартаМаршрута

Синоним

Карта маршрута

Закладка «Подсистемы»

Предприятие

Закладка «Данные»

БП

Имя

БП

Синоним

БП

Тип

БизнесПроцессСсылка.ПродажаСКонтролемОплаты

Форма:

Добавим реквизит «Карта»:

Свойство

Описание

Имя

Карта

Синоним

Карта

Тип

ГрафическаяСхема

И команду формы «Обновить»:

Свойство

Описание

Имя

Обновить

Заголовок

Обновить

Опишем свойство «Действие» команды формы «Обновить»:

&НаКлиенте

Процедура Обновить(Команда)

ОбновитьКарту();

КонецПроцедуры

&НаСервере

Процедура ОбновитьКарту()

Карта = Объект.БП.ПолучитьОбъект().ПолучитьКартуМаршрута();

КонецПроцедуры

В режиме исполнения:

Создадим бизнес-процесс «Продажа с контролем оплаты» и запишем его:

Т.е. создадим просто ссылку на бизнес-процесс, т.е. бизнес-процесс не стартован, ни одна из точек действия не активна. Откроем обработку «Карта маршрута» и выберем в ней наш бизнес-процесс:

Теперь стартанем бизнес-процесс:

И проверим обновление в карте:

Точка «Выписать накладную» стала активной.

На время поменяем свойство «ОсновнаяТаблица» формы списка Задач, чтобы показывались все задачи, а не только активного пользователя:

Свойство

Значение

ОсновнаяТаблица

Задача.ЗадачиИсполнителей

В режиме исполнения:

Смотрим задачу:

Мы не можем выполнить задачу, т.к. в бизнес-процессе не указан документ продажи. Укажем его:

И выполним задачу и проверим карту маршрута:

Точка «Выписать накладную» выполнилась. Оплата не была выполнена, поэтому пошли по ветке «Нет» и процесс завершился. При этом Расходная накладная должна была быть помечена на удаление. Проверим:

Сделаем пример, где оплата уже будет:

Создаем новый бизнес-процесс, запишем его. Создадим для него новый документ «Продажа товаров»:

Запишем документ, выберем его в бизнес-процессе и стартуем бизнес-процесс:

Проверим карту маршрута:

Надо выписать накладную. Открываем соответствующую задачу, выполняем ее и опять смотрим карту:

Теперь последовательно выполняем задачи «Провести накладную» и «Выписать счет-фактуру». Посмотрим карту маршрута:

Необходимые точки пройдены, бизнес-процесс завершен.