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

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

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

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

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

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

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

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

Процедура ПередЗаписью(Отказ)
	
	Если ОбменДанными.Загрузка Тогда
		Возврат;
	КонецЕсли;

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

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

Процедура ПриКопировании(ОбъектКопирования)
	
	Если ЭтоГруппа Тогда
		Возврат
	КонецЕсли; 
	
	Ответственный = Пользователи.ТекущийПользователь();
	Статус = Перечисления.СтатусыСпецификаций.ВРазработке;
	
	НачалоДействия = ТекущаяДатаСеанса();
	КонецДействия  = '00010101';
	
	// Очистим связь с этапами
	Для каждого ИмяТЧ Из ИменаТабличныхЧастей() Цикл
		Для каждого ДанныеСтроки Из ЭтотОбъект[ИмяТЧ] Цикл
			ДанныеСтроки.Этап = Справочники.ЭтапыПроизводства.ПустаяСсылка();
			ДанныеСтроки.ЭтапРедактирование = Справочники.ЭтапыПроизводства.ПустаяСсылка();
		КонецЦикла;
	КонецЦикла;
	
	
	ИдентификаторВерсииДанных = Неопределено;
	
КонецПроцедуры

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

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

#Область ПроверкаЗаполнения

#Область СтатусДействует

Процедура ПроверитьДействующуюСпецификацию(МассивНепроверяемыхРеквизитов, Отказ)

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

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

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

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

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

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

Процедура ПроверитьАвтовыборРасчетПоФормуламОтборПоСвойствам(Отказ)
	
	Если НЕ ПолучитьФункциональнуюОпцию("ИспользоватьПараметризациюРесурсныхСпецификаций") Тогда
		Возврат;
	КонецЕсли;
	
	
КонецПроцедуры

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

Процедура ПроверитьМаршрутныеКарты(Отказ) 

	
	Возврат; // обработчик пустой
	
КонецПроцедуры

Процедура ПроверитьПараметрыНазначения(Отказ)
	
	
	Возврат; // обработчик пустой
	
КонецПроцедуры

Процедура ПроверитьРеквизитыЭтапов(Отказ)

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

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

Процедура ПроверитьПовторВыходныхИзделий(Отказ)
	
	ПредставлениеТЧ = ПредставлениеТаблицыВФорме("ВыходныеИзделия");
	
	Если ВыходныеИзделия.Количество() > 1 Тогда
		
		ШаблонПовторИзделия = НСтр("ru = 'Выходное изделие ""%1"" уже описано в спецификации (см. список ""%2"", строка %3). Дублирование выходных изделий в рамках одной спецификации не допускается.'");

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

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

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


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

#Область ВсеСтатусы


Процедура ПроверитьЗаполнениеМатериалов(Отказ)
	
	ПредставлениеТЧ = ПредставлениеТаблицыВФорме("МатериалыИУслуги");

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

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

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

#Область Прочее

Функция ВыгрузитьМатериалыИУслуги()
	
	Результат = МатериалыИУслуги.Выгрузить(, 
		"НомерСтроки, 
		|Номенклатура, 
		|Характеристика,
		|ЭтапРедактирование, 
		|ПроизводитсяВПроцессе,
		|ИсточникПолученияПолуфабриката");
	
	Результат.Индексы.Добавить("ЭтапРедактирование");
	Результат.Индексы.Добавить("ЭтапРедактирование, Номенклатура");
	Результат.Индексы.Добавить("ЭтапРедактирование, Номенклатура, Характеристика");
	
	Возврат Результат;
	
КонецФункции

Функция ВыгрузитьВыходныеИзделия()
	
	Результат = ВыходныеИзделия.Выгрузить(, 
		"НомерСтроки, 
		|Номенклатура, 
		|Характеристика,
		|ЭтапРедактирование");
	
	Результат.Индексы.Добавить("ЭтапРедактирование");
	
	Возврат Результат;
	
КонецФункции

Функция ВыгрузитьВозвратныеОтходы()
	
	Результат = ВозвратныеОтходы.Выгрузить(, 
		"НомерСтроки, 
		|Номенклатура, 
		|Характеристика,
		|ЭтапРедактирование");
	
	Результат.Индексы.Добавить("ЭтапРедактирование");
	
	Возврат Результат;
	
КонецФункции


Процедура ПроверитьЭтапыПроизводстваНаСтороне(Отказ) Экспорт
	
	Если Не ПолучитьФункциональнуюОпцию("ИспользоватьПроизводствоНаСтороне2_5")
		//++ Устарело_Переработка24
		И Не ПолучитьФункциональнуюОпцию("ИспользоватьПроизводствоНаСтороне")
		//-- Устарело_Переработка24
		И Истина Тогда
		Возврат;
	КонецЕсли;
	
	Запрос = Новый Запрос("
	|ВЫБРАТЬ ПЕРВЫЕ 1
	|	ИСТИНА
	|ИЗ
	|	Справочник.ЭтапыПроизводства КАК Таблица
	|ГДЕ
	|	Таблица.Владелец = &Владелец
	|	И Таблица.ПроизводствоНаСтороне
	|	И НЕ Таблица.ПометкаУдаления");
	Запрос.УстановитьПараметр("Владелец", Ссылка);
	
	Если Запрос.Выполнить().Пустой() Тогда
		Возврат;
	КонецЕсли;
	
	// Производство на стороне доступно только для типа производственного процесса "Изготовление, сборка"
	Если ТипПроизводственногоПроцесса <> Перечисления.ТипыПроизводственныхПроцессов.Сборка Тогда
		ТекстСообщения = СтрШаблон(НСтр("ru = 'В спецификации типа ""%1"" не допускается использовать этапы, выполняемые переработчиком'"), ТипПроизводственногоПроцесса);
		ОбщегоНазначения.СообщитьПользователю(ТекстСообщения, ЭтотОбъект,,, Отказ);
		Возврат;
	КонецЕсли;
	
	// В КА не допускается в многоэтапной спецификации использовать этапы, выполняемые переработчиком
	Если МногоэтапныйПроизводственныйПроцесс И ПолучитьФункциональнуюОпцию("КомплекснаяАвтоматизация") Тогда
		ТекстСообщения = НСтр("ru = 'В многоэтапной спецификации не допускается использовать этапы, выполняемые переработчиком'");
		ОбщегоНазначения.СообщитьПользователю(ТекстСообщения, ЭтотОбъект,,, Отказ);
		Возврат;
	КонецЕсли;
	
	Запрос = Новый Запрос(
	"ВЫБРАТЬ
	|	МатериалыИУслуги.НомерСтроки                                                   КАК НомерСтроки,
	|	ВЫРАЗИТЬ(МатериалыИУслуги.Номенклатура КАК Справочник.Номенклатура)            КАК Номенклатура,
	|	ВЫРАЗИТЬ(МатериалыИУслуги.ЭтапРедактирование КАК Справочник.ЭтапыПроизводства) КАК ЭтапРедактирование,
	|	МатериалыИУслуги.ПроизводитсяВПроцессе                                         КАК ПроизводитсяВПроцессе,
	|	ВЫБОР
	|		КОГДА МатериалыИУслуги.ИсточникПолученияПолуфабриката ССЫЛКА Справочник.ЭтапыПроизводства
	|			ТОГДА ИСТИНА
	|		ИНАЧЕ ЛОЖЬ
	|	КОНЕЦ                                                                          КАК ПроизводитсяНаЭтапе,
	|	ВЫБОР
	|		КОГДА МатериалыИУслуги.ИсточникПолученияПолуфабриката ССЫЛКА Справочник.ЭтапыПроизводства
	|			ТОГДА ЛОЖЬ
	|		ИНАЧЕ ИСТИНА
	|	КОНЕЦ                                                                          КАК ПроизводитсяПоСпецификации
	|ПОМЕСТИТЬ ВТТаблица
	|ИЗ
	|	&МатериалыИУслуги КАК МатериалыИУслуги
	|;
	|
	|////////////////////////////////////////////////////////////////////////////////
	|ВЫБРАТЬ
	|	СписокЭтапов.Ссылка                КАК Ссылка,
	|	СписокЭтапов.ПроизводствоНаСтороне КАК ПроизводствоНаСтороне
	|ПОМЕСТИТЬ ВтСписокЭтапов
	|ИЗ
	|	Справочник.ЭтапыПроизводства КАК СписокЭтапов
	|ГДЕ
	|	СписокЭтапов.Владелец = &Спецификация
	|	И НЕ СписокЭтапов.ПометкаУдаления
	|	
	|ОБЪЕДИНИТЬ ВСЕ
	|
	|ВЫБРАТЬ
	|	ЗНАЧЕНИЕ(Справочник.ЭтапыПроизводства.ПустаяСсылка),
	|	МАКСИМУМ(СписокЭтапов.ПроизводствоНаСтороне)
	|ИЗ
	|	Справочник.ЭтапыПроизводства КАК СписокЭтапов
	|ГДЕ
	|	СписокЭтапов.Владелец = &Спецификация
	|	И СписокЭтапов.НомерЭтапа = 1
	|	И НЕ СписокЭтапов.ПометкаУдаления
	|
	|ИНДЕКСИРОВАТЬ ПО
	|	СписокЭтапов.Ссылка
	|;
	|
	|////////////////////////////////////////////////////////////////////////////////
	|ВЫБРАТЬ
	|	МатериалыИУслуги.НомерСтроки                       КАК НомерСтроки,
	|	МатериалыИУслуги.Номенклатура                      КАК Номенклатура,
	|	ЕСТЬNULL(СписокЭтапов.ПроизводствоНаСтороне, ЛОЖЬ) КАК ПроизводствоНаСтороне,
	|	МатериалыИУслуги.ПроизводитсяВПроцессе             КАК ПроизводитсяВПроцессе,
	|	МатериалыИУслуги.ПроизводитсяНаЭтапе               КАК ПроизводитсяНаЭтапе,
	|	МатериалыИУслуги.ПроизводитсяПоСпецификации        КАК ПроизводитсяПоСпецификации
	|ПОМЕСТИТЬ ВТМатериалыИУслуги
	|ИЗ
	|	ВТТаблица КАК МатериалыИУслуги
	|		ЛЕВОЕ СОЕДИНЕНИЕ ВтСписокЭтапов КАК СписокЭтапов
	|		ПО МатериалыИУслуги.ЭтапРедактирование = СписокЭтапов.Ссылка
	|;
	|
	|ВЫБРАТЬ
	|	Таблица.Ссылка               КАК Этап,
	|	Таблица.Наименование         КАК НаименованиеЭтапа,
	|	Таблица.НомерЭтапа           КАК НомерЭтапа,
	|	Таблица.НомерСледующегоЭтапа КАК НомерСледующегоЭтапа
	|ИЗ
	|	Справочник.ЭтапыПроизводства КАК Таблица
	|ГДЕ 
	|	Таблица.Владелец = &Спецификация
	|		И Таблица.ПроизводствоНаСтороне
	|		И НЕ Таблица.ПометкаУдаления
	|
	|УПОРЯДОЧИТЬ ПО
	|	НомерЭтапа
	|;
	|
	|////////////////////////////////////////////////////////////////////////////////
	|ВЫБРАТЬ
	|	0 КАК НомерСтроки
	|ГДЕ
	|	ЛОЖЬ
	//++ Устарело_Переработка24
	|
	|ОБЪЕДИНИТЬ ВСЕ
	|
	|ВЫБРАТЬ
	|	Т.НомерСтроки КАК НомерСтроки
	|ИЗ
	|	ВТМатериалыИУслуги КАК Т
	|ГДЕ
	|	ВЫБОР
	|			КОГДА Т.Номенклатура.ТипНоменклатуры = ЗНАЧЕНИЕ(Перечисление.ТипыНоменклатуры.Работа)
	|				И Т.ПроизводствоНаСтороне
	|				И НЕ &ИспользуетсяТолькоПередачаВПереработку2_5
	|				ТОГДА ИСТИНА
	|			ИНАЧЕ ЛОЖЬ
	|		КОНЕЦ
	//-- Устарело_Переработка24
	|;
	|
	|////////////////////////////////////////////////////////////////////////////////
	|ВЫБРАТЬ
	|	0 КАК НомерСтроки
	|ГДЕ
	|	ЛОЖЬ
	//++ Устарело_Производство21
	|
	|ОБЪЕДИНИТЬ ВСЕ
	| 
	|ВЫБРАТЬ
	|	Т.НомерСтроки КАК НомерСтроки
	|ИЗ
	|	ВТМатериалыИУслуги КАК Т
	|ГДЕ
	|	&ИспользуетсяПроизводство21
	|	И ВЫБОР
	|		КОГДА Т.ПроизводитсяВПроцессе
	|			И Т.ПроизводствоНаСтороне
	|			И (НЕ &ИспользуетсяПроизводство22
	|				ИЛИ Т.ПроизводитсяПоСпецификации
	|					И &ИспользуетсяПроизводство22)
	|			ТОГДА ИСТИНА
	|		ИНАЧЕ ЛОЖЬ
	|	КОНЕЦ
	//-- Устарело_Производство21
	|");
	Запрос.УстановитьПараметр("Спецификация", Ссылка);
	
	НастройкиПодсистемыПроизводство = ПроизводствоСерверПовтИсп.НастройкиПодсистемыПроизводство();
	//++ Устарело_Производство21
	Запрос.УстановитьПараметр("ИспользуетсяПроизводство21", НастройкиПодсистемыПроизводство.ИспользуетсяПроизводство21);
	//-- Устарело_Производство21
	Запрос.УстановитьПараметр("ИспользуетсяПроизводство22", НастройкиПодсистемыПроизводство.ИспользуетсяПроизводство22);
	
	//++ Устарело_Переработка24
	Запрос.УстановитьПараметр(
		"ИспользуетсяТолькоПередачаВПереработку2_5",
		НастройкиПодсистемыПроизводство.ИспользуетсяТолькоПередачаВПереработку2_5);
	//-- Устарело_Переработка24
	
	ТаблицаВыходныеИзделия  = ВыгрузитьВыходныеИзделия();
	ТаблицаВозвратныеОтходы = ВыгрузитьВозвратныеОтходы();
	ТаблицаМатериалыИУслуги = ВыгрузитьМатериалыИУслуги();
	Запрос.УстановитьПараметр("МатериалыИУслуги", ТаблицаМатериалыИУслуги);
	
	Результат = Запрос.ВыполнитьПакет();
	КоличествоПакетов = Результат.Количество();
	
	// Для этапов выполняемых на стороне должны быть описаны материалы и выходные изделия
	Если Не Результат[КоличествоПакетов - 3].Пустой() Тогда
		
		ШаблонТекстаПовторПродукции = НСтр("ru = 'Номенклатура ""%1"" не может присутствовать одновременно в продукции и в материалах (услугах).'");
		ШаблонТекстаПовторПобочногоВыпуска = НСтр("ru = 'Номенклатура ""%1"" не может присутствовать одновременно в побочном выпуске и в материалах (услугах).'");
		
		Если МногоэтапныйПроизводственныйПроцесс Тогда
			
			
		Иначе
			
			//++ Устарело_Производство21
			// В старой концепции передача одной и той же номенклатуры между этапами запрещена
			Если НастройкиПодсистемыПроизводство.ИспользуетсяПроизводство21 Тогда
					
				МассивПроверок = Новый Массив;
				
				ПараметрыПроверки = Новый Структура;
				ПараметрыПроверки.Вставить("ИмяТабличнойЧасти", "ВыходныеИзделия");
				ПараметрыПроверки.Вставить("Коллекция",         ВыходныеИзделия);
				ПараметрыПроверки.Вставить("ШаблонТекста",      ШаблонТекстаПовторПродукции);
				
				МассивПроверок.Добавить(ПараметрыПроверки);
				
				ПараметрыПроверки = Новый Структура;
				ПараметрыПроверки.Вставить("ИмяТабличнойЧасти", "ВозвратныеОтходы");
				ПараметрыПроверки.Вставить("Коллекция",         ВозвратныеОтходы);
				ПараметрыПроверки.Вставить("ШаблонТекста",      ШаблонТекстаПовторПобочногоВыпуска);
				
				МассивПроверок.Добавить(ПараметрыПроверки);
				
				Для Каждого ПараметрыПроверки Из МассивПроверок Цикл
					
					Коллекция = ПараметрыПроверки.Коллекция; // СправочникТабличнаяЧасть.РесурсныеСпецификации.ВыходныеИзделия,СправочникТабличнаяЧасть.РесурсныеСпецификации.ВозвратныеОтходы
					
					Для Каждого Строка Из Коллекция Цикл
					
						СтруктураПоиска = Новый Структура("Номенклатура", Строка.Номенклатура);
						Если ЗначениеЗаполнено(Строка.Характеристика) Тогда
							СтруктураПоиска.Вставить("Характеристика", Строка.Характеристика);
						КонецЕсли; 
						
						Если МатериалыИУслуги.НайтиСтроки(СтруктураПоиска).ВГраница() <> -1 Тогда
							
							ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
								ПараметрыПроверки.ШаблонТекста, 
								НоменклатураКлиентСервер.ПредставлениеНоменклатуры(
									Строка.Номенклатура, 
									Строка.Характеристика));
								
							ОбщегоНазначения.СообщитьПользователю(
								ТекстСообщения, 
								ЭтотОбъект, 
								ОбщегоНазначенияКлиентСервер.ПутьКТабличнойЧасти(
									ПараметрыПроверки.ИмяТабличнойЧасти, 
									Строка.НомерСтроки, 
									"Номенклатура"),,
								Отказ);
							
						КонецЕсли;
						
					КонецЦикла;
					
				КонецЦикла;
				
			КонецЕсли;
			//-- Устарело_Производство21
			
			// Для этапа, выполняемого переработчиком, должен быть описан хотя бы один материал
			Если ТаблицаМатериалыИУслуги.Количество() = 0 Тогда
				
				ШаблонТекста = НСтр("ru = 'Не введено ни одной строки в список ""Материалы и услуги""'");
				
				ОбщегоНазначения.СообщитьПользователю(
					ШаблонТекста, 
					ЭтотОбъект, 
					"МатериалыИУслуги",, 
					Отказ); 
					
			КонецЕсли;
			
		КонецЕсли;
		
	КонецЕсли;
	
	// В списке ""Материалы и работы"" не допускается указание работ для этапов, выполняемых переработчиком
	Если Не Результат[КоличествоПакетов - 2].Пустой() Тогда
		
		ШаблонТекста = НСтр("ru = 'Указание работ для этапов, выполняемых переработчиком, допускается при отключенном учете по версии 2.4 (см. строку %1 списка ""Материалы и работы"").'");
		
		Выборка = Результат[КоличествоПакетов - 2].Выбрать();
			
		Пока Выборка.Следующий() Цикл
			
			Поле           = ОбщегоНазначенияКлиентСервер.ПутьКТабличнойЧасти("МатериалыИУслуги", Выборка.НомерСтроки, "Номенклатура");
			ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ШаблонТекста, Выборка.НомерСтроки);
			
			ОбщегоНазначения.СообщитьПользователю(
				ТекстСообщения, 
				ЭтотОбъект, 
				Поле,, 
				Отказ);
			
		КонецЦикла;
		
	КонецЕсли;
	
	//++ Устарело_Производство21
	// В старой концепции в списке ""Материалы и работы"" не допускается указание 
	//   полуфабрикатов производимых в процессе для этапов, выполняемых переработчиком
	Если Не Результат[КоличествоПакетов - 1].Пустой() Тогда
		
		ШаблонТекста = НСтр("ru = 'В списке ""Материалы и работы"" не допускается указание полуфабрикатов производимых в процессе для этапов, выполняемых переработчиком (см. строку %1).'");
		
		Выборка = Результат[КоличествоПакетов - 1].Выбрать();
			
		Пока Выборка.Следующий() Цикл
			
			Поле           = ОбщегоНазначенияКлиентСервер.ПутьКТабличнойЧасти("МатериалыИУслуги", Выборка.НомерСтроки, "Номенклатура");
			ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ШаблонТекста, Выборка.НомерСтроки);
			
			ОбщегоНазначения.СообщитьПользователю(
				ТекстСообщения, 
				ЭтотОбъект, 
				Поле,, 
				Отказ);
			
		КонецЦикла;
		
	КонецЕсли;
	//-- Устарело_Производство21
	
КонецПроцедуры

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

Функция ТекстСообщенияОшибкиПроизводственногоПроцесса()
	
	Возврат НСтр("ru = 'Производственный процесс содержит ошибки. Воспользуйтесь проверкой и внесите необходимые исправления в форме спецификации.'")
	
КонецФУнкции

Процедура ЗаписатьОшибкиПроверкиПроизводственногоПроцессаВЖурналРегистрации()
	
	ИмяСобытия = НСтр("ru = 'Ресурсная спецификация.'", ОбщегоНазначения.КодОсновногоЯзыка());
	ШаблонСообщения = НСтр("ru = '%1 %2'");
	
	Сообщения = ПолучитьСообщенияПользователю(Истина);
	Для каждого Сообщение Из Сообщения Цикл
		ТекстСообщения = СтрШаблон(
			ШаблонСообщения,
			Сообщение.Текст,
			?(ЗначениеЗаполнено(Сообщение.КлючДанных), "("+Сообщение.КлючДанных+")" ,""));
		ЗаписьЖурналаРегистрации(ИмяСобытия, УровеньЖурналаРегистрации.Предупреждение,, Ссылка, ТекстСообщения);
	КонецЦикла;
	
КонецПроцедуры

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

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

#Область Прочее

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

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

Процедура ПроверитьОчиститьВыборЭтаповВСтроке(СтрокаТаблицы)
	
	СтрокаТаблицы.Этап = Справочники.ЭтапыПроизводства.ПустаяСсылка();
	СтрокаТаблицы.ЭтапРедактирование = Справочники.ЭтапыПроизводства.ПустаяСсылка();
	
КонецПроцедуры

Процедура ЗаполнитьСлужебныеРеквизиты()
	
	УправлениеДаннымиОбИзделиях.ПроверитьЗаполнитьЗначенияРеквизитовПоУмолчанию(ЭтотОбъект);
	
	Для каждого ИмяТЧ Из СтрРазделить("ВыходныеИзделия,ВозвратныеОтходы,МатериалыИУслуги", ",") Цикл
		Для каждого Строка Из ЭтотОбъект[ИмяТЧ] Цикл
			Если Строка.СпособАвтовыбораНоменклатуры.Пустая() Тогда
				Строка.СпособАвтовыбораНоменклатуры = Перечисления.СпособыАвтовыбораНоменклатуры.УказываетсяВНСИ;
			КонецЕсли;
			Если Строка.СпособАвтовыбораХарактеристики.Пустая() Тогда
				Строка.СпособАвтовыбораХарактеристики = Перечисления.СпособыАвтовыбораХарактеристики.УказываетсяВНСИ;
			КонецЕсли;
		КонецЦикла;
	КонецЦикла;
	
	ПроверитьЗаполнитьРеквизитыОсновногоИзделия();
	
	ЗаполнитьСлужебныеРеквизитыПовтИсп();
	
	Если ЕстьПараметризацияРесурсов Тогда
		РазрешитьВыборДляИзделийПобочногоВыхода = Ложь;
	КонецЕсли;
	
КонецПроцедуры

Процедура ЗаполнитьСлужебныеРеквизитыПовтИсп()
	
	Если Истина
		И ( Статус = Перечисления.СтатусыСпецификаций.ВРазработке ) Тогда
		
		ЕстьУточняемоеОсновноеИзделие      = Ложь;
	
	Иначе
		
		ИтогиПоЭтапам = Новый Структура("ЕстьПараметризацияРесурсов, ЕстьНекратныеНормативыВРЦ", Ложь, Ложь);
		
		// используется параметризация основного изделия спецификации
		#Область ЕстьУточняемоеОсновноеИзделие
		
		ЕстьУточняемоеОсновноеИзделие = (ВариантНазначения = Перечисления.ВариантыНазначенияСпецификации.ВидНоменклатуры)
											ИЛИ (ОсновноеИзделиеХарактеристика.Пустая()
													И Справочники.Номенклатура.ХарактеристикиИспользуются(ОсновноеИзделиеНоменклатура));
		
		#КонецОбласти
		
		
		// некратный выпуск изделий
		#Область ЕстьНекратныйВыпуск
		
		ЕстьНекратныйВыпуск = Ложь;
		Если НЕ ВариантНазначения = Перечисления.ВариантыНазначенияСпецификации.ВидНоменклатуры Тогда
			Если (ТипПроизводственногоПроцесса = Перечисления.ТипыПроизводственныхПроцессов.Ремонт
				ИЛИ ТипПроизводственногоПроцесса = Перечисления.ТипыПроизводственныхПроцессов.Разборка) Тогда
				Количество = ОсновноеИзделиеКоличествоУпаковок * Справочники.УпаковкиЕдиницыИзмерения.КоэффициентУпаковки(ОсновноеИзделиеУпаковка, ОсновноеИзделиеНоменклатура);
				ЕстьНекратныйВыпуск = НЕ ( ВыпускПроизвольнымиПорциями ИЛИ Количество = 1 И УправлениеДаннымиОбИзделиях.ШтучноеИзделие(ОсновноеИзделиеНоменклатура));
			Иначе
				ЕстьНекратныйВыпуск = ( ВыходныеИзделия.Количество() > 1 );
				Если Не ЕстьНекратныйВыпуск Тогда
					Для каждого Строка Из ВыходныеИзделия Цикл
						Количество = Строка.КоличествоУпаковок * Справочники.УпаковкиЕдиницыИзмерения.КоэффициентУпаковки(Строка.Упаковка, Строка.Номенклатура);
						ЕстьНекратныйВыпуск = НЕ ( ВыпускПроизвольнымиПорциями ИЛИ Количество = 1 И УправлениеДаннымиОбИзделиях.ШтучноеИзделие(ОсновноеИзделиеНоменклатура));
						Прервать;
					КонецЦикла;
				КонецЕсли;
			КонецЕсли;
		КонецЕсли;
		
		#КонецОбласти
		
	КонецЕсли;
	
КонецПроцедуры

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

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

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

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


Функция ПредставлениеТаблицыВФорме(ИмяТЧ) Экспорт
	
	ИмяСписка = "";
	
	Если ИмяТЧ = "ВыходныеИзделия"
		И ТипПроизводственногоПроцесса = Перечисления.ТипыПроизводственныхПроцессов.Сборка Тогда
		
		ИмяСписка = НСтр("ru = 'Продукция'");
		
	Иначе
		
		ИмяСписка = Метаданные.Справочники.РесурсныеСпецификации.ТабличныеЧасти[ИмяТЧ].Синоним;
		
	КонецЕсли;
	
	Возврат ИмяСписка;
	
КонецФункции

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

Функция КоличествоЭтаповПроизводства()
	
	Запрос = Новый Запрос("
	|ВЫБРАТЬ
	|	КОЛИЧЕСТВО(*) КАК КоличествоЭтапов
	|ИЗ
	|	Справочник.ЭтапыПроизводства КАК Этапы
	|ГДЕ
	|	Этапы.Владелец = &Спецификация
	|	И НЕ Этапы.ПометкаУдаления");
	Запрос.УстановитьПараметр("Спецификация", Ссылка);
	
	РезультатЗапроса = Запрос.Выполнить();
	Если РезультатЗапроса.Пустой() Тогда
		Возврат 0;
	Иначе
		Выборка = РезультатЗапроса.Выбрать();
		Выборка.Следующий();
		Возврат Выборка.КоличествоЭтапов;
	КонецЕсли;
	
КонецФункции

Функция ИменаТабличныхЧастей()
	
	Возврат Справочники.РесурсныеСпецификации.ИменаТабличныхЧастей();
	
КонецФункции

Функция ЭтоТехнологическийНабор()
	
	Результат = Ложь;
	
	
	Возврат Результат;
	
КонецФункции

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

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

#КонецЕсли

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