Заказ на сборку (разборку) / Модуль объекта

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

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

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

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

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

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

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

Процедура ОбработкаПроверкиЗаполнения(Отказ, ПроверяемыеРеквизиты)
	
	МассивНепроверяемыхРеквизитов = Новый Массив;

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

		ОбщегоНазначения.СообщитьПользователю(
			НСтр("ru = 'Дата окончания сборки/разборки меньше даты начала сборки/разборки'"),
			ЭтотОбъект,
			"ОкончаниеСборкиРазборки",
			,
			Отказ);

	КонецЕсли;

	Если ЗначениеЗаполнено(ЖелаемаяДатаПоступления) И ЖелаемаяДатаПоступления < НачалоДня(Дата) Тогда

		ТекстОшибки = НСтр("ru='Желаемая дата поступления должна быть не меньше даты документа %Дата%'");
		ТекстОшибки = СтрЗаменить(ТекстОшибки, "%Дата%", Формат(Дата,"ДЛФ=DD"));
		
		ОбщегоНазначения.СообщитьПользователю(
			ТекстОшибки,
			ЭтотОбъект,
			"ЖелаемаяДатаПоступления",
			,
			Отказ);

	КонецЕсли;

	Если ЗначениеЗаполнено(ОкончаниеСборкиРазборки) 
		И ОкончаниеСборкиРазборки < НачалоДня(Дата) Тогда

		ТекстОшибки = НСтр("ru='Дата окончания сборки/разборки должна быть не меньше даты документа %Дата%'");
		ТекстОшибки = СтрЗаменить(ТекстОшибки, "%Дата%", Формат(Дата,"ДЛФ=DD"));
		
		ОбщегоНазначения.СообщитьПользователю(
			ТекстОшибки,
			ЭтотОбъект,
			"ОкончаниеСборкиРазборки",
			,
			Отказ);

	КонецЕсли;

	Если ЗначениеЗаполнено(НачалоСборкиРазборки) 
		И НачалоСборкиРазборки < НачалоДня(Дата) Тогда

		ТекстОшибки = НСтр("ru='Дата начала сборки/разборки должна быть не меньше даты документа %Дата%'");
		ТекстОшибки = СтрЗаменить(ТекстОшибки, "%Дата%", Формат(Дата,"ДЛФ=DD"));
		
		ОбщегоНазначения.СообщитьПользователю(
			ТекстОшибки,
			ЭтотОбъект,
			"НачалоСборкиРазборки",
			,
			Отказ);

	КонецЕсли;
	
	// Проверка характеристики в шапке.
	Если ПолучитьФункциональнуюОпцию("ИспользоватьХарактеристикиНоменклатуры")
		И Не Справочники.Номенклатура.ХарактеристикиИспользуются(Номенклатура) Тогда

		МассивНепроверяемыхРеквизитов.Добавить("Характеристика");

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

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

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

Процедура ПриКопировании(ОбъектКопирования)

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

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

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

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

Процедура ОбработкаУдаленияПроведения(Отказ)
	
	ПроведениеДокументов.ОбработкаУдаленияПроведенияДокумента(ЭтотОбъект, Отказ);
	
	ЗаказНаСборкуЛокализация.ОбработкаУдаленияПроведения(ЭтотОбъект, Отказ);
	
КонецПроцедуры

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

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

#Область ИнициализацияИЗаполнение

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

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

Процедура ИнициализироватьДокумент(ДанныеЗаполнения = Неопределено)

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

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

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

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

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

// Проверяет возможность проведения документа в статусе "Закрыт".
//
// Параметры:
//  Отказ	 - Булево - параметр "Отказ" обработки проведения.
//
Процедура ВыполнитьКонтрольЗаказаПослеПроведения(Отказ)

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

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

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

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

#КонецЕсли

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