Диплом: Автоматизация учета расхода материалов на производство в компании ООО "Звезда"

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

Смотрите также:

"Автоматизация обработки заявок ООО "Проектно-Строительная Компания"
"Автоматизация процесса аттестации персонала для ООО "Нэт Бай Нэт Холдинг"
"Анализ интернет-активности конкурентов ( на примере конкурентов "Газпром нефть")
"Бухгалтерский учёт и аудит расчётов с подотчётними лицами в организации на примере ООО "ЛОЦ 10""
«Психологическое сопровождение персонала в организации на примере ООО «Крокус»
Agile-методология в управлении проектами на примере ООО «Ресурсный центр «Академия КлассИнфо»
Aвтoмaтизaция пpoцecca вeдeния инфopмaциoннoй бaзы o дoлжнocтяx и вaкaнcияx c укaзaниeм тpeбoвaний к уpoвню знaний и нaвыкoв кaндидaтoв для гpуппы кaдpoв вoйcкoвoй чacти 3474»
Cовершенствование деловой оценки персонала в организации (на примере ООО "Даймонд кейтеринг развитие")
Cовершенствование управления рентабельности предприятия (на примере гуипп «бендерская типография «полиграфист»)
Event - менеджмент: реализация проекта (на примере ООО "АГРОПАК")