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


Функция Поступления(Запрос) Экспорт
	
	Организация = Запрос.ПараметрыURL.Получить("Организация"); // Уникальный идентификатор организации в базе источнике
	ИННОрганизации = Запрос.ПараметрыURL.Получить("ИНН");
	ДатаНачала = Запрос.ПараметрыURL.Получить("ДатаНачала");
	ДатаОкончания = Запрос.ПараметрыURL.Получить("ДатаОкончания");
	
	Если Организация = Неопределено Или ДатаНачала = Неопределено Или ДатаОкончания = Неопределено Тогда
		Ответ = Новый HTTPСервисОтвет(400);
		Ответ.УстановитьТелоИзСтроки("Система не получила все необходимые параметры");
	Иначе
		ОтветДляБП = ПодготовитьФайлПоступленийДляОтправки(Организация, ИННОрганизации, Дата(ДатаНачала), Дата(ДатаОкончания));
		Ответ = Новый HTTPСервисОтвет(200);
		Ответ.УстановитьТелоИзСтроки(ОтветДляБП);
		Ответ.Заголовки["Content-Type"] = "text/plain";
	КонецЕсли;
	
	Возврат Ответ;
	
КонецФункции

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

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

Функция ДанныеПоступленийЮЛ(Организация, Контрагент, ДатаНачала, ДатаОкончания, ПапкаИсключение);

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

	РезультатЗапроса = Запрос.Выполнить().Выгрузить();
	
	Возврат РезультатЗапроса;
	
КонецФункции

Функция Реализации(Запрос) Экспорт
	
	ИдентификаторОрганизацииБП = Запрос.ПараметрыURL.Получить("Организация"); // Уникальный идентификатор организации в базе источнике
	ИННОрганизации = Запрос.ПараметрыURL.Получить("ИНН");
	ДатаЗагрузки = Запрос.ПараметрыURL.Получить("ДатаЗагрузки");
	
	Если ИдентификаторОрганизацииБП = Неопределено Или ДатаЗагрузки = Неопределено Или ИННОрганизации = Неопределено Тогда
		Ответ = Новый HTTPСервисОтвет(400);
		Ответ.УстановитьТелоИзСтроки("Система не получила все необходимые параметры");
	Иначе
		ОтветДляБП = ПодготовитьФайлРеализацийДляОтправки(ИдентификаторОрганизацииБП, ИННОрганизации, ДатаЗагрузки);
		Ответ = Новый HTTPСервисОтвет(200);
		Ответ.УстановитьТелоИзСтроки(ОтветДляБП);
		Ответ.Заголовки["Content-Type"] = "text/plain";
	КонецЕсли;
	
	Возврат Ответ;
	
КонецФункции

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

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

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

Функция ОбработатьТаблицы(ТаблицаДанныхДокументов, ТаблицаДвижений, ТаблицаКИЗ)
	
	НоваяТаблица = ТаблицаДанныхДокументов.СкопироватьКолонки();
	НоваяТаблица.Колонки.Добавить("КодМаркировки");
	НоваяТаблица.Колонки.Добавить("НоменклатураПоставщика");
	НоваяТаблица.Колонки.Добавить("ГТД");
	
	Для Каждого Строка Из ТаблицаДанныхДокументов Цикл
		
		Если ЗначениеЗаполнено(НоваяТаблица.Найти(Строка.Ссылка, "Ссылка")) Тогда
			Продолжить; // По этой реализации строки уже обработаны
		КонецЕсли;
		
		ПараметрыОтбораПервойТаблицы = Новый Структура("Ссылка", Строка.Ссылка);
		// Все строки исходной таблицы по расходной накладной
		СтрокиТаблицыПоРеализации = ТаблицаДанныхДокументов.НайтиСтроки(ПараметрыОтбораПервойТаблицы);
		Для Каждого СтрокаРеализации Из СтрокиТаблицыПоРеализации Цикл
			
			ПараметрыОтбора = Новый Структура;
			ПараметрыОтбора.Вставить("Регистратор", СтрокаРеализации.Ссылка);
			ПараметрыОтбора.Вставить("Номенклатура", СтрокаРеализации.Номенклатура);
			ПараметрыОтбора.Вставить("Характеристика", СтрокаРеализации.Характеристика);
			
			МассивСтрокДвижений = ТаблицаДвижений.НайтиСтроки(ПараметрыОтбора);
			МассивГТД = Новый Массив;
			МассивНоменклатурПоставщика = Новый Массив;
			Для Каждого СтрокаДвижений Из МассивСтрокДвижений Цикл
				// Нам из этого массива строк нужны все возможные номенклатуры поставщика и ГТД при необходимости при подборе в БП будем их перебирать
				МассивГТД.Добавить(СтрокаДвижений.ГТД);
				МассивНоменклатурПоставщика.Добавить(СтрокаДвижений.НоменклатураПоставщика);
			КонецЦикла;
			
			// Все ещё не использованные в документе строки таблицы КИЗ по расходной накладной
			ПараметрыОтбораВторойТаблицы = Новый Структура("Ссылка, Номенклатура, Бренд, КаталожныйНомер, Использован",
			СтрокаРеализации.Ссылка, СтрокаРеализации.Номенклатура, СтрокаРеализации.Бренд, СтрокаРеализации.КаталожныйНомер_Сокращенный, Ложь);
			
			КоличествоОтобранных = 0;
			Пока СтрокаРеализации.Количество > КоличествоОтобранных Цикл
				СтрокиТаблицыКИЗ = ТаблицаКИЗ.НайтиСтроки(ПараметрыОтбораВторойТаблицы);
				СтрокаКИЗ = СтрокиТаблицыКИЗ[0];
				НоваяСтрока = НоваяТаблица.Добавить();
				ЗаполнитьЗначенияСвойств(НоваяСтрока, СтрокаРеализации);
				НоваяСтрока.КодМаркировки = СтрокаКИЗ.КодМаркировки;
				СтрокаКиз.Использован = Истина;
				КоличествоОтобранных = КоличествоОтобранных + 1;
				НоваяСтрока.НоменклатураПоставщика = МассивНоменклатурПоставщика;
				НоваяСтрока.ГТД = МассивГТД;
			КонецЦикла;
			
		КонецЦикла;
		
	КонецЦикла;
	
	Возврат НоваяТаблица;
	
КонецФункции


//++Миронов А.В Выгрузка чеков для АвтоМастера и АвтоТочки
Функция Чеки(Запрос) Экспорт
	
	Организация = Запрос.ПараметрыURL.Получить("Организация");
	ИННОрганизации = Запрос.ПараметрыURL.Получить("ИНН");
	ДатаНачала = Запрос.ПараметрыURL.Получить("ДатаНачала");
	ДатаОкончания = Запрос.ПараметрыURL.Получить("ДатаОкончания");
	
	Если Организация = Неопределено Или ДатаНачала = Неопределено Или ДатаОкончания = Неопределено Тогда
		Ответ = Новый HTTPСервисОтвет(400);
		Ответ.УстановитьТелоИзСтроки("Система не получила все необходимые параметры");
	Иначе
		ОтветДляБП = ПодготовитьФайлЧековДляОтправки(Организация, ИННОрганизации, Дата(ДатаНачала), Дата(ДатаОкончания));
		Ответ = Новый HTTPСервисОтвет(200);
		Ответ.УстановитьТелоИзСтроки(ОтветДляБП);
		Ответ.Заголовки["Content-Type"] = "text/plain";
	КонецЕсли;
	
	Возврат Ответ;
	
КонецФункции

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

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

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