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


/ ============================================================
// Правка 1. НачатьЗагрузкуЧеков — создать адрес ЗАРАНЕЕ и передать в задание.
// Было: ПоместитьВоВременноеХранилище вызывался с ДанныеДокументов
//       ДО запуска задания, поэтому в хранилище лежал незаполненный массив.
// ============================================================

&НаСервере
Функция НачатьЗагрузкуЧеков(ДанныеДокументов)

	// Пустой адрес, привязанный к форме. Фоновое задание допишет в него
	// заполненные данные — помещение по существующему адресу разрешено.
	ИнформацияОЧекахАдресВХранилище =
		ПоместитьВоВременноеХранилище(Неопределено, УникальныйИдентификатор);

	ПараметрыЗагрузки = Новый Структура("Данные,СоответствиеСкладов,АдресДанных",
		ДанныеДокументов,
		РеквизитФормыВЗначение("СоответствиеСкладовЧеки"),
		ИнформацияОЧекахАдресВХранилище);

	ПараметрыВыполнения = ДлительныеОперации.ПараметрыВыполненияФункции(УникальныйИдентификатор);
	ПараметрыВыполнения.НаименованиеФоновогоЗадания = НСтр("ru = 'Загрузка чеков из ЗПЧ'");
	ПараметрыВыполнения.ЗапуститьВФоне = Истина;

	Возврат ДлительныеОперации.ВыполнитьФункцию(ПараметрыВыполнения,
		"ЗагрузкаЧеков.ОбработатьЧекиВФоне", ПараметрыЗагрузки);

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


// ============================================================
// Правка 2. Обработчик завершения — читать данные из хранилища,
// а не из того, что было до запуска.
// ============================================================

&НаКлиенте
Процедура ЗагрузкаЧековЗавершена(Результат, ДополнительныеПараметры) Экспорт

	ИдентификаторЗадания = Неопределено;
	ПоказатьИндикатор(Ложь);

	Если Результат = Неопределено Тогда
		// Задание отменено пользователем
		Возврат;
	КонецЕсли;

	Если Результат.Статус = "Ошибка" Тогда
		ПоказатьПредупреждение(, Результат.КраткоеПредставлениеОшибки);
		Возврат;
	КонецЕсли;

	ЗагрузкаЧековЗавершенаНаСервере(Результат.АдресРезультата);

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


&НаСервере
Процедура ЗагрузкаЧековЗавершенаНаСервере(АдресРезультатаЗадания)

	РезультатЗадания = ПолучитьИзВременногоХранилища(АдресРезультатаЗадания);

	Если РезультатЗадания = Неопределено Тогда
		ОбщегоНазначения.СообщитьПользователю(
			НСтр("ru = 'Фоновое задание не вернуло результат'"));
		Возврат;
	КонецЕсли;

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

	ВывестиЛогЗагрузки(РезультатЗадания.Лог);

	ОбщегоНазначения.СообщитьПользователю(СтрШаблон(
		НСтр("ru = 'Обработано чеков: %1. Проверьте соответствие складов и нажмите ""Создать документы""'"),
		РезультатЗадания.ОбработаноЧеков));

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


&НаСервере
Процедура ВывестиЛогЗагрузки(Лог)

	Для Каждого СтрокаЛога Из Лог Цикл
		Текст = ?(ПустаяСтрока(СтрокаЛога.Номенклатура),
			СтрокаЛога.Текст,
			СтрокаЛога.Номенклатура + ": " + СтрокаЛога.Текст);
		ОбщегоНазначения.СообщитьПользователю(Текст);
	КонецЦикла;

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


// ============================================================
// Проверка перед созданием документов:
// в хранилище должны лежать структуры с реквизитом НоменклатураБП.
// ============================================================
//
//	ДанныеДокументов = ПолучитьИзВременногоХранилища(ИнформацияОЧекахАдресВХранилище);
//	Если ДанныеДокументов = Неопределено
//		ИЛИ ДанныеДокументов.Количество() = 0
//		ИЛИ ДанныеДокументов[0].Товары.Количество() = 0
//		ИЛИ НЕ ДанныеДокументов[0].Товары[0].Свойство("НоменклатураБП") Тогда
//		ОбщегоНазначения.СообщитьПользователю(
//			НСтр("ru = 'Номенклатура не подобрана — повторите загрузку'"));
//		Возврат;
//	КонецЕсли;