Дополнительные сведения по товарам заказов торговых площадок / Модуль менеджера

файл
#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда

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

#Область ДляВызоваИзДругихПодсистем

// СтандартныеПодсистемы.УправлениеДоступом

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

// Конец СтандартныеПодсистемы.УправлениеДоступом

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

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

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

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

// Возвращает текст запроса динамического списка экземпляров товаров.
//
// Параметры:
//   УчетнаяЗапись - СправочникСсылка.УчетныеЗаписиМаркетплейсов - учетная запись торговой площадки.
//
// Возвращаемое значение:
//   Строка - текст запроса.
//
Функция ТекстЗапросаДинамическогоСписка(УчетнаяЗапись) Экспорт

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

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

// Возвращает представление причины отмены строки, если товар не найден в заказе.
//
// Возвращаемое значение:
//   Строка - представление причины отмены.
//
Функция ПричинаОтменыБезЗаказа() Экспорт

	Возврат НСтр("ru = 'Нет в заказе'");

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

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

// Конструктор параметров заполнения данных по экземплярам.
//
// Возвращаемое значение:
//   Структура - список параметров:
//     * ОбновлятьКодыСтрокПоЗаказу              - Булево - признак обновления кодов строк по заказу.
//     * ОбновлятьИдентификаторыСтрокПоОтгрузке  - Булево - признак обновления идентификаторов строк
//                                                           по документу отгрузки.
//     * ОбновлятьНомераГТДПоОтгрузке            - Булево - признак обновления номеров ГТД
//                                                           по документу отгрузки.
//     * ОбновлятьКодыМаркировкиПоОтгрузке       - Булево - признак обновления кодов маркировки
//                                                           по документам отгрузки.
//     * УчитыватьПризнакМаркировкиИСМП          - Булево - признак заполнения кодов маркировки
//                                                           в случае наличия в учетной системе,
//                                                           даже если площадкой не требуется.
//     * ОбновлятьНомераОтправлений              - Булево - признак проверки состава номеров отправлений.
//
//     * ЗаписатьСведенияОбЭкземплярах           - Булево - признак записи обновленных данных экземпляров.
//     * ЗаписатьСведенияОбОтправлениях          - Булево - признак записи нового состава номеров отправлений.
//
//     * ПроверитьЗаказы                         - Булево - признак проверки переданных заказов.
//     * ВернутьСведенияПоТоварам                - Булево - признак возврата заполненных сведений по экземплярам.
//     * ВыводитьСообщениеОбОформленииДокументов - Булево - признак вывода сообщений.
//
Функция ПараметрыЗаполненияДанныхПоЭкземплярам() Экспорт

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

	Параметры.Вставить("ПроверитьЗаказы",                         Ложь);
	Параметры.Вставить("ВернутьСведенияПоТоварам",                Ложь);
	Параметры.Вставить("ВыводитьСообщениеОбОформленииДокументов", Ложь);
	
	Возврат Параметры;

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

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

	Если ТипЗнч(Заказы) <> Тип("Массив") Тогда
		Заказ = Заказы;
		
		Заказы = Новый Массив;
		Заказы.Добавить(Заказ);
	КонецЕсли;

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

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

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

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

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

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

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

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

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

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

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

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

Функция ФункциональныеОпцииТорговыхПлощадок()

	МассивФункциональныхОпций = Новый Массив;
	МассивФункциональныхОпций.Добавить("ИспользоватьИнтеграциюСOzon");
	
	Возврат СтрСоединить(МассивФункциональныхОпций, ",");

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

Функция КодОшибкиЗаполненияСведенийПоЭкземплярам()

	Возврат "Ошибка_ЗаполнениеЭкземпляров";

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

#Область ПолучениеДанныхПоЭкземплярамСлужебный

Функция ОбрабатываемыеДанные(СписокЗаказов, ИндексыПакетов, ПараметрыЗаполнения = Неопределено)

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

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

Функция ТекущийИндексПакетаЗапроса(ИндексыТаблиц)

	ТекущийИндекс = 0;
	
	КоличествоЗаписей = ИндексыТаблиц.Количество();
	Если КоличествоЗаписей > 0 Тогда
		ТекущийИндекс = Число(ИндексыТаблиц.Получить(КоличествоЗаписей - 1).Представление) + 1;
	КонецЕсли;
	
	Возврат ТекущийИндекс;

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

Функция РезультатЗапросаПоИмениПакета(ПакетРезультатов, ИндексыПакетов, ИмяПакета)

	РезультатЗапроса = Неопределено;
	
	ИндексРезультата = ИндексыПакетов.НайтиПоЗначению(ИмяПакета);
	Если ИндексРезультата <> Неопределено Тогда;
		РезультатЗапроса = ПакетРезультатов[Число(ИндексРезультата.Представление)];
	КонецЕсли;
	
	Возврат РезультатЗапроса;

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

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

#Область ТекстыЗапросовДанныхПоЭкземплярам

Процедура ТекстЗапросаУничтоженияВременнойТаблицы(ТекстыЗапроса, ИндексыПакетов, ИменаТаблиц = "")

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

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

Процедура ТекстЗапросаПодготовкаЗаказовИОтправлений(ТекстыЗапроса, ИндексыПакетов,
			ИмяПакета = "ПодготовкаЗаказовИОтправлений")

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

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

Процедура ТекстЗапросаПодготовкаЗаказовТорговыхПлощадок(ТекстыЗапроса, ИндексыПакетов,
			ИмяПакета = "ПодготовкаЗаказовТорговыхПлощадок")

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

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

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

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

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

Процедура ДополнитьСведенияПоТоварамСоставляющими(ТекстЗапроса, ЗаменяемыйФрагмент = "", УчетнаяЗапись = Неопределено)

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

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

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

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

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

Процедура ТекстЗапросаПодготовкаДанныхПоРаспоряжениям(ТекстыЗапроса, ИндексыПакетов,
			ИмяПакета = "ПодготовкаДанныхПоРаспоряжениям")

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

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

Процедура ДополнитьИдентификаторамиТоваров(ТекстЗапроса, ЗаменяемыйФрагмент = "",
			СведенияПоТоварамИспользуются = Истина)

	Если ПустаяСтрока(ЗаменяемыйФрагмент) Тогда
		ЗаменяемыйФрагмент = "ДанныеПоРаспоряжениямВыборка КАК ДанныеПоРаспоряжениям";
	КонецЕсли;
	
	Соединения = Новый Массив;
	
	// Ozon
	Если ПолучитьФункциональнуюОпцию("ИспользоватьИнтеграциюСOzon") Тогда
		ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&ИдентификаторТовара",
			"ЕСТЬNULL(ТоварыOzon.ИдентификаторFBSSKU, &ИдентификаторТовара)");
		
		Соединения.Добавить("
			|		ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.СтатусыПубликацииОбъектовМаркетплейсаOzon КАК ТоварыOzon
			|		ПО ДанныеПоРаспоряжениям.УчетнаяЗапись = ТоварыOzon.УчетнаяЗаписьМаркетплейса
			|			И ДанныеПоРаспоряжениям.Номенклатура = ТоварыOzon.Номенклатура
			|			И ДанныеПоРаспоряжениям.Характеристика = ТоварыOzon.Характеристика
			|			И ДанныеПоРаспоряжениям.Упаковка = ТоварыOzon.Упаковка
			|			И (ТоварыOzon.ВидОбъектаМаркетплейса = ЗНАЧЕНИЕ(Перечисление.ВидыОбъектовМаркетплейсов.Товар))");
	КонецЕсли;
	
	// Яндекс Маркет
	Если ПолучитьФункциональнуюОпцию("ИспользоватьИнтеграциюСЯндексМаркет") Тогда
		ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&ИдентификаторТовара",
			"ЕСТЬNULL(ИдентификаторыТоваров.ИдентификаторТовара, &ИдентификаторТовара)");
		
		Соединения.Добавить("
			|		ЛЕВОЕ СОЕДИНЕНИЕ ИдентификаторыТоваров КАК ИдентификаторыТоваров
			|		ПО ДанныеПоРаспоряжениям.Заказ = ИдентификаторыТоваров.Заказ
			|			И ДанныеПоРаспоряжениям.Номенклатура = ИдентификаторыТоваров.Номенклатура
			|			И ДанныеПоРаспоряжениям.Характеристика = ИдентификаторыТоваров.Характеристика
			|			И ДанныеПоРаспоряжениям.Упаковка = ИдентификаторыТоваров.Упаковка");
	КонецЕсли;
	
	Если СведенияПоТоварамИспользуются Тогда
		// Не найден товар.
		Соединения.Добавить("
			|		ЛЕВОЕ СОЕДИНЕНИЕ РазличныеСведенияПоТоварам КАК СведенияПоТоварам
			|		ПО ДанныеПоРаспоряжениям.Заказ = СведенияПоТоварам.Заказ
			|			И ДанныеПоРаспоряжениям.КодСтроки = СведенияПоТоварам.КодСтроки");
		
		ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&ИдентификаторТовара",
			"ЕСТЬNULL(СведенияПоТоварам.ИдентификаторТовара, &ИдентификаторТовара)");
	КонецЕсли;
	
	// Итоговая замена
	ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&ИдентификаторТовара", """""");
	
	Если Соединения.Количество() > 0 Тогда
		Соединения.Вставить(0, ЗаменяемыйФрагмент);
		
		ТекстЗапроса = СтрЗаменить(ТекстЗапроса, ЗаменяемыйФрагмент,
			СтрСоединить(Соединения, Символы.ПС));
	КонецЕсли;

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

Процедура ТекстЗапросаДокументыОтгрузки(ТекстыЗапроса, ИндексыПакетов,
			ИмяПакета = "ДокументыОтгрузки")

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

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

Процедура ТекстЗапросаДанныеПоРаспоряжениям(ТекстыЗапроса, ИндексыПакетов,
			ИмяПакета = "ДанныеПоРаспоряжениям")

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

	ТекстыЗапроса.Добавить(ТекстЗапроса, ИмяПакета);
	ИндексыПакетов.Добавить(ИмяПакета, ТекущийИндексПакетаЗапроса(ИндексыПакетов) + 1);

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

Процедура ТекстЗапросаПодготовкаТоваровДокументовОтгрузкиКОформлению(ТекстыЗапроса, ИндексыПакетов,
			ИмяПакета = "ПодготовкаТоваровДокументовОтгрузкиКОформлению")

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

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

Процедура ТекстЗапросаПодготовкаТоваровДокументовОтгрузки(ТекстыЗапроса, ИндексыПакетов,
			ИмяПакета = "ПодготовкаТоваровДокументовОтгрузки")

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

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

Процедура ТекстЗапросаТоварыДокументовОтгрузки(ТекстыЗапроса, ИндексыПакетов,
			ИмяПакета = "ТоварыДокументовОтгрузки")

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

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

Процедура ТекстЗапросаДанныеПоНомерамГТДДокументовОтгрузки(ТекстыЗапроса, ИндексыПакетов,
			ИмяПакета = "ДанныеПоНомерамГТДДокументовОтгрузки")

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

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

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

#Область ОбработкаЭкземпляровСлужебный

Функция УчетнаяЗаписьТорговойПлощадкиЗаказа(Заказ, ДанныеПоРаспоряжениям)

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

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

Функция ТребуетсяПереоформлениеДокументовОтгрузкиПослеРазделенияОтправлений(Заказ, СведенияПоТоварам)

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

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

Функция ТребуетсяЗаписьСведенийОбОтправлениях(Заказ, СведенияПоТоварам)

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

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

Процедура ПроверитьКодыСтрокПоЗаказам(Заказ, СведенияПоТоварам, ДанныеПоРаспоряжениям)

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

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

Процедура ЗаполнитьКодыСтрокПоЗаказам(Заказ, СведенияПоТоварам, ДанныеПоРаспоряжениям)

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

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

Процедура ПроверитьИдентификаторыСтрокПоДокументамОтгрузки(Заказ, СведенияПоТоварам, ТоварыДокументовОтгрузки)

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

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

Процедура ЗаполнитьИдентификаторыСтрокПоДокументамОтгрузки(Заказ, СведенияПоТоварам, ТоварыДокументовОтгрузки,
			ТребуетсяПереоформлениеДокументовОтгрузки = Ложь)

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

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

Процедура ЗаполнитьИдентификаторСтрокиПоДокументамОтгрузки(ЭкземплярТовара, ТоварыДокументовОтгрузки, Отбор)

	СтрокиДокументаОтгрузки = ТоварыДокументовОтгрузки.НайтиСтроки(Отбор);
	Для Каждого СтрокаДокумента Из СтрокиДокументаОтгрузки Цикл
		Количество = Мин(ЭкземплярТовара.Количество, СтрокаДокумента.Количество - СтрокаДокумента.КоличествоОбработано);
		
		Если Количество < ЭкземплярТовара.Количество Тогда
			Продолжить;
		Иначе
			ЭкземплярТовара.ДокументОтгрузки            = СтрокаДокумента.ДокументОтгрузки;
			ЭкземплярТовара.ИдентификаторСтроки         = СтрокаДокумента.ИдентификаторСтроки;
			ЭкземплярТовара.ИдентификаторСтрокиЗаполнен = Истина;
			ЭкземплярТовара.ДокументОтгрузкиКОформлению = СтрокаДокумента.ДокументОтгрузкиКОформлению;
			
			СтрокаДокумента.КоличествоОбработано =
				СтрокаДокумента.КоличествоОбработано + Количество;
			СтрокаДокумента.Обработана =
				(СтрокаДокумента.Количество = СтрокаДокумента.КоличествоОбработано);
			
			Прервать;
		КонецЕсли;
	КонецЦикла;

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

Процедура ПроверитьИВернутьЭкземплярыВРодительскиеОтправления(Заказ, СведенияПоТоварам)

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

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

Процедура ПроверитьНомераГТДПоДокументамОтгрузки(Заказ, СведенияПоТоварам, НомераГТДДокументовОтгрузки)

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

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

Процедура ЗаполнитьНомераГТДПоДокументамОтгрузки(Заказ, СведенияПоТоварам, НомераГТДДокументовОтгрузки,
			ТребуетсяПереоформлениеДокументовОтгрузки = Ложь)

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

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

#Область ОбработкаМаркировкиСлужебный

Функция ДанныеРаспределенияШтрихкодовУпаковокПоДокументуОтгрузки(ДокументСсылка, РеквизитыДокумента)

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

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

Функция ТекстЗапросаТоваровИШтрихкодовДляИСМП()

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

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

Процедура ДополнитьТаблицуТоваровКодамиИИдентификаторамиСтрок(Товары, МенеджерВременныхТаблиц)

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

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

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

Процедура ОбновитьКодыМаркировки(Заказ, СведенияПоТоварам, ДанныеПоДокументамОтгрузки,
		УчитыватьПризнакМаркировкиИСМП = Ложь)

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

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

Функция СведенияОбОтправлениях(Заказ, СведенияПоТоварам, ДокументыОтгрузкиЗаказов, ТребуетсяЗаписьСведенийОбОтправлениях = Ложь)

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

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

Функция ПодготовитьТаблицуДокументовОтгрузки(Заказ, СведенияПоТоварам)

	ТипСтрока_50 = Новый ОписаниеТипов("Строка",,,, Новый КвалификаторыСтроки(50));
	
	ТаблицаСоответствий = Новый ТаблицаЗначений;
	ТаблицаСоответствий.Колонки.Добавить("ДокументОтгрузки");
	ТаблицаСоответствий.Колонки.Добавить("НомерОтправления",              ТипСтрока_50);
	ТаблицаСоответствий.Колонки.Добавить("НомерРодительскогоОтправления", ТипСтрока_50);
	
	НомераОтправлений = Новый Соответствие;
	ДокументыОтгрузки = Новый Соответствие;
	
	ОтборЭкземпляров = Новый Структура; // Индекс3
	ОтборЭкземпляров.Вставить("Заказ",                       Заказ);
	ОтборЭкземпляров.Вставить("КодСтрокиЗаполнен",           Истина);
	ОтборЭкземпляров.Вставить("ИдентификаторСтрокиЗаполнен", Истина);
	
	СтрокиЭкземпляров = СведенияПоТоварам.НайтиСтроки(ОтборЭкземпляров);
	Для Каждого СтрокаЭкземпляра Из СтрокиЭкземпляров Цикл
		ДанныеДокументаОтгрузки = ДокументыОтгрузки[СтрокаЭкземпляра.ДокументОтгрузки];
		Если ДанныеДокументаОтгрузки = Неопределено Тогда
			ДанныеДокументаОтгрузки = Новый Структура;
			ДанныеДокументаОтгрузки.Вставить("НомерРодительскогоОтправления", СтрокаЭкземпляра.НомерРодительскогоОтправления);
			ДанныеДокументаОтгрузки.Вставить("СписокНомеровОтправлений", Новый Массив);
			
			ДокументыОтгрузки.Вставить(СтрокаЭкземпляра.ДокументОтгрузки, ДанныеДокументаОтгрузки);
		КонецЕсли;
		
		Если ДанныеДокументаОтгрузки.СписокНомеровОтправлений.Найти(СтрокаЭкземпляра.НомерОтправления) = Неопределено Тогда
			ДанныеДокументаОтгрузки.СписокНомеровОтправлений.Добавить(СтрокаЭкземпляра.НомерОтправления);
		КонецЕсли;
		
		СписокДокументовОтгрузки = НомераОтправлений[СтрокаЭкземпляра.НомерОтправления];
		Если СписокДокументовОтгрузки = Неопределено Тогда
			СписокДокументовОтгрузки = Новый Массив;
			НомераОтправлений.Вставить(СтрокаЭкземпляра.НомерОтправления, СписокДокументовОтгрузки);
		КонецЕсли;
		
		Если СписокДокументовОтгрузки.Найти(СтрокаЭкземпляра.ДокументОтгрузки) = Неопределено Тогда
			СписокДокументовОтгрузки.Добавить(СтрокаЭкземпляра.ДокументОтгрузки);
		КонецЕсли;
	КонецЦикла;
	
	ТаблицаСоответствий.Свернуть("ДокументОтгрузки, НомерОтправления, НомерРодительскогоОтправления");
	ТаблицаСоответствий.Колонки.Добавить("КоличествоНомеровОтправленийДокументаОтгрузки", Новый ОписаниеТипов("Число"));
	ТаблицаСоответствий.Колонки.Добавить("КоличествоДокументовОтгрузкиНомераОтправления", Новый ОписаниеТипов("Число"));
	ТаблицаСоответствий.Колонки.Добавить("Обработана",                                    Новый ОписаниеТипов("Булево"));
	
	Для Каждого ДанныеДокументаОтгрузки Из ДокументыОтгрузки Цикл
		ДокументОтгрузки              = ДанныеДокументаОтгрузки.Ключ;
		СписокНомеровОтправлений      = ДанныеДокументаОтгрузки.Значение.СписокНомеровОтправлений;
		НомерРодительскогоОтправления = ДанныеДокументаОтгрузки.Значение.НомерРодительскогоОтправления;
		
		Для Каждого НомерОтправления Из СписокНомеровОтправлений Цикл
			СписокДокументовОтгрузки = НомераОтправлений[НомерОтправления];
			
			НовоеСоответствие = ТаблицаСоответствий.Добавить();
			НовоеСоответствие.ДокументОтгрузки                              = ДокументОтгрузки;
			НовоеСоответствие.НомерОтправления                              = НомерОтправления;
			НовоеСоответствие.НомерРодительскогоОтправления                 = НомерРодительскогоОтправления;
			НовоеСоответствие.КоличествоНомеровОтправленийДокументаОтгрузки = СписокНомеровОтправлений.Количество();
			НовоеСоответствие.КоличествоДокументовОтгрузкиНомераОтправления = СписокДокументовОтгрузки.Количество();
		КонецЦикла;
	КонецЦикла;
	
	Возврат ТаблицаСоответствий;

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

Процедура ОпределитьДанныеДокументаОтгрузки(Параметры, ТаблицаСоответствий,
			ДанныеПоДокументамОтгрузки, ДанныеПоНомерамОтправлений,ТребуетсяЗаписьСведенийОбОтправлениях = Ложь)

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

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

Функция НайтиСоответствиеНомераОтправленияИДокументаОтгрузки(СтрокиСоответствий, ЭтоПоискДокументаОтгрузки,
			ДанныеПоДокументамОтгрузки, ДанныеПоНомерамОтправлений)

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

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

Процедура ЗаполнитьНомераОтправлений(Заказ, СведенияПоТоварам, СведенияОбОтправлениях,
			ТребуетсяЗаписьСведенийОбОтправлениях = Ложь, ЗаписатьСведенияОбОтправлениях = Ложь)

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

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

Функция ЗаписатьИзмененияСведенийПоТоварам(Заказ, СведенияПоТоварам)

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

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

Процедура ВернутьЭкземплярВРодительскоеОтправление(КлючЗаписи)

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

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

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

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

#КонецЕсли

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