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


Область СворачиваниеДокументов

// Задачи: сворачивание передач на комиссию + 74011 (возвраты от комиссионера).

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

&Перед("ВыполнитьПроцедуруМодуляМенеджера")
Процедура к_ВыполнитьПроцедуруМодуляМенеджераПеред(ИмяПроцедуры, Параметры)
	
	Настройка = НастройкаПоИмени(ИмяПроцедуры, "ПКО");
	Если Настройка = Неопределено Тогда
		Возврат;
	КонецЕсли;
	
	Если Параметры.ДанныеИБ = Неопределено Тогда
		Возврат;
	КонецЕсли;
	
	Хранилище = Хранилище(Параметры.КомпонентыОбмена);
	Если Не Хранилище.ТекущийВедомый Тогда
		Возврат;
	КонецЕсли;
	
	Накопленные = Новый Структура;
	Для Каждого ИмяТЧ Из Настройка.ТабличныеЧасти Цикл
		Накопленные.Вставить(ИмяТЧ, Параметры.ДанныеИБ[ИмяТЧ].Выгрузить());
	КонецЦикла;
	Хранилище.НакопленныеТЧ = Накопленные;
	
КонецПроцедуры

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

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

&После("ПКО_Документ_ВозвратТоваровОтПокупателя_ПередЗаписьюПолученныхДанных")
Процедура к_ПКО_Документ_ВозвратТоваровОтПокупателя_ПередЗаписьюПолученныхДанных(ПолученныеДанные, ДанныеИБ, КонвертацияСвойств, КомпонентыОбмена)
	
	СнятьПризнакПроведен(ПолученныеДанные, ДанныеИБ,
		Перечисления.ВидыОперацийВозвратТоваровОтПокупателя.ПереданныеТовары);
	
КонецПроцедуры

Процедура СнятьПризнакПроведен(ПолученныеДанные, ДанныеИБ, ВидОперации)
	
	Данные = ?(ПолученныеДанные <> Неопределено, ПолученныеДанные, ДанныеИБ);
	Если Данные = Неопределено Тогда
		Возврат;
	КонецЕсли;
	
	Если Данные.ВидОперации = ВидОперации Тогда
		Данные.Проведен = Ложь;
	КонецЕсли;
	
КонецПроцедуры

#Область Настройки

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

Функция НастройкаПоИмени(ИмяПроцедуры, Вид)
	
	Для Каждого Настройка Из НастройкиСворачивания() Цикл
		Если Настройка[Вид] = ИмяПроцедуры Тогда
			Возврат Настройка;
		КонецЕсли;
	КонецЦикла;
	
	Возврат Неопределено;
	
КонецФункции

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

#Область Реализация

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

Функция КлючГруппы(ДанныеXDTO, ТипДокумента)
	
	Если Не ДанныеXDTO.КлючевыеСвойства.Свойство("Дата") Тогда
		Возврат "";
	КонецЕсли;
	
	ИННКонтрагента = "";
	Контрагент = Неопределено;
	Если ДанныеXDTO.Свойство("Контрагент", Контрагент)
		И Контрагент <> Неопределено
		И Контрагент.Свойство("ИНН") Тогда
		ИННКонтрагента = Контрагент.ИНН;
	КонецЕсли;
	
	Если ИННКонтрагента = "7704217370" Тогда
		Секунда = 1;
	ИначеЕсли ИННКонтрагента = "9714053621" Тогда
		Секунда = 2;
	Иначе
		Секунда = 3;
	КонецЕсли;
	
	ДанныеXDTO.КлючевыеСвойства.Дата = НачалоДня(ДанныеXDTO.КлючевыеСвойства.Дата) + 36000 + Секунда;
	
	Возврат ТипДокумента + "|"
		+ Формат(ДанныеXDTO.КлючевыеСвойства.Дата, "ДФ=yyyyMMdd") + "|"
		+ ИННКонтрагента;
	
КонецФункции

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

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

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

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