Этапы ресурсной спецификации / Модуль объекта

файл
#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда

#Область ПрограммныйИнтерфейс

// Проверяет заполнение реквизитов этапа
// Используется при записи действующей спецификации и при редактировании этапа в заказе на производство.
//
// Параметры:
//	СообщитьНаименованиеЭтапа - Булево - если Истина то в текст сообщений об ошибках будет добавлено представление этапа
//  ПутьКДанным     - Строка - путь к данным (путь к реквизиту формы), используется для корректного вывода сообщений
//  Отказ 			- Булево - истина, если найдены ошибки.
//
// Возвращаемое значение:
//   Булево   - Истина, если найдены ошибки заполнения.
//
Функция ПроверитьЗаполнениеРеквизитов(СообщитьНаименованиеЭтапа, Знач ПутьКДанным = "", Отказ = Ложь) Экспорт

	ЕстьОшибки = Ложь;
	
	Если ПутьКДанным = "" Тогда
		КлючДанных = ЭтотОбъект;
	Иначе
		КлючДанных = Неопределено;
	КонецЕсли;
	
	ПроверитьЗаполнениеРеквизитовШапки(КлючДанных, СообщитьНаименованиеЭтапа, ЕстьОшибки, ПутьКДанным);
	
	
	Если ЕстьОшибки Тогда
		Отказ = Истина;
	КонецЕсли; 
	
	Возврат НЕ ЕстьОшибки;
	
КонецФункции


#КонецОбласти

#Область ОбработчикиСобытий

Процедура ОбработкаПроверкиЗаполнения(Отказ, ПроверяемыеРеквизиты)
	
	МассивНепроверяемыхРеквизитов = Новый Массив;
	
	// Эти реквизиты проверяются только при записи действующей спецификации
	МассивНепроверяемыхРеквизитов.Добавить("Подразделение");
	МассивНепроверяемыхРеквизитов.Добавить("КоэффициентМаршрутнойКарты");
	МассивНепроверяемыхРеквизитов.Добавить("ОдновременноПроизводимоеКоличествоЕдиницПартийИзделий");
	МассивНепроверяемыхРеквизитов.Добавить("ВидыРабочихЦентров");
	МассивНепроверяемыхРеквизитов.Добавить("ВидыРабочихЦентров.ВидРабочегоЦентра");
	МассивНепроверяемыхРеквизитов.Добавить("ВидыРабочихЦентров.ВремяРаботы");
	МассивНепроверяемыхРеквизитов.Добавить("ВидыРабочихЦентров.ЕдиницаИзмерения");
	МассивНепроверяемыхРеквизитов.Добавить("ВидыРабочихЦентров.ВариантНаладки");
	
	ОбщегоНазначения.УдалитьНепроверяемыеРеквизитыИзМассива(ПроверяемыеРеквизиты, МассивНепроверяемыхРеквизитов);
	
	СтатусСпецификации = Неопределено;
	Если НЕ ДополнительныеСвойства.Свойство("СтатусСпецификации", СтатусСпецификации) Тогда
		СтатусСпецификации = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(Владелец, "Статус");
	КонецЕсли;
	
	Если СтатусСпецификации <> Перечисления.СтатусыСпецификаций.Действует Тогда
		Возврат; // только проверка дополнительных реквизитов
	КонецЕсли;
	
	Если НомерЭтапа >= НомерСледующегоЭтапа И НомерСледующегоЭтапа <> 0 Тогда
		ТекстСообщения = НСтр("ru = 'Номер следующего этапа должен быть больше номера этапа.'");
		ОбщегоНазначения.СообщитьПользователю(ТекстСообщения, ЭтотОбъект, "НомерСледующегоЭтапа",, Отказ);
	КонецЕсли;
	
	Если ПроизводствоНаСтороне
		И УслугиПереработчика.Количество() > 1
		И Не ПолучитьФункциональнуюОпцию("ИспользоватьПроизводствоНаСтороне2_5") Тогда
		ТекстСообщения = НСтр("ru = 'Указание нескольких услуг переработчика доступно только при включенном учете по версии 2.5.'");
		ОбщегоНазначения.СообщитьПользователю(ТекстСообщения, ЭтотОбъект, "УслугиПереработчика",, Отказ);
	КонецЕсли;
	
	ПроверитьЗаполнениеРеквизитов(Ложь,, Отказ);
	
КонецПроцедуры

Процедура ПередЗаписью(Отказ)
	
	Если ОбменДанными.Загрузка Тогда
		Возврат;
	КонецЕсли;
	
	ОбновлениеИнформационнойБазы.ПроверитьОбъектОбработан(ЭтотОбъект);
	
	
	Если НЕ Владелец.Пустая() И НЕ ДополнительныеСвойства.Свойство("РазрешитьЗапись") Тогда
		
		// Если этап удаляется, то проверим что он не используется в спецификации
		Если НЕ ЭтоНовый()
			И ПометкаУдаления
			И НЕ ОбщегоНазначения.ЗначениеРеквизитаОбъекта(Ссылка, "ПометкаУдаления") Тогда
			
			Запрос = Новый Запрос;
			Запрос.Текст = 
			"ВЫБРАТЬ ПЕРВЫЕ 1
			|	ТаблицаСвязи.Ссылка
			|ИЗ
			|	Справочник.РесурсныеСпецификации.ВыходныеИзделия КАК ТаблицаСвязи
			|ГДЕ
			|	ТаблицаСвязи.ЭтапРедактирование = &Этап
			|	И ТаблицаСвязи.Ссылка = &Владелец
			|
			|ОБЪЕДИНИТЬ ВСЕ
			|
			|ВЫБРАТЬ ПЕРВЫЕ 1
			|	ТаблицаСвязи.Ссылка
			|ИЗ
			|	Справочник.РесурсныеСпецификации.МатериалыИУслуги КАК ТаблицаСвязи
			|ГДЕ
			|	ТаблицаСвязи.ЭтапРедактирование = &Этап
			|	И ТаблицаСвязи.Ссылка = &Владелец
			|
			|ОБЪЕДИНИТЬ ВСЕ
			|
			|ВЫБРАТЬ ПЕРВЫЕ 1
			|	ТаблицаСвязи.Ссылка
			|ИЗ
			|	Справочник.РесурсныеСпецификации.Трудозатраты КАК ТаблицаСвязи
			|ГДЕ
			|	ТаблицаСвязи.ЭтапРедактирование = &Этап
			|	И ТаблицаСвязи.Ссылка = &Владелец
			|
			|ОБЪЕДИНИТЬ ВСЕ
			|
			|ВЫБРАТЬ ПЕРВЫЕ 1
			|	ТаблицаСвязи.Ссылка
			|ИЗ
			|	Справочник.РесурсныеСпецификации КАК ТаблицаСвязи
			|ГДЕ
			|	ТаблицаСвязи.Ссылка = &Владелец
			|	И ТаблицаСвязи.Статус = ЗНАЧЕНИЕ(Перечисление.СтатусыСпецификаций.Действует)";
			
			Запрос.УстановитьПараметр("Этап",     Ссылка);
			Запрос.УстановитьПараметр("Владелец", Владелец);
			
			Результат = Запрос.Выполнить();
			Если НЕ Результат.Пустой() Тогда
				ТекстСообщения = НСтр("ru = 'Этап используется в спецификации. Удаление невозможно.'");
				ОбщегоНазначения.СообщитьПользователю(ТекстСообщения, Ссылка,,, Отказ);
			КонецЕсли; 
			
		КонецЕсли; 
		
	КонецЕсли;
	
	ПроверитьСтатусВладельца(Отказ);
	
	Если НЕ Отказ И НеобходимоРассчитатьДлительностьПроизводства() Тогда
		
		ДополнительныеСвойства.Вставить("РассчитатьДлительностьПроизводства");
		
	КонецЕсли;
	
КонецПроцедуры

Процедура ОбработкаЗаполнения(ДанныеЗаполнения, СтандартнаяОбработка)
	
	Если ТипЗнч(ДанныеЗаполнения) = Тип("Структура") И ДанныеЗаполнения.Свойство("Владелец") Тогда
		
		Владелец = ДанныеЗаполнения.Владелец;
		ЗаполнитьНовыйОбъект();
		
	КонецЕсли; 
	
	// Заполняем программно, т.к. ед. времени используется в нескольких местах
	ОсновнаяЕдиницаВремениБуфера = Справочники.ЭтапыПроизводства.ОсновнаяЕдиницаВремениБуфера();
	ЕдиницаИзмеренияПредварительногоБуфера = ОсновнаяЕдиницаВремениБуфера;
	ЕдиницаИзмеренияЗавершающегоБуфера     = ОсновнаяЕдиницаВремениБуфера;
	
КонецПроцедуры

Процедура ПриКопировании(ОбъектКопирования)
	
	ЗаполнитьНовыйОбъект();
	
	УправлениеДаннымиОбИзделиях.ОбновитьКлючиСвязиОбъекта(ЭтотОбъект, Истина);
	
КонецПроцедуры

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

#КонецОбласти

#Область СлужебныеПроцедурыИФункции

Процедура ПроверитьЗаполнениеУказанныхРеквизитов(РеквизитыДляПроверки, ЗначенияРеквизитов, ПараметрыТабличнойЧасти, КлючДанных, ПутьКДанным, СообщитьНаименованиеЭтапа, Отказ)

	Для каждого ПараметрыРеквизита Из РеквизитыДляПроверки Цикл
		ИмяПоля = ПараметрыРеквизита.Значение;
		Если НЕ ЗначениеЗаполнено(ЗначенияРеквизитов[ИмяПоля]) Тогда
			
			Если ПараметрыТабличнойЧасти = Неопределено Тогда
				
				Поле = ИмяПоля;
				Если СообщитьНаименованиеЭтапа
					И КлючДанных <> Неопределено И ЗначениеЗаполнено(КлючДанных.Наименование) Тогда
					ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
							НСтр("ru = 'Поле ""%1"" не заполнено (этап: %2).'"), 
							ПараметрыРеквизита.Представление,
							КлючДанных.Наименование);
				Иначе
					ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
							НСтр("ru = 'Поле ""%1"" не заполнено.'"), 
							ПараметрыРеквизита.Представление);
				КонецЕсли; 
				
			Иначе

				Поле = ОбщегоНазначенияКлиентСервер.ПутьКТабличнойЧасти(ПараметрыТабличнойЧасти.Имя, ПараметрыТабличнойЧасти.НомерСтроки, ИмяПоля);
				Если СообщитьНаименованиеЭтапа
					И КлючДанных <> Неопределено И ЗначениеЗаполнено(КлючДанных.Наименование) Тогда
					ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
							НСтр("ru = 'Не заполнена колонка ""%1"" в строке %2 списка ""%3"" (этап: %4)'"), 
							ПараметрыРеквизита.Представление,
							ПараметрыТабличнойЧасти.НомерСтроки,
							ПараметрыТабличнойЧасти.Представление,
							КлючДанных.Наименование);
				Иначе
					ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
							НСтр("ru = 'Не заполнена колонка ""%1"" в строке %2 списка ""%3""'"), 
							ПараметрыРеквизита.Представление,
							ПараметрыТабличнойЧасти.НомерСтроки,
							ПараметрыТабличнойЧасти.Представление);
				КонецЕсли; 
			КонецЕсли; 
					
			ОбщегоНазначения.СообщитьПользователю(ТекстСообщения, КлючДанных, Поле, ПутьКДанным, Отказ); 
		КонецЕсли;
	КонецЦикла;

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

Процедура ЗаполнитьНовыйОбъект()

	НомерЭтапа = Справочники.ЭтапыПроизводства.НовыйНомерЭтапа(Владелец);
	НомерСледующегоЭтапа = НомерЭтапа + 1;
	
	Если ПроизводствоНаСтороне Тогда
		Партнер = Справочники.Партнеры.ПустаяСсылка();
	Иначе
		Партнер = Справочники.Организации.ПустаяСсылка();
	КонецЕсли;
	
КонецПроцедуры

Функция НеобходимоРассчитатьДлительностьПроизводства()
	
	Если НЕ ДополнительныеСвойства.Свойство("ЗапретитьРасчетДнейДоОкончания")
		И ЗначениеЗаполнено(Ссылка)
		И ЗначениеЗаполнено(Владелец)
		И ОбщегоНазначения.ЗначениеРеквизитаОбъекта(Владелец, "Статус") = Перечисления.СтатусыСпецификаций.Действует Тогда
		
		ДанныеДоИзменения = ОбщегоНазначения.ЗначенияРеквизитовОбъекта(
			Ссылка, 
			"Подразделение,ДлительностьЭтапа,ЕдиницаИзмеренияДлительностиЭтапа");
		
			Если (Подразделение <> ДанныеДоИзменения.Подразделение
					ИЛИ ДлительностьЭтапа <> ДанныеДоИзменения.ДлительностьЭтапа
					ИЛИ ЕдиницаИзмеренияДлительностиЭтапа <> ДанныеДоИзменения.ЕдиницаИзмеренияДлительностиЭтапа
				) Тогда
			
			Возврат Истина;
			
		КонецЕсли;
		
	КонецЕсли;
	
	Возврат Ложь;
	
КонецФункции

Процедура ПроверитьЗаполнениеРеквизитовШапки(КлючДанных, СообщитьНаименованиеЭтапа, ЕстьОшибки, ПутьКДанным)

	НастройкиПроизводства = ПроизводствоСерверПовтИсп.НастройкиПодсистемыПроизводство();
	
	РеквизитыДляПроверки = Новый СписокЗначений;
	РеквизитыДляПроверки.Добавить("Подразделение", НСтр("ru = 'Подразделение'"));
	
	Если ПланироватьРаботуВидовРабочихЦентров Тогда
		
		
	КонецЕсли;
	
	Если ЗначениеЗаполнено(ДлительностьЭтапа) Тогда
		
		РеквизитыДляПроверки.Добавить(
			"ЕдиницаИзмеренияДлительностиЭтапа",
			НСтр("ru = 'Единица измерения длительности этапа'"));
		
	КонецЕсли;
	
	Если НастройкиПроизводства.ИспользуетсяПроизводство22 И НЕ НастройкиПроизводства.ИспользуетсяПроизводство21
		И НЕ ПолучитьФункциональнуюОпцию("ХранитьОперацииВРесурсныхСпецификациях")
		И ЗначениеЗаполнено(МаршрутнаяКарта) Тогда
		
		РеквизитыДляПроверки.Добавить(
			"КоэффициентМаршрутнойКарты",
			НСтр("ru = 'Коэффициент маршрутной карты'"));
			
	КонецЕсли;
	
	ПроверитьЗаполнениеУказанныхРеквизитов(
		РеквизитыДляПроверки, ЭтотОбъект, Неопределено, КлючДанных, ПутьКДанным, СообщитьНаименованиеЭтапа, ЕстьОшибки);
	
КонецПроцедуры

Процедура ПроверитьСтатусВладельца(Отказ)
	
	Если Отказ ИЛИ НЕ ЭтоНовый() Тогда
		Возврат;
	КонецЕсли;
	
	Если ДополнительныеСвойства.Свойство("НеПроверятьСтатусВладельца") Тогда
		Возврат;
	КонецЕсли;
	
	СтатусВладельца = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(Владелец, "Статус");
	Если СтатусВладельца = Перечисления.СтатусыСпецификаций.Действует Тогда
		ОбщегоНазначения.СообщитьПользователю(
			НСтр("ru = 'Спецификация имеет статус ""Действует"". Добавление новых этапов недоступно.'"),
			Владелец,,,
			Отказ);
	КонецЕсли;
	
КонецПроцедуры


#КонецОбласти

#КонецЕсли

Связанные материалы