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

Внимание! Если размещение файла нарушает Ваши авторские права, то обязательно сообщите нам
86
олнения", ЭтотОбъ-
ект.Элементы.Исполнители.Текущие
Данные.РезультатИсполнения);
П.Вставить("ДатаИсполне
ния", ЭтотОбъ-
ект.Элементы.Исполнители.Текущие
Данные.ДатаИсполнения);
П.Вставить("Комментарий
", Это-
тОбъ-
ект.Элементы.Исполнители.Текущие
Данные.Комментарий);
ФормаИсполне-
ние = ПолучитьФор-
му("Документ.Задача.Форма.Форма
Исполнения", П, ЭтотОбъект);
ФормаИсполне-
ние.ОткрытьМодально();
// дальше см. в
ОбработкаВыбора формы
Иначе
Сообщить("У
вас нет прав для проставления от-
метки об исполнении");
КонецЕсли;
КонецПроцедуры
// перед записью в ТЧ Исполнители -
не должно быть пустых и проверка
процентов
&НаКлиенте
Процедура ИсполнителиПередО-
кончаниемРедактирования(Элемент,
НоваяСтрока, ОтменаРедактирова-
ния, Отказ)
Если Эле-
мент.ТекущиеДанные.Исполнитель.
Пустая() И Не (НоваяСтрока и От-
менаРедактирования) Тогда
Сооб-
щить("Исполнитель должен быть
обязательно выбран");
Отказ = Истина;
КонецЕсли;
Процентов = 0;
Для Каждого СтрокаИс-
полнитель Из Объект.Исполнители
Цикл
Процентов =
Процентов + СтрокаИсполни-
тель.Процент;
КонецЦикла;
Если Процентов > 100
Тогда
Сооб-
щить("Суммарный процент испол-
нения не может превышать 100%");
Отказ = Истина;
КонецЕсли;
КонецПроцедуры
// выбор нового исполнителя - про-
верка что такого еще не было
&НаКлиенте
Процедура ИсполнителиИсполни-
тельОбработкаВыбора(Элемент,
ВыбранноеЗначение, Стандарт-
наяОбработка)
Если УжеЕстьВТабли-
це(ВыбранноеЗначение) Тогда
СтандартнаяОбработка = Ложь;
Сообщить("Этот исполнитель
уже выбран");
КонецЕсли;
КонецПроцедуры
&НаСервере
Функция УжеЕстьВТаблице(Выбор)
МассивНайденныхСтрок = Объ-
ект.Исполнители.НайтиСтроки(Нов
ый Структу-
ра("Исполнитель",Выбор));
Возврат МассивНайден-
ныхСтрок.Количество();
КонецФункции
//ввод новой строки в ТЧ Исполни-
тели - запрет копирования (не может
быть двух одинаковых строк)
&НаКлиенте
Процедура ИсполнителиПередНача-
ломДобавления(Элемент, Отказ,
Копирование, Родитель, Группа,
Параметр)
Если Копирование = Ис-
тина Тогда // запрет копи-
рования
Отказ = Истина;
КонецЕсли;
КонецПроцедуры
//ввод новой строки в ТЧ Исполни-
тели - автоматически рассчитать
процент
&НаКлиенте
Процедура ИсполнителиПриНача-
леРедактирования(Элемент, Нова-
яСтрока, Копирование)
Если НоваяСтрока = Ис-
тина Тогда
Процентов = 0;
Для Каждого
СтрокаИсполнитель Из Объ-
ект.Исполнители Цикл
Про-
центов = Процентов + СтрокаИс-
полнитель.Процент;
КонецЦикла;
Если Процентов
> 100 Тогда
Про-
центов = 100;
КонецЕсли;
СтрокаИспол-
нитель = Элемент.ТекущиеДанные;
СтрокаИспол-
нитель.Процент = 100-Процентов;
СтрокаИспол-
нитель.Задание = Объ-
ект.Наименование;
КонецЕсли;
КонецПроцедуры
//----------------------------------------------
---------------------------------
// ЗАКЛАДКА ПОДЗАДАЧИ
&НаКлиенте
Процедура ВывестиПанельПодза-
дач() // первоначальное заполнение
дерева подзадач
ЭтотОбъ-
ект.Элементы.ДеревоПодзадач.Нача
льноеОтображениеДерева = Началь-
ноеОтображениеДере-
ва.РаскрыватьВерхнийУровень;
КонецПроцедуры
// заполнить дерево подзадач
&НаСервере
Процедура ЗаполнитьДеревоПодза-
дач()
ЭтаФорма.Прочитать();
// перечитать данные фор-
мы
ДеревоОбъект = Рекви-
зитФормыВЗначе-
ние("ДеревоПодзадач");
ДеревоОбъ-
ект.Строки.Очистить(); //
удалить все подзадачи
// сформировать
корень - текущая задача
Голова = ДеревоОбъ-
ект.Строки.Добавить();
Голова.ПодЗадача
= Объ-
ект.Ссылка;
Голова.Выполнена
= Объ-
ект.Проведен;
Голова.Наименование
=
"ЭТА ЗАДАЧА";
Голова.Пометка
=
УстановитьПометку(Объект); //
отметка исполнения
// по всем под-
задачам табличной части
Для Каждого СтрокаПод-
Задача Из Объект.Подзадачи Цикл
ЗаполнитьПод-
Задачу(СтрокаПодЗадача, Голова); //
вызвать для корня и далее для каж-
дой строки дерева
КонецЦикла;
ЗначениеВРеквизитФор-
мы(ДеревоОбъект, "ДеревоПодза-
дач");
КонецПроцедуры
// рекурсивное заполнение одной
подзадачи
&НаСервере
Процедура ЗаполнитьПодЗада-
чу(СтрокаПодЗадача, Узел)
// фильтр по
проведенным и не проведенным
Если (ФильтрПроведен-
ные = 0) Или (ФильтрПроведенные
= 1) Тогда
Если Не Чис-
ло(СтрокаПодЗадача.ПодЗадача.Про
веден) = ФильтрПроведенные Тогда
87
Воз-
врат;
КонецЕсли;
КонецЕсли;
// // фильтр по теущему
значению
//Если ФильтрЗначение <>
Неопределено Тогда
// Если Фильтр-
Колонка = "Наименование" Тогда
// Если
Найти(СтрокаПодЗадача.ПодЗадача.
Наименование, ФильтрЗначение) = 0
Тогда
//
Возврат;
// Ко-
нецЕсли;
// ИначеЕсли
ФильтрКолонка = "Комментарий"
Тогда
// Если
Найти(СтрокаПодЗадача.Комментар
ий, ФильтрЗначение) = 0 Тогда
//
Возврат;
// Ко-
нецЕсли;
// ИначеЕсли
ФильтрКолонка = "Описание" Тогда
// Если
Найти(СтрокаПодЗадача.ПодЗадача.
КраткоеОписание, ФильтрЗначение)
= 0 Тогда
//
Возврат;
// Ко-
нецЕсли;
// ИначеЕсли
ФильтрКолонка = "Статус" Тогда
// Если
СтрокаПодЗадача.ПодЗадача.Статус
<> ФильтрЗначение Тогда
//
Возврат;
// Ко-
нецЕсли;
// ИначеЕсли
ФильтрКолонка = "ДатаПостановки"
Тогда
// Если
НачалоД-
ня(СтрокаПодЗадача.ПодЗадача.Дат
а) <> НачалоДня(ФильтрЗначение)
Тогда
//
Возврат;
// Ко-
нецЕсли;
// ИначеЕсли
ФильтрКолонка = "ДатаОжидаемая"
Тогда
// Если
НачалоД-
ня(СтрокаПодЗадача.ПодЗадача.Дат
аОкончания) <> НачалоД-
ня(ФильтрЗначение) Тогда
//
Возврат;
// Ко-
нецЕсли;
// КонецЕсли;
//КонецЕсли;
//
создать новый узел дерева
НовыйУзел =
Узел.Строки.Добавить();
НовыйУзел.ПодЗадача
= СтрокаПодЗада-
ча.ПодЗадача;
НовыйУзел.Выполнена
=
СтрокаПодЗада-
ча.ПодЗадача.Проведен;
Но-
выйУзел.НомерВТабЧасти
= СтрокаПодЗада-
ча.НомерСтроки;
НовыйУзел.Наименование
=
Стро-
ка(СтрокаПодЗадача.ПодЗадача.Ном
ер) + " " + СтрокаПодЗада-
ча.ПодЗадача.Наименование;
НовыйУзел.Статус
=
СтрокаПодЗадача.ПодЗадача.Статус;
НовыйУзел.Дата
= СтрокаПодЗада-
ча.ПодЗадача.Дата;
Но-
выйУзел.ДатаОжидаемая
= СтрокаПодЗада-
ча.ПодЗадача.ОжидаемаяДатаВыпол
нения;
НовыйУзел.Комментарий
=
СтрокаПодЗадача.Комментарий;
НовыйУзел.Пометка
= УстановитьПомет-
ку(СтрокаПодЗадача.ПодЗадача);
//НовыйУзел.Картинка =
БиблиотекаКартинок.ДебетКредит;
// теперь рекурсивно для
каждого поддрева
Для Каждого СтрокаПод-
Задача Из СтрокаПодЗада-
ча.ПодЗадача.Подзадачи Цикл
ЗаполнитьПод-
Задачу(СтрокаПодЗадача, Но-
выйУзел);
КонецЦикла;
КонецПроцедуры // ЗаполнитьПод-
Задачу
// признак выполнения задачи
Функция УстановитьПомет-
ку(Задача)
Возврат Чис-
ло(Задача.Проведен);
//Если Задача.Проведен
Тогда
// Возврат 1;
//КонецЕсли;
//
//Для Каждого Строка-
ПодЗадача Из Задача.Подзадачи
Цикл
// Если НЕ Зада-
ча.Проведен Тогда
// Воз-
врат 2;
// КонецЕсли;
//КонецЦикла;
//
//Возврат 0;
КонецФункции
//пройти по массиву Путь (хранит
ссылки на подзадачи) начиная с
головы и вернуть ИД последнего
узла
&НаКлиенте
Функция СпозиционироватьсяВДе-
ревеПодзадач(Вдереве, Путь, Й)
Если Путь.Количество() =
0 Тогда
Возврат 0;
КонецЕсли;
Ключ = Путь[Й];
Для Каждого ТекущаяСт-
рока Из Вдере-
ве.ПолучитьЭлементы() Цикл
Если Текуща-
яСтрока.Подзадача = Ключ Тогда
Если
Й = 0 Тогда
Возврат Теку-
щаяСтро-
ка.ПолучитьИдентификатор();
Иначе
Возврат Спози-
ционироватьсяВДеревеПодза-
дач(ТекущаяСтрока, Путь, Й-1);
Ко-
нецЕсли;
КонецЕсли;
КонецЦикла;
КонецФункции
// перехват выбора (двойной щелчок)
- открыть текущую подзадачу
&НаКлиенте
Процедура ДеревоПодзадачВы-
бор(Элемент, ВыбраннаяСтрока,
Поле, СтандартнаяОбработка)
Если Не ((Поле.Имя =
"ДеревоПодзадачКомментарий")
Или (Поле.Имя = "ДеревоПодза-
дачПодзадача")) Тогда // эти поля -
для собственного редактирования
ОткрытьПодза-
дачу();
КонецЕсли;
КонецПроцедуры
// перехват стандартной команды
Добавить - добавить в дерево суще-
ствующую задачу
// открыть форму выбора и после
выбора добавить выбранную задачу
в дерево
&НаКлиенте
Процедура ДеревоПодзадачПеред-
НачаломДобавления(Элемент, От-
88
каз, Копирование, Родитель, Группа,
Параметр)
Отказ = Истина;
Если Не Копирование
Тогда // копирование невозможно
ДобавитьСуще-
ствующуюПодзадачу();
КонецЕсли;
КонецПроцедуры
// перехват стандартной команды
Изменить - открыть подзадачу
&НаКлиенте
Процедура ДеревоПодзадачПеред-
НачаломИзменения(Элемент, Отказ)
Если Не ((Эле-
мент.ТекущийЭлемент.Имя = "Дере-
воПодзадачКомментарий") Или
(Элемент.ТекущийЭлемент.Имя =
"ДеревоПодзадачПодзадача")) Тогда
// эти поля - для собственного редак-
тирования
Отказ = Истина;
ОткрытьПодза-
дачу();
КонецЕсли;
КонецПроцедуры
// перехват стандартной команды
Удалить
&НаКлиенте
Процедура ДеревоПодзадачПеред-
Удалением(Элемент, Отказ)
УзелРодитель = Элемен-
ты.ДеревоПодзадач.ТекущиеДанные
.ПолучитьРодителя(); // получить
узел-родитель
Если УзелРодитель =
Неопределено Тогда // если нет ро-
дителя - то значит пытаются удалить
корень
Отказ = Истина;
Возврат;
КонецЕсли;
ПутьВДереве = Полу-
читьПутьВДереве(УзелРодитель);
//запомнить путь до текущего узла
УдалитьПодзадачуНаСер-
вере(УзелРодитель.Подзадача, Эле-
мен-
ты.ДеревоПодзадач.ТекущиеДанные
.ПодЗадача); // удалить из таб части
ЗаполнитьДеревоПодза-
дач(); // перестроить дерево
подзадач
Элемен-
ты.ДеревоПодзадач.ТекущаяСтрока
= СпозиционироватьсяВДеревеПод-
задач(ДеревоПодзадач, ПутьВДере-
ве, ПутьВДереве.Количество()-1); //
спозиционироваться на добавленной
задаче
Оповестить("Дерево",
Новый Структура,ЭтотОбъект); //
всем формам послать оповещение о
проведенном изменениии - пусть
они перстаивают свое дерево
Отказ = Истина; // уже все
сделано
КонецПроцедуры
// перехват стандартного Изменения
(изменение последовательность
строк или комментарий)
&НаКлиенте
Процедура ДеревоПодзадачПриИз-
менении(Элемент)
СохранитьДеревоНаСер-
вере();
П = Новый Структура;
Оповестить("Дерево",П,
ЭтотОбъект); // оповестить об изме-
нении, сделанном в этом форме, все
остальные формы - пусть они пер-
старивают свое дерево
КонецПроцедуры
// по команде НоваяПодзадача
&НаКлиенте
Процедура ДеревоНоваяПодзада-
ча(Команда)
ЭтаЗадача = Элемен-
ты.ДеревоПодзадач.ТекущиеДанные
.ПодЗадача;
//// вариант программного
создания и записи нового документа
//НоваяПодЗадача = Со-
здатьПодзадачуНаСервере(); // со-
здать новый документ и записать его
//ПутьВДереве = Полу-
читьПутьВДере-
ве(Элементы.ДеревоПодзадач.Теку
щиеДанные, НоваяПодЗадача);
//сформировать массив подзадач от
текущего узла до корня
//ДобавитьСуществующу
юПодзадачуНаСервере(ЭтаЗадача,
НоваяПодЗадача); // добавить новую
задачу в объект (в таб. часть)
//ЭтаФорма.Прочитать();
// перечитать данные фор-
мы
//ЗаполнитьДеревоПодзад
ач(); // перстроить дерево под-
задач
//СпозиционироватьсяВДе
ревеПодзадач(ДеревоПодзадач,
ПутьВДереве, ПутьВДере-
ве.Количество()-1); // спозициониро-
ваться на добавленной задаче
//П = Новый Структура;
//П.Вставить("Ключ",
НоваяПодЗадача);
//ОткрытьФорму("Докуме
нт.Задача.ФормаОбъекта", П); //
открыть отдельную форму редакти-
рования новой задачи
Если Об-
щийСрв.ВЗакрытомПериоде(ЭтаЗад
ача) Тогда
Сооб-
щить(ОбщийСрв.ПредставлениеЗада
чи(ЭтаЗадача) + "Находится в за-
крытом периоде. Редактирование
невозможно");
Возврат;
КонецЕсли;
Если Не Об-
щийСрв.ПроверкаПрав(ОбщийСрв.
ПолучитьРеквизитЗадачи(ЭтаЗадача,
"Автор"), Об-
щийСрв.ПолучитьГлПользователь())
Тогда
Сооб-
щить(ОбщийСрв.ПредставлениеЗада
чи(ЭтаЗадача) + "Нет прав редакти-
ровать чужой документ");
Возврат;
КонецЕсли;
Если (Об-
щийСрв.ПолучитьРеквизитЗадачи(Э
таЗадача, "Проведен")) И
(Об-
щийСрв.обПолучитьКонстанту("Зап
ретПроведенных")) Тогда
Сооб-
щить(ОбщийСрв.ПредставлениеЗада
чи(ЭтаЗадача) + "Уже выполнена.
Редактирование невозможно");
Возврат;
КонецЕсли;
// вариант открытия фор-
мы нового пустого документа
П = Новый Структура;
П.Вставить("ЭтоНовый",
Истина);// признак того что форма
открывается для нового документа
П.Вставить("Родитель",
ЭтаЗадача);
ОткрытьФор-
му("Документ.Задача.ФормаОбъекта
", П, ЭтотОбъект); // открыть от-
дельную форму редактирования
новой задачи
// далее см. в ПриСозда-
нииНаСервере - заполнение рекви-
зитов и таб. частей нового докумен-
та на основании этого
// далее см. в ПослеЗаписи
- запись новой задачи в тч Подзада-
чи родительской задачи
// далее см. в ОбработкаО-
повещения - в родительской задаче в
дереве спозиционироваться на новой
задаче
КонецПроцедуры
&НаКлиенте
Процедура ЗаполнитьДеревоПоШ-
аблону(Шаблон)
ЭтаЗадача = Элемен-
ты.ДеревоПодзадач.ТекущиеДанные
.ПодЗадача;
Если Об-
щийСрв.ВЗакрытомПериоде(ЭтаЗад
ача) Тогда
Сооб-
щить(ОбщийСрв.ПредставлениеЗада
чи(ЭтаЗадача) + "Находится в за-
крытом периоде. Редактирование
невозможно");
Возврат;
КонецЕсли;
Если Не Об-
щийСрв.ПроверкаПрав(ОбщийСрв.
89
ПолучитьРеквизитЗадачи(ЭтаЗадача,
"Автор"), Об-
щийСрв.ПолучитьГлПользователь())
Тогда
Сооб-
щить(ОбщийСрв.ПредставлениеЗада
чи(ЭтаЗадача) + "Нет прав редакти-
ровать чужой документ");
Возврат;
КонецЕсли;
Если (Об-
щийСрв.ПолучитьРеквизитЗадачи(Э
таЗадача, "Проведен")) И
(Об-
щийСрв.обПолучитьКонстанту("Зап
ретПроведенных")) Тогда
Сооб-
щить(ОбщийСрв.ПредставлениеЗада
чи(ЭтаЗадача) + "Уже выполнена.
Редактирование невозможно");
Возврат;
КонецЕсли;
НоваяПодЗадача = Со-
здатьПодзадачуНаСервере(Шаблон,
ЭтаЗадача); // создать новый доку-
мент и записать его
ДобавитьСуществую-
щуюПодзадачуНаСерве-
ре(ЭтаЗадача, НоваяПодЗадача); //
добавить новую задачу в объект (в
таб. часть)
ПутьВДереве = Полу-
читьПутьВДере-
ве(Элементы.ДеревоПодзадач.Теку
щиеДанные, НоваяПодЗадача);
//сформировать массив подзадач от
текущего узла до корня
ЗаполнитьПоШаблонуРе-
курсивно(Шаблон, НоваяПодЗада-
ча);
ЭтаФорма.Прочитать();
// перечитать данные фор-
мы
ЗаполнитьДеревоПодза-
дач(); // перстроить дерево под-
задач
Элемен-
ты.ДеревоПодзадач.ТекущаяСтрока
= СпозиционироватьсяВДеревеПод-
задач(ДеревоПодзадач, ПутьВДере-
ве, ПутьВДереве.Количество()-1); //
спозиционироваться на добавленной
задаче
КонецПроцедуры
&НаСервере
Процедура ЗаполнитьПоШаблону-
Рекурсивно(Шаблон, Основание)
ВыборкаСправочника =
Справочни-
ки.Этапы.Выбрать(Шаблон);
Пока ВыборкаСправочни-
ка.Следующий() Цикл
НоваяПодЗада-
ча = СоздатьПодзадачуНаСерве-
ре(ВыборкаСправочника, Основа-
ние); // создать новый документ и
записать его
ДобавитьСуществую-
щуюПодзадачуНаСерве-
ре(Основание, НоваяПодЗадача); //
добавить новую задачу в объект (в
таб. часть)
ЗаполнитьПо-
ШаблонуРекурсив-
но(ВыборкаСправочника.Ссылка,
НоваяПодЗадача);
КонецЦикла;
КонецПроцедуры
// открыть текущую подзадачу в
дереве в отдельной форме. Вызы-
ваеися из Выбор и по команде От-
крыть
&НаКлиенте
Процедура ОткрытьПодзадачу()
ПодЗадача = ЭтотОбъ-
ект.Элементы.ДеревоПодзадач.Теку
щиеДанные.Подзадача;
Если ПодЗадача = Не-
определено Тогда
Возврат;
КонецЕсли;
Если ПодЗадача.Пустая()
= Истина Тогда
Возврат;
КонецЕсли;
//ОткрытьЗначение(ПодЗа
дача);
П = Новый Структура;
П.Вставить("Ключ", ПодЗадача);
ОткрытьФор-
му("Документ.Задача.ФормаОбъекта
", П); // открыть отдельную форму
редактирования
КонецПроцедуры
// открыть форму выбора списка
задач
&НаКлиенте
Процедура ДобавитьСуществую-
щуюПодзадачу()
ПодЗадача = ЭтотОбъ-
ект.Элементы.ДеревоПодзадач.Теку
щиеДанные.Подзадача;
П = Новый Структура;
П.Вставить("ПараметрТек
ущаяСтрока", ПодЗадача);
ОткрытьФор-
му("Документ.Задача.ФормаВыбора
", П, ЭтотОбъ-
ект.Элементы.ДеревоПодзадач);
// результат выбора см. в
ОбработкаВыбора элемента формы
ДеревоПодзадач
КонецПроцедуры
// во внешней форме выбора завер-
шили выбор существующей задачи -
добавить ее в дерево подзадач
&НаКлиенте
Процедура ДеревоПодзадачОбрабо-
ткаВыбора(Элемент, ВыбранноеЗна-
чение, СтандартнаяОбработка)
Если Не Элемент.Имя =
"ДеревоПодзадач" Тогда // если
выбор был не из дерева
Возврат;
КонецЕсли;
Если ВыбранноеЗначение
= Неопределено Тогда //
если ничего не было выбрано
Возврат;
КонецЕсли;
Если Элемен-
ты.ДеревоПодзадач.ТекущиеДанные
.Подзадача = ВыбранноеЗначение
Тогда // зацикливание!
Сооб-
щить("Нельзя вставлять задачу саму
в себя!");
Возврат;
КонецЕсли;
Если ЯвляетсяПред-
ком(ВыбранноеЗначение, Элемен-
ты.ДеревоПодзадач.ТекущиеДанные
.Подзадача) Тогда // проврка на
предка
Сооб-
щить("Добавление приведет к за-
цикливанию!");
Возврат;
КонецЕсли;
Если УжеЕстьВСписке-
Подза-
дач(Элементы.ДеревоПодзадач.Теку
щиеДанные, ВыбранноеЗначение)
Тогда // проврка на то, что уже есть
Сооб-
щить("Выбранная подзадача уже
является подзадачей данной зада-
чи!");
Возврат;
КонецЕсли;
//ЭтаЗадача = Объ-
ект.Ссылка; // если в эту задачу
//Если Элемен-
ты.ДеревоПодзадач.ТекущиеДанные
.Подзадача <> ЭтаЗадача Тогда //
если в какую-то подзадачу в дереве
// ЭтаЗадача =
Элемен-
ты.ДеревоПодзадач.ТекущиеДанные
.ПодЗадача;
//КонецЕсли;
ЭтаЗадача = Элемен-
ты.ДеревоПодзадач.ТекущиеДанные
.ПодЗадача;
ПутьВДереве = Полу-
читьПутьВДере-
ве(Элементы.ДеревоПодзадач.Теку
щиеДанные, ВыбранноеЗначение);
//запомнить путь в дереве до нового
выбранного значения
ДобавитьСуществую-
щуюПодзадачуНаСерве-
ре(ЭтаЗадача, ВыбранноеЗначение);
// добавить выбранную задачу в
объект
90
ЗаполнитьДеревоПодза-
дач(); // перстроить дерево под-
задач
Элемен-
ты.ДеревоПодзадач.ТекущаяСтрока
= СпозиционироватьсяВДеревеПод-
задач(ДеревоПодзадач, ПутьВДере-
ве, ПутьВДереве.Количество()-1); //
спозиционироваться на добавленной
задаче
Оповестить("Дерево",
Новый Структура, ЭтотОбъект); //
оповестить все формы об изменении
- пусть они перестаивают свое дере-
во
КонецПроцедуры
//Проверка - является ли Добавляе-
маяЗадача предком текущего узла (в
который добавляют) на каком-либо
уровне
&НаКлиенте
Функция ЯвляетсяПред-
ком(ДобавляемаяЗадача, ВЗадачу)
СЗ = Новый СписокЗначе-
ний; // СЗ всех предков
Об-
щийСрв.СформироватьСписокПредк
ов(СЗ, ВЗадачу); // сформировать
список всех предков
Если
СЗ.НайтиПоЗначению(ДобавляемаяЗ
адача) = Неопределено Тогда // если
входит в СЗ - значит на каком-то
уровне является предком
Возврат Ложь;
КонецЕсли;
Возврат Истина;
КонецФункции
// проверка - задача ВыбранноеЗна-
чение уже есть в списке подзадач
ВеткаДерева на одном уровне
&НаКлиенте
Функция УжеЕстьВСпискеПодза-
дач(ВеткаДерева, ВыбранноеЗначе-
ние)
Для Каждого Строка Из
ВеткаДерева.ПолучитьЭлементы()
Цикл
Если Стро-
ка.Подзадача = ВыбранноеЗначение
Тогда
Воз-
врат Истина;
КонецЕсли;
КонецЦикла;
Возврат Ложь;
КонецФункции
//сформировать массив подзадач от
текущего узла до корня
&НаКлиенте
Функция ПолучитьПутьВДере-
ве(УзелНачало, ВыбранноеЗначение
= Неопределено )
ПутьВДереве = Новый
Массив;
Если Не ВыбранноеЗна-
чение = Неопределено Тогда //
включать ВыбранноеЗначение в
массив или нет
ПутьВДере-
ве.Добавить(ВыбранноеЗначение);
КонецЕсли;
Если УзелНачало = Не-
определено Тогда
Возврат
ПутьВДереве;
КонецЕсли;
// рекурсивно для каждого
уровня
ПолучитьПутьВДеревеРе-
курсив-
но(УзелНачало.ПолучитьИдентифик
атор(), ПутьВДереве);
Возврат ПутьВДереве;
КонецФункции
//сформировать массив подзадач от
текущего узла до корня
&НаСервере
Процедура ПолучитьПутьВДереве-
Рекурсивно(А, ПутьВДереве)
СтрокаДереваФормы =
ДеревоПодза-
дач.НайтиПоИдентификатору(А);
ПутьВДере-
ве.Добавить(СтрокаДереваФормы.П
одЗадача);
Если СтрокаДереваФор-
мы.Подзадача = Объект.Ссылка
Тогда // если это корень - то закон-
чить рекурсию
Возврат;
КонецЕсли;
Родитель = СтрокаДере-
ваФормы.ПолучитьРодителя();
Если Родитель = Неопре-
делено Тогда
Возврат;
КонецЕсли;
ПолучитьПутьВДереве-
Рекурсив-
но(СтрокаДереваФормы.ПолучитьРо
дителя().ПолучитьИдентификатор(),
ПутьВДереве)
КонецПроцедуры
// в объект ВКакуюЗадачу добавить
ЧтоДобавлять
&НаСервере
Процедура ДобавитьСуществую-
щуюПодзадачуНаСерве-
ре(ВКакуюЗадачу, ЧтоДобавлять)
ВКакуюЗадачуОбъект =
ВКакуюЗадачу.ПолучитьОбъект();
ЧтоДобавлятьОбъект =
ЧтоДобавлять.ПолучитьОбъект();
НоваяСтрокаПодзадача =
ВКакуюЗадачуОбъ-
ект.Подзадачи.Добавить();
НоваяСтрокаПодзада-
ча.ПодЗадача = ЧтоДобавлять;
ВКакуюЗадачуОбъ-
ект.Записать(); // просто записать
// если добавля-
емая была головная - то больше она
не головная
Если ЧтоДобав-
лять.Головная Тогда
ЧтоДобавлять-
Объект.Головная = Ложь;
Об-
щийСрв.ЗаписьВедетИсполнитель(И
стина);
ЧтоДобавлять-
Объект.Записать();
Об-
щийСрв.ЗаписьВедетИсполнитель(Л
ожь);
КонецЕсли;
Если (ВКакуюЗада-
чу.Проведен) И (ЧтоДобав-
лять.Проведен = Ложь) Тогда // если
эта задача была проведена, а новая
нет - то распроводим эту
Сооб-
щить("Выполнение задачи-родителя
" + Об-
щийСрв.ПредставлениеЗадачи(ВКак
уюЗадачу) + " будет отменено");
ВКакуюЗада-
чуОбъ-
ект.Записать(РежимЗаписиДокумент
а.ОтменаПроведения, РежимПрове-
денияДокумента.Неоперативный);
КонецЕсли;
КонецПроцедуры
// удалить Подзадача из объекта
Задача (в БД)
&НаСервере
Процедура УдалитьПодзадачуНаСе-
рвере(Задача, Подзадача)
ЗадачаОбъект = Зада-
ча.ПолучитьОбъект();
УдаляемаяСтрока = Зада-
чаОбъ-
ект.Подзадачи.Найти(Подзадача);
Если Не УдаляемаяСтрока
= Неопределено Тогда
ЗадачаОбъ-
ект.Подзадачи.Удалить(УдаляемаяС
трока);
ЗадачаОбъ-
ект.Записать();
КонецЕсли;
КонецПроцедуры
&НаСервере
Процедура СохранитьДеревоНаСер-
вере()
Для Каждого Строка Из
ДеревоПодза-
дач.ПолучитьЭлементы() Цикл
91
Сохранить-
СтрокуДерева(Строка); // для каж-
дой строки
КонецЦикла;
КонецПроцедуры
// сохранить строку дерева (со всеми
ее подстроками)
&НаСервере
Процедура СохранитьСтрокуДере-
ва(СтрокаДерева)
Задача = СтрокаДере-
ва.ПодЗадача;
ЗадачаОбъект = Зада-
ча.ПолучитьОбъект();
ЗадачаОбъ-
ект.Подзадачи.Очистить(); //
очистить таб. часть подзадачи
Для Каждого Строка Из
СтрокаДерева.ПолучитьЭлементы()
Цикл
Новая = Зада-
чаОбъект.Подзадачи.Добавить();
// добавить из дерева каж-
дую строку в таб часть
Но-
вая.Подзадача = Стро-
ка.Подзадача;
Но-
вая.Комментарий = Стро-
ка.Комментарий;
Сохранить-
СтрокуДерева(Строка); //
рекрсивно для каждой строки
КонецЦикла;
ЗадачаОбъект.Записать();
КонецПроцедуры
// создать новую задачу (для вариан-
та создания новой подзадачи про-
граммно, а не в пустой форме)
&НаСервере
Функция СоздатьПодзадачуНаСер-
вере(Шаблон = Неопределено, Ос-
нование = Неопределено)
// создать новый документ
НоваяПодЗадача = Доку-
менты.Задача.СоздатьДокумент();
НоваяПодЗадача.Дата =
ТекущаяДата();
НоваяПодЗада-
ча.УстановитьНовыйНомер();
// заполнить реквизиты по-
умолчанию и из основания
Об-
щийСрв.ПриВводеНовойЗадачи(Нов
аяПодЗадача, Основание, Ложь);
Если Не Шаблон = Не-
определено Тогда // если шаблон
задан, то часть реквизитов - из шаб-
лона
НоваяПодЗада-
ча.Наименование = Шаб-
лон.Наименование;
Ответсвенный =
Справочни-
ки.Сотрудники.ПустаяСсылка();
Если Не Шаб-
лон.ОтветсвенныйСотрудник.Пустая
() Тогда
От-
ветсвенный = Шаб-
лон.ОтветсвенныйСотрудник;
Иначе
От-
ветсвенный = Об-
щийСрв.ОтветсвенныйПоПодраздел
ению(Шаблон.ОтветсвенноеПодразд
еление);
КонецЕсли;
Если Не Ответ-
свенный.Пустая() Тогда
Но-
ваяПодЗадача.Отвественный = От-
ветсвенный; // Ответсвенный
Нова-
яСтрИсполнители = НоваяПодЗада-
ча.Исполнители.Добавить();// он же -
первый исполнитель
Нова-
яСтрИсполнители.Исполнитель =
Ответсвенный;
Нова-
яСтрИсполнители.Процент = 100;
Нова-
яСтрИсполнители.Задание = Шаб-
лон.Наименование;
КонецЕсли;
Если Не Шаб-
лон.Статус.Пустая() Тогда
Но-
ваяПодЗадача.Статус = Шаб-
лон.Статус;
КонецЕсли;
Если Не Шаб-
лон.Срок = 0 Тогда
Но-
ваяПодЗада-
ча.ОжидаемаяДатаВыполнения =
ТекущаяДата() +
24*60*60*Шаблон.Срок;
КонецЕсли;
Если Не Шаб-
лон.Объем = 0 Тогда
Но-
ваяПодЗадача.Объем
= Шаблон.Объем;
КонецЕсли;
Если Не Шаб-
лон.ЕдИзм.Пустая() Тогда
Но-
ваяПодЗадача.ЕдИзм
= Шаблон.ЕдИзм;
КонецЕсли;
Если Не Пуста-
яСтрока(Шаблон.Комментарий)
Тогда
Но-
ваяПодЗадача.Комментарий = Шаб-
лон.Комментарий;
КонецЕсли;
Если Не Шаб-
лон.ВидЗадачи.Пустая() Тогда
Но-
ваяПодЗадача.ВидЗадачи =
Шаблон.ВидЗадачи;
КонецЕсли;
КонецЕсли;
НоваяПодЗада-
ча.Записать();
Возврат НоваяПодЗада-
ча.Ссылка;
КонецФункции
// при любом изменении (в т.ч. про-
ведении) оповестить другие откры-
тые формы
&НаКлиенте
Процедура ПослеЗапи-
си(ПараметрыЗаписи)
П = Новый Структура;
Если Парамет-
ры.Свойство("ЭтоНовый") Тогда //
если из вызывающей формы был
пердан признак что это новый доку-
мент (кнопка Новая в Подзадачи)
Если Парамет-
ры.ЭтоНовый Тогда // то в родителя
добавить эту задачу
Доба-
витьСуществующуюПодзадачуНа-
Сервере(Параметры.Родитель, Объ-
ект.Ссылка); // добавить новую зада-
чу в объект (в таб. часть)
П.Вставить("НоваяПодЗад
ача", Объект.Ссылка); // и пердаем
новую задачу в ОбработкаОповеще-
ния
П.Вставить("ЭтоНовый",
Параметры.ЭтоНовый);
КонецЕсли;
КонецЕсли;
Оповестить("Дерево",П,
ЭтотОбъект); // оповестить об изме-
нении, сделанном в этом форме, все
остальные формы - пусть они пер-
старивают свое дерево
// далее см. в ОбработкаО-
повещения
КонецПроцедуры
// обработка оповещения о любых
изменениях, проведенных в других
формах
&НаКлиенте
Процедура ОбработкаОповеще-
ния(ИмяСобытия, Параметр, Источ-
ник)
Если ИмяСобытия <>
"Дерево" Тогда // не наш случай
Возврат;
КонецЕсли;
//Если Источник = Это-
тОбъект Тогда // если источник
изменения - сама эта форма
// Возврат;
92
//КонецЕсли;
ПутьВДереве = Полу-
читьПутьВДере-
ве(Элементы.ДеревоПодзадач.Теку
щиеДанные); // запомниь путь до
текущего элемента
Если Пара-
метр.Свойство("ЭтоНовый") Тогда //
если была передана структра
Если Пара-
метр.ЭтоНовый Тогда // если опове-
щение передала форма, в котрой был
создан новый документ
Если
Источник.ВладелецФормы = Это-
тОбъект Тогда // если та форма вы-
зывалась из этой
НоваяПодЗадача = Пара-
метр.НоваяПодзадача; // ссылка на
измененную подзадачу
ПутьВДереве = Полу-
читьПутьВДере-
ве(Элементы.ДеревоПодзадач.Теку
щиеДанные, НоваяПодЗадача);
//сформировать массив подзадач от
добавленной подзадачи до корня
Ко-
нецЕсли;
КонецЕсли;
КонецЕсли;
// в любом случае - пере-
строить дерево
ЗаполнитьДеревоПодза-
дач(); // перстроить дерево под-
задач
Элемен-
ты.ДеревоПодзадач.ТекущаяСтрока
= СпозиционироватьсяВДеревеПод-
задач(ДеревоПодзадач, ПутьВДере-
ве, ПутьВДереве.Количество()-1); //
спозиционироваться
КонецПроцедуры
// по команде ДеревоПодзадачаПро-
вести и ДеревоПодзадачаРасПрове-
сти
&НаКлиенте
Процедура ДеревоПодзадачаПрове-
сти(Команда)
Если Элемен-
ты.ДеревоПодзадач.ТекущиеДанные
= Неопределено Тогда
Возврат;
КонецЕсли;
ЭтаЗадача = Элемен-
ты.ДеревоПодзадач.ТекущиеДанные
.ПодЗадача; // какую подзадачу в
дереве проводим
Если ЭтаЗадача.Пустая()
Тогда
Возврат;
КонецЕсли;
Если Команда.Имя = "Де-
ревоПодзадачаПровести" Тогда
Если Не Про-
веркаВозможностиПроведе-
ния(ЭтаЗадача) Тогда
Воз-
врат;
КонецЕсли;
ПровестиПод-
ЗадачуНаСервере(ЭтаЗадача);
КонецЕсли;
Если Команда.Имя = "Де-
ревоПодЗадачаРасПровести" Тогда
Если Не Про-
веркаВозможностиРасПроведе-
ния(ЭтаЗадача) Тогда
Воз-
врат;
КонецЕсли;
РасПровести-
ПодЗадачуНаСервере(ЭтаЗадача);
КонецЕсли;
ПутьВДереве = Полу-
читьПутьВДере-
ве(Элементы.ДеревоПодзадач.Теку
щиеДанные); // запомниь путь до
текущего элемента
ЗаполнитьДеревоПодза-
дач(); // перстроить дерево под-
задач
Элемен-
ты.ДеревоПодзадач.ТекущаяСтрока
= СпозиционироватьсяВДеревеПод-
задач(ДеревоПодзадач, ПутьВДере-
ве, ПутьВДереве.Количество()-1); //
спозиционироваться
Оповестить("Дерево",
Новый Структура, ЭтотОбъект); //
оповестить об изменении, сделанном
в этом форме, все остальные формы
- пусть они перстаривают свое дере-
во
ОтобразитьИзменение-
Данных(Объект.Ссылка, ВидИзме-
ненияДанных.Изменение);
КонецПроцедуры
// провести ПодЗадача
&НаСервере
Процедура ПровестиПодЗадачуНа-
Сервере(ПодЗадача)
ПодЗадачаОбъект = Под-
Задача.ПолучитьОбъект();
ПодЗадачаОбъ-
ект.Записать(РежимЗаписиДокумент
а.Проведение, РежимПроведения-
Документа.Неоперативный);
КонецПроцедуры
// распровести ПодЗадача
&НаСервере
Процедура РасПровестиПодЗадачу-
НаСервере(ПодЗадача)
ПодЗадачаОбъект = Под-
Задача.ПолучитьОбъект();
ПодЗадачаОбъ-
ект.Записать(РежимЗаписиДокумент
а.ОтменаПроведения, РежимПрове-
денияДокумента.Неоперативный);
КонецПроцедуры
// по команде ДеревоСвернутьВсе -
свернуть все узлы, кроме самого
верхнего
&НаКлиенте
Процедура ДеревоСвернутьВ-
се(Команда)
Для Каждого СтрокаДере-
ва Из ДеревоПодза-
дач.ПолучитьЭлементы() Цикл
Для Каждого
Строка1 Из СтрокаДере-
ва.ПолучитьЭлементы() Цикл
Эле-
мен-
ты.ДеревоПодзадач.Свернуть(Строк
а1.ПолучитьИдентификатор());
КонецЦикла;
КонецЦикла;
КонецПроцедуры
// по команде ДеревоСвернутьДоТе-
кущей - свернуть все узлы, но раз-
вернуть путь до текщего узла
&НаКлиенте
Процедура ДеревоСвернутьДоТе-
кущей(Команда)
ПутьВДереве = Полу-
читьПутьВДере-
ве(Элементы.ДеревоПодзадач.Теку
щиеДанные); // запомниь путь до
текущего элемента
Для Каждого СтрокаДере-
ва Из ДеревоПодза-
дач.ПолучитьЭлементы() Цикл
Для Каждого
Строка1 Из СтрокаДере-
ва.ПолучитьЭлементы() Цикл
Эле-
мен-
ты.ДеревоПодзадач.Свернуть(Строк
а1.ПолучитьИдентификатор());
КонецЦикла;
КонецЦикла;
ЗаполнитьДеревоПодза-
дач(); // перстроить дерево под-
задач
Элемен-
ты.ДеревоПодзадач.ТекущаяСтрока
= СпозиционироватьсяВДеревеПод-
задач(ДеревоПодзадач, ПутьВДере-
ве, ПутьВДереве.Количество()-1); //
спозиционироваться
КонецПроцедуры
// по команде ДеревоФильтрПрове-
денные - отобразить в дереве только
Проведенные/Непроведенные/Все
&НаКлиенте
Процедура ДеревоФильтрПроведен-
ные(Команда)
ФильтрПроведенные =
ФильтрПроведенные - 1; // при каж-
93
дом входе в команду - уменьшить
значенеи фильтра на 1
Если ФильтрПроведенные
= -1 Тогда
ФильтрПрове-
денные = 2; // по кругу
КонецЕсли;
// заголовок
кнопки
Если ФильтрПроведенные
= 2 Тогда
Элемен-
ты.ДеревоПодзадачПроведенные.Заг
оловок = "Все";
ИначеЕсли ФильтрПрове-
денные = 1 Тогда
Элемен-
ты.ДеревоПодзадачПроведенные.Заг
оловок = "Выполеннные";
ИначеЕсли ФильтрПрове-
денные = 0 Тогда
Элемен-
ты.ДеревоПодзадачПроведенные.Заг
оловок = "Не выполеннные";
КонецЕсли;
ЗаполнитьДеревоПодза-
дач(); // перестроить дерево с
отбором, удовлетворяющем фильтру
КонецПроцедуры
&НаКлиенте
Процедура ДеревоПоШабло-
ну(Команда)
ОткрытьФор-
му("Справочник.Этапы.ФормаВыбо
ра", ,ЭтаФорма);
// Продолжение см. в Об-
работкаВыбора формы
КонецПроцедуры
//----------------------------------------------
----------------------------------
// ЗАКЛАДКА РЕСУРСЫ
// при выборе/изменении номенкла-
туры
&НаКлиенте
Процедура НоменклатураНоменкла-
тураПриИзменении(Элемент)
ЭтотОбъ-
ект.Элементы.Номенклатура.Текущи
еДанные.Количество = 1;
ЭтотОбъ-
ект.Элементы.Номенклатура.Текущи
еДанные.Коэфф = 1;
ОсновнаяЕдиницаОтгруз-
ки = Об-
щийСрв.ПолучитьОсновнуюЕдиниц
уОтгрузкиНоменклату-
ры(ЭтотОбъект.Элементы.Номенкла
ту-
ра.ТекущиеДанные.Номенклатура);
Если Не ОсновнаяЕдини-
цаОтгрузки.Пустая() Тогда
ЭтотОбъ-
ект.Элементы.Номенклатура.Текущи
еДанные.ЕдИзмерения = Основная-
ЕдиницаОтгрузки;
ЭтотОбъ-
ект.Элементы.Номенклатура.Текущи
еДанные.Коэфф = Об-
щийСрв.ПолучитьКоэффициент(Это
тОбъ-
ект.Элементы.Номенклатура.Текущи
еДанные.ЕдИзмерения);
КонецЕсли;
Об-
щийСрв.РассчитатьСуммуСтроки(О
бъект.Дата, ЭтотОбъ-
ект.Элементы.Номенклатура.Текущи
еДанные.Номенклатура,
Это-
тОбъ-
ект.Элементы.Номенклатура.Текущи
еДанные.Количество,
Это-
тОбъ-
ект.Элементы.Номенклатура.Текущи
еДанные.Коэфф,
Объ-
ект.ТипЦен,
Это-
тОбъ-
ект.Элементы.Номенклатура.Текущи
еДанные.Цена,
ЭтотОбъ-
ект.Элементы.Номенклатура.Текущи
еДанные.Сумма);
КонецПроцедуры
&НаКлиенте
Процедура НоменклатураКоличе-
ствоПриИзменении(Элемент)
Об-
щийСрв.РассчитатьСуммуСтроки(О
бъект.Дата, ЭтотОбъ-
ект.Элементы.Номенклатура.Текущи
еДанные.Номенклатура,
Это-
тОбъ-
ект.Элементы.Номенклатура.Текущи
еДанные.Количество,
Это-
тОбъ-
ект.Элементы.Номенклатура.Текущи
еДанные.Коэфф,
Объ-
ект.ТипЦен,
Это-
тОбъ-
ект.Элементы.Номенклатура.Текущи
еДанные.Цена,
ЭтотОбъ-
ект.Элементы.Номенклатура.Текущи
еДанные.Сумма);
КонецПроцедуры
&НаКлиенте
Процедура НоменклатураЕдИзмере-
нияПриИзменении(Элемент)
ЭтотОбъ-
ект.Элементы.Номенклатура.Текущи
еДанные.Коэфф = Об-
щийСрв.ПолучитьКоэффициент(Это
тОбъ-
ект.Элементы.Номенклатура.Текущи
еДанные.ЕдИзмерения);
Об-
щийСрв.РассчитатьСуммуСтроки(О
бъект.Дата, ЭтотОбъ-
ект.Элементы.Номенклатура.Текущи
еДанные.Номенклатура,
Это-
тОбъ-
ект.Элементы.Номенклатура.Текущи
еДанные.Количество,
Это-
тОбъ-
ект.Элементы.Номенклатура.Текущи
еДанные.Коэфф,
Объ-
ект.ТипЦен,
Это-
тОбъ-
ект.Элементы.Номенклатура.Текущи
еДанные.Цена,
94
ЭтотОбъ-
ект.Элементы.Номенклатура.Текущи
еДанные.Сумма);
КонецПроцедуры
// при выборе номенклатуры - про-
верка резерва
&НаКлиенте
Процедура НоменклатураНоменкла-
тураОбработкаВыбора(Элемент,
ВыбранноеЗначение, Стандарт-
наяОбработка)
Если Зарезервирова-
но(ВыбранноеЗначение) Тогда
Стандарт-
наяОбработка = Ложь;
КонецЕсли;
КонецПроцедуры
// проверка не зарезервирована ли
ВыбНоменклатура в других задачах
&НаСервере
Функция Зарезервирова-
но(ВыбНоменклатура)
Если Не ВыбНоменклату-
ра.ВидНоменклатуры.Резервируется
Тогда
Возврат Ложь;
КонецЕсли;
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ЗадачаНомен-
клатура.Номенклатура,
| Задача.Ссылка
КАК СамаЗадача
|ИЗ
| Доку-
мент.Задача.Номенклатура КАК
ЗадачаНоменклатура
| ЛЕ-
ВОЕ СОЕДИНЕНИЕ Доку-
мент.Задача КАК Задача
| ПО
ЗадачаНоменклатура.Ссылка = Зада-
ча.Ссылка
|ГДЕ
| ЗадачаНомен-
клатура.Номенклатура =
&ВыбНоменклатура
| И Зада-
ча.Проведен = Ложь
| И (
(&ДатаНачалаРезерва МЕЖДУ
Задача.Дата И Зада-
ча.ОжидаемаяДатаВыполнения)
| ИЛИ
(&ДатаОкончанияРезерва МЕЖДУ
Задача.Дата И Зада-
ча.ОжидаемаяДатаВыполнения)
| ИЛИ
(Задача.Дата МЕЖДУ
&ДатаНачалаРезерва И
&ДатаОкончанияРезерва)
| ИЛИ
(Задача.ОжидаемаяДатаВыполнения
МЕЖДУ &ДатаНачалаРезерва И
&ДатаОкончанияРезерва)
| )
|";
За-
прос.УстановитьПараметр("ВыбНом
енклатура", Выб-
Номенклатура);
За-
прос.УстановитьПараметр("ДатаНач
алаРезерва", Нача-
лоДня(Объект.Дата));
За-
прос.УстановитьПараметр("ДатаОко
нчанияРезерва", Ко-
нецДня(Объект.ОжидаемаяДатаВып
олнения));
Результат = За-
прос.Выполнить();
Выборка = Резуль-
тат.Выбрать();
Пока Выбор-
ка.Следующий() Цикл
Сооб-
щить(ВыбНоменклатура.Наименова
ние + " зарезервировано "+ Об-
щийСрв.ПредставлениеЗадачи(Выбо
рка.СамаЗадача));
Возврат Истина
КонецЦикла;
Возврат Ложь;
КонецФункции
// при изменени даты документа
проверить - нет ли зарезервирован-
ных ресурсов
&НаКлиенте
Процедура ДатаПриИзмене-
нии(Элемент)
Для Каждого ТекСтрока-
Номенклатура Из Объ-
ект.Номенклатура Цикл
Зарезервирова-
но(ТекСтрокаНоменклатура.Номенк
латура);
КонецЦикла;
КонецПроцедуры
//----------------------------------------------
----------------------------------
// ЗАКЛАДКА ФАЙЛЫ
// по команде Создать новый файл
&НаКлиенте
Процедура ФайлыСоздать(Команда)
П = Новый Структура;
П.Вставить("Документ",
Объект.Ссылка);
ОткрытьФор-
му("Справочник.ХранимыеФайлы.Ф
ормаОбъекта", П, ЭтотОбъ-
ект.Элементы.Файлы);
// результат выбора см. в
ОбработкаВыбора элемента формы
Файлы (таблица)
КонецПроцедуры
&НаКлиенте
Процедура ФайлыОбработкаВыбо-
ра(Элемент, ВыбранноеЗначение,
СтандартнаяОбработка)
НоваяСтрока = Объ-
ект.Файлы.Добавить();
НоваяСтрока.Файл = Вы-
бранноеЗначе-
ние.Получить(0).Значение;
НоваяСтро-
ка.Комментарий = ВыбранноеЗначе-
ние.Получить(0).Значение;
КонецПроцедуры
&НаКлиенте
Процедура ОткрытьФайл(Команда)
ХранимыйФайл = Это-
тОбъ-
ект.Элементы.Файлы.ТекущиеДанн
ые.Файл;
ОткрытьХранимый-
Файл(ХранимыйФайл);
КонецПроцедуры
&НаКлиенте
Процедура ОткрытьХранимый-
Файл(ХранимыйФайл)
Если ХранимыйФайл =
Неопределено Тогда
Возврат;
КонецЕсли;
Файл = Новый
Файл(ОбщийСрв.ПолучитьИмяФайл
а(ХранимыйФайл));
ИмяФайла = Полу-
читьИмяВременногоФай-
ла(Файл.Расширение);
Адрес = ПолучитьНавига-
ционнуюСсылку(ХранимыйФайл,
"ДанныеФайла");
ПолучитьФайл(Адрес,
ИмяФайла, Ложь);
ЗапуститьПриложе-
ние(ИмяФайла);
КонецПроцедуры
// префикс номера документа
Процедура ПриУстановкеНового-
Номера(СтандартнаяОбработка,
Префикс)
Префикс = Об-
мен.ПолучитьПрефиксНомера();
КонецПроцедуры
// при вводе нового документа
Процедура ОбработкаЗаполне-
ния(Основание, Значение)
Об-
щийСрв.ПриВводеНовойЗадачи(Это
тОбъект); // заполнить все реквизиты
по-умолчанию для новой задачи
// если вводится на осно-
вании Контрагента
Если ТипЗнч(Основание)
=
Тип("СправочникСсылка.Контраген
ты") Тогда
Контрагент
= Основание;
//
основание - это контрагент
95
Отвественный =
Основание.Отвественный; // отвест-
венный по задаче - ответсвенный по
контрагенту
Исполнитель =
Исполнители.Добавить(); //
первый исполнитель -
Исполни-
тель.Исполнитель = Основа-
ние.Отвественный;
Исполни-
тель.Процент = 100;
КонецЕсли;
// если вводится на осно-
вании другой задачи
Если ТипЗнч(Основание)
= Тип("ДокументСсылка.Задача")
Тогда
Об-
щийСрв.ПриВводеНовойЗадачи(Это
тОбъект, Основание);
ДокОснование
= Докумен-
ты.Задача.ПустаяСсылка();
КонецЕсли;
Если ТипЗнч(Основание)
= Тип("Структура") Тогда //если
вводлится новый из списка с уста-
новленным отбором
// то данные
заполняются автоматически из отбо-
ра "Заполнять из данных заполне-
ния"
КонецЕсли
КонецПроцедуры
// если копирование - то переопреде-
лить логику копирования
Процедура ПриКопирова-
нии(ОбъектКопирования)
Автор =
ПараметрыСеанса.глПользователь;
// автор - текущий пользователь
Отвественный = Парамет-
рыСеанса.глПользователь; // автор -
текущий пользователь
Статус =
Справочники.Статусы.Новая;
// новая задача - статус
Новая
ДокОснование = Объект-
Копирования.Ссылка; // Док
основание - та задача из котрой
скопировали
Переписка.Очистить();
Исполнители.Очистить();
Подзадачи.Очистить();
Номенклатура.Очистить();
КонецПроцедуры
// перед удалением документа
Процедура ПередУдалением(Отказ)
// проверка на закрытый
период
Если Об-
щийСрв.ВЗакрытомПериоде(ЭтотОб
ъект) Тогда
Сооб-
щить(ОбщийСрв.ПредставлениеЗада
чи(ЭтотОбъект) + "Находится в
закрытом периоде. Удаление невоз-
можно");
Отказ = Истина;
Возврат;
КонецЕсли;
// проверка Проведена
Если (ЭтотОбъ-
ект.Проведен И Констан-
ты.ЗапретПроведенных.Получить())
И Не ПараметрыСеан-
са.глЗаписьВедетИсполнитель Тогда
Сооб-
щить(ОбщийСрв.ПредставлениеЗада
чи(ЭтотОбъект) + "Уже выполнена.
Удаление невозможно");
Отказ = Истина;
Возврат;
КонецЕсли;
// проверка прав
Если Не Об-
щийСрв.ПроверкаПрав(Автор, Па-
раметрыСеанса.глПользователь)
Тогда
Сооб-
щить(ОбщийСрв.ПредставлениеЗада
чи(ЭтотОбъект) + "Нет прав удалять
чужой документ");
Отказ = Истина;
Возврат;
КонецЕсли;
// удалить вхождение
этого документа в табличную часть
Подзадачи любых остальных доку-
ментов
ТЗРодителей = Сформи-
роватьСписокРодите-
лей(ЭтотОбъект.Ссылка); // сформи-
ровать ТЗ всех документов, в кото-
рые входит удаляемая
Для Каждого СтрокаРоди-
тель Из ТЗРодителей Цикл // для
каждого родителя
УдалитьПодза-
дачу(СтрокаРодитель.Ссылка, Это-
тОбъект.Ссылка); // удалить теку-
щую(удяляемую) задачу из родителя
КонецЦикла
КонецПроцедуры
// удалить ЗадачаРебенок из таблич-
ной части Подзадачи у ЗадачаРоди-
тель
Процедура УдалитьПодзада-
чу(ЗадачаРодитель, ЗадачаРебенок)
Если ЗадачаРоди-
тель.Пустая() Тогда
Возврат;
КонецЕсли;
ЗадачаРодительОбъект =
ЗадачаРодитель.ПолучитьОбъект();
СтруктураОтбора = Но-
вый Структура("Подзадача", Задача-
Ребенок);
МассивУдаляемыхСтрок =
ЗадачаРодительОбъ-
ект.Подзадачи.НайтиСтроки(Структ
ураОтбора);
Для Каждого Элемент-
Массива Из МассивУдаляе-
мыхСтрок Цикл
ЗадачаРоди-
тельОбъ-
ект.Подзадачи.Удалить(ЭлементМас
сива);
КонецЦикла;
ЗадачаРодительОбъ-
ект.Записать();
КонецПроцедуры
// сформироват ТЗ документов, в
которые ПодЗадачаРебенок входит в
таб часть Подзадачи ( вявном виде,
не через рекурсию)
Функция СформироватьСписокРо-
дителей(ПодЗадачаРебенок)
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Задачи.Ссылка
|ИЗ
| Доку-
мент.Задача.Подзадачи КАК Зада-
чаПодзадачи
| ЛЕ-
ВОЕ СОЕДИНЕНИЕ Доку-
мент.Задача КАК Задачи
| ПО
ЗадачаПодзадачи.Ссылка = Зада-
чи.Ссылка
|ГДЕ
| ЗадачаПодзада-
чи.Подзадача = &ПодзадачаРебенок
|";
За-
прос.УстановитьПараметр("Подзада
чаРебенок", ПодзадачаРебенок);
РезультатЗапроса = За-
прос.Выполнить();
ТЗ = РезультатЗапро-
са.Выгрузить();
Возврат ТЗ;
КонецФункции
// провести все непроведенные под-
задачи из ЗадачаОбъект и провести
ее саму
Процедура ВыполнитьВсеПодзада-
чиПринудительно(ЗадачаОбъект)
Для Каждого ТекСтрока-
Подзадача Из ЗадачаОбъ-
ект.Подзадачи Цикл // по всем стро-
кам таб. части Подзадачи
Если ТекСтро-
каПодзадача.Подзадача.Проведен <>
Истина Тогда // если не была
проведена
Вы-
полнитьВсеПодзадачиПринудитель-
но(ТекСтрокаПодзадача.Подзадача.
ПолучитьОбъект()); // провести все
ее подзадачи
ТекСтрокаПодзада-
ча.Подзадача.ПолучитьОбъект().Зап
исать(РежимЗаписиДокумента.Пров

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

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