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

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

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

#Область СтандартныеПодсистемы

// СтандартныеПодсистемы.ВерсионированиеОбъектов

// Определяет настройки объекта для подсистемы ВерсионированиеОбъектов.
//
// Параметры:
//  Настройки - Структура - настройки подсистемы.
Процедура ПриОпределенииНастроекВерсионированияОбъектов(Настройки) Экспорт

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

// Конец СтандартныеПодсистемы.ВерсионированиеОбъектов

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

// Проверяет использование объекта
//
// Параметры:
//  Параметры		- Структура - содержит объект использование которого нужно проверить
//  АдресХранилища	- Строка - адрес хранилища в которое будут помещен результат проверки
//
Процедура ПроверитьИспользованиеОбъекта(Параметры, АдресХранилища) Экспорт

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

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

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

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

// Заполняет список команд печати.
// 
// Параметры:
//   КомандыПечати - см. УправлениеПечатью.СоздатьКоллекциюКомандПечати
//
Процедура ДобавитьКомандыПечати(КомандыПечати) Экспорт

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

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

#Область Отчеты

// Определяет список команд отчетов.
//
// Параметры:
//   КомандыОтчетов - См. ВариантыОтчетовПереопределяемый.ПередДобавлениемКомандОтчетов.КомандыОтчетов
//   Параметры - См. ВариантыОтчетовПереопределяемый.ПередДобавлениемКомандОтчетов.Параметры
//
Процедура ДобавитьКомандыОтчетов(КомандыОтчетов, Параметры) Экспорт
	
	//++ Устарело_Производство21


	//-- Устарело_Производство21
	
КонецПроцедуры

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

#Область Заполнение

// Определяет список команд заполнения.
//
// Параметры:
//   КомандыЗаполнения - См. ЗаполнениеОбъектовПереопределяемый.ПередДобавлениемКомандЗаполнения.КомандыЗаполнения
//   Параметры - См. ЗаполнениеОбъектовПереопределяемый.ПередДобавлениемКомандЗаполнения.Параметры
//
Процедура ДобавитьКомандыЗаполнения(КомандыЗаполнения, Параметры) Экспорт
	
КонецПроцедуры

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

#Область ЗагрузкаИзФайлаВТЧ

// Устанавливает параметры загрузки.
//
// Параметры:
//   Параметры - Структура - параметры загрузки из файла.
//
Процедура УстановитьПараметрыЗагрузкиИзФайлаВТЧ(Параметры) Экспорт
	
	ТипДанныхКолонки = Параметры.ТипДанныхКолонки;
	ИмяТЧ            = Параметры.ДополнительныеПараметры.ИмяТЧ;
	
	ТипДанныхКолонки.Вставить("НомерЭтапа",    Новый ОписаниеТипов("Число",, Новый КвалификаторыЧисла(5, 0)));
	ТипДанныхКолонки.Вставить("НомерОперации", Новый ОписаниеТипов("Число",, Новый КвалификаторыЧисла(5, 0)));
	
	ТипДанныхКолонки.Вставить("СтатьяКалькуляции", Новый ОписаниеТипов("Строка",, Новый КвалификаторыСтроки(100)));
	ТипДанныхКолонки.Вставить("Этап",              Новый ОписаниеТипов("Строка",, Новый КвалификаторыСтроки(150)));
	ТипДанныхКолонки.Вставить("Операция",          Новый ОписаниеТипов("Строка",, Новый КвалификаторыСтроки(150)));
	
	Если ИмяТЧ = "Трудозатраты" Тогда
		
		ТипДанныхКолонки.Вставить("КодВидаРабот",    Новый ОписаниеТипов("Строка",, Новый КвалификаторыСтроки(9)));
		ТипДанныхКолонки.Вставить("ВидРабот",        Новый ОписаниеТипов("Строка",, Новый КвалификаторыСтроки(150)));
		ТипДанныхКолонки.Вставить("НазначениеРабот", Новый ОписаниеТипов("Строка",, Новый КвалификаторыСтроки(150)));
		
		ТипДанныхКолонки.Вставить("Количество", Новый ОписаниеТипов("Число",,  Новый КвалификаторыЧисла(15, 3)));
		
	Иначе
		
		ТипДанныхКолонки.Вставить("Штрихкод",        Новый ОписаниеТипов("Строка",, Новый КвалификаторыСтроки(200)));
		ТипДанныхКолонки.Вставить("Артикул",         Новый ОписаниеТипов("Строка",, Новый КвалификаторыСтроки(50)));
		ТипДанныхКолонки.Вставить("КодНоменклатуры", Новый ОписаниеТипов("Строка",, Новый КвалификаторыСтроки(11)));
		ТипДанныхКолонки.Вставить("Номенклатура",    Новый ОписаниеТипов("Строка",, Новый КвалификаторыСтроки(100)));
		ТипДанныхКолонки.Вставить("Характеристика",  Новый ОписаниеТипов("Строка",, Новый КвалификаторыСтроки(150)));
		ТипДанныхКолонки.Вставить("КодУпаковки",     Новый ОписаниеТипов("Строка",, Новый КвалификаторыСтроки(4)));
		ТипДанныхКолонки.Вставить("Упаковка",        Новый ОписаниеТипов("Строка",, Новый КвалификаторыСтроки(50)));
		
		ТипДанныхКолонки.Вставить(?(ИмяТЧ = "МатериалыИУслуги", "ПрименениеМатериала", "ОписаниеИзделия"),
			Новый ОписаниеТипов("Строка",, Новый КвалификаторыСтроки(0)));
		
		ТипДанныхКолонки.Вставить("КоличествоУпаковок", Новый ОписаниеТипов("Число",, Новый КвалификаторыЧисла(15, 3)));
		
	КонецЕсли;
	
КонецПроцедуры

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

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

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

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

#Область Конструкторы

// Функция - конструктор структуры для выборки данных ресурсной спецификации.
// 
// Возвращаемое значение:
//  Структура - структура с параметрами выборки данных спецификации:
//  	* Номенклатура - СправочникСсылка.Номенклатура - номенклатура
//  	* Характеристика - СправочникСсылка.ХарактеристикиНоменклатуры - характеристика
//  	* Спецификация - СправочникСсылка.РесурсныеСпецификации - спецификация
//  	* Количество - Число - количество изделий
//
Функция ДанныеПоНоменклатуре() Экспорт
	
	ДанныеПоНоменклатуре = Новый Структура;
	
	ДанныеПоНоменклатуре.Вставить("Номенклатура");
	ДанныеПоНоменклатуре.Вставить("Характеристика");
	
	ДанныеПоНоменклатуре.Вставить("Спецификация");
	ДанныеПоНоменклатуре.Вставить("Количество");
	
	Возврат ДанныеПоНоменклатуре;
	
КонецФункции

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

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

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

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

#Область ДанныеСпецификации

// Возвращает данные спецификации с учетом данных о номенклатуре
// 
// Параметры:
// 	ДанныеПоНоменклатуре - см. ДанныеПоНоменклатуреРасширенный
// 	ПараметрыВыборки - см. ПараметрыВыборкиДанных
// 	Отбор - Структура,Неопределено - структура отбора
// Возвращаемое значение:
// 	см. ДанныеСпецификацииКонструктор
//
Функция ДанныеСпецификацииПоНоменклатуре(ДанныеПоНоменклатуре, ПараметрыВыборки, Отбор = Неопределено) Экспорт
	
	ДанныеСпецификации = ДанныеСпецификации(ДанныеПоНоменклатуре, ПараметрыВыборки)[0];
	
	ПартияВыпуска = РассчитатьПартиюВыпускаПоНоменклатуре(ДанныеПоНоменклатуре, ДанныеСпецификации, ПараметрыВыборки);
	
	РассчитатьКоличествоНаПартиюВыпуска(ПартияВыпуска, ДанныеСпецификации, ДанныеПоНоменклатуре);
	
	ПрименитьОтборПоДаннымСпецификации(ДанныеСпецификации, Отбор, ПараметрыВыборки);
	
	Возврат ДанныеСпецификации;
	
КонецФункции

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

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

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

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

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

#Область ОписаниеПроизводственногоПроцесса

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

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

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

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

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

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

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

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

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

	Возврат ПараметрыВыбораСпецификаций;

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

//Имена реквизитов, от значений которых зависят параметры выбора спецификаций
//
//	Возвращаемое значение:
//		Строка - имена реквизитов, перечисленные через запятую
//
Функция ИменаРеквизитовДляЗаполненияПараметровВыбораСпецификаций() Экспорт
	
	ИменаРеквизитов = "";
	Возврат ИменаРеквизитов;
	
КонецФункции

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

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

// Возвращает ссылку на этап спецификации у которой производственный процесс одноэтапный
//
// Параметры:
//  Спецификация	- СправочникСсылка.РесурсныеСпецификации - спецификация, этапы которой требуется проверить
//
// Возвращаемое значение:
//   СправочникСсылка.ЭтапыПроизводства - этап одноэтапной спецификации
//
Функция ПолучитьЭтапОдногоЭтапногоПроцесса(Спецификация) Экспорт

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

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

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

// Тип строки данных спецификации.
// 
// Возвращаемое значение:
//  Строка
//
Функция ТипСтрокиМатериал() Экспорт
	Возврат "Материал";
КонецФункции

// Тип строки данных спецификации.
// 
// Возвращаемое значение:
//  Строка
//
Функция ТипСтрокиПолуфабрикат() Экспорт
	Возврат "Полуфабрикат";
КонецФункции

// Тип строки данных спецификации.
// 
// Возвращаемое значение:
//  Строка
//
Функция ТипСтрокиПромежуточныйПолуфабрикат() Экспорт
	Возврат "ПромежуточныйПолуфабрикат";
КонецФункции

// Тип строки данных спецификации.
// 
// Возвращаемое значение:
//  Строка
//
Функция ТипСтрокиВходящееИзделие() Экспорт
	Возврат "ВходящееИзделие";
КонецФункции

// Тип строки данных спецификации.
// 
// Возвращаемое значение:
//  Строка
//
Функция ТипСтрокиПобочныйВыход() Экспорт
	Возврат "ПобочныйВыход";
КонецФункции

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

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

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

#КонецЕсли

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

Процедура ОбработкаПолученияДанныхВыбора(ДанныеВыбора, Параметры, СтандартнаяОбработка)
	
	УправлениеДаннымиОбИзделияхВызовСервера.РесурсныеСпецификацииОбработкаПолученияДанныхВыбора(
				ДанныеВыбора,
				Параметры, 
				СтандартнаяОбработка);
	
КонецПроцедуры

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

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

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

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

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


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

#Область ДанныеСпецификаций

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

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

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

	ИспользуетсяЦенообразование25 = ЦенообразованиеВызовСервера.ИспользуетсяЦенообразование25();
	
	Если ИспользуетсяЦенообразование25 Тогда
		ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&ВыходныеИзделияИсточникХарактеристикиЦО", 
											ТекстПоляВыражениеХарактеристикаЦООсновногоИзделия("ВыходныеИзделия"));
		ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&ВыходныеИзделияИсточникСерииЦО",
											"ЗНАЧЕНИЕ(Справочник.СерииНоменклатурыДляЦенообразования.ПустаяСсылка)");
		ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&ВыходныеИзделияИсточникУпаковкиЦО",
											ТекстПоляВыражениеУпаковкаЦООсновногоИзделия("ВыходныеИзделия"));
	Иначе
		ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&ВыходныеИзделияИсточникХарактеристикиЦО", "НЕОПРЕДЕЛЕНО");
		ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&ВыходныеИзделияИсточникСерииЦО",          "НЕОПРЕДЕЛЕНО");
		ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&ВыходныеИзделияИсточникУпаковкиЦО",       "НЕОПРЕДЕЛЕНО");
	КонецЕсли;
	
	ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&ВыходныеИзделияИсточникНоменклатуры",   ПараметрыПодстановкиВыходныеИзделия.ИсточникНоменклатура);
	ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&ВыходныеИзделияИсточникХарактеристики", ПараметрыПодстановкиВыходныеИзделия.ИсточникХарактеристика);
	
	ТекстЗапросаКоэффициентУпаковки = Справочники.УпаковкиЕдиницыИзмерения.ТекстЗапросаКоэффициентаУпаковки(
		"ВходныеИзделия.ОсновноеИзделиеУпаковка",
		"ВЫРАЗИТЬ(&ВходныеИзделияИсточникНоменклатуры КАК Справочник.Номенклатура)");
		
	ТекстЗапроса = СтрЗаменить(
		ТекстЗапроса,
		"&ВходныеИзделияКоэффициентУпаковки",
		ТекстЗапросаКоэффициентУпаковки);
	
	ПараметрыПодстановкиВходныеИзделия  = ПараметрыПодстановкиНоменклатураХарактеристикаОсновногоИзделия(
		"ВходныеИзделия",
		"ОсновноеИзделиеВидНоменклатуры",
		"ОсновноеИзделиеНоменклатура",
		"ОсновноеИзделиеХарактеристика");
		
	ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&ВходныеИзделияИсточникНоменклатуры",   ПараметрыПодстановкиВходныеИзделия.ИсточникНоменклатура);
	ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&ВходныеИзделияИсточникХарактеристики", ПараметрыПодстановкиВходныеИзделия.ИсточникХарактеристика);
	
	ТекстЗапросаКоэффициентУпаковки = Справочники.УпаковкиЕдиницыИзмерения.ТекстЗапросаКоэффициентаУпаковки(
		"ВозвратныеОтходы.Упаковка",
		"ВЫРАЗИТЬ(ВозвратныеОтходы.Номенклатура КАК Справочник.Номенклатура)");
		
	ТекстЗапроса = СтрЗаменить(
		ТекстЗапроса,
		"&ВозвратныеОтходыКоэффициентУпаковки",
		ТекстЗапросаКоэффициентУпаковки);
	
	ТекстыЗапроса.Добавить(ТекстЗапроса + РазделительЗапросовВПакете);
	
	СписокТаблицДляУдаления.Добавить("ВтИзделия");
	
	#КонецОбласти

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

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

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

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

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

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

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

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

#Область ПереченьДанных

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

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

#Область РасчетКоличества

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

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

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

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

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

Процедура РассчитатьКоличествоВСтроке(ПартияВыпуска, Строка, ЕстьУпаковки, ЕстьВероятность, РассчитатьФормулы, ДанныеДляРасчета = Неопределено)
	
	// Расчет количества на партию

		Если ЕстьУпаковки Тогда
			Если Строка.ДанныеУпаковки.Знаменатель <> 0 Тогда
				Строка.Количество = Строка.КоличествоУпаковокНаЕдиницуПартииВыпуска 
					* Строка.ДанныеУпаковки.Числитель * ПартияВыпуска.Числитель 
					/ (Строка.ДанныеУпаковки.Знаменатель * ПартияВыпуска.Знаменатель);
			Иначе
				Строка.Количество = 0;
			КонецЕсли;
		Иначе
			Строка.Количество = Строка.КоличествоНаЕдиницуПартииВыпуска * ПартияВыпуска.Числитель / ПартияВыпуска.Знаменатель;
		КонецЕсли;
	
	// Поправка на вероятность
	Если ЕстьВероятность И Строка.КоэффициентВероятности <> 1 Тогда
		Строка.Количество = Строка.Количество * Строка.КоэффициентВероятности;
	КонецЕсли;
	
	// Пересчет количества упаковок
	Если ЕстьУпаковки Тогда
		Если Строка.ДанныеУпаковки.Числитель <> 0 Тогда
			Строка.КоличествоУпаковок = Строка.Количество * Строка.ДанныеУпаковки.Знаменатель / Строка.ДанныеУпаковки.Числитель;
			Строка.Количество         = ОписаниеТипаКоличественногоРеквизита().ПривестиЗначение(Строка.Количество);
		Иначе
			Строка.КоличествоУпаковок = 0;
			Строка.Количество         = 0;
		КонецЕсли;
	КонецЕсли;
	
КонецПроцедуры

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

Функция ПроверитьОкруглитьДоЦелыхПартий(Количество, КоличествоПартия, ДанныеСпецификации)
	
	Если ДанныеСпецификации.ВыпускПроизвольнымиПорциями Тогда
		
		Возврат Количество;
		
	Иначе
		
		Коэффициент = Количество / КоличествоПартия;
		
		Если Цел(Коэффициент) = Коэффициент Тогда
			Возврат Количество;
		Иначе
			Возврат КоличествоПартия * (Цел(Коэффициент) + 1);
		КонецЕсли;
		
	КонецЕсли;
	
КонецФункции

Функция ОписаниеТипаКоличественногоРеквизита()
	
	Возврат Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(15,3,ДопустимыйЗнак.Неотрицательный));
	
КонецФункции


Процедура РассчитатьДнейОтПотребности(ДанныеПоНоменклатуре, ИсходнаяТаблица)

	Если ДанныеПоНоменклатуре <> Неопределено 
		И ДанныеПоНоменклатуре.Свойство("ДнейОтПотребности") Тогда
		
		Если ДанныеПоНоменклатуре.ДнейОтПотребности <> Неопределено Тогда
			Для каждого СтрокаТаблицы Из ИсходнаяТаблица Цикл
				СтрокаТаблицы.ДнейОтПотребности = СтрокаТаблицы.ДнейОтПотребности + ДанныеПоНоменклатуре.ДнейОтПотребности;
			КонецЦикла;
		КонецЕсли;
	КонецЕсли;
	
КонецПроцедуры

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

Функция СравнитьПартииВыпуска(Партия1, Партия2) Экспорт
	
	Если Партия1.Значение > Партия2.Значение Тогда
		Возврат 1;
	ИначеЕсли Партия1.Значение < Партия2.Значение Тогда
		Возврат -1;
	Иначе
		Возврат 0;
	КонецЕсли;
	
КонецФункции

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


#Область Наборы

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

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

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


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

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

Процедура ДобавитьПредставленияВЗапрос(ТекстЗапроса, ПолучитьПредставления)
	
	Если ПолучитьПредставления Тогда
	
		ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&ЭтапыПроизводства_Представления,",
										"ЕСТЬNULL(ЭтапыПроизводства.Подразделение.Представление, """") КАК ПодразделениеПредставление,
										|	ЕСТЬNULL(ЭтапыПроизводства.МаршрутнаяКарта.Представление, """") КАК МаршрутнаяКартаПредставление,"); //@Query-part
										
		ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&ВидыРабочихЦентров_Представления,",
										"ЕСТЬNULL(ТабличнаяЧасть.ВидРабочегоЦентра.Представление, """") КАК ВидРабочегоЦентраПредставление,"); //@Query-part
										
		ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&ВыходныеИзделия_Представления,",
										"ЕСТЬNULL(ВтИзделия.Этап.Представление, """") КАК ЭтапПредставление,
										|	ВЫБОР
										|		КОГДА ВтИзделия.Упаковка <> ЗНАЧЕНИЕ(Справочник.УпаковкиЕдиницыИзмерения.ПустаяСсылка)
										|			ТОГДА ЕСТЬNULL(ВтИзделия.Упаковка.Представление, """")
										|		ИНАЧЕ ЕСТЬNULL(ВтИзделия.Номенклатура.ЕдиницаИзмерения.Представление, """")
										|	КОНЕЦ КАК ЕдИзм,
										|	ЕСТЬNULL(ВтИзделия.ВидНоменклатуры.Представление, """") КАК ВидНоменклатурыПредставление,
										|	ЕСТЬNULL(ВтИзделия.Номенклатура.Представление, """") КАК НоменклатураПредставление,
										|	ЕСТЬNULL(ВтИзделия.Характеристика.Представление, """") КАК ХарактеристикаПредставление,"); //@Query-part
		
		ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&ВозвратныеОтходы_Представления,",
										"ЕСТЬNULL(ВтИзделия.Этап.Представление, """") КАК ЭтапПредставление,
										|	ВЫБОР
										|		КОГДА ВтИзделия.Упаковка <> ЗНАЧЕНИЕ(Справочник.УпаковкиЕдиницыИзмерения.ПустаяСсылка)
										|			ТОГДА ЕСТЬNULL(ВтИзделия.Упаковка.Представление, """")
										|		ИНАЧЕ ЕСТЬNULL(ВтИзделия.Номенклатура.ЕдиницаИзмерения.Представление, """")
										|	КОНЕЦ КАК ЕдИзм,
										|	ЕСТЬNULL(ВтИзделия.Номенклатура.Представление, """") КАК НоменклатураПредставление,
										|	ЕСТЬNULL(ВтИзделия.Характеристика.Представление, """") КАК ХарактеристикаПредставление,"); //@Query-part
		
		ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&МатериалыИУслуги_Представления,",
										"ЕСТЬNULL(МатериалыИУслуги.Этап.Представление, """") КАК ЭтапПредставление,
										|	ВЫБОР
										|		КОГДА МатериалыИУслуги.Упаковка <> ЗНАЧЕНИЕ(Справочник.УпаковкиЕдиницыИзмерения.ПустаяСсылка)
										|			ТОГДА ЕСТЬNULL(МатериалыИУслуги.Упаковка.Представление, """")
										|		ИНАЧЕ ЕСТЬNULL(МатериалыИУслуги.Номенклатура.ЕдиницаИзмерения.Представление, """")
										|	КОНЕЦ КАК ЕдИзм,
										|	ЕСТЬNULL(МатериалыИУслуги.Номенклатура.Представление, """") КАК НоменклатураПредставление,
										|	ЕСТЬNULL(МатериалыИУслуги.Характеристика.Представление, """") КАК ХарактеристикаПредставление,"); //@Query-part
	
	
	Иначе
		
		ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&ЭтапыПроизводства_Представления,", "");
										
		ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&ВидыРабочихЦентров_Представления,", "");
										
		ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&ВыходныеИзделия_Представления,", "");
		
		ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&ВозвратныеОтходы_Представления,", "");
		
		ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&МатериалыИУслуги_Представления,", "");
		
		
	КонецЕсли;
	
КонецПроцедуры

Процедура ПрименитьОтборПоПараметрамВыбораДанных(МатериалыИУслуги, ПараметрыВыборки)
	
	Если НЕ ПараметрыВыборки.ДоступныРаботы Тогда
		
		Для Х = -МатериалыИУслуги.Количество() + 1 По 0 Цикл
			
			Строка = МатериалыИУслуги[-Х];
			
			Если Строка.ТипНоменклатуры = Перечисления.ТипыНоменклатуры.Товар
				ИЛИ Строка.ТипНоменклатуры = Перечисления.ТипыНоменклатуры.МногооборотнаяТара
				ИЛИ Строка.ТипНоменклатуры = Перечисления.ТипыНоменклатуры.Набор
				ИЛИ Строка.Номенклатура.Пустая() Тогда
				Продолжить;
			КонецЕсли;
			
			МатериалыИУслуги.Удалить(-Х);
			
		КонецЦикла;
	
	КонецЕсли;
	
КонецПроцедуры


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

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

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

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


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


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

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

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

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

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

#Область СписокРесурсныхСпецификаций

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

// Условиное оформление списка ресурсных спецификаций
// 
// Параметры:
// 	УсловноеОформление - УсловноеОформлениеКомпоновкиДанных - условное оформление
// 	ИмяВладельцаПолейОтбора - Строка - имя элемента
Процедура УстановитьУсловноеОформлениеСпискаРесурсныхСпецификаций(УсловноеОформление, ИмяВладельцаПолейОтбора = "") Экспорт

	ВладелецПолейОтбора = ?(ИмяВладельцаПолейОтбора = "", "", ИмяВладельцаПолейОтбора + ".");
	
	// Оформление спецификации в разработке
	Элемент = УсловноеОформление.Элементы.Добавить();

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

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

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

// Условиное оформление списка доступных спецификаций
// 
// Параметры:
// 	УсловноеОформление - УсловноеОформлениеКомпоновкиДанных - условное оформление
Процедура УстановитьУсловноеОформлениеСпискаДоступныхСпецификаций(УсловноеОформление) Экспорт

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

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

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

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


#Область ЗагрузкаИзФайлаВТЧ

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

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

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

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

#Область ТекстыЗапросовЗагрузкиИзФайлаВТЧ

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

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

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

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

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

#Область ТекстыЗапросовЗагрузкиИзФайлаВТЧМатериалыИУслуги

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

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

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

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

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

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

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

#Область ТекстыЗапросовЗагрузкиИзФайлаВТЧТрудозатраты

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

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

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

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

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

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

#Область ТекстыЗапросов

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

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

Функция ТекстПоляВыражениеНоменклатураОсновногоИзделия(
	ИмяТаблицы,
	ИсточникВидНоменклатуры = "ВидНоменклатуры",
	ИсточникНоменклатура = "Номенклатура")

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

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

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

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

	
Функция ТекстЗапросаМатериалыСпецификацийВключаяСоставНаборов(ИмяТаблицы) Экспорт

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

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

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

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

Функция ТекстПодстановкиРасчетПризнакаЕстьПараметризацияРесурсов(ИсточникСпецификации = "") Экспорт
	
	ТекстЗапроса = " ЛОЖЬ ";
	
	Возврат ТекстЗапроса;
	
КонецФункции

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

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

Функция СобытиеЖурналаРегистрации() Экспорт
	
	Возврат НСтр("ru = 'Получение данных спецификации'", ОбщегоНазначения.КодОсновногоЯзыка());
	
КонецФункции

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

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


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

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

#КонецЕсли

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