Файл: Разработка конфигурации «Планирование производства» в среде 1С.pdf

ВУЗ: Не указан

Категория: Курсовая работа

Дисциплина: Не указана

Добавлен: 30.03.2023

Просмотров: 500

Скачиваний: 1

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.

Программный код

// префикс номера документа

Процедура ПриУстановкеНовогоНомера(СтандартнаяОбработка, Префикс)

Префикс = Обмен.ПолучитьПрефиксНомера();

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

// при вводе нового документа

Процедура ОбработкаЗаполнения(Основание, Значение)

ОбщийСрв.ПриВводеНовойЗадачи(ЭтотОбъект); // заполнить все реквизиты по-умолчанию для новой задачи

// если вводится на основании Контрагента

Если ТипЗнч(Основание) = Тип("СправочникСсылка.Контрагенты") Тогда

Контрагент = Основание; // основание - это контрагент

Отвественный = Основание.Отвественный; // отвественный по задаче - ответсвенный по контрагенту

Исполнитель = Исполнители.Добавить(); // первый исполнитель -

Исполнитель.Исполнитель = Основание.Отвественный;

Исполнитель.Процент = 100;

КонецЕсли;

// если вводится на основании другой задачи

Если ТипЗнч(Основание) = Тип("ДокументСсылка.Задача") Тогда

ОбщийСрв.ПриВводеНовойЗадачи(ЭтотОбъект, Основание);

ДокОснование = Документы.Задача.ПустаяСсылка();

КонецЕсли;

Если ТипЗнч(Основание) = Тип("Структура") Тогда //если вводлится новый из списка с установленным отбором

// то данные заполняются автоматически из отбора "Заполнять из данных заполнения"

КонецЕсли

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

// если копирование - то переопределить логику копирования

Процедура ПриКопировании(ОбъектКопирования)

Автор = ПараметрыСеанса.глПользователь; // автор - текущий пользователь

Отвественный = ПараметрыСеанса.глПользователь; // автор - текущий пользователь

Статус = Справочники.Статусы.Новая; // новая задача - статус Новая

ДокОснование = ОбъектКопирования.Ссылка; // Док основание - та задача из котрой скопировали

Переписка.Очистить();

Исполнители.Очистить();

Подзадачи.Очистить();

Номенклатура.Очистить();

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

// перед удалением документа

Процедура ПередУдалением(Отказ)

// проверка на закрытый период

Если ОбщийСрв.ВЗакрытомПериоде(ЭтотОбъект) Тогда

Сообщить(ОбщийСрв.ПредставлениеЗадачи(ЭтотОбъект) + "Находится в закрытом периоде. Удаление невозможно");

Отказ = Истина;

Возврат;

КонецЕсли;

// проверка Проведена

Если (ЭтотОбъект.Проведен И Константы.ЗапретПроведенных.Получить()) И Не ПараметрыСеанса.глЗаписьВедетИсполнитель Тогда

Сообщить(ОбщийСрв.ПредставлениеЗадачи(ЭтотОбъект) + "Уже выполнена. Удаление невозможно");

Отказ = Истина;

Возврат;

КонецЕсли;


// проверка прав

Если Не ОбщийСрв.ПроверкаПрав(Автор, ПараметрыСеанса.глПользователь) Тогда

Сообщить(ОбщийСрв.ПредставлениеЗадачи(ЭтотОбъект) + "Нет прав удалять чужой документ");

Отказ = Истина;

Возврат;

КонецЕсли;

// удалить вхождение этого документа в табличную часть Подзадачи любых остальных документов

ТЗРодителей = СформироватьСписокРодителей(ЭтотОбъект.Ссылка); // сформировать ТЗ всех документов, в которые входит удаляемая

Для Каждого СтрокаРодитель Из ТЗРодителей Цикл // для каждого родителя

УдалитьПодзадачу(СтрокаРодитель.Ссылка, ЭтотОбъект.Ссылка); // удалить текущую(удяляемую) задачу из родителя

КонецЦикла

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

// удалить ЗадачаРебенок из табличной части Подзадачи у ЗадачаРодитель

Процедура УдалитьПодзадачу(ЗадачаРодитель, ЗадачаРебенок)

Если ЗадачаРодитель.Пустая() Тогда

Возврат;

КонецЕсли;

ЗадачаРодительОбъект = ЗадачаРодитель.ПолучитьОбъект();

СтруктураОтбора = Новый Структура("Подзадача", ЗадачаРебенок);

МассивУдаляемыхСтрок = ЗадачаРодительОбъект.Подзадачи.НайтиСтроки(СтруктураОтбора);

Для Каждого ЭлементМассива Из МассивУдаляемыхСтрок Цикл

ЗадачаРодительОбъект.Подзадачи.Удалить(ЭлементМассива);

КонецЦикла;

ЗадачаРодительОбъект.Записать();

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

// сформироват ТЗ документов, в которые ПодЗадачаРебенок входит в таб часть Подзадачи ( вявном виде, не через рекурсию)

Функция СформироватьСписокРодителей(ПодЗадачаРебенок)

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

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

"ВЫБРАТЬ

| Задачи.Ссылка

|ИЗ

| Документ.Задача.Подзадачи КАК ЗадачаПодзадачи

| ЛЕВОЕ СОЕДИНЕНИЕ Документ.Задача КАК Задачи

| ПО ЗадачаПодзадачи.Ссылка = Задачи.Ссылка

|ГДЕ

| ЗадачаПодзадачи.Подзадача = &ПодзадачаРебенок

|";

Запрос.УстановитьПараметр("ПодзадачаРебенок", ПодзадачаРебенок);

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

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

Возврат ТЗ;

КонецФункции

// провести все непроведенные подзадачи из ЗадачаОбъект и провести ее саму

Процедура ВыполнитьВсеПодзадачиПринудительно(ЗадачаОбъект)

Для Каждого ТекСтрокаПодзадача Из ЗадачаОбъект.Подзадачи Цикл // по всем строкам таб. части Подзадачи

Если ТекСтрокаПодзадача.Подзадача.Проведен <> Истина Тогда // если не была проведена

ВыполнитьВсеПодзадачиПринудительно(ТекСтрокаПодзадача.Подзадача.ПолучитьОбъект()); // провести все ее подзадачи


ТекСтрокаПодзадача.Подзадача.ПолучитьОбъект().Записать(РежимЗаписиДокумента.Проведение, РежимПроведенияДокумента.Неоперативный); // провести ее саму

Сообщить("Выполнена подзадача " + ОбщийСрв.ПредставлениеЗадачи(ТекСтрокаПодзадача.Подзадача));

КонецЕсли;

КонецЦикла;

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

// проверить, есть ли среди ТЧ Исполнители записи без отметки исполнения

Функция ПроверитьИсполнение()

Исполненно = Истина;

Для Каждого ТекСтрокаИсполнитель Из Исполнители Цикл

Если ТекСтрокаИсполнитель.ДатаИсполнения = Дата(01,01,0001,00,00,00) Тогда

Сообщить("Задача не может быть выполнена, так как исполнитель \" + ТекСтрокаИсполнитель.Исполнитель +

"\ не проставил отметку исполнения");

Исполненно = Ложь;

КонецЕсли;

Если Не ТекСтрокаИсполнитель.РезультатИсполнения.Пустая() Тогда

Если Не ТекСтрокаИсполнитель.РезультатИсполнения.Успех Тогда

Сообщить("Задача не может быть выполнена, так как исполнитель \" + ТекСтрокаИсполнитель.Исполнитель +

"\ проставил отрицательную отметку исполнения");

Исполненно = Ложь;

КонецЕсли;

КонецЕсли;

КонецЦикла;

Возврат Исполненно;

КонецФункции

// действия при проведении документа

Функция ПриПроведении(Отказ)

// проверка того, что все исполнители проставили отметку об исполнении

Если Константы.ПроверятьИсполнениеПриВыполнении.Получить() Тогда // общая константа

Если ОбщийСрв.ПолучитьКонстанту(ТекущаяДата(), ОбщийСрв.ПолучитьГлПользователь(), "ПроверятьИсполнениеПриВыполнении") Тогда // настройка пользователя

Если Не ПроверитьИсполнение() Тогда

Отказ = Истина;

Возврат Ложь;

КонецЕсли;

КонецЕсли;

КонецЕсли;

// проверка того, что все подзадачи проведены

ЕстьНеВыполненыеПодзадачи = Ложь;

Для Каждого ТекСтрокаПодзадача Из Подзадачи Цикл

Если ТекСтрокаПодзадача.Подзадача.Проведен <> Истина Тогда

Сообщить(ОбщийСрв.ПредставлениеЗадачи(ЭтотОбъект) + " имеет невыполненные подзадачи");

ЕстьНеВыполненыеПодзадачи = Истина;

КонецЕсли;

КонецЦикла;

Если ЕстьНеВыполненыеПодзадачи = Истина Тогда

Если (Константы.ПринудительноВыполнятьПодзадачи.Получить()) И // общая константа

(ОбщийСрв.ПолучитьКонстанту(ТекущаяДата(), ОбщийСрв.ПолучитьГлПользователь(), "ПринудительноВыполнятьПодзадачи")) Тогда // настройка пользователя

Сообщить("Подзадачи будут выполнены принудительно...");

ВыполнитьВсеПодзадачиПринудительно(ЭтотОбъект); // автоматически провести все подзадачи данной задачи


Иначе // нельзя автоматически выполнять подзадачи

Сообщить(ОбщийСрв.ПредставлениеЗадачи(ЭтотОбъект) + " не может быть выполнена");

Отказ = Истина;

Возврат Ложь;

КонецЕсли;

КонецЕсли;

Возврат Истина

КонецФункции

// обработка проведения

Процедура ОбработкаПроведения(Отказ, РежимПроведения)

Если Не ПриПроведении(Отказ) Тогда // проверить проведение подзадач

Возврат;

КонецЕсли;

// регистр ИспользованниеНоменклатуры

Движения.ИспользованиеНоменклатуры.Записывать = Истина;

Для Каждого ТекСтрокаНоменклатура Из Номенклатура Цикл

Если ТекСтрокаНоменклатура.Наличие Тогда // если в ТЧ стоит признак наличия

Продолжить;

КонецЕсли;

Если НЕ ТекСтрокаНоменклатура.Номенклатура.ВидНоменклатуры.Списывается Тогда // если номенклатуру не надо списывать

Продолжить;

КонецЕсли;

Движение = Движения.ИспользованиеНоменклатуры.Добавить();

Движение.Период = Дата;

Движение.Номенклатура = ТекСтрокаНоменклатура.Номенклатура;

Движение.Задача = ЭтотОбъект.Ссылка;

Движение.Количество = ТекСтрокаНоменклатура.Количество;

Движение.Сумма = ТекСтрокаНоменклатура.Сумма;

КонецЦикла;

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

// обработка распроведения

Процедура ОбработкаУдаленияПроведения(Отказ)

Если Не ОтменитьПроведениеРодителей(ЭтотОбъект.Ссылка) Тогда // отменитиь проведение задач-родителей

Отказ = Истина;

Возврат;

КонецЕсли;

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

// отменить проведение всех родителей ДокСсылкаРебенок

Функция ОтменитьПроведениеРодителей(ДокСсылкаРебенок)

МассивОтменяемых = ОбщийСрв.СформироватьСписокОтменяемых(ДокСсылкаРебенок); // сформировать массив распроводимых документов

Если МассивОтменяемых.Количество() Тогда // если есть хоть один - сообщить

Сообщить ("Отмена выполнения " + ОбщийСрв.ПредставлениеЗадачи(ЭтотОбъект)

+ " приводит к отмене выполнения задач-родителей...");

КонецЕсли;

Для Каждого СтрокаОтменяемый Из МассивОтменяемых Цикл // для каждого документа из распроводимых

Если ОбщийСрв.ВЗакрытомПериоде(СтрокаОтменяемый.Значение) Тогда // если находится в закрытом периоде

Сообщить("Отмена выполенния " + ОбщийСрв.ПредставлениеЗадачи(ДокСсылкаРебенок)

+ " приводит к отмене выполенния " + ОбщийСрв.ПредставлениеЗадачи(СтрокаОтменяемый.Значение)

+ ", находящейся в закрытом периоде. Отмена не может быть выполнена");

Возврат Ложь;

КонецЕсли;

Если Не ОбщийСрв.ПроверкаПрав(СтрокаОтменяемый.Значение.Автор, ПараметрыСеанса.глПользователь) Тогда // проверка прав


Сообщить("Отмена выполенния " + ОбщийСрв.ПредставлениеЗадачи(ДокСсылкаРебенок)

+ " приводит к отмене выполенния " + ОбщийСрв.ПредставлениеЗадачи(СтрокаОтменяемый.Значение)

+ ", на редактирование которого у Вас нет прав. Отмена не может быть выполнена");

Возврат Ложь;

КонецЕсли;

КонецЦикла;

// распровести каждый

Для Каждого СтрокаОтменяемый Из МассивОтменяемых Цикл

Если СтрокаОтменяемый.Значение.ПолучитьОбъект().Проведен Тогда

СтрокаОтменяемый.Значение.ПолучитьОбъект().Записать(РежимЗаписиДокумента.ОтменаПроведения);

Сообщить("Отменено выполнение родительской " + ОбщийСрв.ПредставлениеЗадачи(СтрокаОтменяемый.Значение));

КонецЕсли;

КонецЦикла;

Возврат Истина;

КонецФункции

// перед любой записью (включая проведение и распроведение) - проверка

Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)

Головная = ЭтоГоловная(); // установить признак - головная или нет

Если ОбщийСрв.ВЗакрытомПериоде(ЭтотОбъект) Тогда // провера на закрытый период

Сообщить(ОбщийСрв.ПредставлениеЗадачи(ЭтотОбъект) + "Находится в закрытом периоде. Редактирование невозможно");

Отказ = Истина;

Возврат;

КонецЕсли;

// проверка того что проведен (тогда редактирование запрещено)

Если Не (РежимЗаписи = РежимЗаписиДокумента.Проведение Или

РежимЗаписи = РежимЗаписиДокумента.ОтменаПроведения) Тогда

Если (ЭтотОбъект.Проведен И Константы.ЗапретПроведенных.Получить()) И Не ПараметрыСеанса.глЗаписьВедетИсполнитель

И Не ПараметрыСеанса.ИдетОбменДанными Тогда

Сообщить(ОбщийСрв.ПредставлениеЗадачи(ЭтотОбъект) + "Уже выполнена. Редактирование невозможно");

Отказ = Истина;

Возврат;

КонецЕсли;

КонецЕсли;

// проверка прав

Если Не ОбщийСрв.ПроверкаПрав(Автор, ПараметрыСеанса.глПользователь) Тогда

Сообщить(ОбщийСрв.ПредставлениеЗадачи(ЭтотОбъект) + "Нет прав редактировать чужой документ");

Отказ = Истина;

Возврат;

КонецЕсли;

Если РежимЗаписи = РежимЗаписиДокумента.Проведение Тогда

РеальнаяДатаВыполнения = ТекущаяДата(); // дата реального выполнения - дата проведения

Если Константы.УстанавливатьЗавершенаУспешно.Получить() = Истина Тогда

Статус = Справочники.Статусы.ЗавершенаУспешно; // статус - успешно

КонецЕсли;

КонецЕсли;

Если РежимЗаписи = РежимЗаписиДокумента.ОтменаПроведения Тогда

РеальнаяДатаВыполнения = 0; // если распровели - значит нет реальной даты завершения