Диплом: Автоматизация аналитического учета в ООО «Верный»

Внимание! Если размещение файла нарушает Ваши авторские права, то обязательно сообщите нам
96
едение, РежимПроведенияДокумен-
та.Неоперативный); // провести ее
саму
Со-
общить("Выполнена подзадача " +
Об-
щийСрв.ПредставлениеЗадачи(ТекС
трокаПодзадача.Подзадача));
КонецЕсли;
КонецЦикла;
КонецПроцедуры
// проверить, есть ли среди ТЧ Ис-
полнители записи без отметки ис-
полнения
Функция ПроверитьИсполнение()
Исполненно = Истина;
Для Каждого ТекСтро-
каИсполнитель Из Исполнители
Цикл
Если ТекСтро-
каИсполнитель.ДатаИсполнения =
Дата(01,01,0001,00,00,00) Тогда
Со-
общить("Задача не может быть вы-
полнена, так как исполнитель \" +
ТекСтрокаИсполни-
тель.Исполнитель +
"\ не проставил
отметку исполнения");
Ис-
полненно = Ложь;
КонецЕсли;
Если Не
ТекСтрокаИсполни-
тель.РезультатИсполнения.Пустая()
Тогда
Если
Не ТекСтрокаИсполни-
тель.РезультатИсполнения.Успех
Тогда
Сообщить("Задача не
может быть выполнена, так как
исполнитель \" + ТекСтрокаИспол-
нитель.Исполнитель +
"\
проставил отрицательную отметку
исполнения");
Исполненно = Ложь;
Ко-
нецЕсли;
КонецЕсли;
КонецЦикла;
Возврат Исполненно;
КонецФункции
// действия при проведении доку-
мента
Функция ПриПроведении(Отказ)
// проверка того, что все
исполнители проставили отметку об
исполнении
Если Констан-
ты.ПроверятьИсполнениеПриВыпол
нении.Получить() Тогда // общая
константа
Если Об-
щийСрв.ПолучитьКонстанту(Текущ
аяДата(), Об-
щийСрв.ПолучитьГлПользователь(),
"ПроверятьИсполнениеПриВыпол-
нении") Тогда // настройка пользова-
теля
Если
Не ПроверитьИсполнение() Тогда
Отказ = Истина;
Возврат Ложь;
Ко-
нецЕсли;
КонецЕсли;
КонецЕсли;
// проверка того, что все
подзадачи проведены
ЕстьНеВыполненыеПод-
задачи = Ложь;
Для Каждого ТекСтрока-
Подзадача Из Подзадачи Цикл
Если ТекСтро-
каПодзадача.Подзадача.Проведен <>
Истина Тогда
Сооб-
об-
щить(ОбщийСрв.ПредставлениеЗада
чи(ЭтотОбъект) + " имеет невыпол-
ненные подзадачи");
ЕстьНеВыполненыеПод-
задачи = Истина;
КонецЕсли;
КонецЦикла;
Если ЕстьНеВыполне-
ныеПодзадачи = Истина Тогда
Если (Констан-
ты.ПринудительноВыполнятьПодзад
ачи.Получить()) И // общая констан-
та
(Об-
щийСрв.ПолучитьКонстанту(Текущ
аяДата(), Об-
щийСрв.ПолучитьГлПользователь(),
"ПринудительноВыполнятьПодзада-
чи")) Тогда // настройка пользовате-
ля
Сообщить("Подзадачи
будут выполнены принудитель-
но...");
ВыполнитьВсеПодзада-
чиПринудительно(ЭтотОбъект); //
автоматически провести все подза-
дачи данной задачи
Иначе // нельзя
автоматически выполнять подзадачи
Сооб-
об-
щить(ОбщийСрв.ПредставлениеЗада
чи(ЭтотОбъект) + " не может быть
выполнена");
Отказ
= Истина;
Воз-
врат Ложь;
КонецЕсли;
КонецЕсли;
Возврат Истина
КонецФункции
// обработка проведения
Процедура ОбработкаПроведе-
ния(Отказ, РежимПроведения)
Если Не ПриПроведе-
нии(Отказ) Тогда // проверить про-
ведение подзадач
Возврат;
КонецЕсли;
// регистр Использован-
ниеНоменклатуры
Движе-
ния.ИспользованиеНоменклатуры.За
писывать = Истина;
Для Каждого ТекСтрока-
Номенклатура Из Номенклатура
Цикл
Если ТекСтро-
каНоменклатура.Наличие Тогда //
если в ТЧ стоит признак наличия
Про-
должить;
КонецЕсли;
Если НЕ
ТекСтрокаНоменклату-
ра.Номенклатура.ВидНоменклатуры.
Списывается Тогда // если номен-
клатуру не надо списывать
Про-
должить;
КонецЕсли;
Движение =
Движе-
ния.ИспользованиеНоменклатуры.Д
обавить();
Движе-
ние.Период = Дата;
Движе-
ние.Номенклатура = ТекСтрока-
Номенклатура.Номенклатура;
Движе-
ние.Задача
= ЭтотОбъект.Ссылка;
Движе-
ние.Количество = ТекСтрока-
Номенклатура.Количество;
Движе-
ние.Сумма
= ТекСтрокаНоменклату-
ра.Сумма;
КонецЦикла;
КонецПроцедуры
// обработка распроведения
Процедура ОбработкаУдаленияПро-
ведения(Отказ)
Если Не ОтменитьПрове-
дениеРодите-
лей(ЭтотОбъект.Ссылка) Тогда //
отменитиь проведение задач-
родителей
Отказ = Истина;
Возврат;
97
КонецЕсли;
КонецПроцедуры
// отменить проведение всех родите-
лей ДокСсылкаРебенок
Функция ОтменитьПроведениеРоди-
телей(ДокСсылкаРебенок)
МассивОтменяемых =
Об-
щийСрв.СформироватьСписокОтме
няемых(ДокСсылкаРебенок); //
сформировать массив распроводи-
мых документов
Если МассивОтменяе-
мых.Количество() Тогда // если есть
хоть один - сообщить
Сообщить
("Отмена выполнения " + Об-
щийСрв.ПредставлениеЗадачи(Этот
Объект)
+
" приводит к отмене выполнения
задач-родителей...");
КонецЕсли;
Для Каждого СтрокаОт-
меняемый Из МассивОтменяемых
Цикл // для каждого документа из
распроводимых
Если Об-
щийСрв.ВЗакрытомПериоде(Строка
Отменяемый.Значение) Тогда // если
находится в закрытом периоде
Со-
общить("Отмена выполенния " +
Об-
щийСрв.ПредставлениеЗадачи(ДокС
сылкаРебенок)
+ " приводит к отмене выполенния "
+ Об-
щийСрв.ПредставлениеЗадачи(Стро
каОтменяемый.Значение)
+ ", находя-
щейся в закрытом периоде. Отмена
не может быть выполнена");
Воз-
врат Ложь;
КонецЕсли;
Если Не Об-
щийСрв.ПроверкаПрав(СтрокаОтме
няемый.Значение.Автор, Парамет-
рыСеанса.глПользователь) Тогда //
проверка прав
Со-
общить("Отмена выполенния " +
Об-
щийСрв.ПредставлениеЗадачи(ДокС
сылкаРебенок)
+ " приводит к отмене выполенния "
+ Об-
щийСрв.ПредставлениеЗадачи(Стро
каОтменяемый.Значение)
+ ", на редакти-
рование которого у Вас нет прав.
Отмена не может быть выполнена");
Воз-
врат Ложь;
КонецЕсли;
КонецЦикла;
// распровести каждый
Для Каждого СтрокаОт-
меняемый Из МассивОтменяемых
Цикл
Если Стро-
каОтменяе-
мый.Значение.ПолучитьОбъект().Пр
оведен Тогда
Стро-
каОтменяе-
мый.Значение.ПолучитьОбъект().За
пи-
сать(РежимЗаписиДокумента.Отмен
аПроведения);
Со-
общить("Отменено выполнение
родительской " + Об-
щийСрв.ПредставлениеЗадачи(Стро
каОтменяемый.Значение));
КонецЕсли;
КонецЦикла;
Возврат Истина;
КонецФункции
// перед любой записью (включая
проведение и распроведение) - про-
верка
Процедура ПередЗаписью(Отказ,
РежимЗаписи, РежимПроведения)
Головная = ЭтоГолов-
ная(); // установить признак - голов-
ная или нет
Если Об-
щийСрв.ВЗакрытомПериоде(ЭтотОб
ъект) Тогда // провера на закрытый
период
Сооб-
щить(ОбщийСрв.ПредставлениеЗада
чи(ЭтотОбъект) + "Находится в
закрытом периоде. Редактирование
невозможно");
Отказ = Истина;
Возврат;
КонецЕсли;
// проверка того что про-
веден (тогда редактирование запре-
щено)
Если Не (РежимЗаписи =
РежимЗаписиДокумента.Проведение
Или
РежимЗапи-
си = РежимЗаписиДокумен-
та.ОтменаПроведения) Тогда
Если
(ЭтотОбъект.Проведен И Констан-
ты.ЗапретПроведенных.Получить())
И Не ПараметрыСеан-
са.глЗаписьВедетИсполнитель
И Не ПараметрыСеан-
са.ИдетОбменДанными Тогда
Сооб-
об-
щить(ОбщийСрв.ПредставлениеЗада
чи(ЭтотОбъект) + "Уже выполнена.
Редактирование невозможно");
Отказ
= Истина;
Воз-
врат;
КонецЕсли;
КонецЕсли;
// проверка прав
Если Не Об-
щийСрв.ПроверкаПрав(Автор, Па-
раметрыСеанса.глПользователь)
Тогда
Сооб-
щить(ОбщийСрв.ПредставлениеЗада
чи(ЭтотОбъект) + "Нет прав редак-
тировать чужой документ");
Отказ = Истина;
Возврат;
КонецЕсли;
Если РежимЗаписи = Ре-
жимЗаписиДокумента.Проведение
Тогда
РеальнаяДа-
таВыполнения = ТекущаяДата(); //
дата реального выполнения - дата
проведения
Если Констан-
ты.УстанавливатьЗавершенаУспешн
о.Получить() = Истина Тогда
Ста-
тус = Справочни-
ки.Статусы.ЗавершенаУспешно; //
статус - успешно
КонецЕсли;
КонецЕсли;
Если РежимЗаписи = Ре-
жимЗаписиДокумен-
та.ОтменаПроведения Тогда
РеальнаяДа-
таВыполнения = 0; // если распро-
вели - значит нет реальной даты
завершения
Статус = Спра-
вочники.Статусы.ПустаяСсылка(); //
и нет статуса
КонецЕсли;
КонецПроцедуры
// проверка на то, что
данная задача не входит ни в одну
другую в качетсве подзадачи
Функция ЭтоГоловная()
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ЗадачаПодзада-
чи.Подзадача
|ИЗ
| Доку-
мент.Задача.Подзадачи КАК Зада-
чаПодзадачи
| ГДЕ ЗадачаПод-
задачи.Подзадача =
&ИскомаяЗадача
|";
За-
прос.УстановитьПараметр("Искомая
Задача", ЭтотОбъект.Ссылка);
98
Результат = За-
прос.Выполнить();
Возврат (Резуль-
тат.Выбрать().Количество() = 0);
КонецФункции
Форма документа «Задача»
&НаСервере
Процедура ПриСозданииНаСерве-
ре(Отказ, СтандартнаяОбработка)
// ЗАКЛАДКА ПОДЗА-
ДАЧИ
Если Парамет-
ры.Свойство("ЭтоНовый") Тогда //
если из вызывающей формы был
пердан признак что это новый доку-
мент
Если Парамет-
ры.ЭтоНовый Тогда // значит нажа-
ли кнопку Новая подзадача в тч
Подзадачи родителя
Ос-
нование = Параметры.Родитель;
Если
Не Основание.Пустая() Тогда
Об-
щийСрв.ПриВводеНовойЗадачи(Объ
ект, Основание, Ложь); // перезапол-
нить реквизиты и тч новой на осно-
вании родителя
// но не добав-
лять в тч Подзадачи
// далее см. в ПослеЗаписи
этой задачи - добавить эту
новую в тч Подзадачи родителя
// далее см. в ОбработкаО-
повещения родителя - спозициони-
роваться на вновь добавленной задче
в дереве
Ко-
нецЕсли;
КонецЕсли;
КонецЕсли;
ФильтрПроведенные = 2;
// первоначальное значение фильтра
"Все"
ЗаполнитьДеревоПодза-
дач(); // первоначально создать дере-
во подзадач
КонецПроцедуры
&НаКлиенте
Процедура ПриОткрытии(Отказ)
// если нет прав - то форма
только просмотр
Если Не Об-
щийСрв.ПроверкаПрав(Объект.Авто
р, Об-
щийСрв.ПолучитьГлПользователь())
Тогда
ЭтаФор-
ма.ТолькоПросмотр = Истина;
КонецЕсли;
// если проведена и запрет
проведенных
Если Объект.Проведен И
Об-
щийСрв.обПолучитьКонстанту("Зап
ретПроведенных") Тогда
ЭтаФор-
ма.ТолькоПросмотр = Истина;
КонецЕсли;
// ЗАКЛАДКА ИСПОЛ-
НИТЕЛИ
// если пользователь явля-
ется исполнителем этого документа
и он открыл документ - то считается
что он с ним ознакомлен -
// надо проставить отметку
об ознакомлении
ИсполнительОзнакомлен
= Ложь;
Для Каждого СтрокаИс-
полнитель Из Объект.Исполнители
Цикл
Если (Стро-
каИсполнитель.Исполнитель = Об-
щийСрв.ПолучитьГлПользователь())
И (СтрокаИсполнитель.Ознакомлен
= глПустаяДата) Тогда
Стро-
каИсполнитель.Ознакомлен = Теку-
щаяДата(); // простановка даты озна-
комления - и есть признак ознаком-
ления
Ис-
полнительОзнакомлен = Истина;
Об-
щийСрв.ЗаписьВедетИсполнитель(И
стина); // признак того что дальней-
шая запись будет вестись исполни-
телем
Пре-
рвать;
КонецЕсли;
КонецЦикла;
Если ИсполнительОзна-
комлен = Истина Тогда // если была
простановка даты ознакомления
П = Новый
Структура;
П.Вставить("РежимЗаписи
", РежимЗаписиДокумента.Запись);
Записать(П);
КонецЕсли;
// ЗАКЛАДКА ПОДЗА-
ДАЧИ
ВывестиПанельПодза-
дач(); // первоначальное заполнение
дерева подзадач
// РодительскаяЗадача =
Об-
щийСрв.НайтиРодительскуюЗадачу(
Объект.Ссылка);
КонецПроцедуры
// реакция на команду формы Запи-
сать и закрыть
&НаКлиенте
Процедура ФормаЗаписатьИЗа-
крыть(Команда)
Записать();
Закрыть();
КонецПроцедуры
// реакция на команду формы Рас-
провести
&НаКлиенте
Процедура ФормаРаспрове-
сти(Команда)
П = Новый Структура;
П.Вставить("РежимЗаписи
", РежимЗаписиДокумен-
та.ОтменаПроведения);
Записать(П);
КонецПроцедуры
// реакция на окончание выбора в
других формах
&НаКлиенте
Процедура ОбработкаВыбо-
ра(ВыбранноеЗначение, Источ-
никВыбора)
// результат пришел из
формы Исполнение исполнителем
Если ИсточникВыбо-
ра.ИмяФормы = "Доку-
мент.Задача.Форма.ФормаИсполнен
ия" Тогда
ЭтотОбъ-
ект.Элементы.Исполнители.Текущие
Данные.РезультатИсполнения =
ВыбранноеЗначе-
ние.Получить(0).Значение;
ЭтотОбъ-
ект.Элементы.Исполнители.Текущие
Данные.ДатаИсполнения =
ВыбранноеЗначе-
ние.Получить(1).Значение;
ЭтотОбъ-
ект.Элементы.Исполнители.Текущие
Данные.Комментарий
= ВыбранноеЗначе-
ние.Получить(2).Значение;
Об-
щийСрв.ЗаписьВедетИсполнитель(И
стина); // флаг того, что записывать
можно, даже если нет прав
П = Новый
Структура;
П.Вставить("РежимЗаписи
", РежимЗаписиДокумента.Запись);
ЭтотОбъ-
ект.Записать(П);
КонецЕсли;
// результат
пришел из формы выбора справоч-
ника Этапы
Если ИсточникВыбо-
ра.ИмяФормы = "Справоч-
ник.Этапы.ФормаВыбора" Тогда
ЗаполнитьДере-
воПоШаблону(ВыбранноеЗначение);
КонецЕсли;
КонецПроцедуры
// проверить возможность записи
документа из формы
&НаКлиенте
99
Процедура ПередЗаписью(Отказ,
ПараметрыЗаписи)
Если ПараметрыЗапи-
си.РежимЗаписи = РежимЗаписиДо-
кумента.Проведение Тогда
Отказ = Не
ПроверкаВозможностиПроведе-
ния();
КонецЕсли;
Если ПараметрыЗапи-
си.РежимЗаписи = РежимЗаписиДо-
кумента.ОтменаПроведения Тогда
Отказ = Не
ПроверкаВозможностиРасПроведе-
ния();
КонецЕсли
КонецПроцедуры
&НаКлиенте
Функция ПроверкаВозможности-
РасПроведения(ЭтаЗадача = Не-
определено)
Если ЭтаЗадача = Неопре-
делено Тогда
ЭтаЗадача =
Объект.Ссылка;
КонецЕсли;
// задать пользователю
вопрос
//МассивОтменяемых =
Об-
щийСрв.СформироватьСписокОтме
няемых(ЭтаЗадача);
//Если МассивОтменяе-
мых.Количество() Тогда
// Если Во-
прос("Отмена выполнения задачи " +
Об-
щийСрв.ПредставлениеЗадачи(ЭтаЗа
дача)
// +
" приведет к отмене выполнения
задач-родителей. Все равно отме-
нить?", РежимДиалогаВо-
прос.ДаНет) = КодВозвратаДиало-
га.Нет Тогда
// Воз-
врат Ложь;
// КонецЕсли;
//КонецЕсли;
Возврат Истина;
КонецФункции
Функция ПроверкаВозможности-
Проведения(ЭтаЗадача = Неопреде-
лено)
Если ЭтаЗадача = Неопре-
делено Тогда
ЭтаЗадача =
Объект.Ссылка;
КонецЕсли;
// задать пользователю
вопрос
Возврат Истина;
КонецФункции
// ЗАКЛАДКА СВОЙСТВА
&НаКлиенте
Процедура СвойстваВидСвой-
стваОбработкаВыбора(Элемент,
ВыбранноеЗначение, Стандарт-
наяОбработка)
// проверка соответсвия
типа выбранного свойства
Если Не СвойстваВид-
СвойстваОбработкаВыбораНаСер-
вере(ВыбранноеЗначение) Тогда
Сообщить("Тип
свойства выбранного вида свойств
не относится к задачам");
Стандарт-
наяОбработка = Ложь;
Возврат;
КонецЕсли;
КонецПроцедуры
&НаСервереБезКонтекста
Функция СвойстваВидСвой-
стваОбработкаВыбораНаСерве-
ре(ВыбВидСвойства)
Если ВыбВидСвой-
ства.ПолучитьОбъект().ТипСвойства
.ТипОбъекта <> Перечисле-
ния.ТипыОбъектов.Задача Тогда
Возврат Ложь;
КонецЕсли;
Возврат Истина;
КонецФункции
//----------------------------------------------
-----------------------------
// ЗАКЛАДКА ПЕРЕПИСКА
// выход из поля ввода текста сооб-
щения - это команда на добавление
сообщения
&НаКлиенте
Процедура НовоеСообщениеОкон-
чаниеВводаТекста(Элемент, Текст,
ДанныеВыбора, ПараметрыПолуче-
нияДанных, СтандартнаяОбработка)
Если ПустаяСтрока(Текст)
Тогда
Возврат;
КонецЕсли;
ДобавитьНовоеСообще-
ние(Текст);
КонецПроцедуры
// программное добавление сообще-
ния
&НаКлиенте
Процедура ДобавитьНовоеСообще-
ние(ТекстСообщения)
Если Объ-
ект.Ссылка.Пустая() Тогда
Сооб-
щить("Нужно сначала записать но-
вую задачу");
Возврат;
КонецЕсли;
НоваяСтрока
= Объ-
ект.Переписка.Добавить();
НоваяСтро-
ка.Пользователь = Об-
щийСрв.ПолучитьГлПользователь();
НоваяСтро-
ка.ДатаСообщения = ТекущаяДа-
та();
НоваяСтрока.Сообщение
= ТекстСооб-
щения;
Об-
щийСрв.ЗаписьВедетИсполнитель(И
стина); // флаг того, что записывать
можно, даже если нет прав
Записать();
КонецПроцедуры
//----------------------------------------------
-----------------------------
// ЗАКЛАДКА ИСПОЛНИТЕЛИ
// по команде Исполнить
&НаКлиенте
Процедура ИсполнителиИспол-
нить(Команда)
Если Об-
щийСрв.ПроверкаПрав(ЭтотОбъект.
Элемен-
ты.Исполнители.ТекущиеДанные.Ис
полнитель, Об-
щийСрв.ПолучитьГлПользователь())
Тогда
П = Новый
Структура;
П.Вставить("Исполнитель
", ЭтотОбъ-
ект.Элементы.Исполнители.Текущие
Данные.Исполнитель);
П.Вставить("РезультатИсп
олнения", ЭтотОбъ-
ект.Элементы.Исполнители.Текущие
Данные.РезультатИсполнения);
П.Вставить("ДатаИсполне
ния", ЭтотОбъ-
ект.Элементы.Исполнители.Текущие
Данные.ДатаИсполнения);
П.Вставить("Комментарий
", Это-
тОбъ-
ект.Элементы.Исполнители.Текущие
Данные.Комментарий);
ФормаИсполне-
ние = ПолучитьФор-
му("Документ.Задача.Форма.Форма
Исполнения", П, ЭтотОбъект);
ФормаИсполне-
ние.ОткрытьМодально();
// дальше см. в
ОбработкаВыбора формы
Иначе
Сообщить("У
вас нет прав для проставления от-
метки об исполнении");
КонецЕсли;
100
КонецПроцедуры
// перед записью в ТЧ Исполнители -
не должно быть пустых и проверка
процентов
&НаКлиенте
Процедура ИсполнителиПередО-
кончаниемРедактирования(Элемент,
НоваяСтрока, ОтменаРедактирова-
ния, Отказ)
Если Эле-
мент.ТекущиеДанные.Исполнитель.
Пустая() И Не (НоваяСтрока и От-
менаРедактирования) Тогда
Сооб-
щить("Исполнитель должен быть
обязательно выбран");
Отказ = Истина;
КонецЕсли;
Процентов = 0;
Для Каждого СтрокаИс-
полнитель Из Объект.Исполнители
Цикл
Процентов =
Процентов + СтрокаИсполни-
тель.Процент;
КонецЦикла;
Если Процентов > 100
Тогда
Сооб-
щить("Суммарный процент испол-
нения не может превышать 100%");
Отказ = Истина;
КонецЕсли;
КонецПроцедуры
// выбор нового исполнителя - про-
верка что такого еще не было
&НаКлиенте
Процедура ИсполнителиИсполни-
тельОбработкаВыбора(Элемент,
ВыбранноеЗначение, Стандарт-
наяОбработка)
Если УжеЕстьВТабли-
це(ВыбранноеЗначение) Тогда
СтандартнаяОбработка = Ложь;
Сообщить("Этот исполнитель
уже выбран");
КонецЕсли;
КонецПроцедуры
&НаСервере
Функция УжеЕстьВТаблице(Выбор)
МассивНайденныхСтрок = Объ-
ект.Исполнители.НайтиСтроки(Нов
ый Структу-
ра("Исполнитель",Выбор));
Возврат МассивНайден-
ныхСтрок.Количество();
КонецФункции
//ввод новой строки в ТЧ Исполни-
тели - запрет копирования (не может
быть двух одинаковых строк)
&НаКлиенте
Процедура ИсполнителиПередНача-
ломДобавления(Элемент, Отказ,
Копирование, Родитель, Группа,
Параметр)
Если Копирование = Ис-
тина Тогда // запрет копи-
рования
Отказ = Истина;
КонецЕсли;
КонецПроцедуры
//ввод новой строки в ТЧ Исполни-
тели - автоматически рассчитать
процент
&НаКлиенте
Процедура ИсполнителиПриНача-
леРедактирования(Элемент, Нова-
яСтрока, Копирование)
Если НоваяСтрока = Ис-
тина Тогда
Процентов = 0;
Для Каждого
СтрокаИсполнитель Из Объ-
ект.Исполнители Цикл
Про-
центов = Процентов + СтрокаИс-
полнитель.Процент;
КонецЦикла;
Если Процентов
> 100 Тогда
Про-
центов = 100;
КонецЕсли;
СтрокаИспол-
нитель = Элемент.ТекущиеДанные;
СтрокаИспол-
нитель.Процент = 100-Процентов;
СтрокаИспол-
нитель.Задание = Объ-
ект.Наименование;
КонецЕсли;
КонецПроцедуры
//----------------------------------------------
---------------------------------
// ЗАКЛАДКА ПОДЗАДАЧИ
&НаКлиенте
Процедура ВывестиПанельПодза-
дач() // первоначальное заполнение
дерева подзадач
ЭтотОбъ-
ект.Элементы.ДеревоПодзадач.Нача
льноеОтображениеДерева = Началь-
ноеОтображениеДере-
ва.РаскрыватьВерхнийУровень;
КонецПроцедуры
// заполнить дерево подзадач
&НаСервере
Процедура ЗаполнитьДеревоПодза-
дач()
ЭтаФорма.Прочитать();
// перечитать данные фор-
мы
ДеревоОбъект = Рекви-
зитФормыВЗначе-
ние("ДеревоПодзадач");
ДеревоОбъ-
ект.Строки.Очистить(); //
удалить все подзадачи
// сформировать
корень - текущая задача
Голова = ДеревоОбъ-
ект.Строки.Добавить();
Голова.ПодЗадача
= Объ-
ект.Ссылка;
Голова.Выполнена
= Объ-
ект.Проведен;
Голова.Наименование
=
"ЭТА ЗАДАЧА";
Голова.Пометка
=
УстановитьПометку(Объект); //
отметка исполнения
// по всем под-
задачам табличной части
Для Каждого СтрокаПод-
Задача Из Объект.Подзадачи Цикл
ЗаполнитьПод-
Задачу(СтрокаПодЗадача, Голова); //
вызвать для корня и далее для каж-
дой строки дерева
КонецЦикла;
ЗначениеВРеквизитФор-
мы(ДеревоОбъект, "ДеревоПодза-
дач");
КонецПроцедуры
// рекурсивное заполнение одной
подзадачи
&НаСервере
Процедура ЗаполнитьПодЗада-
чу(СтрокаПодЗадача, Узел)
// фильтр по
проведенным и не проведенным
Если (ФильтрПроведен-
ные = 0) Или (ФильтрПроведенные
= 1) Тогда
Если Не Чис-
ло(СтрокаПодЗадача.ПодЗадача.Про
веден) = ФильтрПроведенные Тогда
Воз-
врат;
КонецЕсли;
КонецЕсли;
// // фильтр по теущему
значению
//Если ФильтрЗначение <>
Неопределено Тогда
// Если Фильтр-
Колонка = "Наименование" Тогда
// Если
Найти(СтрокаПодЗадача.ПодЗадача.
Наименование, ФильтрЗначение) = 0
Тогда
//
Возврат;
// Ко-
нецЕсли;
// ИначеЕсли
ФильтрКолонка = "Комментарий"
Тогда
// Если
Найти(СтрокаПодЗадача.Комментар
ий, ФильтрЗначение) = 0 Тогда
//
Возврат;
// Ко-
нецЕсли;
// ИначеЕсли
ФильтрКолонка = "Описание" Тогда
101
// Если
Найти(СтрокаПодЗадача.ПодЗадача.
КраткоеОписание, ФильтрЗначение)
= 0 Тогда
//
Возврат;
// Ко-
нецЕсли;
// ИначеЕсли
ФильтрКолонка = "Статус" Тогда
// Если
СтрокаПодЗадача.ПодЗадача.Статус
<> ФильтрЗначение Тогда
//
Возврат;
// Ко-
нецЕсли;
// ИначеЕсли
ФильтрКолонка = "ДатаПостановки"
Тогда
// Если
НачалоД-
ня(СтрокаПодЗадача.ПодЗадача.Дат
а) <> НачалоДня(ФильтрЗначение)
Тогда
//
Возврат;
// Ко-
нецЕсли;
// ИначеЕсли
ФильтрКолонка = "ДатаОжидаемая"
Тогда
// Если
НачалоД-
ня(СтрокаПодЗадача.ПодЗадача.Дат
аОкончания) <> НачалоД-
ня(ФильтрЗначение) Тогда
//
Возврат;
// Ко-
нецЕсли;
// КонецЕсли;
//КонецЕсли;
//
создать новый узел дерева
НовыйУзел =
Узел.Строки.Добавить();
НовыйУзел.ПодЗадача
= СтрокаПодЗада-
ча.ПодЗадача;
НовыйУзел.Выполнена
=
СтрокаПодЗада-
ча.ПодЗадача.Проведен;
Но-
выйУзел.НомерВТабЧасти
= СтрокаПодЗада-
ча.НомерСтроки;
НовыйУзел.Наименование
=
Стро-
ка(СтрокаПодЗадача.ПодЗадача.Ном
ер) + " " + СтрокаПодЗада-
ча.ПодЗадача.Наименование;
НовыйУзел.Статус
=
СтрокаПодЗадача.ПодЗадача.Статус;
НовыйУзел.Дата
= СтрокаПодЗада-
ча.ПодЗадача.Дата;
Но-
выйУзел.ДатаОжидаемая
= СтрокаПодЗада-
ча.ПодЗадача.ОжидаемаяДатаВыпол
нения;
НовыйУзел.Комментарий
=
СтрокаПодЗадача.Комментарий;
НовыйУзел.Пометка
= УстановитьПомет-
ку(СтрокаПодЗадача.ПодЗадача);
//НовыйУзел.Картинка =
БиблиотекаКартинок.ДебетКредит;
// теперь рекурсивно для
каждого поддрева
Для Каждого СтрокаПод-
Задача Из СтрокаПодЗада-
ча.ПодЗадача.Подзадачи Цикл
ЗаполнитьПод-
Задачу(СтрокаПодЗадача, Но-
выйУзел);
КонецЦикла;
КонецПроцедуры // ЗаполнитьПод-
Задачу
// признак выполнения задачи
Функция УстановитьПомет-
ку(Задача)
Возврат Чис-
ло(Задача.Проведен);
//Если Задача.Проведен
Тогда
// Возврат 1;
//КонецЕсли;
//
//Для Каждого Строка-
ПодЗадача Из Задача.Подзадачи
Цикл
// Если НЕ Зада-
ча.Проведен Тогда
// Воз-
врат 2;
// КонецЕсли;
//КонецЦикла;
//
//Возврат 0;
КонецФункции
//пройти по массиву Путь (хранит
ссылки на подзадачи) начиная с
головы и вернуть ИД последнего
узла
&НаКлиенте
Функция СпозиционироватьсяВДе-
ревеПодзадач(Вдереве, Путь, Й)
Если Путь.Количество() =
0 Тогда
Возврат 0;
КонецЕсли;
Ключ = Путь[Й];
Для Каждого ТекущаяСт-
рока Из Вдере-
ве.ПолучитьЭлементы() Цикл
Если Текуща-
яСтрока.Подзадача = Ключ Тогда
Если
Й = 0 Тогда
Возврат Теку-
щаяСтро-
ка.ПолучитьИдентификатор();
Иначе
Возврат Спози-
ционироватьсяВДеревеПодза-
дач(ТекущаяСтрока, Путь, Й-1);
Ко-
нецЕсли;
КонецЕсли;
КонецЦикла;
КонецФункции
// перехват выбора (двойной щелчок)
- открыть текущую подзадачу
&НаКлиенте
Процедура ДеревоПодзадачВы-
бор(Элемент, ВыбраннаяСтрока,
Поле, СтандартнаяОбработка)
Если Не ((Поле.Имя =
"ДеревоПодзадачКомментарий")
Или (Поле.Имя = "ДеревоПодза-
дачПодзадача")) Тогда // эти поля -
для собственного редактирования
ОткрытьПодза-
дачу();
КонецЕсли;
КонецПроцедуры
// перехват стандартной команды
Добавить - добавить в дерево суще-
ствующую задачу
// открыть форму выбора и после
выбора добавить выбранную задачу
в дерево
&НаКлиенте
Процедура ДеревоПодзадачПеред-
НачаломДобавления(Элемент, От-
каз, Копирование, Родитель, Группа,
Параметр)
Отказ = Истина;
Если Не Копирование
Тогда // копирование невозможно
ДобавитьСуще-
ствующуюПодзадачу();
КонецЕсли;
КонецПроцедуры
// перехват стандартной команды
Изменить - открыть подзадачу
&НаКлиенте
Процедура ДеревоПодзадачПеред-
НачаломИзменения(Элемент, Отказ)
Если Не ((Эле-
мент.ТекущийЭлемент.Имя = "Дере-
воПодзадачКомментарий") Или
(Элемент.ТекущийЭлемент.Имя =
"ДеревоПодзадачПодзадача")) Тогда
// эти поля - для собственного редак-
тирования
Отказ = Истина;
ОткрытьПодза-
дачу();
КонецЕсли;
102
КонецПроцедуры
// перехват стандартной команды
Удалить
&НаКлиенте
Процедура ДеревоПодзадачПеред-
Удалением(Элемент, Отказ)
УзелРодитель = Элемен-
ты.ДеревоПодзадач.ТекущиеДанные
.ПолучитьРодителя(); // получить
узел-родитель
Если УзелРодитель =
Неопределено Тогда // если нет ро-
дителя - то значит пытаются удалить
корень
Отказ = Истина;
Возврат;
КонецЕсли;
ПутьВДереве = Полу-
читьПутьВДереве(УзелРодитель);
//запомнить путь до текущего узла
УдалитьПодзадачуНаСер-
вере(УзелРодитель.Подзадача, Эле-
мен-
ты.ДеревоПодзадач.ТекущиеДанные
.ПодЗадача); // удалить из таб части
ЗаполнитьДеревоПодза-
дач(); // перестроить дерево
подзадач
Элемен-
ты.ДеревоПодзадач.ТекущаяСтрока
= СпозиционироватьсяВДеревеПод-
задач(ДеревоПодзадач, ПутьВДере-
ве, ПутьВДереве.Количество()-1); //
спозиционироваться на добавленной
задаче
Оповестить("Дерево",
Новый Структура,ЭтотОбъект); //
всем формам послать оповещение о
проведенном изменениии - пусть
они перстаивают свое дерево
Отказ = Истина; // уже все
сделано
КонецПроцедуры
// перехват стандартного Изменения
(изменение последовательность
строк или комментарий)
&НаКлиенте
Процедура ДеревоПодзадачПриИз-
менении(Элемент)
СохранитьДеревоНаСер-
вере();
П = Новый Структура;
Оповестить("Дерево",П,
ЭтотОбъект); // оповестить об изме-
нении, сделанном в этом форме, все
остальные формы - пусть они пер-
старивают свое дерево
КонецПроцедуры
// по команде НоваяПодзадача
&НаКлиенте
Процедура ДеревоНоваяПодзада-
ча(Команда)
ЭтаЗадача = Элемен-
ты.ДеревоПодзадач.ТекущиеДанные
.ПодЗадача;
//// вариант программного
создания и записи нового документа
//НоваяПодЗадача = Со-
здатьПодзадачуНаСервере(); // со-
здать новый документ и записать его
//ПутьВДереве = Полу-
читьПутьВДере-
ве(Элементы.ДеревоПодзадач.Теку
щиеДанные, НоваяПодЗадача);
//сформировать массив подзадач от
текущего узла до корня
//ДобавитьСуществующу
юПодзадачуНаСервере(ЭтаЗадача,
НоваяПодЗадача); // добавить новую
задачу в объект (в таб. часть)
//ЭтаФорма.Прочитать();
// перечитать данные фор-
мы
//ЗаполнитьДеревоПодзад
ач(); // перстроить дерево под-
задач
//СпозиционироватьсяВДе
ревеПодзадач(ДеревоПодзадач,
ПутьВДереве, ПутьВДере-
ве.Количество()-1); // спозициониро-
ваться на добавленной задаче
//П = Новый Структура;
//П.Вставить("Ключ",
НоваяПодЗадача);
//ОткрытьФорму("Докуме
нт.Задача.ФормаОбъекта", П); //
открыть отдельную форму редакти-
рования новой задачи
Если Об-
щийСрв.ВЗакрытомПериоде(ЭтаЗад
ача) Тогда
Сооб-
щить(ОбщийСрв.ПредставлениеЗада
чи(ЭтаЗадача) + "Находится в за-
крытом периоде. Редактирование
невозможно");
Возврат;
КонецЕсли;
Если Не Об-
щийСрв.ПроверкаПрав(ОбщийСрв.
ПолучитьРеквизитЗадачи(ЭтаЗадача,
"Автор"), Об-
щийСрв.ПолучитьГлПользователь())
Тогда
Сооб-
щить(ОбщийСрв.ПредставлениеЗада
чи(ЭтаЗадача) + "Нет прав редакти-
ровать чужой документ");
Возврат;
КонецЕсли;
Если (Об-
щийСрв.ПолучитьРеквизитЗадачи(Э
таЗадача, "Проведен")) И
(Об-
щийСрв.обПолучитьКонстанту("Зап
ретПроведенных")) Тогда
Сооб-
щить(ОбщийСрв.ПредставлениеЗада
чи(ЭтаЗадача) + "Уже выполнена.
Редактирование невозможно");
Возврат;
КонецЕсли;
// вариант открытия фор-
мы нового пустого документа
П = Новый Структура;
П.Вставить("ЭтоНовый",
Истина);// признак того что форма
открывается для нового документа
П.Вставить("Родитель",
ЭтаЗадача);
ОткрытьФор-
му("Документ.Задача.ФормаОбъекта
", П, ЭтотОбъект); // открыть от-
дельную форму редактирования
новой задачи
// далее см. в ПриСозда-
нииНаСервере - заполнение рекви-
зитов и таб. частей нового докумен-
та на основании этого
// далее см. в ПослеЗаписи
- запись новой задачи в тч Подзада-
чи родительской задачи
// далее см. в ОбработкаО-
повещения - в родительской задаче в
дереве спозиционироваться на новой
задаче
КонецПроцедуры
&НаКлиенте
Процедура ЗаполнитьДеревоПоШ-
аблону(Шаблон)
ЭтаЗадача = Элемен-
ты.ДеревоПодзадач.ТекущиеДанные
.ПодЗадача;
Если Об-
щийСрв.ВЗакрытомПериоде(ЭтаЗад
ача) Тогда
Сооб-
щить(ОбщийСрв.ПредставлениеЗада
чи(ЭтаЗадача) + "Находится в за-
крытом периоде. Редактирование
невозможно");
Возврат;
КонецЕсли;
Если Не Об-
щийСрв.ПроверкаПрав(ОбщийСрв.
ПолучитьРеквизитЗадачи(ЭтаЗадача,
"Автор"), Об-
щийСрв.ПолучитьГлПользователь())
Тогда
Сооб-
щить(ОбщийСрв.ПредставлениеЗада
чи(ЭтаЗадача) + "Нет прав редакти-
ровать чужой документ");
Возврат;
КонецЕсли;
Если (Об-
щийСрв.ПолучитьРеквизитЗадачи(Э
таЗадача, "Проведен")) И
(Об-
щийСрв.обПолучитьКонстанту("Зап
ретПроведенных")) Тогда
Сооб-
щить(ОбщийСрв.ПредставлениеЗада
чи(ЭтаЗадача) + "Уже выполнена.
Редактирование невозможно");
Возврат;
КонецЕсли;
НоваяПодЗадача = Со-
здатьПодзадачуНаСервере(Шаблон,
ЭтаЗадача); // создать новый доку-
мент и записать его
103
ДобавитьСуществую-
щуюПодзадачуНаСерве-
ре(ЭтаЗадача, НоваяПодЗадача); //
добавить новую задачу в объект (в
таб. часть)
ПутьВДереве = Полу-
читьПутьВДере-
ве(Элементы.ДеревоПодзадач.Теку
щиеДанные, НоваяПодЗадача);
//сформировать массив подзадач от
текущего узла до корня
ЗаполнитьПоШаблонуРе-
курсивно(Шаблон, НоваяПодЗада-
ча);
ЭтаФорма.Прочитать();
// перечитать данные фор-
мы
ЗаполнитьДеревоПодза-
дач(); // перстроить дерево под-
задач
Элемен-
ты.ДеревоПодзадач.ТекущаяСтрока
= СпозиционироватьсяВДеревеПод-
задач(ДеревоПодзадач, ПутьВДере-
ве, ПутьВДереве.Количество()-1); //
спозиционироваться на добавленной
задаче
КонецПроцедуры
&НаСервере
Процедура ЗаполнитьПоШаблону-
Рекурсивно(Шаблон, Основание)
ВыборкаСправочника =
Справочни-
ки.Этапы.Выбрать(Шаблон);
Пока ВыборкаСправочни-
ка.Следующий() Цикл
НоваяПодЗада-
ча = СоздатьПодзадачуНаСерве-
ре(ВыборкаСправочника, Основа-
ние); // создать новый документ и
записать его
ДобавитьСуществую-
щуюПодзадачуНаСерве-
ре(Основание, НоваяПодЗадача); //
добавить новую задачу в объект (в
таб. часть)
ЗаполнитьПо-
ШаблонуРекурсив-
но(ВыборкаСправочника.Ссылка,
НоваяПодЗадача);
КонецЦикла;
КонецПроцедуры
// открыть текущую подзадачу в
дереве в отдельной форме. Вызы-
ваеися из Выбор и по команде От-
крыть
&НаКлиенте
Процедура ОткрытьПодзадачу()
ПодЗадача = ЭтотОбъ-
ект.Элементы.ДеревоПодзадач.Теку
щиеДанные.Подзадача;
Если ПодЗадача = Не-
определено Тогда
Возврат;
КонецЕсли;
Если ПодЗадача.Пустая()
= Истина Тогда
Возврат;
КонецЕсли;
//ОткрытьЗначение(ПодЗа
дача);
П = Новый Структура;
П.Вставить("Ключ", ПодЗадача);
ОткрытьФор-
му("Документ.Задача.ФормаОбъекта
", П); // открыть отдельную форму
редактирования
КонецПроцедуры
// открыть форму выбора списка
задач
&НаКлиенте
Процедура ДобавитьСуществую-
щуюПодзадачу()
ПодЗадача = ЭтотОбъ-
ект.Элементы.ДеревоПодзадач.Теку
щиеДанные.Подзадача;
П = Новый Структура;
П.Вставить("ПараметрТек
ущаяСтрока", ПодЗадача);
ОткрытьФор-
му("Документ.Задача.ФормаВыбора
", П, ЭтотОбъ-
ект.Элементы.ДеревоПодзадач);
// результат выбора см. в
ОбработкаВыбора элемента формы
ДеревоПодзадач
КонецПроцедуры
// во внешней форме выбора завер-
шили выбор существующей задачи -
добавить ее в дерево подзадач
&НаКлиенте
Процедура ДеревоПодзадачОбрабо-
ткаВыбора(Элемент, ВыбранноеЗна-
чение, СтандартнаяОбработка)
Если Не Элемент.Имя =
"ДеревоПодзадач" Тогда // если
выбор был не из дерева
Возврат;
КонецЕсли;
Если ВыбранноеЗначение
= Неопределено Тогда //
если ничего не было выбрано
Возврат;
КонецЕсли;
Если Элемен-
ты.ДеревоПодзадач.ТекущиеДанные
.Подзадача = ВыбранноеЗначение
Тогда // зацикливание!
Сооб-
щить("Нельзя вставлять задачу саму
в себя!");
Возврат;
КонецЕсли;
Если ЯвляетсяПред-
ком(ВыбранноеЗначение, Элемен-
ты.ДеревоПодзадач.ТекущиеДанные
.Подзадача) Тогда // проврка на
предка
Сооб-
щить("Добавление приведет к за-
цикливанию!");
Возврат;
КонецЕсли;
Если УжеЕстьВСписке-
Подза-
дач(Элементы.ДеревоПодзадач.Теку
щиеДанные, ВыбранноеЗначение)
Тогда // проврка на то, что уже есть
Сооб-
щить("Выбранная подзадача уже
является подзадачей данной зада-
чи!");
Возврат;
КонецЕсли;
//ЭтаЗадача = Объ-
ект.Ссылка; // если в эту задачу
//Если Элемен-
ты.ДеревоПодзадач.ТекущиеДанные
.Подзадача <> ЭтаЗадача Тогда //
если в какую-то подзадачу в дереве
// ЭтаЗадача =
Элемен-
ты.ДеревоПодзадач.ТекущиеДанные
.ПодЗадача;
//КонецЕсли;
ЭтаЗадача = Элемен-
ты.ДеревоПодзадач.ТекущиеДанные
.ПодЗадача;
ПутьВДереве = Полу-
читьПутьВДере-
ве(Элементы.ДеревоПодзадач.Теку
щиеДанные, ВыбранноеЗначение);
//запомнить путь в дереве до нового
выбранного значения
ДобавитьСуществую-
щуюПодзадачуНаСерве-
ре(ЭтаЗадача, ВыбранноеЗначение);
// добавить выбранную задачу в
объект
ЗаполнитьДеревоПодза-
дач(); // перстроить дерево под-
задач
Элемен-
ты.ДеревоПодзадач.ТекущаяСтрока
= СпозиционироватьсяВДеревеПод-
задач(ДеревоПодзадач, ПутьВДере-
ве, ПутьВДереве.Количество()-1); //
спозиционироваться на добавленной
задаче
Оповестить("Дерево",
Новый Структура, ЭтотОбъект); //
оповестить все формы об изменении
- пусть они перестаивают свое дере-
во
КонецПроцедуры
//Проверка - является ли Добавляе-
маяЗадача предком текущего узла (в
который добавляют) на каком-либо
уровне
&НаКлиенте
Функция ЯвляетсяПред-
ком(ДобавляемаяЗадача, ВЗадачу)
СЗ = Новый СписокЗначе-
ний; // СЗ всех предков
Об-
щийСрв.СформироватьСписокПредк
104
ов(СЗ, ВЗадачу); // сформировать
список всех предков
Если
СЗ.НайтиПоЗначению(ДобавляемаяЗ
адача) = Неопределено Тогда // если
входит в СЗ - значит на каком-то
уровне является предком
Возврат Ложь;
КонецЕсли;
Возврат Истина;
КонецФункции
// проверка - задача ВыбранноеЗна-
чение уже есть в списке подзадач
ВеткаДерева на одном уровне
&НаКлиенте
Функция УжеЕстьВСпискеПодза-
дач(ВеткаДерева, ВыбранноеЗначе-
ние)
Для Каждого Строка Из
ВеткаДерева.ПолучитьЭлементы()
Цикл
Если Стро-
ка.Подзадача = ВыбранноеЗначение
Тогда
Воз-
врат Истина;
КонецЕсли;
КонецЦикла;
Возврат Ложь;
КонецФункции
//сформировать массив подзадач от
текущего узла до корня
&НаКлиенте
Функция ПолучитьПутьВДере-
ве(УзелНачало, ВыбранноеЗначение
= Неопределено )
ПутьВДереве = Новый
Массив;
Если Не ВыбранноеЗна-
чение = Неопределено Тогда //
включать ВыбранноеЗначение в
массив или нет
ПутьВДере-
ве.Добавить(ВыбранноеЗначение);
КонецЕсли;
Если УзелНачало = Не-
определено Тогда
Возврат
ПутьВДереве;
КонецЕсли;
// рекурсивно для каждого
уровня
ПолучитьПутьВДеревеРе-
курсив-
но(УзелНачало.ПолучитьИдентифик
атор(), ПутьВДереве);
Возврат ПутьВДереве;
КонецФункции
//сформировать массив подзадач от
текущего узла до корня
&НаСервере
Процедура ПолучитьПутьВДереве-
Рекурсивно(А, ПутьВДереве)
СтрокаДереваФормы =
ДеревоПодза-
дач.НайтиПоИдентификатору(А);
ПутьВДере-
ве.Добавить(СтрокаДереваФормы.П
одЗадача);
Если СтрокаДереваФор-
мы.Подзадача = Объект.Ссылка
Тогда // если это корень - то закон-
чить рекурсию
Возврат;
КонецЕсли;
Родитель = СтрокаДере-
ваФормы.ПолучитьРодителя();
Если Родитель = Неопре-
делено Тогда
Возврат;
КонецЕсли;
ПолучитьПутьВДереве-
Рекурсив-
но(СтрокаДереваФормы.ПолучитьРо
дителя().ПолучитьИдентификатор(),
ПутьВДереве)
КонецПроцедуры
// в объект ВКакуюЗадачу добавить
ЧтоДобавлять
&НаСервере
Процедура ДобавитьСуществую-
щуюПодзадачуНаСерве-
ре(ВКакуюЗадачу, ЧтоДобавлять)
ВКакуюЗадачуОбъект =
ВКакуюЗадачу.ПолучитьОбъект();
ЧтоДобавлятьОбъект =
ЧтоДобавлять.ПолучитьОбъект();
НоваяСтрокаПодзадача =
ВКакуюЗадачуОбъ-
ект.Подзадачи.Добавить();
НоваяСтрокаПодзада-
ча.ПодЗадача = ЧтоДобавлять;
ВКакуюЗадачуОбъ-
ект.Записать(); // просто записать
// если добавля-
емая была головная - то больше она
не головная
Если ЧтоДобав-
лять.Головная Тогда
ЧтоДобавлять-
Объект.Головная = Ложь;
Об-
щийСрв.ЗаписьВедетИсполнитель(И
стина);
ЧтоДобавлять-
Объект.Записать();
Об-
щийСрв.ЗаписьВедетИсполнитель(Л
ожь);
КонецЕсли;
Если (ВКакуюЗада-
чу.Проведен) И (ЧтоДобав-
лять.Проведен = Ложь) Тогда // если
эта задача была проведена, а новая
нет - то распроводим эту
Сооб-
щить("Выполнение задачи-родителя
" + Об-
щийСрв.ПредставлениеЗадачи(ВКак
уюЗадачу) + " будет отменено");
ВКакуюЗада-
чуОбъ-
ект.Записать(РежимЗаписиДокумент
а.ОтменаПроведения, РежимПрове-
денияДокумента.Неоперативный);
КонецЕсли;
КонецПроцедуры
// удалить Подзадача из объекта
Задача (в БД)
&НаСервере
Процедура УдалитьПодзадачуНаСе-
рвере(Задача, Подзадача)
ЗадачаОбъект = Зада-
ча.ПолучитьОбъект();
УдаляемаяСтрока = Зада-
чаОбъ-
ект.Подзадачи.Найти(Подзадача);
Если Не УдаляемаяСтрока
= Неопределено Тогда
ЗадачаОбъ-
ект.Подзадачи.Удалить(УдаляемаяС
трока);
ЗадачаОбъ-
ект.Записать();
КонецЕсли;
КонецПроцедуры
&НаСервере
Процедура СохранитьДеревоНаСер-
вере()
Для Каждого Строка Из
ДеревоПодза-
дач.ПолучитьЭлементы() Цикл
Сохранить-
СтрокуДерева(Строка); // для каж-
дой строки
КонецЦикла;
КонецПроцедуры
// сохранить строку дерева (со всеми
ее подстроками)
&НаСервере
Процедура СохранитьСтрокуДере-
ва(СтрокаДерева)
Задача = СтрокаДере-
ва.ПодЗадача;
ЗадачаОбъект = Зада-
ча.ПолучитьОбъект();
ЗадачаОбъ-
ект.Подзадачи.Очистить(); //
очистить таб. часть подзадачи
Для Каждого Строка Из
СтрокаДерева.ПолучитьЭлементы()
Цикл
Новая = Зада-
чаОбъект.Подзадачи.Добавить();
// добавить из дерева каж-
дую строку в таб часть
Но-
вая.Подзадача = Стро-
ка.Подзадача;
Но-
вая.Комментарий = Стро-
ка.Комментарий;
105
Сохранить-
СтрокуДерева(Строка); //
рекрсивно для каждой строки
КонецЦикла;
ЗадачаОбъект.Записать();
КонецПроцедуры
// создать новую задачу (для вариан-
та создания новой подзадачи про-
граммно, а не в пустой форме)
&НаСервере
Функция СоздатьПодзадачуНаСер-
вере(Шаблон = Неопределено, Ос-
нование = Неопределено)
// создать новый документ
НоваяПодЗадача = Доку-
менты.Задача.СоздатьДокумент();
НоваяПодЗадача.Дата =
ТекущаяДата();
НоваяПодЗада-
ча.УстановитьНовыйНомер();
// заполнить реквизиты по-
умолчанию и из основания
Об-
щийСрв.ПриВводеНовойЗадачи(Нов
аяПодЗадача, Основание, Ложь);
Если Не Шаблон = Не-
определено Тогда // если шаблон
задан, то часть реквизитов - из шаб-
лона
НоваяПодЗада-
ча.Наименование = Шаб-
лон.Наименование;
Ответсвенный =
Справочни-
ки.Сотрудники.ПустаяСсылка();
Если Не Шаб-
лон.ОтветсвенныйСотрудник.Пустая
() Тогда
От-
ветсвенный = Шаб-
лон.ОтветсвенныйСотрудник;
Иначе
От-
ветсвенный = Об-
щийСрв.ОтветсвенныйПоПодраздел
ению(Шаблон.ОтветсвенноеПодразд
еление);
КонецЕсли;
Если Не Ответ-
свенный.Пустая() Тогда
Но-
ваяПодЗадача.Отвественный = От-
ветсвенный; // Ответсвенный
Нова-
яСтрИсполнители = НоваяПодЗада-
ча.Исполнители.Добавить();// он же -
первый исполнитель
Нова-
яСтрИсполнители.Исполнитель =
Ответсвенный;
Нова-
яСтрИсполнители.Процент = 100;
Нова-
яСтрИсполнители.Задание = Шаб-
лон.Наименование;
КонецЕсли;
Если Не Шаб-
лон.Статус.Пустая() Тогда
Но-
ваяПодЗадача.Статус = Шаб-
лон.Статус;
КонецЕсли;
Если Не Шаб-
лон.Срок = 0 Тогда
Но-
ваяПодЗада-
ча.ОжидаемаяДатаВыполнения =
ТекущаяДата() +
24*60*60*Шаблон.Срок;
КонецЕсли;
Если Не Шаб-
лон.Объем = 0 Тогда
Но-
ваяПодЗадача.Объем
= Шаблон.Объем;
КонецЕсли;
Если Не Шаб-
лон.ЕдИзм.Пустая() Тогда
Но-
ваяПодЗадача.ЕдИзм
= Шаблон.ЕдИзм;
КонецЕсли;
Если Не Пуста-
яСтрока(Шаблон.Комментарий)
Тогда
Но-
ваяПодЗадача.Комментарий = Шаб-
лон.Комментарий;
КонецЕсли;
Если Не Шаб-
лон.ВидЗадачи.Пустая() Тогда
Но-
ваяПодЗадача.ВидЗадачи =
Шаблон.ВидЗадачи;
КонецЕсли;
КонецЕсли;
НоваяПодЗада-
ча.Записать();
Возврат НоваяПодЗада-
ча.Ссылка;
КонецФункции
// при любом изменении (в т.ч. про-
ведении) оповестить другие откры-
тые формы
&НаКлиенте
Процедура ПослеЗапи-
си(ПараметрыЗаписи)
П = Новый Структура;
Если Парамет-
ры.Свойство("ЭтоНовый") Тогда //
если из вызывающей формы был
пердан признак что это новый доку-
мент (кнопка Новая в Подзадачи)
Если Парамет-
ры.ЭтоНовый Тогда // то в родителя
добавить эту задачу
Доба-
витьСуществующуюПодзадачуНа-
Сервере(Параметры.Родитель, Объ-
ект.Ссылка); // добавить новую зада-
чу в объект (в таб. часть)
П.Вставить("НоваяПодЗад
ача", Объект.Ссылка); // и пердаем
новую задачу в ОбработкаОповеще-
ния
П.Вставить("ЭтоНовый",
Параметры.ЭтоНовый);
КонецЕсли;
КонецЕсли;
Оповестить("Дерево",П,
ЭтотОбъект); // оповестить об изме-
нении, сделанном в этом форме, все
остальные формы - пусть они пер-
старивают свое дерево
// далее см. в ОбработкаО-
повещения
КонецПроцедуры
// обработка оповещения о любых
изменениях, проведенных в других
формах
&НаКлиенте
Процедура ОбработкаОповеще-
ния(ИмяСобытия, Параметр, Источ-
ник)
Если ИмяСобытия <>
"Дерево" Тогда // не наш случай
Возврат;
КонецЕсли;
//Если Источник = Это-
тОбъект Тогда // если источник
изменения - сама эта форма
// Возврат;
//КонецЕсли;
ПутьВДереве = Полу-
читьПутьВДере-
ве(Элементы.ДеревоПодзадач.Теку
щиеДанные); // запомниь путь до
текущего элемента
Если Пара-
метр.Свойство("ЭтоНовый") Тогда //
если была передана структра
Если Пара-
метр.ЭтоНовый Тогда // если опове-
щение передала форма, в котрой был
создан новый документ
Если
Источник.ВладелецФормы = Это-
тОбъект Тогда // если та форма вы-
зывалась из этой
НоваяПодЗадача = Пара-
метр.НоваяПодзадача; // ссылка на
измененную подзадачу
ПутьВДереве = Полу-
читьПутьВДере-
ве(Элементы.ДеревоПодзадач.Теку
щиеДанные, НоваяПодЗадача);
//сформировать массив подзадач от
добавленной подзадачи до корня
Ко-
нецЕсли;

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

"Автоматизация обработки заявок ООО "Проектно-Строительная Компания"
"Автоматизация процесса аттестации персонала для ООО "Нэт Бай Нэт Холдинг"
"Анализ интернет-активности конкурентов ( на примере конкурентов "Газпром нефть")
"Бухгалтерский учёт и аудит расчётов с подотчётними лицами в организации на примере ООО "ЛОЦ 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 - менеджмент: реализация проекта (на примере ООО "АГРОПАК")