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


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

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

//++ Миронов А.В. Штатное допроведение
Процедура ВыполнитьАвтопроведение() Экспорт
		
		УстановитьПривилегированныйРежим(Истина);
		
		МассивЗаказов = ПолучитьЗаказыДляПроведения();
		
		Если МассивЗаказов.Количество() > 0 Тогда
				ПровестиЗаказы(МассивЗаказов);
		КонецЕсли;
		
КонецПроцедуры
//++ Миронов А.В. Штатное допроведение
#КонецОбласти

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

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

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

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

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

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

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

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

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

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

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

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

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


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

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

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

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

Функция ТекстОшибкиСоСообщениями(Префикс)
	ТекстСообщений = "";
	Для Каждого Сообщение Из ПолучитьСообщенияПользователю(Истина) Цикл
		ТекстСообщений = ТекстСообщений + Символы.ПС + Сообщение.Текст;
	КонецЦикла;
	Возврат Префикс + ": " + ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())
		+ ?(ПустаяСтрока(ТекстСообщений), "", Символы.ПС + "Сообщения:" + ТекстСообщений);
КонецФункции
//++ Миронов А.В. Штатное допроведение

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

//++ Варнин А.А. - процедура формирует цепочку документов - 10.07.26
// ПоступлениеТоваровОтХранителя + ПриходныйОрдерНаТовары + ОтборРазмещениеТоваров 

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

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

		Поступление.Комментарий = "Автоматическое сторно отмены заказа ТП, передача " + Строка(Передача);
		Поступление.Записать(РежимЗаписиДокумента.Проведение);
		
		Склад = Передача.Склад;
		ИспользуетсяАдреснаяСхема = СкладыСервер.ИспользоватьАдресноеХранение(Склад);

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

		ПриходныйОрдер = Документы.ПриходныйОрдерНаТовары.СоздатьДокумент();
		ПриходныйОрдер.Заполнить(Основание);

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

		Размещение = Документы.ОтборРазмещениеТоваров.СоздатьДокумент();
		Размещение.Дата           = ТекущаяДатаСеанса();
		Размещение.Статус         = Перечисления.СтатусыОтборовРазмещенийТоваров.ВыполненоБезОшибок;
		Размещение.ВидОперации    = Перечисления.ВидыОперацийОтбораРазмещенияТоваров.Размещение;
		Размещение.Склад          = Склад;
		Размещение.к_Распоряжение = ПриходныйОрдер.Ссылка;
		Размещение.ЗонаПриемки    = ЗонаПриемки;
//		Размещение.Ответственный  = Пользователи.ТекущийПользователь();

		ТекстОшибкиРазмещения = "";
		ЗаполненоРазмещение = ЗаполнитьРазмещениеИзИсходныхЯчеек(Размещение, ПриходныйОрдер, ЯчейкиОтбора, ТекстОшибкиРазмещения);

		Если НЕ ЗаполненоРазмещение Тогда
			ВызватьИсключение ТекстОшибкиРазмещения;
		КонецЕсли;

		Размещение.Записать(РежимЗаписиДокумента.Проведение);

		ЗафиксироватьТранзакцию();
		Возврат Истина;

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

Функция ПолучитьПередачиНаКомиссию(ЗаказКлиентаСсылка)

	Запрос = Новый Запрос;
	Запрос.Текст =
	"ВЫБРАТЬ
	|	Передача.Ссылка КАК Ссылка
	|ИЗ
	|	Документ.ПередачаТоваровХранителю КАК Передача
	|ГДЕ
	|	Передача.ЗаказКлиента = &ЗаказКлиента
	|	И Передача.Проведен
	|
	|ОБЪЕДИНИТЬ
	|
	|ВЫБРАТЬ
	|	ПередачаТовары.Ссылка
	|ИЗ
	|	Документ.ПередачаТоваровХранителю.Товары КАК ПередачаТовары
	|ГДЕ
	|	ПередачаТовары.ЗаказКлиента = &ЗаказКлиента
	|	И ПередачаТовары.Ссылка.Проведен";

	Запрос.УстановитьПараметр("ЗаказКлиента", ЗаказКлиентаСсылка);

	Возврат Запрос.Выполнить().Выгрузить().ВыгрузитьКолонку("Ссылка");

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

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

Функция ПолучитьЯчейкиОтбораПоЗаказу(ЗаказКлиентаСсылка) Экспорт

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

	Запрос.УстановитьПараметр("ЗаказКлиента", ЗаказКлиентаСсылка);

	Возврат Запрос.Выполнить().Выгрузить();

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

Функция ПередачаУжеСторнирована(Передача)

	Запрос = Новый Запрос;
	Запрос.Текст =
	"ВЫБРАТЬ ПЕРВЫЕ 1
	|	Поступление.Ссылка
	|ИЗ
	|	Документ.ПоступлениеТоваровОтХранителя КАК Поступление
	|ГДЕ
	|	Поступление.ДокументОснование = &Передача
	|	И НЕ Поступление.ПометкаУдаления";

	Запрос.УстановитьПараметр("Передача", Передача);

	Возврат НЕ Запрос.Выполнить().Пустой();

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

Функция ЗаполнитьРазмещениеИзИсходныхЯчеек(Размещение, ПриходныйОрдер, ЯчейкиОтбора, ТекстОшибки)

	Для Каждого СтрокаПрихода Из ПриходныйОрдер.Товары Цикл

		ОсталосьРазместить = СтрокаПрихода.Количество;
		Если ОсталосьРазместить = 0 Тогда
			Продолжить;
		КонецЕсли;

		Отбор = Новый Структура("Номенклатура, Характеристика, Упаковка, Серия");
		ЗаполнитьЗначенияСвойств(Отбор, СтрокаПрихода);
		НайденныеСтроки = ЯчейкиОтбора.НайтиСтроки(Отбор);

		Для Каждого СтрЯчейка Из НайденныеСтроки Цикл

			Если ОсталосьРазместить = 0 Тогда
				Прервать;
			КонецЕсли;
			Если СтрЯчейка.Количество = 0 Тогда
				Продолжить;
			КонецЕсли;

			РазместитьКоличество = Мин(ОсталосьРазместить, СтрЯчейка.Количество);

			НоваяСтрока = Размещение.ТоварыРазмещение.Добавить();
			ЗаполнитьЗначенияСвойств(НоваяСтрока, СтрокаПрихода,
				"Номенклатура, Характеристика, Упаковка, Серия, Назначение, СтатусУказанияСерий");
			НоваяСтрока.Ячейка = СтрЯчейка.Ячейка;
			НоваяСтрока.Количество = РазместитьКоличество;
			Если СтрокаПрихода.Количество <> 0 Тогда
				НоваяСтрока.КоличествоУпаковок = СтрокаПрихода.КоличествоУпаковок * РазместитьКоличество / СтрокаПрихода.Количество;
			КонецЕсли;

			СтрЯчейка.Количество = СтрЯчейка.Количество - РазместитьКоличество;
			ОсталосьРазместить = ОсталосьРазместить - РазместитьКоличество;

		КонецЦикла;

		Если ОсталосьРазместить <> 0 Тогда
			ТекстОшибки = "Не найдена исходная ячейка отбора для позиции " + Строка(СтрокаПрихода.Номенклатура)
				+ " (не хватает " + ОсталосьРазместить + ")";
			Возврат Ложь;
		КонецЕсли;

	КонецЦикла;

	Возврат Истина;

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

// - 10.07.26

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