Загрузка данных
#Область ПрограммныйИнтерфейс
Процедура ВыполнитьЗадание() Экспорт
УстановитьПривилегированныйРежим(Истина);
Попытка
ОбработатьНовыеОтмены();
Исключение
ЗаписьЖурналаРегистрации("кор_ОбработкаОтменЗаказовТП",УровеньЖурналаРегистрации.Ошибка,,,ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
КонецПопытки;
КонецПроцедуры
//++ Миронов А.В. Штатное допроведение
Процедура ВыполнитьАвтопроведение() Экспорт
УстановитьПривилегированныйРежим(Истина);
МассивЗаказов = ПолучитьЗаказыДляПроведения();
Если МассивЗаказов.Количество() > 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
#КонецОбласти