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

файл
#Область ОписаниеПеременных

&НаКлиенте
Перем КэшированныеЗначения;

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

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

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

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

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

#Область ОбработчикиСобытийЭлементовТаблицыФормыМатериалы

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

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

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

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

#Область ОбработчикиКомандФормы

&НаКлиенте
Процедура ПеренестиВДокумент(Команда)
	
	Если ЕстьДанныеДляПереноса() Тогда
		
		ПеренестиМатериалыВДокумент();
		
	Иначе
		
		ОчиститьСообщения();
		
		ОбщегоНазначенияКлиентСервер.СообщитьПользователю(
			НСтр("ru = 'Необходимо указать количество номенклатуры'"));
		
	КонецЕсли;
	
КонецПроцедуры

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

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

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

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

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

&НаСервере
Процедура ПрочитатьКоличествоПодобрано()
	
	Если НЕ ЭтоАдресВременногоХранилища(Параметры.АдресПодобранныеМатериалы) Тогда
		Возврат;
	КонецЕсли;
	
	СтруктураПоиска = Параметры.СтруктураПоискаПодобранныеМатериалы;
	
	ПодобранныеМатериалы = ПолучитьИзВременногоХранилища(Параметры.АдресПодобранныеМатериалы);
	
	СтруктураДействий = Новый Структура;
	СтруктураДействий.Вставить("ПересчитатьКоличествоЕдиницСуффикс",
		Новый Структура("Суффикс, НужноОкруглять", "Подобрано", Ложь));
	
	СтрокиКОбработке = Новый Массив;
	КэшированныеЗначения = ПакетнаяОбработкаТабличнойЧастиКлиентСервер.ПолучитьСтруктуруКэшируемыеЗначения();
	
	Для каждого Строка Из Материалы Цикл
		
		ЗаполнитьЗначенияСвойств(СтруктураПоиска, Строка);
		НайденныеСтроки = ПодобранныеМатериалы.НайтиСтроки(СтруктураПоиска);
		
		Если НайденныеСтроки.Количество() > 0 Тогда
			
			Для каждого СтрокаПодобрано Из НайденныеСтроки Цикл
				Если Строка.Упаковка = СтрокаПодобрано.Упаковка Тогда
					КоличествоУпаковокДобавить = СтрокаПодобрано.КоличествоУпаковок;
				Иначе
					МассивДанных = Новый Массив;
					МассивДанных.Добавить(Строка);
					МассивДанных.Добавить(СтрокаПодобрано);
					
					КоэффициентыУпаковок = Справочники.УпаковкиЕдиницыИзмерения.КоэффициентыУпаковок(МассивДанных).Получить(Строка.Номенклатура);
					КоэффициентУпаковки1 = КоэффициентыУпаковок.Получить(СтрокаПодобрано.Упаковка);
					КоэффициентУпаковки2 = КоэффициентыУпаковок.Получить(Строка.Упаковка);
					
					КоличествоУпаковокДобавить = СтрокаПодобрано.КоличествоУпаковок
						* ?(ЗначениеЗаполнено(КоэффициентУпаковки1),КоэффициентУпаковки1,1)
								/ ?(ЗначениеЗаполнено(КоэффициентУпаковки2),КоэффициентУпаковки2,1);
				КонецЕсли;
				Строка.КоличествоУпаковокПодобрано = Строка.КоличествоУпаковокПодобрано + КоличествоУпаковокДобавить;
			КонецЦикла;
			
			СтрокиКОбработке.Добавить(Строка);
			
		КонецЕсли;
		
	КонецЦикла;
	
	ПакетнаяОбработкаТабличнойЧастиСервер.ОбработатьСтрокиТЧ(
		СтрокиКОбработке,
		СтруктураДействий,
		Материалы,
		КэшированныеЗначения);
	
КонецПроцедуры

&НаКлиенте
Процедура ПередЗакрытиемПеренестиИЗакрыть(РезультатВопроса, ДополнительныеПараметры) Экспорт
	
	ПеренестиМатериалыВДокумент();
	
КонецПроцедуры

&НаКлиенте
Процедура ПеренестиМатериалыВДокумент()
	
	Результат = ПоместитьМатериалыВХранилище();
	
	Модифицированность = Ложь;
	Закрыть();
	
	ОповеститьОВыборе(Результат);
	
КонецПроцедуры

&НаСервере
Функция ПоместитьМатериалыВХранилище()
	
	ТаблицаМатериалов = РеквизитФормыВЗначение("Материалы").СкопироватьКолонки(СоставРезультата());
	
	Для каждого Строка Из Материалы Цикл
		
		Если Строка.Количество <> 0 Тогда
			ЗаполнитьЗначенияСвойств(ТаблицаМатериалов.Добавить(), Строка);
		КонецЕсли;
		
	КонецЦикла;
	
	Возврат ПоместитьВоВременноеХранилище(ТаблицаМатериалов, АдресРезультата);
	
КонецФункции

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

&НаКлиенте
Функция ЕстьДанныеДляПереноса()
	
	Результат = Ложь;
	
	Для каждого Строка Из Материалы Цикл
		
		Если Строка.Количество <> 0 Тогда
			
			Результат = Истина;
			Прервать;
			
		КонецЕсли;
		
	КонецЦикла;
	
	Возврат Результат;
	
КонецФункции

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

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

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

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