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

файл

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

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

&НаКлиенте
Процедура ПриОткрытии(Отказ)
	
	МенеджерОборудованияКлиент.НачатьПодключениеОборудованиеПриОткрытииФормы(Неопределено, ЭтаФорма, "СканерШтрихкода");
	
	СостояниеДокументовПриИзменении(Неопределено);
	
КонецПроцедуры

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

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

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

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

&НаКлиенте
Процедура РежимФормированияПриИзменении(Элемент)
	
	Если РежимФормированияДоИзменения <> РежимФормирования Тогда
		ОбновитьСписокРаспоряженияНаОформление();
		УстановитьВидимостьКнопкиСостояниеВыполнения(ЭтаФорма);
	КонецЕсли;
	
КонецПроцедуры

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

&НаКлиенте
Процедура ПодразделениеПриИзменении(Элемент)
	ОбновитьСписокРаспоряженияНаОформление();
КонецПроцедуры

&НаКлиенте
Процедура СкладПриИзменении(Элемент)
	ОбновитьСписокРаспоряженияНаОформление();
КонецПроцедуры

&НаКлиенте
Процедура МенеджерПриИзменении(Элемент)
	ОбновитьСписокРаспоряженияНаОформление();
КонецПроцедуры

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

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

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

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

&НаКлиенте
Процедура ГиперссылкаДокументыПроизводстваОбработкаНавигационнойСсылки(Элемент, НавигационнаяСсылкаФорматированнойСтроки, СтандартнаяОбработка)
	
	СтандартнаяОбработка = Ложь;
	ОбщегоНазначенияУТКлиент.ОткрытьЖурнал(ПараметрыЖурнала());
	
КонецПроцедуры

&НаКлиенте
Процедура Подключаемый_ВыполнитьПереопределяемуюКоманду(Команда)
	
	СобытияФормКлиент.ВыполнитьПереопределяемуюКоманду(ЭтаФорма, Команда);
	
КонецПроцедуры

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

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

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

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

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

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

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

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

#Область НастройкаФормы

&НаСервере
Процедура УстановитьУсловноеОформление()
	
	УсловноеОформление.Элементы.Очистить();
	
	СтандартныеПодсистемыСервер.УстановитьУсловноеОформлениеПоляДата(ЭтотОбъект, "СписокРаспоряженияНаОформление.Дата", "СписокРаспоряженияНаОформлениеДата");
	
КонецПроцедуры

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

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

&НаКлиентеНаСервереБезКонтекста
Процедура УстановитьВидимостьКнопкиСостояниеВыполнения(Форма)
	
	Форма.Элементы.СписокРаспоряженияНаОформлениеСостояниеВыполнения.Видимость = 
		Форма.ПравоПросмотраСостоянийВыполненияДокументов И Форма.РежимФормирования = 0;
	
КонецПроцедуры

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

#Область ШтрихкодыИТорговоеОборудование

&НаКлиенте
Функция СсылкаНаЭлементСпискаПоШтрихкоду(Штрихкод)
	
	Возврат ШтрихкодированиеПечатныхФормВызовСервера.СсылкаНаЭлементСпискаПоШтрихкоду(
		Штрихкод, ХозяйственныеОперацииИДокументы.Выгрузить());
	
КонецФункции

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

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

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

&НаСервере
Процедура ОтборОперацияТипОбработкаВыбораСервер(АдресХозяйственныхОперацийИДокументов)
	
	ТЗХозОперацииИТипыДокументов = ПолучитьИзВременногоХранилища(АдресХозяйственныхОперацийИДокументов);
	ХозяйственныеОперацииИДокументы.Загрузить(ТЗХозОперацииИТипыДокументов);
	ОбщегоНазначенияУТ.ЗаполнитьОтборыПоТаблицеХозОперацийИТиповДокументов(ТЗХозОперацииИТипыДокументов, ОтборХозяйственныеОперации, ОтборТипыДокументов);
	
	НастроитьФормуПоВыбраннымОперациямИДокументам(ТЗХозОперацииИТипыДокументов);
	
КонецПроцедуры

&НаКлиентеНаСервереБезКонтекста
Функция КлючНазначенияФормыПоУмолчанию()
	
	Возврат "ДокументыПроизводства";
	
КонецФункции

&НаСервере
Функция ПоместитьВоВременноеХранилищеХозяйственныеОперацииИДокументы()
	Возврат ПоместитьВоВременноеХранилище(ХозяйственныеОперацииИДокументы.Выгрузить(), УникальныйИдентификатор);
КонецФункции

&НаКлиенте
Функция ПараметрыЖурнала()
	
	СтруктураБыстрогоОтбора = Новый Структура;
	СтруктураБыстрогоОтбора.Вставить("Организация",		Организация);
	СтруктураБыстрогоОтбора.Вставить("Подразделение",	Подразделение);
	СтруктураБыстрогоОтбора.Вставить("Менеджер",		Менеджер);
	СтруктураБыстрогоОтбора.Вставить("ОтборТипыДокументов",			ОтборТипыДокументов);
	СтруктураБыстрогоОтбора.Вставить("ОтборХозяйственныеОперации",	ОтборХозяйственныеОперации);
	
	ПараметрыЖурнала = Новый Структура;
	ПараметрыЖурнала.Вставить("СтруктураБыстрогоОтбора",	СтруктураБыстрогоОтбора);
	ПараметрыЖурнала.Вставить("ИмяРабочегоМеста",			"ЖурналДокументовПроизводства");
	ПараметрыЖурнала.Вставить("КлючНазначенияФормы",		КлючНазначенияИспользования);
	ПараметрыЖурнала.Вставить("СинонимЖурнала",				НСтр("ru = 'Документы производства'"));
	
	Возврат ПараметрыЖурнала;
	
КонецФункции

&НаСервере
Процедура НастроитьФормуПоВыбраннымОперациямИДокументам(ТЗХозОперацииИТипыДокументов)

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

#Область СохраняемыеНастройкиФормы

&НаСервере
Процедура ВосстановитьНастройки(Параметры)
	
	СтруктураБыстрогоОтбора = Неопределено;
	Параметры.Свойство("СтруктураБыстрогоОтбора", СтруктураБыстрогоОтбора);
	
	Если СтруктураБыстрогоОтбора <> Неопределено Тогда
		ЗаполнитьЗначенияСвойств(ЭтаФорма, НастройкиФормы(СтруктураБыстрогоОтбора));
	КонецЕсли;

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

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

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

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

&НаСервере
Процедура ОбновитьСписокРаспоряженияНаОформление()
	
	Если РежимФормированияДоИзменения <> РежимФормирования Тогда
		РежимФормированияДоИзменения = РежимФормирования;
		Элементы.ГруппаНоменклатураХарактеристика.Видимость = РежимФормирования = 1;
		Элементы.СписокРаспоряженияНаОформлениеКОформлению.Видимость = РежимФормирования = 1;
	КонецЕсли;
	
	СформироватьТекстыЗапросов();
	ОбновитьСписокРаспоряженияНаОформлениеНаСервере();
	
КонецПроцедуры	

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

&НаСервере
Процедура ОрганизацияПриИзмененииНаСервере(РежимФормированияДанных)
	
	УстановитьОтборПоОрганизации();
	
	ОбновитьСписокРаспоряженияНаОформление();
	
КонецПроцедуры

&НаСервере
Процедура УстановитьОтборПоОрганизации()

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

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

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

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

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