Загрузка данных


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

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

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

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

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

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

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

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

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

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

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

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

&НаКлиенте
Функция мТоварыВсеОтобраны()
	Для Каждого лСтрокаТовары Из Товары Цикл // Если где то не выбрано все, то не сбрасываем отборы
		Если лСтрокаТовары.Количество<>лСтрокаТовары.КоличествоВыбрано Тогда Возврат Ложь; КонецЕсли; 
	КонецЦикла; 
	Возврат Истина;
КонецФункции

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

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

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

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

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

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

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

&НаКлиенте
Процедура ЯчейкаОткудаПриИзменении(Элемент)
	мЯчейкаОткудаПриИзменении();
	ЯчейкаПодтверждена=ЗначениеЗаполнено(ЯчейкаОткуда); // Если вручную то потверждаем
КонецПроцедуры

&НаКлиенте
Процедура ВыйтиИзЯчейки(Команда)
	ЯчейкаОткуда="";
	ЯчейкаПодтверждена=Ложь;
	мЯчейкаОткудаПриИзменении();
	Элементы.ВыйтиИзЯчейки.Видимость=ЗначениеЗаполнено(ЯчейкаОткуда);
КонецПроцедуры

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

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

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

&НаКлиенте
Процедура ПриОткрытии(пОтказ)
	МенеджерОборудованияКлиент.ПодключитьОборудование(УникальныйИдентификатор);
КонецПроцедуры

&НаКлиенте
Процедура СканироватьКамерой(Команда)
	ТсПлатформаМодули.МПКлиент().СканироватьШтрихкод(ЭтаФорма);
КонецПроцедуры

&НаКлиенте
Процедура ЯчейкаКудаОчистить(Команда)
	ЯчейкаКуда="";
	ЯчейкаКудаПриИзменении(Элементы.ЯчейкаКуда);
КонецПроцедуры

&НаКлиенте
Процедура ЯчейкаОткудаОчистить(Команда)
	ЯчейкаОткуда="";
	ЯчейкаПодтверждена=Ложь;
	мЯчейкаОткудаПриИзменении();
КонецПроцедуры

&НаКлиенте
Процедура ЯчейкаВыбрать(Команда)
	лДанныеСтроки=Элементы.Товары.ТекущиеДанные;
	Если лДанныеСтроки=Неопределено Тогда Сообщить("Выберите строку товара"); Возврат; КонецЕсли;
	Если лДанныеСтроки.КоличествоВыбрано>=лДанныеСтроки.Количество Тогда Сообщить("Товар в этой строке уже отобран"); Возврат; КонецЕсли;

	//Если Не ВРаботе Тогда
	//	Если Не мВзятьВРаботу() Тогда Возврат; КонецЕсли;
	//КонецЕсли;

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

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

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

	ЯчейкаОткуда=пРезультат;
	ЯчейкаПодтверждена=Ложь; // выбрали из списка — подтверждаем сканированием, как в форме размещения
	мЯчейкаОткудаПриИзменении();
	ТсПлатформаМодули.МПКлиент().ФормаСтатусУстановить(ЭтаФорма, лТекстСообщения);
КонецФункции

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

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

	лОсталосьОтобрать=лСтрокаТовары.Количество-лСтрокаТовары.КоличествоВыбрано;
	Если лОсталосьОтобрать<=0 Тогда пТекстСообщения="Товар в этой строке уже отобран"; Возврат Ложь; КонецЕсли;

	// Свободно в ячейке: остаток по регистру минус то, что из неё по этому заданию уже забрали или ещё заберут
	лСвободно=мОстатокВЯчейкеПолучить(лСтрокаТовары.Номенклатура, пЯчейка);
	Для Каждого лСтрокаВЯчейке Из Товары.НайтиСтроки(Новый Структура("Номенклатура, ЯчейкаОткуда", лСтрокаТовары.Номенклатура, пЯчейка)) Цикл
		лСвободно=лСвободно-лСтрокаВЯчейке.Количество;
	КонецЦикла;
	Если лСвободно<=0 Тогда пТекстСообщения="В ячейке "+пЯчейка+" свободного остатка этого товара нет (всё уже в задании)"; Возврат Ложь; КонецЕсли;
	лПереносим=Мин(лОсталосьОтобрать, лСвободно);

	лСтруктураОтбора=Новый Структура("Номенклатура, ЯчейкаОткуда, ЯчейкаКуда", лСтрокаТовары.Номенклатура, пЯчейка, лСтрокаТовары.ЯчейкаКуда);
	лСтрокиПриемник=Товары.НайтиСтроки(лСтруктураОтбора);
	Если лСтрокиПриемник.Количество()=0 Тогда
		лСтрокаПриемник=Товары.Добавить();
		ЗаполнитьЗначенияСвойств(лСтрокаПриемник, лСтруктураОтбора);
	Иначе
		лСтрокаПриемник=лСтрокиПриемник[0];
	КонецЕсли;
	лСтрокаПриемник.Количество=лСтрокаПриемник.Количество+лПереносим;
	лСтрокаТовары.Количество=лСтрокаТовары.Количество-лПереносим;
	Если лСтрокаТовары.Количество=0 Тогда Товары.Удалить(лСтрокаТовары); КонецЕсли; // выбрано в ней было 0, иначе перенесли бы не всё

//	мТоварыСортировать();

	пТекстСообщения="Из ячейки "+пЯчейка+" взять: "+лПереносим+" шт"
		+?(лПереносим<лОсталосьОтобрать, ", остальные "+(лОсталосьОтобрать-лПереносим)+" шт — из "+лЯчейкаПрежняя, "")
		+". Отсканируйте ячейку.";
	Возврат Истина;
КонецФункции

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

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

&НаКлиенте
Функция мВзятьВРаботу()
	Если Не мДокументВзятьВРаботу() Тогда Возврат Ложь; КонецЕсли;
	
	ВРаботе=Истина;
	
	Элементы.ГруппаНижняяКп.Видимость=Истина;
	Элементы.ГруппаПодвал.Видимость=Истина;
	Элементы.ВзятьВРаботу.Видимость=Ложь;
	
	//мКоличествоПриИзменении();
	Возврат Истина;
КонецФункции 

&НаКлиенте
Процедура ВзятьВРаботу(Команда)
	мВзятьВРаботу();
КонецПроцедуры

&НаКлиенте
Процедура СледующаяЯчейка(Команда)
	мСледующаяЯчейка()
КонецПроцедуры

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

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

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

&НаКлиенте
Процедура ОткрытьНоменклатуру(Команда)
	ПоказатьЗначение(, Элементы.Товары.ТекущиеДанные.Номенклатура);
КонецПроцедуры