Акт о расхождениях после перемещения / Форма документа / Модуль формы

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

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

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

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

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

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

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

	// СтандартныеПодсистемы.УчетОригиналовПервчиныхДокументов
	УчетОригиналовПервичныхДокументов.ПриСозданииНаСервере_ФормаДокумента(ЭтотОбъект);
	// Конец СтандартныеПодсистемы.УчетОригиналовПервчиныхДокументов 
	
КонецПроцедуры

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

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

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

&НаСервере
Процедура ПриЧтенииНаСервере(ТекущийОбъект)

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

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

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

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

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

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

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

	КонецЕсли;

	ОтключитьОтметкуНезаполненного();

	Если Окно <> Неопределено Тогда
		Окно.Активизировать();
	КонецЕсли;

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

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

	// СтандартныеПодсистемы.УчетОригиналовПервичныхДокументов	
	УчетОригиналовПервичныхДокументовКлиент.ОбработчикОповещенияФормаДокумента(ИмяСобытия,ЭтотОбъект);
	// Конец СтандартныеПодсистемы.УчетОригиналовПервичныхДокументов
	
КонецПроцедуры

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

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

&НаСервере
Процедура ПослеЗаписиНаСервере(ТекущийОбъект, ПараметрыЗаписи)

	// СтандартныеПодсистемы.УправлениеДоступом
	УправлениеДоступом.ПослеЗаписиНаСервере(ЭтотОбъект, ТекущийОбъект, ПараметрыЗаписи);
	// Конец СтандартныеПодсистемы.УправлениеДоступом

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

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

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

&НаКлиенте
Процедура ХозяйственнаяОперацияПриИзменении(Элемент)
	
	ПриИзмененииХозяйственнойОперацииСервер();
	
КонецПроцедуры

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

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

&НаКлиенте
Процедура ОрганизацияПолучательПриИзменении(Элемент)
	УстановитьВидимостьДоступность();
КонецПроцедуры

&НаКлиенте
Процедура ОрганизацияПриИзменении(Элемент)
	УстановитьВидимостьДоступность();
КонецПроцедуры

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

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

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

&НаКлиенте
Процедура ОформляемыеДокументыНажатие(Элемент)
	
	РасхожденияКлиент.ОформитьДокументыНажатие(ЭтотОбъект);
	
КонецПроцедуры

&НаКлиенте
Процедура ГруппаСтраницыПриСменеСтраницы(Элемент, ТекущаяСтраница)

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

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

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

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

&НаКлиенте
Процедура МенеджерПриИзменении(Элемент)
	
	Если ЗначениеЗаполнено(Объект.Менеджер) Тогда
		Объект.Подразделение = ПодразделениеМенеджера(Объект.Менеджер);
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура Подключаемый_ДекорацияСостояниеОригиналаНажатие()

	// СтандартныеПодсистемы.УчетОригиналовПервичныхДокументов
	УчетОригиналовПервичныхДокументовКлиент.ОткрытьМенюВыбораСостояния(ЭтотОбъект,Элементы.ДекорацияСостояниеОригинала);
	//Конец СтандартныеПодсистемы.УчетОригиналовПервичныхДокументов

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

&НаКлиенте
Процедура ТоварыНазначениеПриИзменении(Элемент)
	ОбновитьНазначениеОтправителя();
КонецПроцедуры

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

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

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

// СтандартныеПодсистемы.ПодключаемыеКоманды
&НаСервере
Процедура ВыполнитьКомандуНаСервере(ПараметрыВыполнения)
	ПодключаемыеКоманды.ВыполнитьКоманду(ЭтотОбъект, ПараметрыВыполнения, Объект);
КонецПроцедуры
// Конец СтандартныеПодсистемы.ПодключаемыеКоманды


// СтандартныеПодсистемы.ПодключаемыеКоманды
&НаКлиенте
Процедура Подключаемый_ПродолжитьВыполнениеКомандыНаСервере(ПараметрыВыполнения, ДополнительныеПараметры) Экспорт
	ВыполнитьКомандуНаСервере(ПараметрыВыполнения);
КонецПроцедуры
// Конец СтандартныеПодсистемы.ПодключаемыеКоманды


// СтандартныеПодсистемы.РаботаСФайлами
&НаКлиенте
Процедура Подключаемый_КомандаПанелиПрисоединенныхФайлов(Команда)
	 РаботаСФайламиКлиент.КомандаУправленияПрисоединеннымиФайлами(ЭтотОбъект, Команда);
КонецПроцедуры
// Конец СтандартныеПодсистемы.РаботаСФайлами

// СтандартныеПодсистемы.РаботаСФайлами
&НаКлиенте
Процедура Подключаемый_ПолеПредпросмотраПроверкаПеретаскивания(Элемент, ПараметрыПеретаскивания, СтандартнаяОбработка)
	 РаботаСФайламиКлиент.ПолеПредпросмотраПроверкаПеретаскивания(ЭтотОбъект, Элемент, ПараметрыПеретаскивания, СтандартнаяОбработка);
КонецПроцедуры
// Конец СтандартныеПодсистемы.РаботаСФайлами

// СтандартныеПодсистемы.РаботаСФайлами
&НаКлиенте
Процедура Подключаемый_ПолеПредпросмотраПеретаскивание(Элемент, ПараметрыПеретаскивания, СтандартнаяОбработка)
	 РаботаСФайламиКлиент.ПолеПредпросмотраПеретаскивание(ЭтотОбъект, Элемент, ПараметрыПеретаскивания, СтандартнаяОбработка);
КонецПроцедуры
// Конец СтандартныеПодсистемы.РаботаСФайлами

// СтандартныеПодсистемы.РаботаСФайлами
&НаКлиенте
Процедура Подключаемый_ПолеПредпросмотраНажатие(Элемент, СтандартнаяОбработка)
	 РаботаСФайламиКлиент.ПолеПредпросмотраНажатие(ЭтотОбъект, Элемент, СтандартнаяОбработка);
КонецПроцедуры
// Конец СтандартныеПодсистемы.РаботаСФайлами

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

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

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

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

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

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

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

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

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

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

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

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

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

	ОткрытьФорму("Документ.АктОРасхожденияхПослеПеремещения.Форма.ФормаПодбораДокументовОснований",
	             ПараметрыФормы,
	             ЭтаФорма);

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

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

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

&НаКлиенте
Процедура ЗагрузитьИзВнешнегоФайлаЗавершение(АдресЗагруженныхДанных, ДополнительныеПараметры) Экспорт
	
	Если ЗначениеЗаполнено(АдресЗагруженныхДанных) Тогда
		ПолучитьЗагруженныеТоварыИзХранилища(АдресЗагруженныхДанных, КэшированныеЗначения);
	КонецЕсли;
	
КонецПроцедуры

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

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

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

&НаКлиенте
Процедура ИзменитьДействиеВыделенныхСтрокЗавершение(Результат, ДополнительныеПараметры) Экспорт

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

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

&НаСервере
Процедура УстановитьВариантДействияВСтрокахСервер(Результат, КоличествоИзмененныхСтрокСоответствие)
	
	РасхожденияСервер.УстановитьВариантДействияВСтроках(ЭтаФорма, Результат, КоличествоИзмененныхСтрокСоответствие);
	
КонецПроцедуры

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

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

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

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

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

&НаКлиенте
Процедура Подключаемый_ВыполнитьПереопределяемуюКоманду(Команда)
	
	СобытияФормКлиент.ВыполнитьПереопределяемуюКоманду(ЭтаФорма, Команда);
	
КонецПроцедуры

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

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

// СтандартныеПодсистемы.Свойства

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

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

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

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

// Конец СтандартныеПодсистемы.Свойства

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

	УсловноеОформление.Элементы.Очистить();
	
	// Упаковка
	
	НоменклатураСервер.УстановитьУсловноеОформлениеЕдиницИзмерения(ЭтаФорма);
	
	// ТоварыТекстовоеОписание отметка незаполненного

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

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

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

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

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

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

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

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

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

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

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

	// Заказ клиента код строки отметка незаполненного

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

	// Реализация отметка незаполненного

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

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

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

	// Серии номенклатуры
	
	РасхожденияСервер.УстановитьУсловноеОформлениеСерий(ЭтаФорма, "СерииПриПланированииОтгрузкиУказываютсяВТЧТовары");
	
	// Недоступность элементов таблицы товары по реализациям
	
	Элемент = УсловноеОформление.Элементы.Добавить();

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

	// Расхождение количество

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

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

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

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

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

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

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

&НаСервере
Процедура ПриЧтенииСозданииНаСервере()

	ПараметрыУказанияСерий = Новый ФиксированнаяСтруктура(НоменклатураСервер.ПараметрыУказанияСерий(Объект, Документы.АктОРасхожденияхПослеПеремещения));
	ПравоНаРедактирование  = ПравоДоступа("Изменение", Объект.Ссылка.Метаданные());

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

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

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

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

&НаСервере
Процедура ОткрытьПодборСерийЗавершениеСервер(Результат, ДополнительныеПараметры)

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

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

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

&НаКлиенте
Процедура КомментарийМенеджераНачалоВыбора()

	РасхожденияКлиент.КомментарийНачалоВыбора(ЭтотОбъект,
	                                          "КомментарийМенеджера",
	                                          "ЕстьКомментарийМенеджера",
	                                          "ТоварыКомментарийМенеджераПодвал");

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

&НаКлиенте
Процедура КомментарийПолучателяНачалоВыбора()

	РасхожденияКлиент.КомментарийНачалоВыбора(ЭтотОбъект,
	                                          "КомментарийПолучателя",
	                                          "ЕстьКомментарийПолучателя",
	                                          "ТоварыКомментарийПолучателяПодвал");

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

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

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

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

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

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

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

// СтандартныеПодсистемы.ПодключаемыеКоманды
&НаКлиенте
Процедура Подключаемый_ВыполнитьКоманду(Команда)
	ПодключаемыеКомандыКлиент.НачатьВыполнениеКоманды(ЭтотОбъект, Команда, Объект);
КонецПроцедуры

&НаКлиенте
Процедура Подключаемый_ОбновитьКоманды()
	ПодключаемыеКомандыКлиентСервер.ОбновитьКоманды(ЭтотОбъект, Объект);
КонецПроцедуры
// Конец СтандартныеПодсистемы.ПодключаемыеКоманды

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

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

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

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

&НаКлиенте
Процедура Подключаемый_ЗакрытьФорму()
	
	Закрыть();
	
КонецПроцедуры

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

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

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

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

	Элементы.ОрганизацияПолучатель.Видимость = 
		?(Объект.ХозяйственнаяОперация = Перечисления.ХозяйственныеОперации.ПеремещениеТоваровМеждуФилиалами,
		Истина, Ложь);

		Элементы.ТоварыДокументОснование.Видимость = ЭтаФорма.ДокументыОснования.Количество() > 1;

	// Видимость элементов серий
	Элементы.ТоварыСтатусУказанияСерий.Видимость  = ПараметрыУказанияСерий.ИспользоватьСерииНоменклатуры;
	Элементы.ТоварыУказатьСерии.Видимость         = ПараметрыУказанияСерий.ИспользоватьСерииНоменклатуры;
	Элементы.ТоварыСерия.Видимость                = ПараметрыУказанияСерий.УчитыватьСебестоимостьПоСериям;
	
	Элементы.ТоварыПерезаполнитьПоПоступлению.Видимость = ИспользоватьОрдернуюСхемуСкладПолучатель;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

&НаСервере
Процедура ПолучитьЗагруженныеТоварыИзХранилища(АдресТоваровВХранилище, КэшированныеЗначения)

	РасхожденияСервер.ПолучитьЗагруженныеТоварыИзХранилища(Объект.Товары, ЭтаФорма.ДокументыОснования, АдресТоваровВХранилище);

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

	ЗаполнитьСтатусыУказанияСерийСервер();

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

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

	ОбработкаВыбораПодборНаСервере(ВыбранноеЗначение, КэшированныеЗначения);

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

&НаСервере
Процедура ОбработкаВыбораПодборНаСервере(ВыбранноеЗначение, КэшированныеЗначения)

	РасхожденияСервер.ОбработкаВыбораПодборНаСервереПеремещение(Объект.Товары, ЭтаФорма.ДокументыОснования, ВыбранноеЗначение);

	РасхожденияСервер.ЗаполнитьСлужебныеРеквизитыПоНоменклатуре(Объект);
	ЗаполнитьСтатусыУказанияСерийСервер();

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

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

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

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

	РезультирующаяТаблица      = ТаблицаНакладная.СкопироватьКолонки();
	РезультирующаяТаблицаСерии = ТаблицаНакладная.СкопироватьКолонки();
	
	НакладнаяЯвляетсяРаспоряжением = ЗакупкиСервер.РаспоряжениеНаПриемкуТовараНакладная(Объект.ВариантПриемкиТоваров);

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

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

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

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

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

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

&НаСервереБезКонтекста
Функция ПодразделениеМенеджера(Менеджер)
	
	Возврат ЗначениеНастроекПовтИсп.ПодразделениеПользователя(Менеджер);
	
КонецФункции

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

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

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