Назначения / Модуль менеджера

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

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

#Область ВыборНазначенийВДокументах

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

	Возврат СтруктураПараметров;
	
КонецФункции

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

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

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

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

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

#Область ИнтерфейсДляДоступаКРеквизитамНазначений

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

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

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

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

#КонецЕсли

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

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

Процедура ОбработкаПолученияПредставления(Данные, Представление, СтандартнаяОбработка)
	
	СтандартнаяОбработка = Ложь;

	Представление = Данные.Наименование;

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

	#Если Клиент Тогда
		ЭтоОсновнойЯзык = ОбщегоНазначенияУТКлиентПовтИсп.ЭтоОсновнойЯзык();
	#Иначе
		ЭтоОсновнойЯзык = ОбщегоНазначенияУТПовтИсп.ЭтоОсновнойЯзык();
	#КонецЕсли

		Если Не ЭтоОсновнойЯзык И ЗначениеЗаполнено(Данные.ТипОбъектаНазначения) Тогда

			ПозицияОткрывающейСкобки = СтрНайти(Представление, "(", НаправлениеПоиска.СКонца);

			ОбрезанноеПредставление = Лев(Представление, ПозицияОткрывающейСкобки);
			Представление = ОбрезанноеПредставление + Строка(Данные.ТипОбъектаНазначения) + ")";

		КонецЕсли;
	
	#КонецЕсли
		
КонецПроцедуры

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

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

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

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

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

#Область ВыборНазначенийВДокументах

#Область Совместимость

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

	Если ПараметрыФормированияЗапроса.УпорядочитьПоДатеЗаказаНазначения Тогда
		ТекстЗапроса = ТекстЗапроса + "
		|УПОРЯДОЧИТЬ ПО
		|	Назначения.Заказ.Дата";
	КонецЕсли;
	
	Возврат ТекстЗапроса;
	
КонецФункции

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

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

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

#Область ВзаимодействиеСФормойВыбораНазначений

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

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

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

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

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

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

Процедура ДобавитьОтборИсключенияПартнера(СтруктураОтборов) Экспорт
	
	ЕстьНазначенияСЗаполненнымПартнером = Ложь;
	
	ЕстьНазначенияСЗаполненнымПартнером =
		ЕстьНазначенияСЗаполненнымПартнером
		Или ПолучитьФункциональнуюОпцию("ИспользоватьОказаниеАгентскихУслугПриЗакупке");

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

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

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

#Область ОбновлениеНазначенийВТабличныхЧастяхДокументов

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

Функция ШаблонЕстьЧастныйСлучайШаблона(ШаблонЧастный, ШаблонОбщий) Экспорт
	
	Для Каждого Свойство Из ШаблонОбщий Цикл
		
		Если ЗначениеЗаполнено(Свойство.Значение) И ШаблонЧастный[Свойство.Ключ] <> ШаблонОбщий[Свойство.Ключ] Тогда
			Возврат Ложь;
		КонецЕсли;
		
	КонецЦикла;
	Возврат Истина;
	
КонецФункции

Процедура ЗаполнитьНазначениеОбеспечения(ТабличнаяЧасть, НазначениеШапки, ИмяПоляНазначенияОбеспечения = "НазначениеОбеспечения") Экспорт

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

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

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

#Область СозданиеНазначений

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

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

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

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

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

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

Функция ШаблоныРавны(Шаблон1, Шаблон2) Экспорт
	
	Для Каждого Свойство Из Шаблон1 Цикл
		
		Если Шаблон1[Свойство.Ключ] <> Шаблон2[Свойство.Ключ] Тогда
			Возврат Ложь;
		КонецЕсли;
		
	КонецЦикла;
	Возврат Истина;
	
КонецФункции

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

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

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

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

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

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

#Область ВыборНазначенийВДокументах


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

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

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

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

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

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

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

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

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

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

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

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

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

Процедура ЗаменитьПрефиксВИменахКолонок(ТекстЗапроса, Префикс, Имена)
	
	Для Каждого Имя Из Имена Цикл
		ТекстЗапроса = СтрЗаменить(ТекстЗапроса, Имя.Ключ, Префикс + "_" + Имя.Значение);
	КонецЦикла;
	
КонецПроцедуры

Функция ПолеНазначение(Элементы, ПутьКПолюНазначение)
	
	Текст = СтрЗаменить(ПутьКПолюНазначение, "Объект.", "");
	Пути = СтрРазделить(Текст, ".");
	ИмяЭлемента = СтрСоединить(Пути);
	Элемент = Элементы[ИмяЭлемента];
	Возврат Элемент;
	
КонецФункции

Функция ТаблицаФормы(Элементы, ПутьКПолюНазначение)
	
	Текст = СтрЗаменить(ПутьКПолюНазначение, "Объект.", "");
	Пути = СтрРазделить(Текст, ".");
	Элемент = Неопределено;
	Если Пути.Количество() = 2 Тогда
		Элемент = Элементы[Пути[0]];
	ИначеЕсли Пути.Количество() = 3 Тогда // РедактированиеЭтапов
		Элемент = Элементы[Пути[0] + Пути[1]];
	КонецЕсли;
	Возврат Элемент;
	
КонецФункции

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

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

//++ НЕ УТ

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

//++ Локализация

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

//-- Локализация

//-- НЕ УТ

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

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

Процедура ЗаполнитьЗначениеПараметраИзИБ(ИсточникПараметровПолучаемыхИзИБ, ИсточникПараметров)
	
	Для Каждого Элемент Из ИсточникПараметровПолучаемыхИзИБ Цикл
		
		ЗначениеРеквизита = ОбщегоНазначения.ЗначенияРеквизитовОбъекта(
			ИсточникПараметров[Элемент.Значение.ИмяПараметра],
			Элемент.Значение.ОбращениеКИБ);
		
		Элемент.Значение.Значение = ЗначениеРеквизита[Элемент.Значение.ОбращениеКИБ];
		
	КонецЦикла;
	
КонецПроцедуры

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

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

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

#Область СозданиеНазначений

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

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

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

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

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

Функция СсылкаЕстьВШаблоне(Ссылка, Шаблон)
	
	Для Каждого Свойство Из Шаблон Цикл
		
		Если Свойство.Значение = Ссылка Тогда
			Возврат Истина;
		КонецЕсли;
		
	КонецЦикла;
	
	Возврат Ложь;
	
КонецФункции

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

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

#Область ОбновлениеИнформационнойБазы

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

			Или Не ОбновлениеИнформационнойБазы.ЕстьДанныеДляОбработки(Неопределено, Метаданные.Документы.ЗаявкаНаВозвратТоваровОтКлиента);
	КонецЕсли;
	
	Возврат ДанныеОбновлены И ЗависимыеДанныеОбновлены;
	
КонецФункции

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

#КонецЕсли
#КонецЕсли

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