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