Проверка количества товаров в документе / Проверка количества товаров / Модуль формы

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

&НаКлиенте
Перем КэшированныеЗначения; //используется механизмом обработки изменения реквизитов ТЧ

&НаКлиенте
Перем ТекущиеДанныеИдентификатор; //используется для передачи текущей строки в обработчик ожидания

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

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

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

	СтруктураДействий.Вставить("ПроверитьСериюРассчитатьСтатус", Новый Структура("Склад, ПараметрыУказанияСерий", Объект.Склад, ПараметрыУказанияСерий));

	ПакетнаяОбработкаТабличнойЧастиКлиент.ОбработатьСтрокуТЧ(ТекущаяСтрока, СтруктураДействий, КэшированныеЗначения);

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

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

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

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

	ОткрытьФорму("Справочник.Назначения.Форма.ФормаВыбора", ПараметрыФормы, ЭтаФорма);

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

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

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

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

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

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

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

&НаКлиенте
Процедура ТоварыКоличествоУпаковокПриИзменении(Элемент)

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

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

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

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

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

&НаКлиенте
Процедура ТоварыПриАктивизацииСтроки(Элемент)
	ПодключитьОбработчикОжидания("ТоварыПриАктивацииСтрокиОбработчик",0.1,Истина);
КонецПроцедуры

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


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

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

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

&НаКлиенте
Процедура ВернутьсяКПроверке(Команда)
	Элементы.СтраницыФормы.ТекущаяСтраница       = Элементы.СтраницаТовары;
	Элементы.ЗавершитьПроверку.КнопкаПоУмолчанию = Истина
КонецПроцедуры

&НаКлиенте
Процедура ОтразитьВУчете(Команда)
	ОтразитьРасхожденияВУчетеКлиент();
КонецПроцедуры

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

&НаКлиенте
Процедура ПоискПоШтрихкодуЗавершение(ДанныхШтрихкода, ДополнительныеПараметры) Экспорт
	
	ОбработатьШтрихкоды(ДанныхШтрихкода);
	
КонецПроцедуры

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

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

&НаКлиенте
Процедура ЗаполнитьПоОрдеру(Команда)
	НайденныеСтроки	= Объект.Товары.НайтиСтроки(Новый Структура("Количество", 0));
	Если НайденныеСтроки.Количество() <> Объект.Товары.Количество() Тогда
		
		ТекстВопроса = НСтр("ru='В табличной части присутствуют строки, в которых заполнено количество.
		                    |При автоматическом заполнении эти данные будут утеряны. Продолжить?'");
		Ответ = Неопределено;

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

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

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

&НаКлиенте
Процедура ЗаполнитьПоОрдеруФрагмент()
    
    ЗаполнитьТЧТовары(Истина);

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

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

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

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

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

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

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

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

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

&НаКлиенте
Процедура ВариантУчетаПриИзменении(Элемент)
	
	Элементы.ЗаданиеНаДобор.Доступность = (Объект.ВариантУчетаНедобора = "Добрать");
	
КонецПроцедуры

&НаКлиенте
Процедура ПечатьУпаковочногоЛиста(Команда)
	ПечатьУпаковочногоЛистаОбработчик();
КонецПроцедуры

&НаКлиенте
Процедура ПечатьЭтикеткиУпаковочногоЛиста(Команда)
	ПечатьЭтикеткиУпаковочногоЛистаОбработчик();
КонецПроцедуры

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

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

&НаКлиенте
Процедура ИзменитьТекущийУпаковочныйЛист(Команда)
	
	ИзменитьТекущийУпаковочныйЛистОбработчик();		
	
КонецПроцедуры

&НаКлиенте
Процедура НеОтгружать(Команда)
	НеОтгружатьОбработчик();
КонецПроцедуры

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

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

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

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

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

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

	СтруктураДействийСИзмененнымиСтроками = Новый Структура;
	ДобавитьВСтруктуруДействияПриИзмененииКоличестваУпаковок(СтруктураДействийСИзмененнымиСтроками);

	СтруктураДействий = ШтрихкодированиеНоменклатурыКлиент.ПараметрыОбработкиШтрихкодов();

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

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

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

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

#Область Серии

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

&НаСервере
Процедура ЗаполнитьСтатусыПриОкончанииРедактированияСтрокиТЧ(ТекущаяСтрокаИдентификатор, КэшированныеЗначения, ЭтоУдаление, ОбновлятьСерии)
	
	Если ОбновлятьСерии Тогда
		НоменклатураСервер.ЗаполнитьСтатусыУказанияСерийПриОкончанииРедактированияСтрокиТЧ(Объект, 
				ПараметрыУказанияСерий,
				?(ЭтоУдаление, Неопределено,ТекущаяСтрокаИдентификатор),
				КэшированныеЗначения);
	КонецЕсли;
				
	ЗаполнитьСтатусыПроблем(ТекущаяСтрокаИдентификатор, ЭтоУдаление);

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

	Элемент.Оформление.УстановитьЗначениеПараметра("ОтметкаНезаполненного", Ложь);
	
	//

	ПараметрыУсловногоОформления = НоменклатураСервер.НовыеПараметрыУсловногоОформленияЕдиницИзмерения(Истина, Истина);
	ПараметрыУсловногоОформления.ИмяПоляЕдиницаИзмерения = "ТоварыЕдиницаИзмерения";
	НоменклатураСервер.УстановитьУсловноеОформлениеЕдиницИзмерения(ЭтотОбъект, ПараметрыУсловногоОформления);

	//

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

	//

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

	//


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

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

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

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

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

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

	Элемент.Оформление.УстановитьЗначениеПараметра("ОтметкаНезаполненного", Ложь);

	//

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

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

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

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

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

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

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

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

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

	//

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

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

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

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

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

	НоменклатураСервер.УстановитьУсловноеОформлениеХарактеристикНоменклатуры(ЭтаФорма);

	НоменклатураСервер.УстановитьУсловноеОформлениеСерийНоменклатуры(ЭтаФорма, "СерииВсегдаВТЧТовары");

	НоменклатураСервер.УстановитьУсловноеОформлениеНазначенияНоменклатуры(ЭтаФорма);
	
КонецПроцедуры

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

	ПараметрыЗаполненияРеквизитов = Новый Структура;
	ПараметрыЗаполненияРеквизитов.Вставить("ЗаполнитьПризнакТипИзмеряемойВеличины", Новый Структура("Номенклатура", "ТипИзмеряемойВеличины"));

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

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

	Элементы.ГруппаНеотгружаемые.Видимость = Объект.Неотгружаемые.Количество() <> 0;
	Элементы.ГруппаНедобор.Видимость = Объект.Недобор.Количество() <> 0;
	
	Возврат ПроверкаПройдена;
	
КонецФункции

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

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

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

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

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

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

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

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

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

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

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

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

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


&НаКлиенте
Процедура ВывестиПредставлениеТекущегоУпаковочногоЛиста(КодУпаковочногоЛиста)
	
	ТекстСтроки1 = Новый ФорматированнаяСтрока(НСтр("ru = 'Текущий упаковочный лист:'") + " ");
	Если ЗначениеЗаполнено(ТекущийУпаковочныйЛист) Тогда
		ТекстСтроки2 = Новый ФорматированнаяСтрока(КодУпаковочногоЛиста,Новый Шрифт(,,Истина));;
	Иначе
		ТекстСтроки2 = Новый ФорматированнаяСтрока(НСтр("ru = '<не выбран>'"),Новый Шрифт(,,Истина));;
	КонецЕсли;
	
	ТекстСтроки3 = Новый ФорматированнаяСтрока(НСтр("ru = 'Изменить (F6)'"),,,,"Изменить");
	
	ТекстСтроки4 = Новый ФорматированнаяСтрока(НСтр("ru = 'Напечатать этикетку'"),,,,"ПечатьЭтикетки");
	
	ТекстСтроки5 = Новый ФорматированнаяСтрока(НСтр("ru = 'Напечатать упаковочный лист'"),,,,"ПечатьУпаковочногоЛиста");
	
	Пробел = "   ";
	
	МассивСтрок = Новый Массив;
	МассивСтрок.Добавить(ТекстСтроки1);
	МассивСтрок.Добавить(ТекстСтроки2);
	МассивСтрок.Добавить(Пробел);
	МассивСтрок.Добавить(ТекстСтроки3);
	МассивСтрок.Добавить(Пробел);
	МассивСтрок.Добавить(Пробел);
	МассивСтрок.Добавить(ТекстСтроки4);
	МассивСтрок.Добавить(Пробел);
	МассивСтрок.Добавить(ТекстСтроки5);
	
	ТекущийУпаковочныйЛистПредставление = Новый ФорматированнаяСтрока(МассивСтрок);	
	
КонецПроцедуры

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

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

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

	ПоказатьВопрос(Оповещение,ТекстВопроса,КнопкиВопроса);

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

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

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

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

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

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

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

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

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

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

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

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

&НаСервере
Процедура СохранитьНастройкиПроверкиОрдера()
	
	ОбщегоНазначения.ХранилищеОбщихНастроекСохранить("ВариантЗавершенияПроверкиОрдера", "",
		ВариантЗавершенияПроверкиОрдера);
	
КонецПроцедуры

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

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

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

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