Диплом. автоматизация приема и обработки заявок отделом техподдержки ооо "компьютерные бизнес системы"
Скачать 3.38 Mb.
|
Форма документа «Задача» &НаСервере Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) // ЗАКЛАДКА ПОДЗАДАЧИ Если Параметры.Свойство("ЭтоНовый") Тогда // если из вызывающей формы был пердан признак что это новый документ Если Параметры.ЭтоНовый Тогда // значит нажали кнопку Новая подзадача в тч Подзадачи родителя Основание = Параметры.Родитель; Если Не Основание.Пустая() Тогда ОбщийСрв.ПриВводеНовойЗадачи(Объект, Основание, Ложь); // перезаполнить реквизиты и тч новой на основании родителя // но не добавлять в тч Подзадачи // далее см. в ПослеЗаписи этой задачи - добавить эту новую в тч Подзадачи родителя // далее см. в ОбработкаОповещения родителя - спозиционироваться на вновь добавленной задче в дереве КонецЕсли; КонецЕсли; КонецЕсли; ФильтрПроведенные = 2; // первоначальное значение фильтра "Все" ЗаполнитьДеревоПодзадач(); // первоначально создать дерево подзадач КонецПроцедуры 122 &НаКлиенте Процедура ПриОткрытии(Отказ) // если нет прав - то форма только просмотр Если Не ОбщийСрв.ПроверкаПрав(Объект.Автор, ОбщийСрв.ПолучитьГлПользователь()) Тогда ЭтаФорма.ТолькоПросмотр = Истина; КонецЕсли; // если проведена и запрет проведенных Если Объект.Проведен И ОбщийСрв.обПолучитьКонстанту("ЗапретПроведенных") Тогда ЭтаФорма.ТолькоПросмотр = Истина; КонецЕсли; // ЗАКЛАДКА ИСПОЛНИТЕЛИ // если пользователь является исполнителем этого документа и он открыл документ - то считается что он с ним ознакомлен - // надо проставить отметку об ознакомлении ИсполнительОзнакомлен = Ложь; Для Каждого СтрокаИсполнитель Из Объект.Исполнители Цикл Если (СтрокаИсполнитель.Исполнитель = ОбщийСрв.ПолучитьГлПользователь()) И (СтрокаИсполнитель.Ознакомлен = глПустаяДата) Тогда СтрокаИсполнитель.Ознакомлен = ТекущаяДата(); // простановка даты ознакомления - и есть признак ознакомления ИсполнительОзнакомлен = Истина; ОбщийСрв.ЗаписьВедетИсполнитель(Истина); // признак того что дальнейшая запись будет вестись исполнителем Прервать; КонецЕсли; КонецЦикла; Если ИсполнительОзнакомлен = Истина Тогда // если была простановка даты ознакомления П = Новый Структура; П.Вставить("РежимЗаписи", РежимЗаписиДокумента.Запись); Записать(П); КонецЕсли; // ЗАКЛАДКА ПОДЗАДАЧИ ВывестиПанельПодзадач(); // первоначальное заполнение дерева подзадач // РодительскаяЗадача = ОбщийСрв.НайтиРодительскуюЗадачу(Объект.Ссылка); КонецПроцедуры // реакция на команду формы Записать и закрыть &НаКлиенте 123 Процедура ФормаЗаписатьИЗакрыть(Команда) Записать(); Закрыть(); КонецПроцедуры // реакция на команду формы Распровести &НаКлиенте Процедура ФормаРаспровести(Команда) П = Новый Структура; П.Вставить("РежимЗаписи", РежимЗаписиДокумента.ОтменаПроведения); Записать(П); КонецПроцедуры // реакция на окончание выбора в других формах &НаКлиенте Процедура ОбработкаВыбора(ВыбранноеЗначение, ИсточникВыбора) // результат пришел из формы Исполнение исполнителем Если ИсточникВыбора.ИмяФормы = "Документ.Задача.Форма.ФормаИсполнения" Тогда ЭтотОбъект.Элементы.Исполнители.ТекущиеДанные.РезультатИсполнения = ВыбранноеЗначение.Получить(0).Значение; ЭтотОбъект.Элементы.Исполнители.ТекущиеДанные.ДатаИсполнения = ВыбранноеЗначение.Получить(1).Значение; ЭтотОбъект.Элементы.Исполнители.ТекущиеДанные.Комментарий = ВыбранноеЗначение.Получить(2).Значение; ОбщийСрв.ЗаписьВедетИсполнитель(Истина); // флаг того, что записывать можно, даже если нет прав П = Новый Структура; П.Вставить("РежимЗаписи", РежимЗаписиДокумента.Запись); ЭтотОбъект.Записать(П); КонецЕсли; // результат пришел из формы выбора справочника Этапы Если ИсточникВыбора.ИмяФормы = "Справочник.Этапы.ФормаВыбора" Тогда ЗаполнитьДеревоПоШаблону(ВыбранноеЗначение); КонецЕсли; КонецПроцедуры // проверить возможность записи документа из формы &НаКлиенте Процедура ПередЗаписью(Отказ, ПараметрыЗаписи) 124 Если ПараметрыЗаписи.РежимЗаписи = РежимЗаписиДокумента.Проведение Тогда Отказ = Не ПроверкаВозможностиПроведения(); КонецЕсли; Если ПараметрыЗаписи.РежимЗаписи = РежимЗаписиДокумента.ОтменаПроведения Тогда Отказ = Не ПроверкаВозможностиРасПроведения(); КонецЕсли КонецПроцедуры &НаКлиенте Функция ПроверкаВозможностиРасПроведения(ЭтаЗадача = Неопределено) Если ЭтаЗадача = Неопределено Тогда ЭтаЗадача = Объект.Ссылка; КонецЕсли; // задать пользователю вопрос //МассивОтменяемых = ОбщийСрв.СформироватьСписокОтменяемых(ЭтаЗадача); //Если МассивОтменяемых.Количество() Тогда // Если Вопрос("Отмена выполнения задачи " + ОбщийСрв.ПредставлениеЗадачи(ЭтаЗадача) // + " приведет к отмене выполнения задач-родителей. Все равно отменить?", РежимДиалогаВопрос.ДаНет) = КодВозвратаДиалога.Нет Тогда // Возврат Ложь; // КонецЕсли; //КонецЕсли; Возврат Истина; КонецФункции Функция ПроверкаВозможностиПроведения(ЭтаЗадача = Неопределено) Если ЭтаЗадача = Неопределено Тогда ЭтаЗадача = Объект.Ссылка; КонецЕсли; // задать пользователю вопрос Возврат Истина; КонецФункции 125 // ЗАКЛАДКА СВОЙСТВА &НаКлиенте Процедура СвойстваВидСвойстваОбработкаВыбора(Элемент, ВыбранноеЗначение, СтандартнаяОбработка) // проверка соответсвия типа выбранного свойства Если Не СвойстваВидСвойстваОбработкаВыбораНаСервере(ВыбранноеЗначение) Тогда Сообщить("Тип свойства выбранного вида свойств не относится к задачам"); СтандартнаяОбработка = Ложь; Возврат; КонецЕсли; КонецПроцедуры &НаСервереБезКонтекста Функция СвойстваВидСвойстваОбработкаВыбораНаСервере(ВыбВидСвойства) Если ВыбВидСвойства.ПолучитьОбъект().ТипСвойства.ТипОбъекта <> Перечисления.ТипыОбъектов.Задача Тогда Возврат Ложь; КонецЕсли; Возврат Истина; КонецФункции //--------------------------------------------------------------------------- // ЗАКЛАДКА ПЕРЕПИСКА // выход из поля ввода текста сообщения - это команда на добавление сообщения &НаКлиенте Процедура НовоеСообщениеОкончаниеВводаТекста(Элемент, Текст, ДанныеВыбора, ПараметрыПолученияДанных, СтандартнаяОбработка) Если ПустаяСтрока(Текст) Тогда Возврат; КонецЕсли; ДобавитьНовоеСообщение(Текст); КонецПроцедуры // программное добавление сообщения &НаКлиенте Процедура ДобавитьНовоеСообщение(ТекстСообщения) Если Объект.Ссылка.Пустая() Тогда Сообщить("Нужно сначала записать новую задачу"); 126 Возврат; КонецЕсли; НоваяСтрока = Объект.Переписка.Добавить(); НоваяСтрока.Пользователь = ОбщийСрв.ПолучитьГлПользователь(); НоваяСтрока.ДатаСообщения = ТекущаяДата(); НоваяСтрока.Сообщение = ТекстСообщения; ОбщийСрв.ЗаписьВедетИсполнитель(Истина); // флаг того, что записывать можно, даже если нет прав Записать(); КонецПроцедуры //--------------------------------------------------------------------------- // ЗАКЛАДКА ИСПОЛНИТЕЛИ // по команде Исполнить &НаКлиенте Процедура ИсполнителиИсполнить(Команда) Если ОбщийСрв.ПроверкаПрав(ЭтотОбъект.Элементы.Исполнители.ТекущиеДанные.Ис полнитель, ОбщийСрв.ПолучитьГлПользователь()) Тогда П = Новый Структура; П.Вставить("Исполнитель", ЭтотОбъект.Элементы.Исполнители.ТекущиеДанные.Исполнитель); П.Вставить("РезультатИсполнения", ЭтотОбъект.Элементы.Исполнители.ТекущиеДанные.РезультатИсполнения); П.Вставить("ДатаИсполнения", ЭтотОбъект.Элементы.Исполнители.ТекущиеДанные.ДатаИсполнения); П.Вставить("Комментарий", ЭтотОбъект.Элементы.Исполнители.ТекущиеДанные.Комментарий); ФормаИсполнение = ПолучитьФорму("Документ.Задача.Форма.ФормаИсполнения", П, ЭтотОбъект); ФормаИсполнение.ОткрытьМодально(); // дальше см. в ОбработкаВыбора формы Иначе Сообщить("У вас нет прав для проставления отметки об исполнении"); КонецЕсли; КонецПроцедуры // перед записью в ТЧ Исполнители - не должно быть пустых и проверка процентов &НаКлиенте 127 Процедура ИсполнителиПередОкончаниемРедактирования(Элемент, НоваяСтрока, ОтменаРедактирования, Отказ) Если Элемент.ТекущиеДанные.Исполнитель.Пустая() И Не (НоваяСтрока и ОтменаРедактирования) Тогда Сообщить("Исполнитель должен быть обязательно выбран"); Отказ = Истина; КонецЕсли; Процентов = 0; Для Каждого СтрокаИсполнитель Из Объект.Исполнители Цикл Процентов = Процентов + СтрокаИсполнитель.Процент; КонецЦикла; Если Процентов > 100 Тогда Сообщить("Суммарный процент исполнения не может превышать 100%"); Отказ = Истина; КонецЕсли; КонецПроцедуры // выбор нового исполнителя - проверка что такого еще не было &НаКлиенте Процедура ИсполнителиИсполнительОбработкаВыбора(Элемент, ВыбранноеЗначение, СтандартнаяОбработка) Если УжеЕстьВТаблице(ВыбранноеЗначение) Тогда СтандартнаяОбработка = Ложь; Сообщить("Этот исполнитель уже выбран"); КонецЕсли; КонецПроцедуры &НаСервере Функция УжеЕстьВТаблице(Выбор) МассивНайденныхСтрок = Объект.Исполнители.НайтиСтроки(Новый Структура("Исполнитель",Выбор)); Возврат МассивНайденныхСтрок.Количество(); КонецФункции //ввод новой строки в ТЧ Исполнители - запрет копирования (не может быть двух одинаковых строк) &НаКлиенте Процедура ИсполнителиПередНачаломДобавления(Элемент, Отказ, Копирование, Родитель, Группа, Параметр) Если Копирование = Истина Тогда // запрет копирования Отказ = Истина; 128 КонецЕсли; КонецПроцедуры //ввод новой строки в ТЧ Исполнители - автоматически рассчитать процент &НаКлиенте Процедура ИсполнителиПриНачалеРедактирования(Элемент, НоваяСтрока, Копирование) Если НоваяСтрока = Истина Тогда Процентов = 0; Для Каждого СтрокаИсполнитель Из Объект.Исполнители Цикл Процентов = Процентов + СтрокаИсполнитель.Процент; КонецЦикла; Если Процентов > 100 Тогда Процентов = 100; КонецЕсли; СтрокаИсполнитель = Элемент.ТекущиеДанные; СтрокаИсполнитель.Процент = 100-Процентов; СтрокаИсполнитель.Задание = Объект.Наименование; КонецЕсли; КонецПроцедуры //------------------------------------------------------------------------------- // ЗАКЛАДКА ПОДЗАДАЧИ &НаКлиенте Процедура ВывестиПанельПодзадач() // первоначальное заполнение дерева подзадач ЭтотОбъект.Элементы.ДеревоПодзадач.НачальноеОтображениеДерева = НачальноеОтображениеДерева.РаскрыватьВерхнийУровень; КонецПроцедуры // заполнить дерево подзадач &НаСервере Процедура ЗаполнитьДеревоПодзадач() ЭтаФорма.Прочитать(); // перечитать данные формы ДеревоОбъект = РеквизитФормыВЗначение("ДеревоПодзадач"); ДеревоОбъект.Строки.Очистить(); // удалить все подзадачи // сформировать корень - текущая задача Голова = ДеревоОбъект.Строки.Добавить(); Голова.ПодЗадача = Объект.Ссылка; Голова.Выполнена = Объект.Проведен; Голова.Наименование = "ЭТА ЗАДАЧА"; Голова.Пометка = УстановитьПометку(Объект); // отметка исполнения 129 // по всем подзадачам табличной части Для Каждого СтрокаПодЗадача Из Объект.Подзадачи Цикл ЗаполнитьПодЗадачу(СтрокаПодЗадача, Голова); // вызвать для корня и далее для каждой строки дерева КонецЦикла; ЗначениеВРеквизитФормы(ДеревоОбъект, "ДеревоПодзадач"); КонецПроцедуры // рекурсивное заполнение одной подзадачи &НаСервере Процедура ЗаполнитьПодЗадачу(СтрокаПодЗадача, Узел) // фильтр по проведенным и не проведенным Если (ФильтрПроведенные = 0) Или (ФильтрПроведенные = 1) Тогда Если Не Число(СтрокаПодЗадача.ПодЗадача.Проведен) = ФильтрПроведенные Тогда Возврат; КонецЕсли; КонецЕсли; // // фильтр по теущему значению //Если ФильтрЗначение <> Неопределено Тогда // Если ФильтрКолонка = "Наименование" Тогда // Если Найти(СтрокаПодЗадача.ПодЗадача.Наименование, ФильтрЗначение) = 0 Тогда // Возврат; // КонецЕсли; // ИначеЕсли ФильтрКолонка = "Комментарий" Тогда // Если Найти(СтрокаПодЗадача.Комментарий, ФильтрЗначение) = 0 Тогда // Возврат; // КонецЕсли; // ИначеЕсли ФильтрКолонка = "Описание" Тогда // Если Найти(СтрокаПодЗадача.ПодЗадача.КраткоеОписание, ФильтрЗначение) = 0 Тогда // Возврат; // КонецЕсли; // ИначеЕсли ФильтрКолонка = "Статус" Тогда // Если СтрокаПодЗадача.ПодЗадача.Статус <> ФильтрЗначение Тогда // Возврат; // КонецЕсли; // ИначеЕсли ФильтрКолонка = "ДатаПостановки" Тогда // Если НачалоДня(СтрокаПодЗадача.ПодЗадача.Дата) <> НачалоДня(ФильтрЗначение) Тогда 130 // Возврат; // КонецЕсли; // ИначеЕсли ФильтрКолонка = "ДатаОжидаемая" Тогда // Если НачалоДня(СтрокаПодЗадача.ПодЗадача.ДатаОкончания) <> НачалоДня(ФильтрЗначение) Тогда // Возврат; // КонецЕсли; // КонецЕсли; //КонецЕсли; // создать новый узел дерева НовыйУзел = Узел.Строки.Добавить(); НовыйУзел.ПодЗадача = СтрокаПодЗадача.ПодЗадача; НовыйУзел.Выполнена = СтрокаПодЗадача.ПодЗадача.Проведен; НовыйУзел.НомерВТабЧасти = СтрокаПодЗадача.НомерСтроки; НовыйУзел.Наименование = Строка(СтрокаПодЗадача.ПодЗадача.Номер) + " " + СтрокаПодЗадача.ПодЗадача.Наименование; НовыйУзел.Статус = СтрокаПодЗадача.ПодЗадача.Статус; НовыйУзел.Дата = СтрокаПодЗадача.ПодЗадача.Дата; НовыйУзел.ДатаОжидаемая = СтрокаПодЗадача.ПодЗадача.ОжидаемаяДатаВыполнения; НовыйУзел.Комментарий = СтрокаПодЗадача.Комментарий; НовыйУзел.Пометка = УстановитьПометку(СтрокаПодЗадача.ПодЗадача); //НовыйУзел.Картинка = БиблиотекаКартинок.ДебетКредит; // теперь рекурсивно для каждого поддрева Для Каждого СтрокаПодЗадача Из СтрокаПодЗадача.ПодЗадача.Подзадачи Цикл ЗаполнитьПодЗадачу(СтрокаПодЗадача, НовыйУзел); КонецЦикла; КонецПроцедуры // ЗаполнитьПодЗадачу // признак выполнения задачи Функция УстановитьПометку(Задача) Возврат Число(Задача.Проведен); //Если Задача.Проведен Тогда // Возврат 1; //КонецЕсли; // 131 //Для Каждого СтрокаПодЗадача Из Задача.Подзадачи Цикл // Если НЕ Задача.Проведен Тогда // Возврат 2; // КонецЕсли; //КонецЦикла; // //Возврат 0; КонецФункции //пройти по массиву Путь (хранит ссылки на подзадачи) начиная с головы и вернуть ИД последнего узла &НаКлиенте Функция СпозиционироватьсяВДеревеПодзадач(Вдереве, Путь, Й) Если Путь.Количество() = 0 Тогда Возврат 0; КонецЕсли; Ключ = Путь[Й]; Для Каждого ТекущаяСтрока Из Вдереве.ПолучитьЭлементы() Цикл Если ТекущаяСтрока.Подзадача = Ключ Тогда Если Й = 0 Тогда Возврат ТекущаяСтрока.ПолучитьИдентификатор(); Иначе Возврат СпозиционироватьсяВДеревеПодзадач(ТекущаяСтрока, Путь, Й-1); КонецЕсли; КонецЕсли; КонецЦикла; КонецФункции // перехват выбора (двойной щелчок) - открыть текущую подзадачу &НаКлиенте Процедура ДеревоПодзадачВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка) Если Не ((Поле.Имя = "ДеревоПодзадачКомментарий") Или (Поле.Имя = "ДеревоПодзадачПодзадача")) Тогда // эти поля - для собственного редактирования ОткрытьПодзадачу(); КонецЕсли; КонецПроцедуры // перехват стандартной команды Добавить - добавить в дерево существующую задачу // открыть форму выбора и после выбора добавить выбранную задачу в дерево &НаКлиенте 132 Процедура ДеревоПодзадачПередНачаломДобавления(Элемент, Отказ, Копирование, Родитель, Группа, Параметр) Отказ = Истина; Если Не Копирование Тогда // копирование невозможно ДобавитьСуществующуюПодзадачу(); КонецЕсли; КонецПроцедуры // перехват стандартной команды Изменить - открыть подзадачу &НаКлиенте Процедура ДеревоПодзадачПередНачаломИзменения(Элемент, Отказ) Если Не ((Элемент.ТекущийЭлемент.Имя = "ДеревоПодзадачКомментарий") Или (Элемент.ТекущийЭлемент.Имя = "ДеревоПодзадачПодзадача")) Тогда // эти поля - для собственного редактирования Отказ = Истина; ОткрытьПодзадачу(); КонецЕсли; КонецПроцедуры // перехват стандартной команды Удалить &НаКлиенте Процедура ДеревоПодзадачПередУдалением(Элемент, Отказ) УзелРодитель = Элементы.ДеревоПодзадач.ТекущиеДанные.ПолучитьРодителя(); // получить узел- родитель Если УзелРодитель = Неопределено Тогда // если нет родителя - то значит пытаются удалить корень Отказ = Истина; Возврат; КонецЕсли; ПутьВДереве = ПолучитьПутьВДереве(УзелРодитель); //запомнить путь до текущего узла УдалитьПодзадачуНаСервере(УзелРодитель.Подзадача, Элементы.ДеревоПодзадач.ТекущиеДанные.ПодЗадача); // удалить из таб части ЗаполнитьДеревоПодзадач(); // перестроить дерево подзадач Элементы.ДеревоПодзадач.ТекущаяСтрока = СпозиционироватьсяВДеревеПодзадач(ДеревоПодзадач, ПутьВДереве, ПутьВДереве.Количество()-1); // спозиционироваться на добавленной задаче Оповестить("Дерево", Новый Структура,ЭтотОбъект); // всем формам послать оповещение о проведенном изменениии - пусть они перстаивают свое дерево Отказ = Истина; // уже все сделано 133 КонецПроцедуры // перехват стандартного Изменения (изменение последовательность строк или комментарий) &НаКлиенте Процедура ДеревоПодзадачПриИзменении(Элемент) СохранитьДеревоНаСервере(); П = Новый Структура; Оповестить("Дерево",П, ЭтотОбъект); // оповестить об изменении, сделанном в этом форме, все остальные формы - пусть они перстаривают свое дерево КонецПроцедуры // по команде НоваяПодзадача |