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