Формирование заказов по потребностям / Форма / Модуль формы

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

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

&НаКлиенте
Перем ДатаПоставкиДоИзменения;

&НаКлиенте
Перем СтрокаДоИзменения;

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

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

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

	ЗаполнитьСкладВидимость = ПолучитьФункциональнуюОпцию("ИспользоватьЗаказыНаПеремещение");
	ЗаполнитьПоставщикаВидимость = ПолучитьФункциональнуюОпцию("ИспользоватьЗаказыПоставщикам");
	//++ НЕ УТ
	ЗаполнитьПоставщикаВидимость = ЗаполнитьПоставщикаВидимость
		//++ Устарело_Переработка24
		Или ПолучитьФункциональнуюОпцию("ИспользоватьПроизводствоНаСтороне")
		//-- Устарело_Переработка24
		Или ПолучитьФункциональнуюОпцию("ИспользоватьПроизводствоНаСтороне2_5");
	//-- НЕ УТ
	ЗаполнитьПодразделениеВидимость = Ложь;
	
	Элементы.ЗаполнитьПоставщикаНаШагеЗаказы.Видимость    = ЗаполнитьПоставщикаВидимость;
	Элементы.ЗаполнитьСкладНаШагеЗаказы.Видимость         = ЗаполнитьСкладВидимость;
	Элементы.ЗаполнитьПодразделениеНаШагеЗаказы.Видимость = ЗаполнитьПодразделениеВидимость;

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

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

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

&НаКлиенте
Процедура ОбработкаВыбора(ВыбранноеЗначение, ИсточникВыбора)

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

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

&НаКлиенте
Процедура ОбработкаОповещения(ИмяСобытия, Параметр, Источник)
	
	Если ВключенаОбработкаОповещенийЗаписиДокументов
		И ( ИмяСобытия = "Запись_ЗаказНаПеремещение"
		Или ИмяСобытия = "Запись_ЗаказНаСборку"
		//++ НЕ УТ
		Или ИмяСобытия = "Запись_ЗаказМатериаловВПроизводство"
		//++ Устарело_Переработка24
		Или ИмяСобытия = "Запись_ЗаказПереработчику"
		//-- Устарело_Переработка24
		Или ИмяСобытия = "Запись_ЗаказПереработчику2_5"

		//-- НЕ УТ
		Или ИмяСобытия = "Запись_ЗаказПоставщику") Тогда
		
		Ссылка = Источник;
		
		ОбновитьРеквизитыТаблицыДокументов(Ссылка);
		
	КонецЕсли;
	
	Если ИмяСобытия = "Запись_СпособОбеспеченияПотребностей" Тогда
		
		СпособыОбеспеченияПриИзмененииСпособаОбеспечения();
		
	КонецЕсли;
	
КонецПроцедуры

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

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

#Область СерверныеОтборы

&НаКлиенте
Процедура ОтборПоСкладуПриИзменении(Элемент)
	
	СохранитьНастройки = Истина;
	ОтразитьПростойОтборВОтборахКомпоновки(КомпоновщикНастроекДляОтборов,
		"Склад", ОтборПоСкладу, ЭтоОтборПоГруппе(ОтборПоСкладу));
	
КонецПроцедуры

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

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

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

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

&НаКлиенте
Процедура ОтборПоНоменклатуреПриИзменении(Элемент)
	
	СохранитьНастройки = Истина;
	ОтразитьПростойОтборВОтборахКомпоновки(КомпоновщикНастроекДляОтборов,
		"Номенклатура", ОтборПоНоменклатуре, ЭтоОтборПоГруппе(ОтборПоНоменклатуре));
	
КонецПроцедуры

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

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

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

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

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

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

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

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

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

#Область КлиентскиеФильтры

&НаКлиенте
Процедура РасчетОбособленныхПотребностейСУчетомОстатковНаВсехСкладахПриИзменении(Элемент)
	
	СохранитьНастройки = Истина;
	
	Элементы.НадписьОсобенностиРаспределительнойСети.Заголовок
		= ПриИзмененииРасчетОбособленныхПотребностейСУчетомОстатковНаВсехСкладах(
			РасчетОбособленныхПотребностейСУчетомОстатковНаВсехСкладах);
	
КонецПроцедуры

&НаКлиенте
Процедура ФильтрОтметкаЗапасыПриИзменении(Элемент)

	ОтборЗапасыНаСервере();

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

&НаКлиенте
Процедура ФильтрУровеньЗапасаПриИзменении(Элемент)

	ОтборЗапасыНаСервере();

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

&НаКлиенте
Процедура ФильтрУровеньЗапасаНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)

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

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

&НаКлиенте
Процедура ФильтрУровеньЗапасаОчистка(Элемент, СтандартнаяОбработка)

	СтандартнаяОбработка = Ложь;

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

&НаКлиенте
Процедура ФильтрКЗаказуНеПозднееЗапасыПриИзменении(Элемент)

	ОтборЗапасыНаСервере();

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

&НаКлиенте
Процедура ФильтрКЗаказуНеПозднееЗаказыПриИзменении(Элемент)
	
	ОтборЗаказыНаСервере();
	
КонецПроцедуры

&НаКлиенте
Процедура ФильтрОтметкаЗаказыПриИзменении(Элемент)

	ОтборЗаказыНаСервере();

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

&НаКлиенте
Процедура ФильтрПриоритетПриИзменении(Элемент)

	ОтборЗаказыНаСервере();

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

&НаКлиенте
Процедура ФильтрКОтгрузкеНеРанееПриИзменении(Элемент)

	ОтборЗаказыНаСервере();

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

&НаКлиенте
Процедура ФильтрКОтгрузкеНеПозднееПриИзменении(Элемент)

	ОтборЗаказыНаСервере();

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

&НаКлиенте
Процедура ФильтрКОтгрузкеНеРанееОкончаниеВводаТекста(Элемент, Текст, ДанныеВыбора, Параметры, СтандартнаяОбработка)

	ПроверитьКорректностьЗаполненияФильтраКОтгрузкеНеРанее(СтрокаВДату(Текст), СтандартнаяОбработка);

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

&НаКлиенте
Процедура ФильтрКОтгрузкеНеПозднееОкончаниеВводаТекста(Элемент, Текст, ДанныеВыбора, Параметры, СтандартнаяОбработка)

	ПроверитьКорректностьЗаполненияФильтраКОтгрузкеНеПозднее(СтрокаВДату(Текст), СтандартнаяОбработка);

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

&НаКлиенте
Процедура ФильтрКОтгрузкеНеПозднееОбработкаВыбора(Элемент, ВыбранноеЗначение, СтандартнаяОбработка)

	ПроверитьКорректностьЗаполненияФильтраКОтгрузкеНеПозднее(ВыбранноеЗначение, СтандартнаяОбработка);

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

&НаКлиенте
Процедура ФильтрКОтгрузкеНеРанееОбработкаВыбора(Элемент, ВыбранноеЗначение, СтандартнаяОбработка)

	ПроверитьКорректностьЗаполненияФильтраКОтгрузкеНеРанее(ВыбранноеЗначение, СтандартнаяОбработка);

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

&НаКлиенте
Процедура ФильтрНеобеспеченныеПриИзменении(Элемент)

	ФильтрНеобеспеченныеПриИзмененииНаСервере();

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

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

#Область ПанельРекомендаций

&НаКлиенте
Процедура МинимальныйЗапас1Нажатие(Элемент, СтандартнаяОбработка)

	СтандартнаяОбработка = Ложь;
	ОткрытьМетодОбеспечения("Запасы");

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

&НаКлиенте
Процедура МаксимальныйЗаказ1Нажатие(Элемент, СтандартнаяОбработка)

	СтандартнаяОбработка = Ложь;
	ОткрытьМетодОбеспечения("Запасы");

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

&НаКлиенте
Процедура МинимальныйЗапас2Нажатие(Элемент, СтандартнаяОбработка)

	СтандартнаяОбработка = Ложь;
	ОткрытьМетодОбеспечения("Запасы");

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

&НаКлиенте
Процедура МаксимальныйЗаказ2Нажатие(Элемент, СтандартнаяОбработка)

	СтандартнаяОбработка = Ложь;
	ОткрытьМетодОбеспечения("Запасы");

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

&НаКлиенте
Процедура СрокПоставки3Нажатие(Элемент, СтандартнаяОбработка)

	СтандартнаяОбработка = Ложь;
	ОткрытьСпособОбеспечения("Запасы");

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

&НаКлиенте
Процедура ОбеспечиваемыйПериод3Нажатие(Элемент, СтандартнаяОбработка)

	СтандартнаяОбработка = Ложь;
	ОткрытьСпособОбеспечения("Запасы");

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

&НаКлиенте
Процедура СреднедневноеПотребление3Нажатие(Элемент, СтандартнаяОбработка)

	СтандартнаяОбработка = Ложь;
	ОткрытьМетодОбеспечения("Запасы");

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

&НаКлиенте
Процедура СтраховойЗапас3Нажатие(Элемент, СтандартнаяОбработка)

	СтандартнаяОбработка = Ложь;
	ОткрытьМетодОбеспечения("Запасы");

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

&НаКлиенте
Процедура СрокПоставки43Нажатие(Элемент, СтандартнаяОбработка)

	СтандартнаяОбработка = Ложь;
	ОткрытьСпособОбеспечения("Запасы");

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

&НаКлиенте
Процедура ОбеспечиваемыйПериод43Нажатие(Элемент, СтандартнаяОбработка)

	СтандартнаяОбработка = Ложь;
	ОткрытьСпособОбеспечения("Запасы");

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

&НаКлиенте
Процедура СреднедневноеПотребление4Нажатие(Элемент, СтандартнаяОбработка)

	СтандартнаяОбработка = Ложь;
	ОткрытьМетодОбеспечения("Запасы");

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

&НаКлиенте
Процедура СтраховойЗапас4Нажатие(Элемент, СтандартнаяОбработка)

	СтандартнаяОбработка = Ложь;
	ОткрытьМетодОбеспечения("Запасы");

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

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

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

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

&НаКлиенте
Процедура ПроизвольныеОтборыЭлементыПриИзменении(Элемент)
	СохранитьНастройки = Истина;
КонецПроцедуры

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

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

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

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

&НаКлиенте
Процедура СпособыОбеспеченияДатаПоставкиПриИзменении(Элемент)
	СтрокаТаблицы = Элементы.СпособыОбеспечения.ТекущиеДанные;
	СтрокаТаблицы.СтрокаИзменена = Истина;
КонецПроцедуры

&НаКлиенте
Процедура СпособыОбеспеченияГраницаПериодаОбеспеченияПриИзменении(Элемент)
	СтрокаТаблицы = Элементы.СпособыОбеспечения.ТекущиеДанные;
	СтрокаТаблицы.СтрокаИзменена = Истина;
КонецПроцедуры

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

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

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

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

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

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

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

&НаКлиенте
Процедура ЗапасыПриАктивизацииЯчейки(Элемент)
	
	СтрокаЗапасы = Элементы.Запасы.ТекущиеДанные;
	Если Элемент.ТекущийЭлемент = Элементы.СпособОбеспеченияЗапасы И СтрокаЗапасы <> Неопределено Тогда
		
		Если СтрокаЗапасы.ПеремещениеРазрешено Тогда
			ДоступныеТипыОбеспеченияДляВыбора = ДоступныеТипыОбеспеченияСПеремещением;
		Иначе
			ДоступныеТипыОбеспеченияДляВыбора = ДоступныеТипыОбеспеченияБезПеремещения;
		КонецЕсли;
		
	КонецЕсли;
	
КонецПроцедуры

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

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

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

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

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

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

&НаКлиенте
Процедура СпособОбеспеченияЗапасыОбработкаВыбора(Элемент, ВыбранноеЗначение, СтандартнаяОбработка)

	Поставка = Элементы.Запасы.ТекущиеДанные;
	Поставка.Отметка = Ложь;
	РассчитатьИтоги();

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

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

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

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

	Если Поставка.Отметка Тогда

		РассчитатьИтоги();

	КонецЕсли;

	Поставка.ИсточникОбеспечения = ТекстНеЗаполнено;

	ОчиститьУсловияЗакупок(Поставка);

	КоличествоКЗаказу = Поставка.Округлено * ?(Поставка.Отметка, 1, 0);
	РассчитатьИтоги();

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

&НаКлиенте
Процедура ИсточникОбеспеченияЗапасыОбработкаВыбора(Элемент, ВыбранноеЗначение, СтандартнаяОбработка)

	СтандартнаяОбработка = Ложь;

	Поставка = Элементы.Запасы.ТекущиеДанные;

	Если Поставка.Отметка Тогда

		РассчитатьИтоги();

	КонецЕсли;

	ОчиститьУсловияЗакупок(Поставка);

	Поставка.ИсточникОбеспечения = ОбработатьПустойИсточникОбеспечения(ВыбранноеЗначение, ТекстНеЗаполнено);
	
	КоличествоКЗаказу = Поставка.Округлено * ?(Поставка.Отметка, 1, 0);
	РассчитатьИтоги();

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

&НаКлиенте
Процедура ИсточникОбеспеченияЗапасыОкончаниеВводаТекста(Элемент, Текст, ДанныеВыбора, ПараметрыПолученияДанных, СтандартнаяОбработка)

	Если Текст = "" Тогда

		Поставка = Элементы.Запасы.ТекущиеДанные;

		Если Поставка.Отметка Тогда

			РассчитатьИтоги();

		КонецЕсли;

		ОчиститьУсловияЗакупок(Поставка);

		Поставка.ИсточникОбеспечения = ТекстНеЗаполнено;

		КоличествоКЗаказу = Поставка.Округлено * ?(Поставка.Отметка, 1, 0);
		РассчитатьИтоги();

	КонецЕсли;

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

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

	Если Поставка.Отметка Тогда

		РассчитатьИтоги();

	КонецЕсли;

	Поставка.ДатаПоставки = '00010101';

	КоличествоКЗаказу = Поставка.Округлено * ?(Поставка.Отметка, 1, 0);
	РассчитатьИтоги();

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

&НаКлиенте
Процедура ДатаПоставкиЗапасыОбработкаВыбора(Элемент, ВыбранноеЗначение, СтандартнаяОбработка)
	
	СтандартнаяОбработка = Ложь;

	Поставка = Элементы.Запасы.ТекущиеДанные;

	Если Поставка.Отметка Тогда

		РассчитатьИтоги();

	КонецЕсли;

	Поставка.ДатаПоставки = ВыбранноеЗначение;
	КоличествоКЗаказу = Поставка.Округлено * ?(Поставка.Отметка, 1, 0);
	РассчитатьИтоги();
	
КонецПроцедуры

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

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

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

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

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

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

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

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

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

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

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

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

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

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

&НаКлиенте
Процедура СпособОбеспеченияЗаказыОбработкаВыбора(Элемент, ВыбранноеЗначение, СтандартнаяОбработка)

	Поставка = Элементы.ЗаказыКОбеспечению.ТекущиеДанные;
	Поставка.Отметка = Ложь;
	РассчитатьИтоги();

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

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

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

	Поставка = Элементы.ЗаказыКОбеспечению.ТекущиеДанные;

	ПараметрыФормы = Новый Структура("Склад, Номенклатура, Характеристика, ЭтоРабота, ТипОбеспечения");
	ЗаполнитьЗначенияСвойств(ПараметрыФормы, Поставка);

	СтандартнаяОбработка = Ложь;
	ОткрытьФорму("Обработка.ОбеспечениеПотребностей.Форма.ФормаВыбораИсточникаОбеспечения", ПараметрыФормы, ЭтаФорма, УникальныйИдентификатор);

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

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

	Если Поставка.Отметка Тогда

		РассчитатьИтоги();

	КонецЕсли;

	Поставка.ИсточникОбеспечения = ТекстНеЗаполнено;

	ОчиститьУсловияЗакупок(Поставка);

	КоличествоКЗаказу = Поставка.Округлено * ?(Поставка.Отметка, 1, 0);
	РассчитатьИтоги();

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

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

	Поставка = Элементы.ЗаказыКОбеспечению.ТекущиеДанные;

	Если Поставка.Отметка Тогда

		РассчитатьИтоги();

	КонецЕсли;

	ОчиститьУсловияЗакупок(Поставка);

	Поставка.ИсточникОбеспечения = ОбработатьПустойИсточникОбеспечения(ВыбранноеЗначение, ТекстНеЗаполнено);
	КоличествоКЗаказу = Поставка.Округлено * ?(Поставка.Отметка, 1, 0);
	РассчитатьИтоги();

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

&НаКлиенте
Процедура ИсточникОбеспеченияЗаказыОкончаниеВводаТекста(Элемент, Текст, ДанныеВыбора, ПараметрыПолученияДанных, СтандартнаяОбработка)

	Если Текст = "" Тогда

		Поставка = Элементы.ЗаказыКОбеспечению.ТекущиеДанные;

		Если Поставка.Отметка Тогда

			РассчитатьИтоги();

		КонецЕсли;

		ОчиститьУсловияЗакупок(Поставка);

		Поставка.ИсточникОбеспечения = ТекстНеЗаполнено;

		КоличествоКЗаказу = Поставка.Округлено * ?(Поставка.Отметка, 1, 0);
		РассчитатьИтоги();

	КонецЕсли;

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

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

	Если Поставка.Отметка Тогда

		РассчитатьИтоги();

	КонецЕсли;

	Поставка.ДатаПоставки = '00010101';

	КоличествоКЗаказу = Поставка.Округлено * ?(Поставка.Отметка, 1, 0);
	РассчитатьИтоги();

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

&НаКлиенте
Процедура ДатаПоставкиЗаказыОбработкаВыбора(Элемент, ВыбранноеЗначение, СтандартнаяОбработка)
	
	СтандартнаяОбработка = Ложь;

	Поставка = Элементы.ЗаказыКОбеспечению.ТекущиеДанные;

	Если Поставка.Отметка Тогда

		РассчитатьИтоги();

	КонецЕсли;

	Поставка.ДатаПоставки = ВыбранноеЗначение;
	КоличествоКЗаказу = Поставка.Округлено * ?(Поставка.Отметка, 1, 0);
	РассчитатьИтоги();

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

&НаКлиенте
Процедура ДатаПоставкиЗаказыОкончаниеВводаТекста(Элемент, Текст, ДанныеВыбора, Параметры, СтандартнаяОбработка)

	ДатаПоставкиДоИзменения = Элементы.ЗаказыКОбеспечению.ТекущиеДанные.ДатаПоставки;

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

&НаКлиенте
Процедура ДатаПоставкиЗаказыПриИзменении(Элемент)
	
	// &ЗамерПроизводительности
	ОценкаПроизводительностиКлиент.НачатьЗамерВремени(Истина,
		"Обработка.ОбеспечениеПотребностей.Форма.Элемент.ДатаПоставкиЗаказы.ПриИзменении");
	
	Поставка = Элементы.ЗаказыКОбеспечению.ТекущиеДанные;

	Если Поставка.Отметка Тогда

		НоваяДатаПоставки = Поставка.ДатаПоставки;
		Поставка.ДатаПоставки = ДатаПоставкиДоИзменения;
		РассчитатьИтоги();
		Поставка.ДатаПоставки = НоваяДатаПоставки;

	КонецЕсли;

	Поставка = Элементы.ЗаказыКОбеспечению.ТекущиеДанные;
	КоличествоКЗаказу = Поставка.Округлено * ?(Поставка.Отметка, 1, 0);
	РассчитатьИтоги();

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

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

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

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

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

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

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

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

&НаСервереБезКонтекста
Функция ПолучитьМинимальнуюСуммуЗаказа(СпособОбеспечения)
	Возврат ОбщегоНазначения.ЗначениеРеквизитаОбъекта(СпособОбеспечения, "МинимальнаяСуммаЗаказа");
КонецФункции

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

&НаСервереБезКонтекста
Функция ПолучитьИсточникИСоглашение(СпособОбеспечения)
	Возврат ОбщегоНазначения.ЗначенияРеквизитовОбъекта(СпособОбеспечения, "ИсточникОбеспеченияПотребностей, Соглашение, ТипОбеспечения");
КонецФункции

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

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

&НаКлиенте
Процедура ПредварительныйПросмотрПередУдалением(Элемент, Отказ)
	Отказ = Истина;
КонецПроцедуры

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

&НаКлиенте
Процедура ПредварительныйПросмотрПриАктивизацииЯчейки(Элемент)
		
	СтрокаПредварительныйПросмотр= Элементы.ПредварительныйПросмотр.ТекущиеДанные;
	Если Элемент.ТекущийЭлемент = Элементы.ПредварительныйПросмотрСпособОбеспечения И СтрокаПредварительныйПросмотр <> Неопределено Тогда
		
		Если СтрокаПредварительныйПросмотр.ЭтоРабота Тогда
			ДоступныеТипыОбеспеченияДляВыбора = ДоступныеТипыОбеспеченияРабот;
		ИначеЕсли СтрокаПредварительныйПросмотр.ПеремещениеРазрешено Тогда
			ДоступныеТипыОбеспеченияДляВыбора = ДоступныеТипыОбеспеченияСПеремещением;
		Иначе
			ДоступныеТипыОбеспеченияДляВыбора = ДоступныеТипыОбеспеченияБезПеремещения;
		КонецЕсли;
	
	КонецЕсли;
	
КонецПроцедуры

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

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

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

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

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

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

&НаКлиенте
Процедура НазадЗавершение(РезультатВопроса, ДополнительныеПараметры) Экспорт
	
	Ответ = РезультатВопроса;
	
	Если Ответ = КодВозвратаДиалога.Отмена Тогда
		Возврат;
	КонецЕсли;
	
	НазадФрагмент();
	
КонецПроцедуры

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

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

&НаКлиенте
Процедура ПродолжитьСДругимиОтборами(Команда)

	ОчиститьСообщения();
	ПродолжитьСДругимиОтборамиНаСервере();

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

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

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

&НаКлиенте
Процедура УстановитьФлажкиВТаблицеСпособовОбеспечения(Команда)

	ИзменитьФлажкиВТаблицеСпособовОбеспечения(Истина);

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

&НаКлиенте
Процедура СнятьФлажкиВТаблицеСпособовОбеспечения(Команда)

	ИзменитьФлажкиВТаблицеСпособовОбеспечения(Ложь);

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

&НаКлиенте
Процедура ЗаполнитьКЗаказуТоварыДостигшиеТочкиЗаказаДляВыделенныхСтрок(Команда)
	ЗаполнитьКЗаказуТовары(Ложь);
КонецПроцедуры

&НаКлиенте
Процедура ПоказатьСкрытьПанельРекомендаций(Команда)

		Элементы.РекомендацииЗапасы.Пометка = Не Элементы.РекомендацииЗапасы.Пометка;
		Элементы.РекомендацииЗаказы.Пометка = Не Элементы.РекомендацииЗаказы.Пометка;
		Элементы.ПанельРекомендаций.Видимость = Элементы.РекомендацииЗапасы.Пометка;

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

&НаКлиенте
Процедура ЗаполнитьКЗаказуТоварыВсеДляВыделенныхСтрок(Команда)
	ЗаполнитьКЗаказуТовары(Истина);
КонецПроцедуры

&НаКлиенте
Процедура ОтметитьКЗаказуЗапасы(Команда)

	ИзменитьОтметку("Запасы", Истина);
	
	ТекущаяСтрока = Элементы.Запасы.ТекущиеДанные;
	
	ОтобразитьРасчитанноеОкругление(ТекущаяСтрока, Истина);

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

&НаКлиенте
Процедура СнятьОтметкуЗапасы(Команда)

	ИзменитьОтметку("Запасы", Ложь);
	
	ТекущаяСтрока = Элементы.Запасы.ТекущиеДанные;
	
	ОтобразитьРасчитанноеОкругление(ТекущаяСтрока, Истина);

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

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

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

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

&НаКлиенте
Процедура ЗаполнитьСклад(Команда)

	МассивТипов = Новый Массив();
	МассивТипов.Добавить(ПредопределенноеЗначение("Перечисление.ТипыОбеспечения.Перемещение"));
	ЗаполнитьИсточникОбеспечения(МассивТипов);
	
КонецПроцедуры

&НаКлиенте
Процедура ЗаполнитьПодразделение(Команда)

	МассивТипов = Новый Массив();
	МассивТипов.Добавить(ПредопределенноеЗначение("Перечисление.ТипыОбеспечения.Производство"));
	ЗаполнитьИсточникОбеспечения(МассивТипов);
	
КонецПроцедуры

&НаКлиенте
Процедура ЗаполнитьДатуПоставки(Команда)
	
	// &ЗамерПроизводительности
	ОценкаПроизводительностиКлиент.НачатьЗамерВремени(Истина,
		"Обработка.ОбеспечениеПотребностей.Форма.Форма.Команда.ЗаполнитьДатуПоставки");
	
	ОписаниеОповещения = Новый ОписаниеОповещения("ЗаполнитьДатуПоставкиПослеВводаЗначения", ЭтотОбъект);
	ДатаПоставки = ОбщегоНазначенияКлиент.ДатаСеанса();
	ПоказатьВводДаты(ОписаниеОповещения, ДатаПоставки, НСтр("ru = 'Введите дату поставки'"), ЧастиДаты.Дата);
	
КонецПроцедуры

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

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

&НаКлиенте
Процедура ОбновитьСформированныеЗаказы(Команда)
	ОбновитьЗначенияРеквизитовТаблицыДокументов();
КонецПроцедуры

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

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

&НаКлиенте
Процедура ЗаказНаПроизводствоКПроизводству(Команда)
	
	Возврат;
	
КонецПроцедуры

&НаКлиенте
Процедура РазвернутьСтроки(Команда)
	
	КоллекцияЭлементовДерева=ПредварительныйПросмотр.ПолучитьЭлементы();
	
	Для Каждого Строка Из КоллекцияЭлементовДерева Цикл
		ИдентификаторСтроки=Строка.ПолучитьИдентификатор();
		Элементы.ПредварительныйПросмотр.Развернуть(ИдентификаторСтроки);
	КонецЦикла;
	
КонецПроцедуры

&НаКлиенте
Процедура СвернутьСтроки(Команда)
	
	КоллекцияЭлементовДерева=ПредварительныйПросмотр.ПолучитьЭлементы();
	
	Для Каждого Строка Из КоллекцияЭлементовДерева Цикл
		ИдентификаторСтроки=Строка.ПолучитьИдентификатор();
		Элементы.ПредварительныйПросмотр.Свернуть(ИдентификаторСтроки);
	КонецЦикла;
	
КонецПроцедуры

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

&НаКлиенте
Процедура ИзменитьСклад(Команда)
	
	ОткрытьФорму(
		"Справочник.Склады.Форма.ФормаВыбора",
		Новый Структура("ВыборГруппИЭлементов", ИспользованиеГруппИЭлементов.Элементы),
		ЭтотОбъект,
		,
		,
		,
		Новый ОписаниеОповещения("ВыборСкладаЗавершение", ЭтотОбъект),
		РежимОткрытияОкнаФормы.БлокироватьОкноВладельца);

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

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

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

#Область ШагНастройкаСпособовОбеспечения

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

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

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

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

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

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

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

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

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

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

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

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

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

&НаКлиенте
Процедура ЗаполнитьКЗаказуТовары(ЭтоПлановыйЗаказ)

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

	ТекстСообщения = СтрШаблон(
		НСтр("ru = 'Установлено новое значение в колонке: ""К заказу товары"". Всего обработано строк: %1'"),
		ИдентификаторыСтрок.Количество());

	ПоказатьОповещениеПользователя(НСтр("ru = 'Обработка строк'"), , ТекстСообщения);

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

&НаСервере
Процедура УстановитьДоступностьЭлементовФормыПоПравам()

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

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

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

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

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

#Область ШагЗапасы

&НаКлиенте
Процедура ЗапасыПриАктивизацииСтрокиОбработчикОжидания()

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

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

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

&НаКлиенте
Процедура РассчитатьСтрокуТаблицыЗапасыНаКлиенте(СпособОбеспечения)

	Поставка = Элементы.Запасы.ТекущиеДанные;

	Если Поставка.Отметка Тогда

		РассчитатьИтоги();

	КонецЕсли;

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

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

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

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

&НаКлиенте
Процедура РассчитатьСтрокуТаблицыЗаказыКОбеспечениюНаКлиенте(СпособОбеспечения)

	Поставка = Элементы.ЗаказыКОбеспечению.ТекущиеДанные;

	Если Поставка.Отметка Тогда

		РассчитатьИтоги();

	КонецЕсли;

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

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

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

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

#Область ШагЗаказы

&НаКлиенте
Процедура ЗаказыПриАктивизацииСтрокиОбработчикОжидания()
	
	Строка = Элементы.ЗаказыКОбеспечению.ТекущиеДанные;
	
	Если Строка = Неопределено Тогда
		
		Элементы.ПанельРекомендаций.ТекущаяСтраница = Элементы.СтраницаНеВыделенаСтрока;
		
	Иначе
		
		СтрокаФормата = "ЧДЦ=3; ЧН=0.000";
		ЕдиницаИЗмерения = Строка.ЕдиницаИзмерения;
		
		Если Не ЗначениеЗаполнено(Строка.ДатаОтгрузки) Тогда
			
			ДатаОтгрузки = НСтр("ru = '-'");
			
		Иначе
			
			ДатаОтгрузки = НадписьВФормате(Строка.ДатаОтгрузки, "", "ДЛФ=D");
			
		КонецЕсли;
		
		НеЗаполненГрафикПоставок = Строка.ДатаПоставкиРасчетная = '00010101'
			И Строка.ДатаПоставкиПоСпособуОбеспечения > '00010101';
		Если НеЗаполненГрафикПоставок Тогда
			ДатаПоставки = НСтр("ru = 'не заполнен график поставок'");
		Иначе
			ДатаПоставки = НадписьВФормате(Строка.ДатаПоставкиРасчетная, "", "ДЛФ=D");
		КонецЕсли;
		
		Требуется    = НадписьВФормате(Строка.Требуется,  ЕдиницаИзмерения, СтрокаФормата);
		Обеспечено   = НадписьВФормате(Строка.Обеспечено, ЕдиницаИзмерения, СтрокаФормата);
			
		КоличествоКЗаказуНадпись = НадписьВФормате(Строка.КЗаказуРекомендуется, ЕдиницаИзмерения, СтрокаФормата);
		
		ОтгрузкаВнутриПериода = Строка.ДатаПоставкиРасчетная <= Строка.ДатаПоставкиПоСпособуОбеспечения;
		
		Если Строка.КЗаказуТовары = 2 Тогда
			
			ТекстРекомендации = НСтр("ru = 'Не заказывать товар. Ожидать наступления даты заказа по графику.'");
			
		ИначеЕсли ОтгрузкаВнутриПериода Тогда
			
			Если Строка.Обеспечено = 0 Тогда
				ТекстРекомендации = НСтр("ru = 'Заказать количество, требующееся по заказу'");
			Иначе
				ТекстРекомендации = НСтр("ru = 'Заказать количество, требующееся по заказу, за вычетом обеспеченного ранее'");
			КонецЕсли;
			
		Иначе
			
			ТекстРекомендации = НСтр("ru = 'Не заказывать товар. Ожидать приближения даты отгрузки'");
			
		КонецЕсли;
		
		Если ОтгрузкаВнутриПериода Тогда
			Если НеЗаполненГрафикПоставок Тогда
				НадписьДатаОтгрузки = НСтр("ru = 'Не удалось рассчитать дату поставки на данную дату отгрузки'");
			Иначе
				НадписьДатаОтгрузки = НСтр("ru = 'Дата отгрузки обеспечивается ближайшей поставкой'");
			КонецЕсли;
		Иначе
			НадписьДатаОтгрузки = НСтр("ru = 'Дата отгрузки обеспечивается одной из следующих поставок'");
		КонецЕсли;
		
		Элементы.ПанельРекомендаций.ТекущаяСтраница = Элементы.СтраницаЗаказыПоГрафикуДатаНаступила;
		
		Элементы.СтраницыРекомендация7.ТекущаяСтраница   = ?(ОтгрузкаВнутриПериода,
			Элементы.СтраницаРекомендацияЗаказать7,
			Элементы.СтраницаРекомендацияНеЗаказывать7);
		
	КонецЕсли;
	
	ОтобразитьРасчитанноеОкругление(Строка, Ложь);
	
КонецПроцедуры

&НаКлиентеНаСервереБезКонтекста
Процедура ЗаполнитьРасчетныеПоляСтрокиЗаказы(Строка, КэшированныеЗначения)

	Строка.КартинкаПриоритета = ?(Строка.Приоритет = КэшированныеЗначения.ВысшийПриоритет, 0,
		?(Строка.Приоритет = КэшированныеЗначения.НизшийПриоритет, 2, 1));

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

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

#Область ШагиПотребности

&НаКлиенте
Процедура ОткрытьМетодОбеспечения(ИмяТаблицы)

	Поставка = Элементы[ИмяТаблицы].ТекущиеДанные;
	КлючНоменклатуры = Новый Структура("Номенклатура, Характеристика, Склад, ЭтоРабота");
	КлючНоменклатуры.ЭтоРабота = Ложь;
	ЗаполнитьЗначенияСвойств(КлючНоменклатуры, Поставка);

	РежимОткрытия = "Полный";

	ПараметрыФормы = Новый Структура("КлючПотребности, РассчитыватьСтатистику, РежимОткрытия",
		КлючНоменклатуры, Истина, РежимОткрытия);

	ОткрытьФорму("Обработка.ОбеспечениеПотребностей.Форма.ФормаРедактированияПараметровОбеспечения", ПараметрыФормы, ЭтаФорма, УникальныйИдентификатор);

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

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

&НаКлиенте
Процедура ОчиститьУсловияЗакупок(Поставка)

	Поставка.Соглашение = ПредопределенноеЗначение("Справочник.СоглашенияСПоставщиками.ПустаяСсылка");
	Поставка.ЦенаВВалютеУправленческогоУчета = 0;
	Поставка.ЦенаВВалютеСоглашения = 0;
	Поставка.ВалютаСоглашения = ПредопределенноеЗначение("Справочник.Валюты.ПустаяСсылка");

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

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

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

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

#Область КорзинаЗаказов

&НаКлиенте
Процедура РассчитатьИтоги()
	
	КорзинаЗаказовИтогПолеСтрокВсего = 0;
	КорзинаЗаказовИтогПолеОбщийВес   = 0;
	КорзинаЗаказовИтогПолеСумма      = 0;
	
	Для Каждого Строка Из Объект.Запасы Цикл
		Если Строка.Отметка И Строка.КЗаказу > 0 Тогда
			
			Если Строка.НеОкруглятьПередСозданиемЗаказа Тогда
				КорзинаЗаказовИтогПолеСумма = КорзинаЗаказовИтогПолеСумма + Строка.ЦенаВВалютеУправленческогоУчета * Строка.КЗаказу;
				КорзинаЗаказовИтогПолеОбщийВес = КорзинаЗаказовИтогПолеОбщийВес + Строка.КЗаказу * Строка.Вес;
				КорзинаЗаказовИтогПолеСтрокВсего = КорзинаЗаказовИтогПолеСтрокВсего + 1;
			Иначе
				КорзинаЗаказовИтогПолеСумма = КорзинаЗаказовИтогПолеСумма + Строка.ЦенаВВалютеУправленческогоУчета * Строка.Округлено;
				КорзинаЗаказовИтогПолеОбщийВес = КорзинаЗаказовИтогПолеОбщийВес + Строка.Округлено * Строка.Вес;
				КорзинаЗаказовИтогПолеСтрокВсего = КорзинаЗаказовИтогПолеСтрокВсего + 1;
			КонецЕсли;
			
		КонецЕсли;
	КонецЦикла;
	
	Для Каждого Строка Из Объект.ЗаказыКОбеспечению Цикл
		Если Строка.Отметка И Строка.КЗаказу Тогда
			
			Если Строка.НеОкруглятьПередСозданиемЗаказа Тогда
				КорзинаЗаказовИтогПолеСумма = КорзинаЗаказовИтогПолеСумма + Строка.ЦенаВВалютеУправленческогоУчета * Строка.КЗаказу;
				КорзинаЗаказовИтогПолеОбщийВес = КорзинаЗаказовИтогПолеОбщийВес + Строка.КЗаказу * Строка.Вес;
				КорзинаЗаказовИтогПолеСтрокВсего = КорзинаЗаказовИтогПолеСтрокВсего + 1;
			Иначе
				КорзинаЗаказовИтогПолеСумма = КорзинаЗаказовИтогПолеСумма + Строка.ЦенаВВалютеУправленческогоУчета * Строка.Округлено;
				КорзинаЗаказовИтогПолеОбщийВес = КорзинаЗаказовИтогПолеОбщийВес + Строка.Округлено * Строка.Вес;
				КорзинаЗаказовИтогПолеСтрокВсего = КорзинаЗаказовИтогПолеСтрокВсего + 1;
			КонецЕсли;
		
		КонецЕсли;
	КонецЦикла;
	
КонецПроцедуры

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

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

&НаСервере
Процедура ИзменитьОтметкуНаВсеСтроки(ИмяТаблицы, Установить)
	
	Таблица = Объект[ИмяТаблицы];

	Для Каждого Строка Из Таблица Цикл
		
		Строка.Отметка = Установить;
	КонецЦикла;
	
	РассчитатьИтогиНаСервере();
	
КонецПроцедуры

&НаСервере
Процедура ЗаполнитьЦеныНаСервере(СписокТоваров, Соглашение)
	
	СписокТоваровСЦенами = ПолучитьЦены(СписокТоваров, Соглашение);
	Для Каждого Товар Из СписокТоваровСЦенами Цикл
		
		СтрокаДерева = ПредварительныйПросмотр.НайтиПоИдентификатору(Товар.ИД);
		СтрокаДерева.ЦенаВВалютеСоглашения               = Товар.ЦенаВВалютеСоглашения;
		СтрокаДерева.СуммаВалютаСоглашения               = СтрокаДерева.ЦенаВВалютеСоглашения * СтрокаДерева.КЗаказу;
		СтрокаДерева.ЦенаВВалютеУправленческогоУчета     = Товар.ЦенаВВалютеУправленческогоУчета;
		СтрокаДерева.СуммаУпрУчет                        = СтрокаДерева.ЦенаВВалютеУправленческогоУчета * СтрокаДерева.КЗаказу;
		СтрокаДерева.УпаковкаЗаказа                      = Товар.УпаковкаЗаказа;
		СтрокаДерева.МинимальнаяПартияПоставки           = Товар.МинимальнаяПартияПоставки;
		СтрокаДерева.ВидЦены                             = Товар.ВидЦены;
		СтрокаДерева.ВалютаСоглашения                    = Товар.ВалютаСоглашения;
		
	КонецЦикла;
	
КонецПроцедуры

&НаСервере
Функция ПолучитьЦены(СписокТоваров, Соглашение)
	
	ВидЦеныПоставщика = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(Соглашение, "ВидЦеныПоставщика");

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

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

#Область ШагРедактированиеЗаказов

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

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

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

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

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

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

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

&НаКлиенте
Процедура ПересчитатьИтогиПоЗаказу(СтрокаЗаказа)
	
	СтрокаЗаказа.Потребность = 0;
	СтрокаЗаказа.КЗаказу = 0;
	СтрокаЗаказа.СуммаВалютаСоглашения = 0;
	СтрокаЗаказа.СтрокВЗаказе = 0;
	СтрокаЗаказа.Вес = 0;
	
	Для Каждого СтрокаТовар Из СтрокаЗаказа.ПолучитьЭлементы() Цикл
		
		СтрокаТовар.СуммаВалютаСоглашения = СтрокаТовар.КЗаказу * СтрокаТовар.ЦенаВВалютеСоглашения;
		
		СтрокаЗаказа.Потребность = СтрокаЗаказа.Потребность + СтрокаТовар.Потребность;
		СтрокаЗаказа.КЗаказу = СтрокаЗаказа.КЗаказу + СтрокаТовар.КЗаказу;
		СтрокаЗаказа.СуммаВалютаСоглашения = СтрокаЗаказа.СуммаВалютаСоглашения + СтрокаТовар.СуммаВалютаСоглашения;
		СтрокаЗаказа.СтрокВЗаказе   = СтрокаЗаказа.СтрокВЗаказе + СтрокаТовар.СтрокВЗаказе;
		СтрокаЗаказа.Вес = СтрокаЗаказа.Вес + СтрокаТовар.Вес;
		
	КонецЦикла;
	
	Если СтрокаЗаказа.МинимальнаяСуммаЗаказа > 0 И СтрокаЗаказа.МинимальнаяСуммаЗаказа > СтрокаЗаказа.СуммаВалютаСоглашения Тогда
		СтрокаЗаказа.Предупреждение = Истина;
	Иначе
		СтрокаЗаказа.Предупреждение = Ложь;
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура СформироватьНадписьПредупреждения(Элемент)

	Если Элемент.ТекущиеДанные = Неопределено Тогда
		Возврат;
	КонецЕсли;
	
	Если Элемент.ТекущиеДанные.УровеньВДереве = 0 Тогда
		СтрокаЗаказа = Элемент.ТекущиеДанные;
	Иначе
		СтрокаЗаказа = Элемент.ТекущиеДанные.ПолучитьРодителя();
	КонецЕсли;
	
	СуммаЗаказа      = Формат(СтрокаЗаказа.СуммаВалютаСоглашения,  "ЧДЦ=2; ЧН=0,00");
	СуммаСоглашения  = Формат(СтрокаЗаказа.МинимальнаяСуммаЗаказа, "ЧДЦ=2; ЧН=0,00");
	СуммаКДозаказу   = Формат(СтрокаЗаказа.МинимальнаяСуммаЗаказа - СтрокаЗаказа.СуммаВалютаСоглашения, "ЧДЦ=2; ЧН=0,00");
	ВалютаСоглашения = Строка(СтрокаЗаказа.ВалютаСоглашения);
	
	Если СтрокаЗаказа.Предупреждение Тогда
		ТекстПредупреждения = НСтр("ru='Минимальная сумма заказа по соглашению %1, текущая сумма %2'");
		ТекстПредупреждения = ТекстПредупреждения + Символы.ПС + НСтр("ru='Рекомендуется увеличить сумму заказа на %3'");
		
		ТекстПредупреждения = СтрЗаменить(ТекстПредупреждения, "%1", СуммаСоглашения + " " + ВалютаСоглашения);
		ТекстПредупреждения = СтрЗаменить(ТекстПредупреждения, "%2", СуммаЗаказа     + " " + ВалютаСоглашения);
		ТекстПредупреждения = СтрЗаменить(ТекстПредупреждения, "%3", СуммаКДозаказу  + " " + ВалютаСоглашения);
	Иначе
		ТекстПредупреждения = "";
	КонецЕсли;

	Элементы.СтрокаПредупреждение.Заголовок = ТекстПредупреждения;
	
КонецПроцедуры

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

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

&НаКлиенте
Процедура УстановитьСвойстваСворачиваемойГруппы(ЭлементГруппа, КартинкаГруппы, ГруппаСвернута)

	ЭлементГруппа.Видимость = ГруппаСвернута;
	
	Если ГруппаСвернута Тогда
		КартинкаГруппы.Картинка = БиблиотекаКартинок.СтрелкаВниз;
	Иначе
		КартинкаГруппы.Картинка = БиблиотекаКартинок.СтрелкаВправо;
	КонецЕсли; 

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

&НаКлиенте
Процедура ПоказатьСкрытьПредупреждение()
	
	СвернутаГруппаПредупреждение = НЕ Элементы.ГруппаПредупреждение.Видимость;
	
	УстановитьСвойстваСворачиваемойГруппы(
	Элементы.ГруппаПредупреждение,
	Элементы.ПоказатьСкрытьПредупреждения,
	СвернутаГруппаПредупреждение);
	
КонецПроцедуры

&НаКлиенте
Функция ПодготовитьСтруктуруСтроки()
	
	СтруктураСтроки = Новый Структура("СпособОбеспечения, ИсточникОбеспечения, Соглашение, Склад, Номенклатура,
	|Характеристика, КЗаказу, УпаковкаЗаказа, ЕдиницаИзмерения, ЧислительУпаковки, ЗнаменательУпаковки,
	|НомерСтроки, Отметка, Назначение, ЦенаВВалютеСоглашения, ВалютаСоглашения, Потребность");
	
	Возврат СтруктураСтроки;
	
КонецФункции

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

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

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

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

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

#Область ШагСформированныеЗаказы

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

#Область СлужебныеПроцедурыСозданияЗаказов

&НаСервере
Процедура ВыгрузитьОтмеченныеКЗаказу(Таблица, ИмяТаблицы)

	Для Каждого Строка Из Объект[ИмяТаблицы] Цикл

		Если Строка.Отметка И Строка.КЗаказу > 0 Тогда

			НоваяСтрока = Таблица.Добавить();
			ЗаполнитьЗначенияСвойств(НоваяСтрока, Строка);

		КонецЕсли;

	КонецЦикла;

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

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

&НаСервере
Процедура ПродолжитьСДругимиОтборамиНаСервере()

	Объект.Запасы.Очистить();
	Объект.ЗаказыКобеспечению.Очистить();
	Объект.СпособыОбеспечения.Очистить();
	ТаблицаДокументы.Очистить();
	СформированныеЗаказы.Очистить();
	УстановитьСтраницыПомощника("ШагОтборПотребностей");

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

&НаСервере
Процедура ОбновитьРеквизитыТаблицыДокументов(Ссылка)

	ПараметрыОтбора = Новый Структура("Документ", Ссылка);

	МассивНайденныхСтрок = ТаблицаДокументы.НайтиСтроки(ПараметрыОтбора);
	Если МассивНайденныхСтрок.Количество() > 0 Тогда

		НовыеЗначенияРеквизитов = ПолучитьЗначенияРеквизитовДокументаИзСсылки(Ссылка);
		ЗаполнитьЗначенияСвойств(МассивНайденныхСтрок[0], НовыеЗначенияРеквизитов);

	КонецЕсли;

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

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


	КонецЕсли;
	
	Возврат ТекстЗапроса;
КонецФункции

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

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

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

#Область ЛогикаРаботыФормы

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

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

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

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

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

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

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

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

&НаСервере
Процедура УстановитьСтраницыПомощника(ИмяШага)

	Если ИмяШага = "ШагОтборПотребностей" Тогда

		Элементы.Далее.КнопкаПоУмолчанию = Истина;
		Элементы.Помощник.ТекущаяСтраница = Элементы.ШагОтборПотребностей;
		Элементы.НадписьШаг.Заголовок = НСтр("ru = 'Шаг 1 из 6. Отбор потребностей'");

	ИначеЕсли ИмяШага = "ШагНастройкаСпособовОбеспечения" Тогда

		Элементы.ДалееНастройка.КнопкаПоУмолчанию = Истина;
		Элементы.Помощник.ТекущаяСтраница = Элементы.ШагНастройкаСпособовОбеспечения;
		Элементы.НадписьШаг.Заголовок = НСтр("ru = 'Шаг 2 из 6. Настройка способов обеспечения'");

	ИначеЕсли ИмяШага = "ШагЗапасы" Тогда

		Элементы.Помощник.ТекущаяСтраница = Элементы.ШагиПотребности;
		Элементы.СтраницыКомандыИФильтрыПотребностей.ТекущаяСтраница = Элементы.СтраницаКомандыИФильтрыЗапасы;
		Элементы.СтраницаКомандыИФильтрыЗаказы.Видимость = Ложь;
		Элементы.СтраницаКомандыИФильтрыЗапасы.Видимость = Истина;
		Элементы.СтраницыТаблицаПотребностей.ТекущаяСтраница = Элементы.СтраницаТаблицаЗапасы;
		Элементы.ДалееСоставЗаказа.КнопкаПоУмолчанию = Истина;
		Элементы.НадписьШаг.Заголовок = НСтр("ru = 'Шаг 3 из 6. Поддержание запасов'");

	ИначеЕсли ИмяШага = "ШагЗаказы" Тогда

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

		Элементы.Помощник.ТекущаяСтраница = Элементы.ШагРедактированиеЗаказов;
		Элементы.СформироватьЗаказы.КнопкаПоУмолчанию = Истина;
		Элементы.НадписьШаг.Заголовок = НСтр("ru = 'Шаг 5 из 6. Предварительный просмотр и редактирование заказов'");

	ИначеЕсли ИмяШага = "ШагСформированныеЗаказы" Тогда

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

	КонецЕсли;
	
	ВключенаОбработкаОповещенийЗаписиДокументов = Ложь;

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

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

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

#Область ОтборыСКД

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

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

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

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

&НаСервере
Процедура УстановитьПараметрыВыбораКладовыхВСКД(СхемаКомпоновкиДанных)

	Если Параметры.Свойство("ОтборПоЦеховымКладовым") И Параметры.ОтборПоЦеховымКладовым Тогда
		ПолеСклад = СхемаКомпоновкиДанных.НаборыДанных[0].Поля.Найти(Новый ПолеКомпоновкиДанных("Склад"));
		ОбщегоНазначенияУТКлиентСервер.ДобавитьПараметрВыбора(ПолеСклад, "ЦеховаяКладовая", Истина);
	КонецЕсли;
	
КонецПроцедуры

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

&НаСервере
Процедура ВосстановитьНастройки()

	ЗначениеНастроек = ОбщегоНазначения.ХранилищеОбщихНастроекЗагрузить("Обработка.ОбработкаОбеспечениеПотребностей", "Основная");

	Если ТипЗнч(ЗначениеНастроек) = Тип("Структура") Тогда

		КомпоновщикНастроекДляОтборов.ЗагрузитьПользовательскиеНастройки(ЗначениеНастроек.ПользовательскиеНастройки);
		КомпоновщикНастроекДляОтборов.Восстановить(СпособВосстановленияНастроекКомпоновкиДанных.ПроверятьДоступность);

		ЗаполнитьЗначенияСвойств(ЭтотОбъект, ЗначениеНастроек);

		Если Не ЗначениеНастроек.Свойство("ФильтрНеобеспеченные") Тогда

			ФильтрНеобеспеченные = Истина;

		КонецЕсли;
		
		Если Не ЗначениеНастроек.Свойство("РасчетОбособленныхПотребностейСУчетомОстатковНаВсехСкладах") Тогда
			РасчетОбособленныхПотребностейСУчетомОстатковНаВсехСкладах = 1;
		КонецЕсли;

	КонецЕсли;

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

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

	Если СписокВыбора.Количество() = 1 Тогда
		ОтборПоТипуОбеспечения = Элементы.ОтборПоТипуОбеспечения.СписокВыбора[0].Значение;
	КонецЕсли;
	
	// Настройка формы в целом в зависимости от доступных типов обеспечения.
	Если СписокВыбора.Количество() = 1 Тогда
		
		Элементы.ОтборПоТипуОбеспечения.Вид = ВидПоляФормы.ПолеНадписи;
		Элементы.ОтборПоТипуОбеспечения.ЦветТекста = ЦветаСтиля.ПоясняющийТекст;
		Элементы.ОтборПоТипуОбеспечения.Шрифт = Новый Шрифт(Элементы.ОтборПоТипуОбеспечения.Шрифт,,,Истина);
		
	ИначеЕсли СписокВыбора.Количество() = 0 Тогда

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

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

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

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

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

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

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

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

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

#Область ФильтрыТаблицПотребностей

&НаКлиентеНаСервереБезКонтекста
Функция ТекстЛюбой()
	Возврат НСтр("ru = '<любой>'");
КонецФункции

&НаКлиентеНаСервереБезКонтекста
Функция КодУровняЗапаса(Уровень)
	
	Код = 0;
	Пока Код < 7 Цикл
		
		Если Уровень = УровеньЗапасаПоКоду(Код) Тогда
			Возврат Код;
		КонецЕсли;
		
		Код = Код + 1;
		
	КонецЦикла;
	
	Возврат Неопределено;
	
КонецФункции

&НаКлиентеНаСервереБезКонтекста
Функция УровеньЗапасаПоКоду(Код)
	
	Возврат
		?(Код = 0, ТекстЛюбой(),
		?(Код = 1, НСтр("ru = 'Критический'"),
		?(Код = 2, НСтр("ru = 'Близкий к критическому'"),
		?(Код = 3, НСтр("ru = 'К отмене заказа'"),
		?(Код = 4, НСтр("ru = 'Меньше половины'"),
		?(Код = 5, НСтр("ru = 'Больше половины'"),
		?(Код = 6, НСтр("ru = 'Избыток'"), Неопределено)))))));
	
КонецФункции

&НаСервере
Процедура ОтборЗапасыНаСервере()

	СтруктураОтбора = Новый Структура();

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

	Если ФильтрУровеньЗапаса <> ТекстЛюбой() Тогда

		Если КодУровняЗапаса(ФильтрУровеньЗапаса) = 3 Тогда // к отмене заказа
			СтруктураОтбора.Вставить("КОтменеЗаказаКартинка", Истина);
		ИначеЕсли КодУровняЗапаса(ФильтрУровеньЗапаса) = 1
			Или КодУровняЗапаса(ФильтрУровеньЗапаса) = 2
			Или КодУровняЗапаса(ФильтрУровеньЗапаса) = 4 Тогда
			СтруктураОтбора.Вставить("УровеньЗапаса", КодУровняЗапаса(ФильтрУровеньЗапаса));
		ИначеЕсли КодУровняЗапаса(ФильтрУровеньЗапаса) = 5 Или КодУровняЗапаса(ФильтрУровеньЗапаса) = 6 Тогда
			СтруктураОтбора.Вставить("УровеньЗапасаМаксимум", КодУровняЗапаса(ФильтрУровеньЗапаса));
		КонецЕсли;

	КонецЕсли;

	Если ЗначениеЗаполнено(ФильтрКЗаказуНеПозднееЗапасы) Тогда

		СтруктураОтбора.Вставить("УдовлетворяетОтбору", Истина);
		ОбновитьФильтрКЗаказуНеПозднееЗапасы();

	КонецЕсли;

	Если ЗначениеЗаполнено(СтруктураОтбора) Тогда
		Элементы.Запасы.ОтборСтрок = Новый ФиксированнаяСтруктура(СтруктураОтбора);
	Иначе
		Элементы.Запасы.ОтборСтрок = Неопределено;
	КонецЕсли;

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

&НаСервере
Процедура ОтборЗаказыНаСервере()

	СтруктураОтбора = Новый Структура();

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

	Если ФильтрНеОбеспеченные Тогда
		СтруктураОтбора.Вставить("УдовлетворяетОтбору", Истина);
	КонецЕсли;

	Если ЗначениеЗаполнено(ФильтрПриоритет) Тогда
		СтруктураОтбора.Вставить("Приоритет", ФильтрПриоритет);
	КонецЕсли;

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

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

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

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

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

&НаСервере
Процедура ОбновитьФильтрКЗаказуНеПозднееЗапасы()
	
	ДоТочкиЗаказаДней = (ФильтрКЗаказуНеПозднееЗапасы - НачалоДня(ТекущаяДатаСеанса())) / 86400; //86400 - длительность суток
	Для каждого Строка Из Объект.Запасы Цикл
		
		НаступитТочкаЗаказа = ?(Строка.МетодОбеспечения = Перечисления.МетодыОбеспеченияПотребностей.ПоддержаниеЗапасаМинМакс,
			Строка.ТочкаЗаказаКартинка,
			Строка.СреднедневноеПотребление > 0 И Строка.ДоТочкиЗаказа / Строка.СреднедневноеПотребление <= ДоТочкиЗаказаДней);
			
		ЕстьКоличествоКЗаказу = Строка.Остаток + Строка.ЗаказыКПоступлению - Строка.МинимальныйЗапас < Строка.МаксимальныйЗапас;
		Строка.УдовлетворяетОтбору = НаступитТочкаЗаказа И ЕстьКоличествоКЗаказу;
		
	КонецЦикла;
	
КонецПроцедуры

&НаСервере
Процедура ОбновитьФильтрКЗаказуКОтгрузке()

	Для каждого Строка Из Объект.ЗаказыКОбеспечению Цикл

		Строка.УдовлетворяетОтбору =
			Строка.ДатаОтгрузки >= ФильтрКОтгрузкеНеРанее
				И (Строка.ДатаОтгрузки <= ФильтрКОтгрузкеНеПозднее Или Не ЗначениеЗаполнено(ФильтрКОтгрузкеНеПозднее))
				И (Строка.Требуется > Строка.Обеспечено Или Не ФильтрНеобеспеченные)
				И (Строка.ДатаЗаказаНеПозднее <= ФильтрКЗаказуНеПозднееЗаказы
					Или Не ЗначениеЗаполнено(ФильтрКЗаказуНеПозднееЗаказы))

	КонецЦикла;

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

&НаСервере
Процедура ОчиститьОтборыЗапасы()

	ФильтрКЗаказуНеПозднееЗапасы = '00010101'; //очистка даты
	ФильтрУровеньЗапаса = ТекстЛюбой();
	ФильтрОтметкаЗапасы = Ложь;
	ОтборЗапасыНаСервере();

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

&НаСервере
Процедура ОчиститьОтборыЗаказы()
	
	ФильтрКЗаказуНеПозднееЗаказы = '00010101'; //очистка даты
	ФильтрКОтгрузкеНеРанее = '00010101'; //очистка даты
	ФильтрКОтгрузкеНеПозднее = '00010101'; //очистка даты
	ФильтрОтметкаЗаказы = Ложь;
	ФильтрПриоритет = Справочники.Приоритеты.ПустаяСсылка();
	ОтборЗаказыНаСервере();

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

&НаСервере
Процедура ЗаполнитьСписокВыбораФильтраУровняЗапаса()

	СписокВыбора = Элементы.ФильтрУровеньЗапаса.СписокВыбора;
	СписокВыбора.Очистить();

	Для Счетчик = 0 По 6 Цикл

		СписокВыбора.Добавить(УровеньЗапасаПоКоду(Счетчик));

	КонецЦикла;

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

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

#Область ПроверкиВозможностиВыполненияДействий

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

		ТекстОшибки = НСтр("ru = 'Для перехода к следующему шагу необходимо отметить хотя бы один способ обеспечения из списка'");
		ПоказатьПредупреждение(, ТекстОшибки);

		НетОшибок = Ложь;

	КонецЕсли;
	
	Возврат НетОшибок;
	
КонецФункции

&НаКлиенте
Процедура СообщитьОбОтсутствииПотребностей()
	
	ТекстПредупреждения = НСтр("ru = 'Для товаров не установлены параметры поддержания запаса
			|и нет заказов клиентов, заказов на перемещение и т.п. к обеспечению.
			|Установите параметры обеспечения потребностей, либо измените условия отбора потребностей.
			|Важно: полностью отгруженные заказы %1не учитываются.'");

	ИспользуютсяСтатусы = ИспользуютсяСтатусы();
	ТекстПредупреждения = СтрЗаменить(ТекстПредупреждения, "%1", ?(ИспользуютсяСтатусы,
		НСтр("ru = 'и заказы в статусе ниже чем ""К обеспечению""'") + " ", ""));

	ПоказатьПредупреждение(Неопределено, ТекстПредупреждения);
	
КонецПроцедуры

&НаСервереБезКонтекста
Функция ИспользуютсяСтатусы()

	ИспользуютсяСтатусы = ПолучитьФункциональнуюОпцию("ИспользоватьРасширенныеВозможностиЗаказаКлиента")
		Или ПолучитьФункциональнуюОпцию("ИспользоватьСтатусыЗаказовНаВнутреннееПотребление")
		Или ПолучитьФункциональнуюОпцию("ИспользоватьСтатусыЗаказовНаПеремещение")
		Или ПолучитьФункциональнуюОпцию("ИспользоватьСтатусыЗаказовНаСборку");

		
//++ НЕ УТ
	ИспользуютсяСтатусы =
		ИспользуютсяСтатусы
		//++ Устарело_Переработка24
		Или ПолучитьФункциональнуюОпцию("ИспользоватьСтатусыЗаказовПереработчикам")
		//-- Устарело_Переработка24
		Или ПолучитьФункциональнуюОпцию("ИспользоватьСтатусыЗаказовПереработчикам2_5");
//-- НЕ УТ


	Возврат ИспользуютсяСтатусы;

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

&НаКлиенте
Процедура ОчисткаТаблицыПотребностейВопросОповещение(РезультатВопроса, ДополнительныеПараметры) Экспорт

	Результат = Истина;
	Если РезультатВопроса = КодВозвратаДиалога.Отмена Тогда
		Результат = Ложь;
	КонецЕсли;

	Если Результат Тогда

		Если ДополнительныеПараметры.Операция = "Закрытие" Тогда

			ОчисткаТаблицыПотребностейОтветПолучен = Истина;
			Закрыть();

		ИначеЕсли ДополнительныеПараметры.Операция = "ШагНазад" Тогда

			// чтобы не передавать лишние данные на сервер.
			Объект.Запасы.Очистить();
			Объект.ЗаказыКОбеспечению.Очистить();

			ОчиститьДеревоИндексов(Истина);
			
			ОчиститьСообщения();
			УстановитьСтраницыПомощника("ШагНастройкаСпособовОбеспечения");

		КонецЕсли;

	КонецЕсли;

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

&НаКлиенте
Процедура ОчисткаТаблицыПотребностейВопрос(Операция)

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

	ДополнительныеПараметры = Новый Структура("Операция", Операция);
	ОписаниеОповещения = Новый ОписаниеОповещения("ОчисткаТаблицыПотребностейВопросОповещение",
		ЭтаФорма, ДополнительныеПараметры);
	ПоказатьВопрос(ОписаниеОповещения, ТекстВопроса, Кнопки);

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

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

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

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

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

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

&НаКлиентеНаСервереБезКонтекста
Функция ПриИзмененииРасчетОбособленныхПотребностейСУчетомОстатковНаВсехСкладах(РасчетСУчетомОстатковНаВсехСкладах)
	
	Если РасчетСУчетомОстатковНаВсехСкладах = 0 Тогда // Только на складе отгрузки
		Текст = НСтр("ru = 'Для центра распределительной сети настройка игнорируется - учитываются остатки всех складов сети'");
	Иначе
		Текст = НСтр("ru = 'Для удаленного склада распределительной сети настройка игнорируется - учитываются остатки только удаленного склада'");
	КонецЕсли;
	
	Возврат Текст;
	
КонецФункции

&НаСервере
Процедура УстановитьДоступностьКомандПоФункциональнымОпциям()
	
	ВидимостьКоманды = Ложь;
	//++ НЕ УТ
	ВидимостьКоманды =
		ПолучитьФункциональнуюОпцию("ИспользоватьСтатусыЗаказовПереработчикам2_5")
		//++ Устарело_Переработка24
		Или ПолучитьФункциональнуюОпцию("ИспользоватьСтатусыЗаказовПереработчикам")
		//-- Устарело_Переработка24
		Или Ложь;
	//-- НЕ УТ
	Элементы.ФормаЗаказПереработчикуКИсполнению.Видимость = ВидимостьКоманды;
	
	ВидимостьКоманды = Ложь;
	Элементы.ФормаЗаказНаПроизводствоКПроизводству.Видимость = ВидимостьКоманды;
	
	ВидимостьКоманды = ПолучитьФункциональнуюОпцию("ИспользоватьСтатусыЗаказовПоставщикам");
	Элементы.ФормаЗаказПоставщикуПодтвержден.Видимость = ВидимостьКоманды;
	
КонецПроцедуры

&НаСервере
Процедура ФильтрНеобеспеченныеПриИзмененииНаСервере()
	
	СохранитьНастройки();
	ОтборЗаказыНаСервере();
	
КонецПроцедуры

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

&НаКлиентеНаСервереБезКонтекста
Функция НадписьВФормате(Параметр, ЕдиницаИзмерения, ФорматнаяСтрока)
	Возврат СтрШаблон("%1 %2", Формат(Параметр, ФорматнаяСтрока), ЕдиницаИзмерения);
КонецФункции

&НаКлиентеНаСервереБезКонтекста
Функция СтрокаВДату(ДатаСтрокой)
	
	Год = Прав(ДатаСтрокой,4);
	Месяц = Сред(ДатаСтрокой,4,2);
	День = Лев(ДатаСтрокой,2);
	
	Если Не ЗначениеЗаполнено(Год + Месяц + День) Тогда
		Возврат Дата(1,1,1);
	Иначе
		Возврат Дата(Год, Месяц, День);
		
	КонецЕсли;
	
КонецФункции

&НаСервере
Процедура УстановитьУсловноеОформление()

	УсловноеОформление.Элементы.Очистить();

	// Первый уровень группировки в корзине заказов жирный

	Элемент = УсловноеОформление.Элементы.Добавить();

	ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
	ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ПредварительныйПросмотр.Имя);

	ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
	ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("ПредварительныйПросмотр.УровеньВДереве");
	ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
	ОтборЭлемента.ПравоеЗначение = 0;

	Элемент.Оформление.УстановитьЗначениеПараметра("Шрифт", Новый Шрифт(WindowsШрифты.DefaultGUIFont, , , Истина, Ложь, Ложь, Ложь, ));
	
	// Недоступность выбора соглашения для всех способов обеспечения кроме покупки

	Элемент = УсловноеОформление.Элементы.Добавить();

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

	ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
	ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ПредварительныйПросмотрСклад.Имя);

	ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
	ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("ПредварительныйПросмотр.ЭтоРабота");
	ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
	ОтборЭлемента.ПравоеЗначение = Истина;

	Элемент.Оформление.УстановитьЗначениеПараметра("ТолькоПросмотр", Истина);
	
	// Недоступность источника обеспечения, если он задан в способе обеспечения

	Элемент = УсловноеОформление.Элементы.Добавить();

	ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
	ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ПредварительныйПросмотрИсточникОбеспечения.Имя);

	ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
	ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("ПредварительныйПросмотр.ИсточникОбеспеченияТолькоПросмотр");
	ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
	ОтборЭлемента.ПравоеЗначение = Истина;
	
	Элемент.Оформление.УстановитьЗначениеПараметра("ЦветТекста", ЦветаСтиля.ТекстЗапрещеннойЯчейкиЦвет);
	Элемент.Оформление.УстановитьЗначениеПараметра("ТолькоПросмотр", Истина);

	// Нет доступа к заказу
	Элемент = УсловноеОформление.Элементы.Добавить();
	Элемент.Представление = НСтр("ru = 'Нет доступа к заказу'");

	ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
	ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.Заказ.Имя);

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

	ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
	ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.Заказ.Имя);

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

	ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
	ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.МетодОбеспечения.Имя);

	ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
	ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Объект.Запасы.МетодОбеспечения");
	ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Заполнено;
	
	Элемент.Оформление.УстановитьЗначениеПараметра("ЦветТекста", ЦветаСтиля.ГиперссылкаЦвет);

	// Документ имеет высокий приоритет
	Элемент = УсловноеОформление.Элементы.Добавить();
	Элемент.Представление = НСтр("ru = 'Документ имеет высокий приоритет'");

	ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
	ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ЗаказыКОбеспечению.Имя);

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

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

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

	// Текст поля "Способ обеспечения" для номенклатуры, обеспечиваемой без указания способа.

	Элемент = УсловноеОформление.Элементы.Добавить();

	ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
	ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.СпособыОбеспеченияСпособОбеспечения.Имя);

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

	// Выделение цветом ошибки в поле "Дней до планового заказа" когда просрочена дата заказа по плану, нет плановой даты
	// поставки либо незаполнен календарь.

	Элемент = УсловноеОформление.Элементы.Добавить();

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

	ГруппаОтбора1 = Элемент.Отбор.Элементы.Добавить(Тип("ГруппаЭлементовОтбораКомпоновкиДанных"));
	ГруппаОтбора1.ТипГруппы = ТипГруппыЭлементовОтбораКомпоновкиДанных.ГруппаИли;

	ОтборЭлемента = ГруппаОтбора1.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
	ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Объект.СпособыОбеспечения.ДнейДоПлановогоЗаказа");
	ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Меньше;
	ОтборЭлемента.ПравоеЗначение = 0;

	ОтборЭлемента = ГруппаОтбора1.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
	ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Объект.СпособыОбеспечения.ПлановаяДатаЗаказа");
	ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.НеЗаполнено;

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

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

	// Текст <без ограничений периода> в поле "Граница периода обеспечения" при незаполненной границе

	Элемент = УсловноеОформление.Элементы.Добавить();

	ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
	ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.СпособыОбеспеченияГраницаПериодаОбеспечения.Имя);

	ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
	ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Объект.СпособыОбеспечения.ГраницаПериодаОбеспечения");
	ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.НеЗаполнено;

	Элемент.Оформление.УстановитьЗначениеПараметра("Текст", НСтр("ru = '<без ограничений периода>'"));

	// Текст <не заполнен график работы предприятия> в поле "Граница периода обеспечения" при незаполненном календаре
	
	Элемент = УсловноеОформление.Элементы.Добавить();

	ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
	ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.СпособыОбеспеченияГраницаПериодаОбеспечения.Имя);

	ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
	ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Объект.СпособыОбеспечения.ГраницаПериодаОбеспечения");
	ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.НеЗаполнено;

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

	Элемент = УсловноеОформление.Элементы.Добавить();

	ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
	ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.СпособыОбеспеченияГраницаПериодаОбеспечения.Имя);

	ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
	ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Объект.СпособыОбеспечения.ГраницаПериодаОбеспечения");
	ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.НеЗаполнено;

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

	Элемент = УсловноеОформление.Элементы.Добавить();

	ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
	ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.Статус.Имя);

	ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
	ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("ТаблицаДокументы.СтандартнаяКартинка");
	ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.НеРавно;
	ОтборЭлемента.ПравоеЗначение = 0;

	Элемент.Оформление.УстановитьЗначениеПараметра("ЦветТекста", ЦветаСтиля.SpecialTextColor);
	Элемент.Оформление.УстановитьЗначениеПараметра("Текст", НСтр("ru = '<не проведен>'"));

	// Выделение цветом отрицательного остатка на складе

	Элемент = УсловноеОформление.Элементы.Добавить();

	ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
	ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.Остаток.Имя);

	ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
	ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Объект.Запасы.Остаток");
	ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Меньше;
	ОтборЭлемента.ПравоеЗначение = 0;

	Элемент.Оформление.УстановитьЗначениеПараметра("ЦветТекста", ЦветаСтиля.ПоясняющийОшибкуТекст);

	// Текст <сборка> в источнике обеспечения

	Элемент = УсловноеОформление.Элементы.Добавить();

	ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
	ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ИсточникОбеспеченияЗаказы.Имя);

	ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
	ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Объект.ЗаказыКОбеспечению.ТипОбеспечения");
	ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
	ОтборЭлемента.ПравоеЗначение = Перечисления.ТипыОбеспечения.СборкаРазборка;

	Элемент.Оформление.УстановитьЗначениеПараметра("Текст", НСтр("ru = '<сборка>'"));
	Элемент.Оформление.УстановитьЗначениеПараметра("ТолькоПросмотр", Истина);

	Элемент = УсловноеОформление.Элементы.Добавить();

	ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
	ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ИсточникОбеспеченияЗапасы.Имя);

	ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
	ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Объект.Запасы.ТипОбеспечения");
	ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
	ОтборЭлемента.ПравоеЗначение = Перечисления.ТипыОбеспечения.СборкаРазборка;

	Элемент.Оформление.УстановитьЗначениеПараметра("Текст", НСтр("ru = '<сборка>'"));
	Элемент.Оформление.УстановитьЗначениеПараметра("ТолькоПросмотр", Истина);

	// Недоступность источника обеспечения, если он задан в способе обеспечения

	Элемент = УсловноеОформление.Элементы.Добавить();

	ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
	ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ИсточникОбеспеченияЗапасы.Имя);

	ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
	ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Объект.Запасы.ИсточникОбеспеченияТолькоПросмотр");
	ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
	ОтборЭлемента.ПравоеЗначение = Истина;

	Элемент.Оформление.УстановитьЗначениеПараметра("ЦветТекста", ЦветаСтиля.ТекстЗапрещеннойЯчейкиЦвет);
	Элемент.Оформление.УстановитьЗначениеПараметра("ТолькоПросмотр", Истина);

	Элемент = УсловноеОформление.Элементы.Добавить();

	ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
	ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ИсточникОбеспеченияЗаказы.Имя);

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

	Элемент.Оформление.УстановитьЗначениеПараметра("ЦветТекста", ЦветаСтиля.ТекстЗапрещеннойЯчейкиЦвет);
	Элемент.Оформление.УстановитьЗначениеПараметра("ТолькоПросмотр", Истина);
	
	// Текст "<не используется>" в поле Склад отгрузки заказа

	Элемент = УсловноеОформление.Элементы.Добавить();

	ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
	ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.СкладОтгрузкиЗаказа.Имя);

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

	Элемент.Оформление.УстановитьЗначениеПараметра("ЦветТекста", ЦветаСтиля.ТекстЗапрещеннойЯчейкиЦвет);
	Элемент.Оформление.УстановитьЗначениеПараметра("Текст", НСтр("ru = '<не используется>'"));

	// Текст "<не используется>" в поле Статус

	Элемент = УсловноеОформление.Элементы.Добавить();

	ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
	ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.Статус.Имя);

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

	Элемент.Оформление.УстановитьЗначениеПараметра("ЦветТекста", ЦветаСтиля.ТекстЗапрещеннойЯчейкиЦвет);
	Элемент.Оформление.УстановитьЗначениеПараметра("Текст", НСтр("ru = '<не используется>'"));

	// Просроченная дата отгрузки потребности по заказу
	Элемент = УсловноеОформление.Элементы.Добавить();

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

	Элемент.Оформление.УстановитьЗначениеПараметра("ЦветТекста", ЦветаСтиля.ПоясняющийОшибкуТекст);

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

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

&НаКлиенте
Процедура ПроверитьКорректностьЗаполненияФильтраКОтгрузкеНеПозднее(Дата, СтандартнаяОбработка)

	Если Дата < ФильтрКОтгрузкеНеРанее И ЗначениеЗаполнено(ФильтрКОтгрузкеНеРанее) Тогда

		СтандартнаяОбработка = Ложь;
		ПоказатьПредупреждение(, НСтр("ru = 'Дата окончания периода не может быть меньше даты начала'"), , );

	КонецЕсли;

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

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

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

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

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

#Область ОкруглениеКоличества

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

		Возврат Неопределено;
	КонецЕсли;
	
	ИДИндекса = Строка.ИДИндекса;
	
	СоответствиеСтрок = ПодготовитьСоответствиеСтрокДляОкругленияКлиент(ИДИндекса);
	
	Структура = ОкруглитьСоответствиеСтрок(СоответствиеСтрок, ИспользоватьУпаковки);
	
	Возврат СоответствиеСтрок;
	
КонецФункции

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

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

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

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

&НаКлиентеНаСервереБезКонтекста
Функция Округлить(Количество, Кратность, ТипЕдиницыИзмерения)
	
	Если Кратность <> 1
		Или ТипЕдиницыИзмерения = ПредопределенноеЗначение("Перечисление.ТипыИзмеряемыхВеличин.КоличествоШтук") Тогда
		Если Количество % Кратность <> 0 Тогда
			Остаток = Цел(Количество / Кратность) + 1;
			Возврат Остаток * Кратность;
		Иначе
			Возврат Количество;
		КонецЕсли;
	Иначе 
		Возврат Количество;
	КонецЕсли;
	
КонецФункции

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

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

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

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

&НаКлиенте
Функция ПараметрыИнформационнойСтроки()
	
	СтруктураВозврата = Новый Структура();
	СтруктураВозврата.Вставить("ОкругленоИтог", 0);
	СтруктураВозврата.Вставить("КЗаказуИтог", 0);
	СтруктураВозврата.Вставить("КЗаказуИтогЗапасы", 0);
	СтруктураВозврата.Вставить("КЗаказуИтогЗаказы", 0);
	СтруктураВозврата.Вставить("СуммаИтог", 0);
	СтруктураВозврата.Вставить("ЕстьСтрокаСПустойЦеной", Ложь);
	
	Возврат СтруктураВозврата;
	
КонецФункции

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

&НаСервере
Функция ВыгрузитьНоменклатуруСИдентификаторамиСтрок(ТаблицаФормы)
	
	ТаблицаВыгрузки = Новый ТаблицаЗначений();
	ТаблицаВыгрузки.Колонки.Добавить("Номенклатура",   Новый ОписаниеТипов("СправочникСсылка.Номенклатура"));
	ТаблицаВыгрузки.Колонки.Добавить("Характеристика", Новый ОписаниеТипов("СправочникСсылка.ХарактеристикиНоменклатуры"));
	ТаблицаВыгрузки.Колонки.Добавить("Склад",          Новый ОписаниеТипов("СправочникСсылка.Склады"));
	ТаблицаВыгрузки.Колонки.Добавить("ДатаПоставки",   Новый ОписаниеТипов("Дата"));
	ТаблицаВыгрузки.Колонки.Добавить("Индекс",         Новый ОписаниеТипов("Число"));
	
	ВсегоСтрок = ТаблицаФормы.Количество() - 1;
	Для Индекс = 0 По ВсегоСтрок Цикл
		
		СтрокаТаблицы = ТаблицаФормы[Индекс];
		ВыгруженнаяСтрока = ТаблицаВыгрузки.Добавить();
		ЗаполнитьЗначенияСвойств(ВыгруженнаяСтрока, СтрокаТаблицы);
		ВыгруженнаяСтрока.Индекс = Индекс;
		
	КонецЦикла;
	Возврат ТаблицаВыгрузки;
	
КонецФункции

&НаКлиенте
Процедура ВыбратьУпаковкуКлиент(ИмяТаблицы)

	Поставка = Элементы[ИмяТаблицы].ТекущиеДанные;

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

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

// Очищает дерево ИндексыПоиска полностью, либо только записи ссылающиеся на таблицу ЗаказыКОбеспечению.
//
// Параметры:
//  Запасы	 - Булево - Признак того, что вызов процедуры производится на шаге Запасы.
&НаКлиенте
Процедура ОчиститьДеревоИндексов(Запасы)
	
	Корни = ИндексыПоиска.ПолучитьЭлементы();
	
	// Таблица Запасы - первая. Ее очищение по кнопке Назад равнозначно полной очистке таблицы.
	Если Запасы Тогда
		Корни.Очистить();
	КонецЕсли;
	
	Количество = Корни.Количество() - 1;
	Для н = 0 По Количество Цикл
		
		ИндексКорня = Количество - н;
		Корень = Корни[ИндексКорня];
		
		Ветви = Корень.ПолучитьЭлементы();
		КоличествоВетвей = Ветви.Количество() - 1;
		
		// Удаление ветвей связанных с таблицей ЗаказыКОбеспечению
		Для м = 0 По КоличествоВетвей Цикл
			
			ИндексВетви = КоличествоВетвей - м;
			Ветвь = Ветви[ИндексВетви];
			Если Ветвь.ТаблицаЗапасы = Ложь Тогда
				Ветви.Удалить(ИндексВетви);
			КонецЕсли;
			
		КонецЦикла;
		
		// Если из корня удалены все ветви, удаляется корень
		Если Корень.ПолучитьЭлементы().Количество() = 0 Тогда
			Корни.Удалить(ИндексКорня);
		КонецЕсли;
		
	КонецЦикла;
	
КонецПроцедуры

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

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

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