/////////////////////////////////////////////////////////////////////////////////////////////////////// // Copyright (c) 2023, ООО 1С-Софт // Все права защищены. Эта программа и сопроводительные материалы предоставляются // в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0) // Текст лицензии доступен по ссылке: // https://creativecommons.org/licenses/by/4.0/legalcode /////////////////////////////////////////////////////////////////////////////////////////////////////// #Область СлужебныйПрограммныйИнтерфейс // Возвращает путь к рабочему каталогу пользователя. Функция РабочийКаталогПользователя() Экспорт Возврат РаботаСФайламиСлужебныйКлиентПовтИсп.РабочийКаталогПользователя(); КонецФункции // Открывает форму папки со списком файлов. // // Параметры: // СтандартнаяОбработка - Булево - передается "как есть" из параметров обработчика "Открытие". // Папка - СправочникСсылка.Файлы - открываемая папка. // Процедура РассылкаОтчетовПросмотрПапки(СтандартнаяОбработка, Папка) Экспорт СтандартнаяОбработка = Ложь; ПараметрыФормы = Новый Структура("Папка", Папка); ОткрытьФорму("Справочник.Файлы.Форма.Файлы", ПараметрыФормы, , Папка); КонецПроцедуры Процедура ПеренестиФайлы() Экспорт ОткрытьФорму("Обработка.ПереносФайлов.Форма"); КонецПроцедуры // На основе переданного пути к файлу создает файл в программе и открывает карточку. // // Параметры: // ПараметрыВыполнения - Структура: // * ОбработчикРезультата - ОписаниеОповещения // - Неопределено - описание процедуры, принимающей результат работы метода. // * ПолноеИмяФайла - Строка - необязательный. Полный путь и имя файла на клиенте. // Если не указан, то будет открыт диалог для выбора файла. // * ВладелецФайла - ЛюбаяСсылка - владелец файла. // * ФормаВладелец - ФормаКлиентскогоПриложения - форма из которой вызвано создание файла. // * НеОткрыватьКарточкуПослеСозданияИзФайла - Булево. // - Истина когда карточка файла не открывается после создания. // * ИмяСоздаваемогоФайла - Строка - необязательный. Новое имя файла. // Процедура ДобавитьИзФайловойСистемыСРасширением(ПараметрыВыполнения) Экспорт Результат = ДобавитьИзФайловойСистемыСРасширениемСинхронно(ПараметрыВыполнения); Если Не Результат.ФайлДобавлен Тогда Если ЗначениеЗаполнено(Результат.ТекстОшибки) Тогда ВернутьРезультатПослеПоказаПредупреждения(ПараметрыВыполнения.ОбработчикРезультата, Результат.ТекстОшибки, Неопределено); Иначе ВернутьРезультат(ПараметрыВыполнения.ОбработчикРезультата, Неопределено); КонецЕсли; Возврат; КонецЕсли; Если ПараметрыВыполнения.НеОткрыватьКарточкуПослеСозданияИзФайла <> Истина Тогда ПараметрыФормы = Новый Структура("КарточкаОткрытаПослеСозданияФайла", Истина); ОписаниеОповещенияОЗакрытии = ОбработчикЗавершения(ПараметрыВыполнения.ОбработчикРезультата); РаботаСФайламиКлиент.ОткрытьФормуФайла(Результат.ФайлСсылка,, ПараметрыФормы, ОписаниеОповещенияОЗакрытии); Иначе ВернутьРезультат(ПараметрыВыполнения.ОбработчикРезультата, Результат); КонецЕсли; КонецПроцедуры // На основе переданного пути к файлу создает файл в программе и открывает карточку. // // Параметры: // ПараметрыВыполнения - Структура: // * ПолноеИмяФайла - Строка - необязательный. Полный путь и имя файла на клиенте. // Если не указан, то будет открыт синхронный диалог для выбора файла. // * ВладелецФайла - ЛюбаяСсылка - владелец файла. // * УникальныйИдентификатор - УникальныйИдентификатор - идентификатор формы для хранения файла. // * ИмяСоздаваемогоФайла - Строка - необязательный. Новое имя файла. // // Возвращаемое значение: // Структура: // * ФайлДобавлен - Булево - успешно ли выполнена операция. // * ФайлСсылка - СправочникСсылка.Файлы // * ТекстОшибки - Строка. // Функция ДобавитьИзФайловойСистемыСРасширениемСинхронно(ПараметрыВыполнения) Экспорт Результат = Новый Структура; Результат.Вставить("ФайлДобавлен", Ложь); Результат.Вставить("ФайлСсылка", Неопределено); Результат.Вставить("ТекстОшибки", ""); ФильтрДиалога = ?(ПараметрыВыполнения.Свойство("ФильтрДиалогаВыбора"), ПараметрыВыполнения.ФильтрДиалогаВыбора, СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Все файлы (%1)|%1'"), ПолучитьМаскуВсеФайлы())); Если Не ПараметрыВыполнения.Свойство("ПолноеИмяФайла") Тогда // Загрузить из файловой системы с расширением работы с файлами. ДиалогВыбораФайла = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие); ДиалогВыбораФайла.МножественныйВыбор = Ложь; ДиалогВыбораФайла.Заголовок = НСтр("ru = 'Выбор файла'"); ДиалогВыбораФайла.Фильтр = ФильтрДиалога; ДиалогВыбораФайла.Каталог = РаботаСФайламиСлужебныйВызовСервера.РабочийКаталогПапки(ПараметрыВыполнения.ВладелецФайла); Если НЕ ДиалогВыбораФайла.Выбрать() Тогда Возврат Результат; КонецЕсли; ПараметрыВыполнения.Вставить("ПолноеИмяФайла", ДиалогВыбораФайла.ПолноеИмяФайла); КонецЕсли; Если Не ПараметрыВыполнения.Свойство("ИмяСоздаваемогоФайла") Тогда ПараметрыВыполнения.Вставить("ИмяСоздаваемогоФайла", Неопределено); КонецЕсли; ДобавляемыйФайл = Новый Файл(ПараметрыВыполнения.ПолноеИмяФайла); Если Не ДобавляемыйФайл.Существует() Тогда ТекстОшибки = НСтр("ru = 'Указанный файл не существует: |%1'"); Результат.ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ТекстОшибки, ПараметрыВыполнения.ПолноеИмяФайла); Возврат Результат; КонецЕсли; Если ПараметрыВыполнения.Свойство("МаксимальныйРазмер") И ПараметрыВыполнения.МаксимальныйРазмер > 0 И ДобавляемыйФайл.Размер() > ПараметрыВыполнения.МаксимальныйРазмер*1024*1024 Тогда ТекстОшибки = НСтр("ru = 'Размер файла превышает %1 Мб.'"); Результат.ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ТекстОшибки, ПараметрыВыполнения.МаксимальныйРазмер); Возврат Результат; КонецЕсли; ПроверитьВозможностьЗагрузкиФайла(ДобавляемыйФайл); ОбщиеНастройки = ОбщиеНастройкиРаботыСФайлами(); ИзвлекатьТекстыФайловНаКлиенте = НЕ ОбщиеНастройки.ИзвлекатьТекстыФайловНаСервере; Если ИзвлекатьТекстыФайловНаКлиенте Тогда АдресВременногоХранилищаТекста = ИзвлечьТекстВоВременноеХранилище(ДобавляемыйФайл.ПолноеИмя, ПараметрыВыполнения.ФормаВладелец.УникальныйИдентификатор); Иначе АдресВременногоХранилищаТекста = ""; КонецЕсли; // Помещение файла во временное хранилище. АдресВременногоХранилищаФайла = ""; ПомещаемыеФайлы = Новый Массив; Описание = Новый ОписаниеПередаваемогоФайла(ДобавляемыйФайл.ПолноеИмя, ""); ПомещаемыеФайлы.Добавить(Описание); ПомещенныеФайлы = Новый Массив; ФайлыПомещены = ПоместитьФайлы(ПомещаемыеФайлы, ПомещенныеФайлы, , Ложь, ПараметрыВыполнения.ФормаВладелец.УникальныйИдентификатор); Если НЕ ФайлыПомещены Тогда Возврат Результат; КонецЕсли; Если ПомещенныеФайлы.Количество() = 1 Тогда АдресВременногоХранилищаФайла = ПомещенныеФайлы[0].Хранение; КонецЕсли; #Если МобильныйКлиент Тогда ПредставлениеНаМобильномУстройстве = ДобавляемыйФайл.ПолучитьПредставлениеФайлаБиблиотекиМобильногоУстройства(); РасширениеФайла = ОбщегоНазначенияКлиентСервер.ПолучитьРасширениеИмениФайла(ПредставлениеНаМобильномУстройстве); ИмяФайлаБезРасширения = СтрЗаменить(ПредставлениеНаМобильномУстройстве, "." + РасширениеФайла, ""); #Иначе РасширениеФайла = ОбщегоНазначенияКлиентСервер.РасширениеБезТочки(ДобавляемыйФайл.Расширение); ИмяФайлаБезРасширения = ДобавляемыйФайл.ИмяБезРасширения; #КонецЕсли Если ПараметрыВыполнения.ИмяСоздаваемогоФайла <> Неопределено Тогда ИмяСоздания = ПараметрыВыполнения.ИмяСоздаваемогоФайла; Иначе ИмяСоздания = ИмяФайлаБезРасширения; КонецЕсли; // Создание карточки Файла в БД. Попытка Если РаботаСФайламиСлужебныйКлиентПовтИсп.ЭтоСправочникФайлы(ПараметрыВыполнения.ВладелецФайла) Тогда СведенияОФайле = РаботаСФайламиКлиентСервер.СведенияОФайле("ФайлСВерсией", ДобавляемыйФайл); СведенияОФайле.АдресВременногоХранилищаФайла = АдресВременногоХранилищаФайла; СведенияОФайле.АдресВременногоХранилищаТекста = АдресВременногоХранилищаТекста; СведенияОФайле.ЗаписатьВИсторию = Истина; СведенияОФайле.ИмяБезРасширения = ИмяСоздания; СведенияОФайле.РасширениеБезТочки = РасширениеФайла; Результат.ФайлСсылка = РаботаСФайламиСлужебныйВызовСервера.СоздатьФайлСВерсией(ПараметрыВыполнения.ВладелецФайла, СведенияОФайле); Иначе ПараметрыФайла = РаботаСФайламиСлужебныйКлиентСервер.ПараметрыДобавленияФайла(); ПараметрыФайла.ВладелецФайлов = ПараметрыВыполнения.ВладелецФайла; ПараметрыФайла.ИмяБезРасширения = ИмяФайлаБезРасширения; ПараметрыФайла.РасширениеБезТочки = РасширениеФайла; Результат.ФайлСсылка = РаботаСФайламиСлужебныйВызовСервера.ДобавитьФайл(ПараметрыФайла, АдресВременногоХранилищаФайла, АдресВременногоХранилищаТекста); КонецЕсли; Результат.ФайлДобавлен = Истина; Исключение Результат.ТекстОшибки = ОшибкаСозданияНовогоФайла(ИнформацияОбОшибке()); КонецПопытки; Если Результат.ТекстОшибки <> "" Тогда Возврат Результат; КонецЕсли; ПараметрыОповещения = ПараметрыОповещенияЗаписиФайла(); ПараметрыОповещения.Владелец = ПараметрыВыполнения.ВладелецФайла; ПараметрыОповещения.ВладелецФайла = ПараметрыОповещения.Владелец; ПараметрыОповещения.Файл = Результат.ФайлСсылка; ПараметрыОповещения.ЭтоНовый = Истина; Оповестить("Запись_Файл", ПараметрыОповещения, Результат.ФайлСсылка); ПоказатьОповещениеПользователя( НСтр("ru = 'Создание:'"), ПолучитьНавигационнуюСсылку(Результат.ФайлСсылка), Результат.ФайлСсылка, БиблиотекаКартинок.Информация32); Возврат Результат; КонецФункции // Продолжение процедуры ПрисоединенныеФайлыКлиент.ДобавитьФайлы. Процедура ДобавитьФайлыРасширениеПредложено(РасширениеРаботыСФайламиПодключено, ДополнительныеПараметры) Экспорт ВладелецФайла = ДополнительныеПараметры.ВладелецФайла; ИдентификаторФормы = ДополнительныеПараметры.ИдентификаторФормы; Если Не ДополнительныеПараметры.Свойство("Фильтр") Тогда ДополнительныеПараметры.Вставить("Фильтр",""); КонецЕсли; Если РасширениеРаботыСФайламиПодключено Тогда Фильтр = ДополнительныеПараметры.Фильтр; ОткрыватьКарточкуПослеСозданияИзФайла = Ложь; Если ДополнительныеПараметры.Свойство("НеОткрыватьКарточкуПослеСозданияИзФайла") Тогда ОткрыватьКарточкуПослеСозданияИзФайла = Не ДополнительныеПараметры.НеОткрыватьКарточкуПослеСозданияИзФайла; КонецЕсли; ВыбранныеФайлы = Новый Массив; Если Не ДополнительныеПараметры.Свойство("ПолноеИмяФайла") Тогда ВыборФайла = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие); ВыборФайла.МножественныйВыбор = Истина; ВыборФайла.Заголовок = НСтр("ru = 'Выбор файла'"); ВыборФайла.Фильтр = ?(ЗначениеЗаполнено(Фильтр), Фильтр, НСтр("ru = 'Все файлы'") + " (*.*)|*.*"); Если ВыборФайла.Выбрать() Тогда ВыбранныеФайлы = ВыборФайла.ВыбранныеФайлы; КонецЕсли; Иначе ВыбранныеФайлы.Добавить(ДополнительныеПараметры.ПолноеИмяФайла); КонецЕсли; ИмяСоздаваемогоФайла = ""; Если ДополнительныеПараметры.Свойство("ИмяСоздаваемогоФайла") Тогда ИмяСоздаваемогоФайла = ДополнительныеПараметры.ИмяСоздаваемогоФайла; КонецЕсли; Если ВыбранныеФайлы.Количество() > 0 Тогда ПрисоединенныеФайлыМассив = Новый Массив; ПоместитьВыбранныеФайлыВХранилище( ВыбранныеФайлы, ВладелецФайла, ПрисоединенныеФайлыМассив, ИдентификаторФормы, ИмяСоздаваемогоФайла, ДополнительныеПараметры.ГруппаФайлов); Если ПрисоединенныеФайлыМассив.Количество() = 1 И ОткрыватьКарточкуПослеСозданияИзФайла Тогда ПрисоединенныйФайл = ПрисоединенныеФайлыМассив[0]; ПоказатьОповещениеПользователя( НСтр("ru = 'Создание:'"), ПолучитьНавигационнуюСсылку(ПрисоединенныйФайл), ПрисоединенныйФайл, БиблиотекаКартинок.Информация32); ПараметрыФормы = Новый Структура("ЭтоНовый", Истина); РаботаСФайламиКлиент.ОткрытьФормуФайла(ПрисоединенныйФайл,, ПараметрыФормы) КонецЕсли; Если ПрисоединенныеФайлыМассив.Количество() > 0 Тогда ОповеститьОбИзменении(ПрисоединенныеФайлыМассив[0]); ОповеститьОбИзменении(ВладелецФайла); ПараметрыОповещения = ПараметрыОповещенияЗаписиФайла(); ПараметрыОповещения.Владелец = ВладелецФайла; ПараметрыОповещения.ВладелецФайла = ПараметрыОповещения.Владелец; ПараметрыОповещения.Файл = ПрисоединенныеФайлыМассив[0]; ПараметрыОповещения.ЭтоНовый = Истина; Оповестить("Запись_Файл", ПараметрыОповещения, ПрисоединенныеФайлыМассив); КонецЕсли; Если ДополнительныеПараметры.Свойство("ОбработчикРезультата") И ДополнительныеПараметры.ОбработчикРезультата <> Неопределено Тогда ВыполнитьОбработкуОповещения(ДополнительныеПараметры.ОбработчикРезультата, ПрисоединенныеФайлыМассив); КонецЕсли; КонецЕсли; Иначе // Если веб-клиент без подключенного расширения. ОписаниеОповещения = Новый ОписаниеОповещения("ДобавитьФайлыЗавершение", ЭтотОбъект, ДополнительныеПараметры); ПоместитьВыбранныеФайлыВХранилищеВеб(ОписаниеОповещения, ВладелецФайла, ИдентификаторФормы); КонецЕсли; КонецПроцедуры // Показывает стандартное предупреждение. // // Параметры: // ОбработчикРезультата - ОписаниеОповещения // - Неопределено - описание процедуры, принимающей результат работы метода. // ПредставлениеКоманды - Строка - имя команды, для выполнения которой необходимо расширение. // Процедура ПоказатьПредупреждениеОНеобходимостиРасширенияРаботыСФайлами(ОбработчикРезультата, ПредставлениеКоманды = "") Экспорт Если Не КлиентПоддерживаетСинхронныеВызовы() Тогда ТекстПредупреждения = НСтр("ru = 'В веб-браузерах Google Chrome и Mozilla Firefox команда ""%1"" недоступна.'"); Иначе ТекстПредупреждения = НСтр("ru = 'Для выполнения команды ""%1"" необходимо |установить расширение для работы с 1С:Предприятием.'"); КонецЕсли; Если ЗначениеЗаполнено(ПредставлениеКоманды) Тогда ТекстПредупреждения = СтрЗаменить(ТекстПредупреждения, "%1", ПредставлениеКоманды); Иначе ТекстПредупреждения = СтрЗаменить(ТекстПредупреждения, " ""%1""", ""); КонецЕсли; ВернутьРезультатПослеПоказаПредупреждения(ОбработчикРезультата, ТекстПредупреждения, Неопределено); КонецПроцедуры // Сохраняет путь к рабочему каталогу пользователя в настройках. // // Параметры: // ИмяКаталога - Строка - имя каталога. // Процедура УстановитьРабочийКаталогПользователя(ИмяКаталога) Экспорт РаботаСФайламиСлужебныйВызовСервера.УстановитьРабочийКаталогПользователя(ИмяКаталога); КонецПроцедуры // Возвращает каталог "Мои Документы" + имя текущего пользователя или // ранее использованную папку для выгрузки. // Функция КаталогВыгрузки() Экспорт Путь = ""; #Если Не ВебКлиент И НЕ МобильныйКлиент Тогда Путь = ОбщегоНазначенияВызовСервера.ХранилищеОбщихНастроекЗагрузить("ИмяПапкиВыгрузки", "ИмяПапкиВыгрузки"); Если Путь = Неопределено Тогда Если Не СтандартныеПодсистемыКлиент.ЭтоБазоваяВерсияКонфигурации() Тогда Путь = КаталогМоиДокументы(); ОбщегоНазначенияВызовСервера.ХранилищеОбщихНастроекСохранить( "ИмяПапкиВыгрузки", "ИмяПапкиВыгрузки", Путь); КонецЕсли; КонецЕсли; #КонецЕсли Возврат Путь; КонецФункции // Показывает пользователю диалог выбора файлов и возвращает // массив - выбранные файлы для импорта. // Функция ИмпортируемыеФайлы() Экспорт ДиалогОткрытияФайла = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие); ДиалогОткрытияФайла.ПолноеИмяФайла = ""; ДиалогОткрытияФайла.Фильтр = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Все файлы (%1)|%1'"), ПолучитьМаскуВсеФайлы()); ДиалогОткрытияФайла.МножественныйВыбор = Истина; ДиалогОткрытияФайла.Заголовок = НСтр("ru = 'Выберите файлы'"); МассивИменФайлов = Новый Массив; Если ДиалогОткрытияФайла.Выбрать() Тогда МассивФайлов = ДиалогОткрытияФайла.ВыбранныеФайлы; Для Каждого ИмяФайла Из МассивФайлов Цикл МассивИменФайлов.Добавить(ИмяФайла); КонецЦикла; КонецЕсли; Возврат МассивИменФайлов; КонецФункции // Проверяет имя файла на наличие некорректных символов. // // Параметры: // ИмяФайла - Строка- проверяемое имя файла. // // УдалятьНекорректныеСимволы - Булево - Истина указывает удалять некорректные // символы из переданной строки. // Процедура КорректноеИмяФайла(ИмяФайла, УдалятьНекорректныеСимволы = Ложь) Экспорт // Перечень запрещенных символов взят отсюда: http://support.microsoft.com/kb/100108/ru // при этом были объединены запрещенные символы для файловых систем FAT и NTFS. СтрИсключения = ОбщегоНазначенияКлиентСервер.ПолучитьНедопустимыеСимволыВИмениФайла(); ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = 'В имени файла не должно быть следующих символов: %1'"), СтрИсключения); Результат = Истина; МассивНайденныхНедопустимыхСимволов = ОбщегоНазначенияКлиентСервер.НайтиНедопустимыеСимволыВИмениФайла(ИмяФайла); Если МассивНайденныхНедопустимыхСимволов.Количество() <> 0 Тогда Результат = Ложь; Если УдалятьНекорректныеСимволы Тогда ИмяФайла = ОбщегоНазначенияКлиентСервер.ЗаменитьНедопустимыеСимволыВИмениФайла(ИмяФайла, ""); КонецЕсли; КонецЕсли; Если Не Результат Тогда ВызватьИсключение ТекстОшибки; КонецЕсли; КонецПроцедуры // Рекурсивно обходит каталоги и подсчитывает количество файлов и их суммарный размер. Процедура ОбходФайловРазмер(Путь, МассивФайлов, РазмерСуммарный, КоличествоСуммарное) Экспорт Для Каждого ВыбранныйФайл Из МассивФайлов Цикл Если ВыбранныйФайл.ЭтоКаталог() Тогда НовыйПуть = Строка(Путь); НовыйПуть = НовыйПуть + ПолучитьРазделительПути(); НовыйПуть = НовыйПуть + Строка(ВыбранныйФайл.Имя); МассивФайловВКаталоге = НайтиФайлы(НовыйПуть, ПолучитьМаскуВсеФайлы()); Если МассивФайловВКаталоге.Количество() <> 0 Тогда ОбходФайловРазмер( НовыйПуть, МассивФайловВКаталоге, РазмерСуммарный, КоличествоСуммарное); КонецЕсли; Продолжить; КонецЕсли; РазмерСуммарный = РазмерСуммарный + ВыбранныйФайл.Размер(); КоличествоСуммарное = КоличествоСуммарное + 1; КонецЦикла; КонецПроцедуры // Возвращает путь к каталогу вида // "C:\Documents and Settings\ИМЯ ПОЛЬЗОВАТЕЛЯ\Application Data\1C\ФайлыА8\". // Функция ВыбратьПутьККаталогуДанныхПользователя() Экспорт ИмяКаталога = ""; Если РасширениеРаботыСФайламиПодключено() Тогда ИмяКаталога = РабочийКаталогДанныхПользователя(); КонецЕсли; Возврат ИмяКаталога; КонецФункции // Открывает Проводник Windows и выделяет указанный файл. Функция ОткрытьПроводникСФайлом(Знач ПолноеИмяФайла) Экспорт ФайлНаДиске = Новый Файл(ПолноеИмяФайла); Если НЕ ФайлНаДиске.Существует() Тогда Возврат Ложь; КонецЕсли; ФайловаяСистемаКлиент.ОткрытьПроводник(ФайлНаДиске.ПолноеИмя); Возврат Истина; КонецФункции // Возвращает результат подключения расширения для работы с 1С:Предприятием. // // Возвращаемое значение: // Булево - в тонком клиенте всегда Истина, в браузере Google Chrome всегда ложь. // Функция РасширениеРаботыСФайламиПодключено() Экспорт Если КлиентПоддерживаетСинхронныеВызовы() Тогда Возврат ПодключитьРасширениеРаботыСФайлами(); Иначе Возврат Ложь; КонецЕсли; КонецФункции // Описание процедуры см. ОбщегоНазначенияКлиент.ПоказатьВопросОбУстановкеРасширенияРаботыСФайлами. // Процедура ПоказатьВопросОбУстановкеРасширенияРаботыСФайлами(ОписаниеОповещения) Экспорт Если Не КлиентПоддерживаетСинхронныеВызовы() Тогда ВыполнитьОбработкуОповещения(ОписаниеОповещения, Ложь); Иначе ФайловаяСистемаКлиент.ПодключитьРасширениеДляРаботыСФайлами(ОписаниеОповещения); КонецЕсли; КонецПроцедуры Процедура ОтправитьФайлыПоПочте(МассивФайлов, ИдентификаторФормы, ПараметрыОтправки, ЭтоФайл = Ложь) Экспорт Если МассивФайлов.Количество() = 0 Тогда Возврат; КонецЕсли; Параметры = Новый Структура; Параметры.Вставить("МассивФайлов", МассивФайлов); Параметры.Вставить("ИдентификаторФормы", ИдентификаторФормы); Параметры.Вставить("ЭтоФайл", ЭтоФайл); Параметры.Вставить("ПараметрыОтправки", ПараметрыОтправки); ОписаниеОповещения = Новый ОписаниеОповещения("ОтправитьФайлыПоПочтеНастройкаУчетнойЗаписиПредложена", ЭтотОбъект, Параметры); Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаСПочтовымиСообщениями") Тогда МодульРаботаСПочтовымиСообщениямиКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("РаботаСПочтовымиСообщениямиКлиент"); МодульРаботаСПочтовымиСообщениямиКлиент.ПроверитьНаличиеУчетнойЗаписиДляОтправкиПочты(ОписаниеОповещения); КонецЕсли; КонецПроцедуры Процедура ОтправитьФайлыПоПочтеНастройкаУчетнойЗаписиПредложена(УчетнаяЗаписьНастроена, ДополнительныеПараметры) Экспорт Если УчетнаяЗаписьНастроена <> Истина Тогда Возврат; КонецЕсли; СписокВложений = РаботаСФайламиСлужебныйВызовСервера.ПоместитьФайлыВоВременноеХранилище(ДополнительныеПараметры); ПараметрыОтправки = ДополнительныеПараметры.ПараметрыОтправки; ПараметрыОтправки.Вставить("Вложения", СписокВложений); ПараметрыОтправки.Вставить("УдалятьФайлыПослеОтправки", Истина); МодульРаботаСПочтовымиСообщениямиКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("РаботаСПочтовымиСообщениямиКлиент"); МодульРаботаСПочтовымиСообщениямиКлиент.СоздатьНовоеПисьмо(ПараметрыОтправки); КонецПроцедуры Функция ПараметрыОбновленияФайла(ОбработчикРезультата, ОбъектСсылка, ИдентификаторФормы) Экспорт ПараметрыОбработчика = Новый Структура; ПараметрыОбработчика.Вставить("ОбработчикРезультата", ОбработчикРезультата); ПараметрыОбработчика.Вставить("ОбъектСсылка", ОбъектСсылка); ПараметрыОбработчика.Вставить("ИдентификаторФормы", ИдентификаторФормы); ПараметрыОбработчика.Вставить("ХранитьВерсии"); ПараметрыОбработчика.Вставить("ФайлРедактируетТекущийПользователь"); ПараметрыОбработчика.Вставить("Редактирует"); ПараметрыОбработчика.Вставить("АвторТекущейВерсии"); ПараметрыОбработчика.Вставить("ПереданныйПолныйПутьКФайлу", ""); ПараметрыОбработчика.Вставить("СоздатьНовуюВерсию"); ПараметрыОбработчика.Вставить("КомментарийКВерсии"); ПараметрыОбработчика.Вставить("ПоказыватьОповещение", Истина); ПараметрыОбработчика.Вставить("ПрименитьКоВсем", Ложь); ПараметрыОбработчика.Вставить("ОсвобождатьФайлы", Истина); ПараметрыОбработчика.Вставить("Кодировка"); Возврат ПараметрыОбработчика; КонецФункции // Нажатие команды "Показывать служебные файлы" в списке файлов. // // Параметры: // Список - ДинамическийСписок // // Возвращаемое значение: // Булево - отображение служебных файлов в списке. // Функция ПоказыватьСлужебныеФайлыНажатие(Список) Экспорт ЭлементОтбора = ОбщегоНазначенияКлиентСервер.НайтиЭлементОтбораПоПредставлению(Список.Отбор.Элементы, "СкрыватьСлужебные"); Если ЭлементОтбора = Неопределено Тогда Возврат Ложь; КонецЕсли; ПоказыватьСлужебныеФайлы = ЭлементОтбора.Использование; ЭлементОтбора.Использование = Не ПоказыватьСлужебныеФайлы; Возврат ПоказыватьСлужебныеФайлы; КонецФункции // Сохраняет отредактированный файл в ИБ и снимает с него блокировку. // // Параметры: // Параметры - см. ПараметрыОбновленияФайла. // Процедура ЗакончитьРедактированиеСОповещением(Параметры) Экспорт Если Параметры.ОбъектСсылка = Неопределено Тогда ВернутьРезультат(Параметры.ОбработчикРезультата, Неопределено); Возврат; КонецЕсли; ПараметрыВыполнения = Новый Структура; ПараметрыВыполнения.Вставить("ОбработчикРезультата", Параметры.ОбработчикРезультата); ПараметрыВыполнения.Вставить("ПараметрКоманды", Параметры.ОбъектСсылка); Обработчик = Новый ОписаниеОповещения("ЗакончитьРедактированиеСОповещениемЗавершение", ЭтотОбъект, ПараметрыВыполнения); ПараметрыОбработчика = ПараметрыОбновленияФайла(Обработчик, Параметры.ОбъектСсылка, Параметры.ИдентификаторФормы); ПараметрыОбработчика.СоздатьНовуюВерсию = Параметры.СоздатьНовуюВерсию; ЗакончитьРедактирование(ПараметрыОбработчика); КонецПроцедуры // Сохраняет файл в информационной базе, но не освобождает его. Процедура СохранитьИзмененияФайлаСОповещением(ОбработчикРезультата, ПараметрКоманды, ИдентификаторФормы) Экспорт Если ПараметрКоманды = Неопределено Тогда ВернутьРезультат(ОбработчикРезультата, Неопределено); Возврат; КонецЕсли; ПараметрыВыполнения = Новый Структура; ПараметрыВыполнения.Вставить("ОбработчикРезультата", ОбработчикРезультата); ПараметрыВыполнения.Вставить("ПараметрКоманды", ПараметрКоманды); Обработчик = Новый ОписаниеОповещения("СохранитьИзмененияФайлаСОповещениемЗавершение", ЭтотОбъект, ПараметрыВыполнения); ПараметрыОбработчика = ПараметрыОбновленияФайла(Обработчик, ПараметрКоманды, ИдентификаторФормы); СохранитьИзмененияФайла(ПараметрыОбработчика); КонецПроцедуры // Возвращает строковое представление расширений, ассоциированных с типом файла. // // Параметры: // ТипФайла - Строка - типы файлов см. ЗаполнитьСписокТипамиФайлов. // Функция РасширенияПоТипуФайла(ТипФайла) Экспорт Если ТипФайла = "Изображения" Тогда Возврат "JPG JPEG JP2 JPG2 PNG BMP TIFF"; ИначеЕсли ТипФайла = "ОфисныеДокументы" Тогда Возврат "DOC DOCX DOCM DOT DOTX DOTM XLS XLSX XLSM XLT XLTM XLSB PPT PPTX PPTM PPS PPSX PPSM POT POTX POTM" + "ODT OTT ODP OTP ODS OTS ODC OTC ODF OTF ODM OTH SDW STW SXW STC SXC SDC SDD STI"; Иначе Возврат ""; КонецЕсли; КонецФункции //////////////////////////////////////////////////////////////////////////////// // Процедуры и функции работы с криптографией. // Проверить подписи данных объекта в таблице. // // Параметры: // Форма - ФормаКлиентскогоПриложения - с реквизитами: // * Объект - ДанныеФормыСтруктура - как у объекта со свойствами Ссылка, Зашифрован. // Например, СправочникОбъект.Файл, СправочникОбъект.ДокументПрисоединенныеФайлы. // Если свойств у объекта нет, то структуру со свойствами нужно передать в ДанныеФайла. // // * ЭлектронныеПодписи - ДанныеФормыКоллекция: // * ДатаПроверкиПодписи - Дата - возвращаемое значение. Дата проверки. // * Статус - Строка - возвращаемое значение. Результат проверки. // * АдресПодписи - Строка - адрес данных подписи во временном хранилище. // // СсылкаНаДвоичныеДанные - ДвоичныеДанные - двоичные данные файла. // - Строка - адрес во временном хранилище или навигационная ссылка. // // ВыделенныеСтроки - Массив - свойство таблицы формы параметра ЭлектронныеПодписи. // - Неопределено - проверить все подписи. // ДанныеФайла - см. РаботаСФайлами.ДанныеФайла // Процедура ПроверитьПодписи(Форма, СсылкаНаДвоичныеДанные, ВыделенныеСтроки = Неопределено, ДанныеФайла = Неопределено) Экспорт // 1. Получаем адрес двоичных данных, адреса двоичных данных подписей. // 2. Если файл зашифрован, то расшифровываем, далее выполняем проверку. Если ДанныеФайла = Неопределено Тогда ДанныеФайла = Форма.Объект; // ОпределяемыйТип.ПрисоединенныйФайлОбъект КонецЕсли; ДополнительныеПараметры = Новый Структура; ДополнительныеПараметры.Вставить("Форма", Форма); ДополнительныеПараметры.Вставить("ВыделенныеСтроки", ВыделенныеСтроки); ДополнительныеПараметры.Вставить("ПодписанныйОбъект", ДанныеФайла.Ссылка); ДополнительныеПараметры.Вставить("СтрокиДляПроверкиПоМЧД", Новый Массив); Если Не ДанныеФайла.Зашифрован Тогда ПроверитьПодписиПослеПодготовкиДанных(СсылкаНаДвоичныеДанные, ДополнительныеПараметры); Возврат; КонецЕсли; Если Не ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.ЭлектроннаяПодпись") Тогда Возврат; КонецЕсли; ОписаниеДанных = Новый Структура; ОписаниеДанных.Вставить("Операция", НСтр("ru = 'Расшифровка файла'")); ОписаниеДанных.Вставить("ЗаголовокДанных", НСтр("ru = 'Файл'")); ОписаниеДанных.Вставить("Данные", СсылкаНаДвоичныеДанные); ОписаниеДанных.Вставить("Представление", ДанныеФайла.Ссылка); ОписаниеДанных.Вставить("СертификатыШифрования", ДанныеФайла.Ссылка); ОписаниеДанных.Вставить("СообщитьОЗавершении", Ложь); ОбработчикПродолжения = Новый ОписаниеОповещения("ПослеРасшифровкиФайлаПриПроверкеПодписи", ЭтотОбъект, ДополнительныеПараметры); МодульЭлектроннаяПодписьКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("ЭлектроннаяПодписьКлиент"); МодульЭлектроннаяПодписьКлиент.Расшифровать(ОписаниеДанных, , ОбработчикПродолжения); КонецПроцедуры // Продолжение процедуры ПроверитьПодписи. Процедура ПроверитьПодписиПослеПроверкиСтроки(РезультатПроверкиПодписи, ДополнительныеПараметры) Экспорт Результат = РезультатПроверкиПодписи.Результат; СтрокаПодписи = ДополнительныеПараметры.СтрокаПодписи; ДанныеСтроки = ДанныеСтрокиПодписи(); ЗаполнитьЗначенияСвойств(ДанныеСтроки, СтрокаПодписи); ДанныеСтроки.ДатаПроверкиПодписи = ОбщегоНазначенияКлиент.ДатаСеанса(); ДанныеСтроки.ПодписьВерна = (Результат = Истина); ДанныеСтроки.ТребуетсяПроверка = РезультатПроверкиПодписи.ТребуетсяПроверка; ДанныеСтроки.ОписаниеОшибки = ?(ДанныеСтроки.ПодписьВерна, "", Результат); Если ЗначениеЗаполнено(РезультатПроверкиПодписи.ТипПодписи) Тогда ДанныеСтроки.ТипПодписи = РезультатПроверкиПодписи.ТипПодписи; КонецЕсли; Если ЗначениеЗаполнено(РезультатПроверкиПодписи.СрокДействияПоследнейМеткиВремени) Тогда ДанныеСтроки.СрокДействияПоследнейМеткиВремени = РезультатПроверкиПодписи.СрокДействияПоследнейМеткиВремени; КонецЕсли; // Локализация Если ЗначениеЗаполнено(ДанныеСтроки.РезультатПроверкиПодписиПоМЧД) И ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.МашиночитаемыеДоверенности") Тогда Структура = Новый Структура; Структура.Вставить("Сертификат", РезультатПроверкиПодписи.Сертификат); Структура.Вставить("ДатаПодписи", ДанныеСтроки.ДатаПодписи); Структура.Вставить("Индекс", ДополнительныеПараметры.Индекс); Структура.Вставить("РезультатПроверкиПодписиПоМЧД", ДанныеСтроки.РезультатПроверкиПодписиПоМЧД); ДополнительныеПараметры.СтрокиДляПроверкиПоМЧД.Добавить(Структура); КонецЕсли; // Конец Локализация РаботаСФайламиСлужебныйКлиентСервер.ЗаполнитьСтатусПодписи(ДанныеСтроки, ОбщегоНазначенияКлиент.ДатаСеанса()); ЗаполнитьЗначенияСвойств(СтрокаПодписи, ДанныеСтроки); ПроверитьПодписиЦиклНачало(ДополнительныеПараметры); КонецПроцедуры Процедура ПродлитьДействиеПодписей(Форма, ПараметрыПродления, ОбработчикПродолжения) Экспорт Если Не ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.ЭлектроннаяПодпись") Тогда Возврат; КонецЕсли; МодульЭлектроннаяПодписьКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("ЭлектроннаяПодписьКлиент"); МодульЭлектроннаяПодписьКлиент.ОткрытьФормуПродленияДействияПодписей( Форма, ПараметрыПродления, ОбработчикПродолжения); КонецПроцедуры // Для формы файла. // // Параметры: // Форма - ФормаКлиентскогоПриложения // ЭтоНовый - Булево - файл не записан // Процедура УстановитьДоступностьКомандСпискаЭлектронныхПодписей(Форма, ЭтоНовый) Экспорт Элементы = Форма.Элементы; ЕстьПодписи = (Форма.ЭлектронныеПодписи.Количество() <> 0); ЭлектронныеПодписиОткрыть = Элементы.ЭлектронныеПодписиОткрыть; // КнопкаФормы ЭлектронныеПодписиОткрыть.Доступность = ЕстьПодписи; ЭлектронныеПодписиПроверить = Элементы.ЭлектронныеПодписиПроверить; // КнопкаФормы ЭлектронныеПодписиПроверить.Доступность = ЕстьПодписи И Не ЭтоНовый; ЭлектронныеПодписиПроверитьВсе = Элементы.ЭлектронныеПодписиПроверитьВсе; // КнопкаФормы ЭлектронныеПодписиПроверитьВсе.Доступность = ЕстьПодписи И Не ЭтоНовый; ЭлектронныеПодписиСохранить = Элементы.ЭлектронныеПодписиСохранить; // КнопкаФормы ЭлектронныеПодписиСохранить.Доступность = ЕстьПодписи; ЭлектронныеПодписиУдалить = Элементы.ЭлектронныеПодписиУдалить; // КнопкаФормы ЭлектронныеПодписиУдалить.Доступность = ЕстьПодписи И Не ЭтоНовый; ЭлектронныеПодписиПродлитьДействиеПодписей = Элементы.ЭлектронныеПодписиПродлитьДействиеПодписей; // КнопкаФормы ЭлектронныеПодписиПродлитьДействиеПодписей.Доступность = ЕстьПодписи И Не ЭтоНовый; КонецПроцедуры // Для формы файла. // // Параметры: // Форма - ФормаКлиентскогоПриложения // Процедура УстановитьДоступностьКомандСпискаСертификатовШифрования(Форма) Экспорт Объект = Форма.Объект; Элементы = Форма.Элементы; СертификатыШифрованияОткрыть = Элементы.СертификатыШифрованияОткрыть; // КнопкаФормы СертификатыШифрованияОткрыть.Доступность = Объект.Зашифрован; КонецПроцедуры #Область Сканирование // Открывает диалог сканирования и просмотра картинки. // // Параметры: // ПараметрыВыполнения - Структура: // * ОбработчикРезультата - Неопределено, ОписаниеОповещения. // * ВладелецФайла - Неопределено, ОпределяемыйТип.ВладелецФайлов. // * ФормаВладелец - Неопределено, Форма. // * ЭтоФайл - Булево. // ПараметрыСканирования - см. РаботаСФайламиКлиент.ПараметрыСканирования. // Процедура ДобавитьСоСканера(ПараметрыВыполнения, ПараметрыСканирования = Неопределено) Экспорт #Если МобильныйКлиент Тогда ТипРезультата = ПараметрыВыполнения.ТипРезультата; ДанныеМультимедиа = СредстваМультимедиа.СделатьФотоснимок(); Если ДанныеМультимедиа = Неопределено Тогда ВернутьРезультат(ПараметрыВыполнения.ОбработчикРезультата, Неопределено); Возврат; КонецЕсли; ИмяБезРасширения = "img_" + Формат(ОбщегоНазначенияКлиент.ДатаСеанса(), "ДФ=yyyyMMdd_hhmmss"); РезультатСканирования = РезультатСканирования(); Если ТипРезультата = РаботаСФайламиКлиент.ТипРезультатаКонвертацииДвоичныеДанные() Тогда РезультатСканирования.ДвоичныеДанные = ДанныеМультимедиа.ПолучитьДвоичныеДанные(); ВыполнитьОбработкуОповещения(ПараметрыВыполнения.ОбработчикРезультата, РезультатСканирования); ИначеЕсли ТипРезультата = РаботаСФайламиКлиент.ТипРезультатаКонвертацииИмяФайла() Тогда ДанныеИзображения = ДанныеМультимедиа.ПолучитьДвоичныеДанные(); // АПК:441-выкл Является результатом метода ИмяВременногоФайла = ПолучитьИмяВременногоФайла(ДанныеМультимедиа.РасширениеФайла); // АПК:441-вкл ДанныеИзображения.Записать(ИмяВременногоФайла); РезультатСканирования.ИмяФайла = ИмяВременногоФайла; ВыполнитьОбработкуОповещения(ПараметрыВыполнения.ОбработчикРезультата, РезультатСканирования); Иначе ПараметрыФайла = РаботаСФайламиСлужебныйКлиентСервер.ПараметрыДобавленияФайла(); ПараметрыФайла.ВладелецФайлов = ПараметрыВыполнения.ВладелецФайла; ПараметрыФайла.ИмяБезРасширения = ИмяБезРасширения; ПараметрыФайла.РасширениеБезТочки = ДанныеМультимедиа.РасширениеФайла; АдресФайла = ПоместитьВоВременноеХранилище(ДанныеМультимедиа.ПолучитьДвоичныеДанные(), ПараметрыВыполнения.ФормаВладелец.УникальныйИдентификатор); РезультатСканирования.Вставить("ФайлДобавлен", Истина); РезультатСканирования.Вставить("ФайлСсылка", РаботаСФайламиСлужебныйВызовСервера.ДобавитьФайл(ПараметрыФайла, АдресФайла)); ВернутьРезультат(ПараметрыВыполнения.ОбработчикРезультата, РезультатСканирования); КонецЕсли; #Иначе ИдентификаторКлиента = ИдентификаторКлиента(); Если ПараметрыСканирования = Неопределено Тогда ПараметрыСканирования = РаботаСФайламиКлиент.ПараметрыСканирования(Истина); КонецЕсли; ПараметрыФормы = Новый Структура("ВладелецФайла, ЭтоФайл, НеОткрыватьКарточкуПослеСозданияИзФайла, ТолькоОдинФайл, ТипРезультата"); ЗаполнитьЗначенияСвойств(ПараметрыФормы, ПараметрыВыполнения); ПараметрыФормы.Вставить("ИдентификаторКлиента", ИдентификаторКлиента); ПараметрыФормы.Вставить("ПараметрыСканирования", ПараметрыСканирования); ОписаниеОповещенияОЗакрытии = ОбработчикЗавершения(ПараметрыВыполнения.ОбработчикРезультата); ОткрытьФорму("Обработка.Сканирование.Форма.РезультатСканирования", ПараметрыФормы, ПараметрыВыполнения.ФормаВладелец, , , , ОписаниеОповещенияОЗакрытии); #КонецЕсли КонецПроцедуры Функция РезультатСканирования() Экспорт Результат = Новый Структура; Результат.Вставить("ТекстОшибки", ""); Результат.Вставить("ФайлДобавлен", Ложь); Результат.Вставить("ФайлСсылка"); Результат.Вставить("ДвоичныеДанные"); Результат.Вставить("ИмяФайла"); Возврат Результат; КонецФункции Функция ИдентификаторКлиента() Экспорт СистемнаяИнформация = Новый СистемнаяИнформация(); Возврат СистемнаяИнформация.ИдентификаторКлиента; КонецФункции #КонецОбласти //////////////////////////////////////////////////////////////////////////////// // Общие процедуры и функции работы с файлами операционной системы. // Открыть версию файла. // // Параметры: // ОбработчикРезультата - ОписаниеОповещения // - Неопределено - описание процедуры, принимающей результат работы метода. // ДанныеФайла - Структура // УникальныйИдентификатор - УникальныйИдентификатор формы. // Процедура ОткрытьВерсиюФайла(ОбработчикРезультата, ДанныеФайла, УникальныйИдентификатор = Неопределено) Экспорт ПараметрыОбработчика = Новый Структура; ПараметрыОбработчика.Вставить("ОбработчикРезультата", ОбработчикРезультата); ПараметрыОбработчика.Вставить("ДанныеФайла", ДанныеФайла); ПараметрыОбработчика.Вставить("УникальныйИдентификатор", УникальныйИдентификатор); Обработчик = Новый ОписаниеОповещения("ОткрытьВерсиюФайлаПослеУстановкиРасширения", ЭтотОбъект, ПараметрыОбработчика); ПоказатьВопросОбУстановкеРасширенияРаботыСФайлами(Обработчик); КонецПроцедуры //////////////////////////////////////////////////////////////////////////////// // Обработчики событий подсистем конфигурации. // См. ОбщегоНазначенияКлиентПереопределяемый.ПередЗавершениемРаботыСистемы Процедура ПередЗавершениемРаботыСистемы(Отказ, Предупреждения) Экспорт Ответ = ПроверитьЗанятыеФайлыПриЗавершенииРаботы(); Если Ответ = Неопределено Тогда Возврат; КонецЕсли; Если ТипЗнч(Ответ) <> Тип("Структура") Тогда Возврат; КонецЕсли; ПредупреждениеПользователю = СтандартныеПодсистемыКлиент.ПредупреждениеПриЗавершенииРаботы(); ПредупреждениеПользователю.ТекстГиперссылки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = 'Открыть список редактируемых файлов (%1)'"), Ответ.КоличествоЗанятыхФайлов); ПредупреждениеПользователю.ТекстПредупреждения = НСтр("ru = 'Имеются занятые для редактирования файлы'"); ДействиеПриНажатииГиперссылки = ПредупреждениеПользователю.ДействиеПриНажатииГиперссылки; ПрикладнаяФормаПредупреждения = Неопределено; Ответ.Свойство("ПрикладнаяФормаПредупреждения", ПрикладнаяФормаПредупреждения); ПараметрыПрикладнойФормыПредупреждения = Неопределено; Ответ.Свойство("ПараметрыПрикладнойФормыПредупреждения", ПараметрыПрикладнойФормыПредупреждения); Форма = Неопределено; Ответ.Свойство("Форма", Форма); ПараметрыФормы = Неопределено; Ответ.Свойство("ПараметрыФормы", ПараметрыФормы); Если ПрикладнаяФормаПредупреждения <> Неопределено Тогда ДействиеПриНажатииГиперссылки.ПрикладнаяФормаПредупреждения = ПрикладнаяФормаПредупреждения; ДействиеПриНажатииГиперссылки.ПараметрыПрикладнойФормыПредупреждения = ПараметрыПрикладнойФормыПредупреждения; КонецЕсли; Если Форма <> Неопределено Тогда ДействиеПриНажатииГиперссылки.Форма = Форма; ДействиеПриНажатииГиперссылки.ПараметрыФормы = ПараметрыФормы; КонецЕсли; Предупреждения.Добавить(ПредупреждениеПользователю); КонецПроцедуры Функция ПараметрыОповещенияЗаписиФайла(Событие = "") Экспорт ПараметрыСобытия = Новый Структура; ПараметрыСобытия.Вставить("Событие", Событие); ПараметрыСобытия.Вставить("ЭтоНовый", Ложь); ПараметрыСобытия.Вставить("Владелец"); ПараметрыСобытия.Вставить("ВладелецФайла"); // для совместимости ПараметрыСобытия.Вставить("Файл"); Возврат ПараметрыСобытия; КонецФункции Процедура ОповеститьОбИзмененииФайлов(Файлы, ПараметрыОповещенияЗаписиФайла = Неопределено) Экспорт Если ТипЗнч(Файлы) <> Тип("Массив") Тогда ФайлыДляОповещения = ОбщегоНазначенияКлиентСервер.ЗначениеВМассиве(Файлы); Иначе ФайлыДляОповещения = Файлы; КонецЕсли; Если ПараметрыОповещенияЗаписиФайла = Неопределено Тогда ПараметрыОповещенияЗаписиФайла = ПараметрыОповещенияЗаписиФайла(); КонецЕсли; Для Каждого Файл Из ФайлыДляОповещения Цикл Оповестить("Запись_Файл", ПараметрыОповещенияЗаписиФайла, Файл); КонецЦикла; КонецПроцедуры #Область ИзвлечениеТекста Процедура ИзвлечьТекстВерсии(ФайлИлиВерсияФайла, АдресФайла, Расширение, УникальныйИдентификатор, Кодировка = Неопределено) Экспорт #Если НЕ ВебКлиент Тогда ИмяФайлаСПутем = ПолучитьИмяВременногоФайла(Расширение); Если Не ПолучитьФайл(АдресФайла, ИмяФайлаСПутем, Ложь) Тогда Возврат; КонецЕсли; // Для варианта с хранением файлов в томах удаляем файл из временного хранилища после получения. Если ЭтоАдресВременногоХранилища(АдресФайла) Тогда УдалитьИзВременногоХранилища(АдресФайла); КонецЕсли; РезультатИзвлечения = "НеИзвлечен"; АдресВременногоХранилищаТекста = ""; Текст = ""; Если ИмяФайлаСПутем <> "" Тогда // Извлечение текста из файла. Отказ = Ложь; Текст = ИзвлечьТекст(ИмяФайлаСПутем, Отказ, Кодировка); Если Отказ = Ложь Тогда РезультатИзвлечения = "Извлечен"; Если Не ПустаяСтрока(Текст) Тогда ИмяВременногоФайла = ПолучитьИмяВременногоФайла(); ТекстовыйФайл = Новый ЗаписьТекста(ИмяВременногоФайла, КодировкаТекста.UTF8); ТекстовыйФайл.Записать(Текст); ТекстовыйФайл.Закрыть(); РезультатЗагрузки = ПоместитьФайлСДискаВоВременноеХранилище(ИмяВременногоФайла, , УникальныйИдентификатор); Если РезультатЗагрузки <> Неопределено Тогда АдресВременногоХранилищаТекста = РезультатЗагрузки; КонецЕсли; Попытка УдалитьФайлы(ИмяВременногоФайла); Исключение ЖурналРегистрацииКлиент.ДобавитьСообщениеДляЖурналаРегистрации(СобытиеЖурналаРегистрации(), "Предупреждение", ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()),, Истина); КонецПопытки; КонецЕсли; Иначе // Когда Текст извлечь "некому" - это нормальный случай, // сообщение об ошибке не формируется. РезультатИзвлечения = "ИзвлечьНеУдалось"; КонецЕсли; КонецЕсли; Попытка УдалитьФайлы(ИмяФайлаСПутем); Исключение ЖурналРегистрацииКлиент.ДобавитьСообщениеДляЖурналаРегистрации(СобытиеЖурналаРегистрации(), "Предупреждение", ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()),, Истина); КонецПопытки; РаботаСФайламиСлужебныйВызовСервера.ЗаписатьРезультатИзвлеченияТекста( ФайлИлиВерсияФайла, РезультатИзвлечения, АдресВременногоХранилищаТекста); #КонецЕсли КонецПроцедуры #КонецОбласти Процедура ПроверитьДоступностьКаталога(ОповещениеРезультата, ИмяКаталога) Экспорт ИмяКаталогаТестовое = ИмяКаталога + ПолучитьРазделительПути()+ "ПроверкаДоступа"; Контекст = Новый Структура; Контекст.Вставить("ОповещениеРезультата", ОповещениеРезультата); Контекст.Вставить("ИмяКаталогаТестовое", ИмяКаталогаТестовое); Оповещение = Новый ОписаниеОповещения("ПроверитьДоступностьКаталогаПослеСоздания", ЭтотОбъект, Контекст, "ПроверитьДоступностьКаталогаОшибкаСоздания", ЭтотОбъект); НачатьСозданиеКаталога(Оповещение, ИмяКаталогаТестовое); КонецПроцедуры #КонецОбласти #Область СлужебныеПроцедурыИФункции Процедура УстановитьУниверсальноеВремяИзменения(ПутьКФайлу, НовоеВремяИзменения) Если НЕ ЗначениеЗаполнено(НовоеВремяИзменения) Тогда Возврат; КонецЕсли; Файл = Новый Файл(ПутьКФайлу); Если Файл.Существует() Тогда Файл.УстановитьУниверсальноеВремяИзменения(НовоеВремяИзменения); КонецЕсли; КонецПроцедуры // Возвращает Истина, если файл с таким расширением можно загружать. Функция ПроверитьРасширениеФайлаДляЗагрузки(РасширениеФайла, ВызыватьИсключение = Истина) ОбщиеНастройки = ОбщиеНастройкиРаботыСФайлами(); Если НЕ ОбщиеНастройки.ЗапретЗагрузкиФайловПоРасширению Тогда Возврат Истина; КонецЕсли; Если РаботаСФайламиСлужебныйКлиентСервер.РасширениеФайлаВСписке( ОбщиеНастройки.СписокЗапрещенныхРасширений, РасширениеФайла) Тогда Если ВызыватьИсключение Тогда ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = 'Загрузка файлов с расширением ""%1"" запрещена. |Обратитесь к администратору.'"), РасширениеФайла); Иначе Возврат Ложь; КонецЕсли; КонецЕсли; Возврат Истина; КонецФункции // Извлечь текст из файла и возвратить его в виде строки. Функция ИзвлечьТекст(ПолноеИмяФайла, Отказ = Ложь, Кодировка = Неопределено) ИзвлеченныйТекст = ""; Попытка Файл = Новый Файл(ПолноеИмяФайла); Если Не Файл.Существует() Тогда Отказ = Истина; Возврат ИзвлеченныйТекст; КонецЕсли; Исключение Отказ = Истина; Возврат ИзвлеченныйТекст; КонецПопытки; Прекратить = Ложь; ОбщиеНастройки = ОбщиеНастройкиРаботыСФайлами(); #Если Не ВебКлиент И НЕ МобильныйКлиент Тогда РасширениеИмениФайла = ОбщегоНазначенияКлиентСервер.ПолучитьРасширениеИмениФайла(ПолноеИмяФайла); РасширениеФайлаВСписке = РаботаСФайламиСлужебныйКлиентСервер.РасширениеФайлаВСписке( ОбщиеНастройки.СписокРасширенийТекстовыхФайлов, РасширениеИмениФайла); Если РасширениеФайлаВСписке Тогда Возврат РаботаСФайламиСлужебныйКлиентСервер.ИзвлечьТекстИзТекстовогоФайла( ПолноеИмяФайла, Кодировка, Отказ); КонецЕсли; Попытка Извлечение = Новый ИзвлечениеТекста(ПолноеИмяФайла); ИзвлеченныйТекст = Извлечение.ПолучитьТекст(); Исключение // Когда текст некому извлечь исключение не требуется. Это нормальный случай. ИзвлеченныйТекст = ""; Прекратить = Истина; КонецПопытки; #КонецЕсли Если ПустаяСтрока(ИзвлеченныйТекст) Тогда РасширениеИмениФайла = ОбщегоНазначенияКлиентСервер.ПолучитьРасширениеИмениФайла(ПолноеИмяФайла); РасширениеФайлаВСписке = РаботаСФайламиСлужебныйКлиентСервер.РасширениеФайлаВСписке( ОбщиеНастройки.СписокРасширенийФайловOpenDocument, РасширениеИмениФайла); Если РасширениеФайлаВСписке Тогда Возврат РаботаСФайламиСлужебныйКлиентСервер.ИзвлечьТекстOpenDocument(ПолноеИмяФайла, Отказ); КонецЕсли; КонецЕсли; Если Прекратить Тогда Отказ = Истина; КонецЕсли; Возврат ИзвлеченныйТекст; КонецФункции // Возвращает путь к рабочему каталогу данных пользователя. Этот каталог используется // в качестве начального значения для рабочего каталога пользователя. // // Параметры: // Оповещение - ОписаниеОповещения - оповещение, которое выполняется после получения рабочего // каталога пользователя. В качестве результата возвращается Структура со свойствами: // * Каталог - Строка - полное имя рабочего каталога данных пользователя. // * ОписаниеОшибки - Строка - текст ошибки, если каталог получить не удалось. // Процедура ПолучитьРабочийКаталогДанныхПользователя(Оповещение) Контекст = Новый Структура; Контекст.Вставить("Оповещение", Оповещение); НачатьПолучениеРабочегоКаталогаДанныхПользователя(Новый ОписаниеОповещения( "ПолучитьРабочийКаталогДанныхПользователяПослеПолучения", ЭтотОбъект, Контекст, "ПолучитьРабочийКаталогДанныхПользователяПослеОшибкиПолучения", ЭтотОбъект)); КонецПроцедуры // Продолжение процедуры ПолучитьРабочийКаталогДанныхПользователя. Процедура ПолучитьРабочийКаталогДанныхПользователяПослеОшибкиПолучения(ИнформацияОбОшибке, СтандартнаяОбработка, Контекст) Экспорт СтандартнаяОбработка = Ложь; Результат = Новый Структура; Результат.Вставить("Каталог", ""); Результат.Вставить("ОписаниеОшибки", СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = 'Не удалось получить рабочий каталог данных пользователя по причине: |%1'"), ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке))); ВыполнитьОбработкуОповещения(Контекст.Оповещение, Результат); КонецПроцедуры // Продолжение процедуры ПолучитьРабочийКаталогДанныхПользователя. Процедура ПолучитьРабочийКаталогДанныхПользователяПослеПолучения(КаталогДанныхПользователя, Контекст) Экспорт Результат = Новый Структура; Результат.Вставить("Каталог", КаталогДанныхПользователя); Результат.Вставить("ОписаниеОшибки", ""); ВыполнитьОбработкуОповещения(Контекст.Оповещение, Результат); КонецПроцедуры // Продолжение процедуры ПроверитьПодписи. Процедура ПроверитьПодписиЦиклНачало(ДополнительныеПараметры) Если ДополнительныеПараметры.Коллекция.Количество() <= ДополнительныеПараметры.Индекс + 1 Тогда // Локализация Если ДополнительныеПараметры.СтрокиДляПроверкиПоМЧД.Количество() > 0 Тогда Результат = РаботаСФайламиСлужебныйВызовСервера.ПроверитьПодписиПоМЧД( ДополнительныеПараметры.СтрокиДляПроверкиПоМЧД, ДополнительныеПараметры.ПодписанныйОбъект); Для Каждого РезультатПроверки Из Результат Цикл Элемент = ДополнительныеПараметры.Коллекция[РезультатПроверки.Индекс]; СтрокаПодписи = ?(ТипЗнч(Элемент) <> Тип("Число"), Элемент, ДополнительныеПараметры.Форма.ЭлектронныеПодписи.НайтиПоИдентификатору(Элемент)); ЗаполнитьЗначенияСвойств(СтрокаПодписи, РезультатПроверки); КонецЦикла; КонецЕсли; // Конец Локализация Возврат; КонецЕсли; ДополнительныеПараметры.Индекс = ДополнительныеПараметры.Индекс + 1; Элемент = ДополнительныеПараметры.Коллекция[ДополнительныеПараметры.Индекс]; ДополнительныеПараметры.Вставить("СтрокаПодписи", ?(ТипЗнч(Элемент) <> Тип("Число"), Элемент, ДополнительныеПараметры.Форма.ЭлектронныеПодписи.НайтиПоИдентификатору(Элемент))); МодульЭлектроннаяПодписьКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("ЭлектроннаяПодписьКлиент"); ПараметрыПроверкиПодписи = МодульЭлектроннаяПодписьКлиент.ПараметрыПроверкиПодписи(); ПараметрыПроверкиПодписи.РезультатВВидеСтруктуры = Истина; МодульЭлектроннаяПодписьКлиент.ПроверитьПодпись( Новый ОписаниеОповещения("ПроверитьПодписиПослеПроверкиСтроки", ЭтотОбъект, ДополнительныеПараметры), ДополнительныеПараметры.Данные, ДополнительныеПараметры.СтрокаПодписи.АдресПодписи, Неопределено, ДополнительныеПараметры.СтрокаПодписи.ДатаПодписи, ПараметрыПроверкиПодписи); КонецПроцедуры // Проверяет свойства файла в рабочем каталоге и в хранилище файлов, // если требуется уточняет у пользователя и возвращает одно из действий: // "ОткрытьСуществующий", "ВзятьИзХранилищаИОткрыть", "Отменить". // // Параметры: // ОбработчикРезультата - ОписаниеОповещения // - Неопределено - описание процедуры, принимающей результат работы метода. // ИмяФайлаСПутем - Строка - полное имя файла с путем в рабочем каталоге. // // ДанныеФайла - Структура: // Размер - Число. // ДатаМодификацииУниверсальная - Дата. // ВРабочемКаталогеНаЧтение - Булево. // Процедура ДействиеПриОткрытииФайлаВРабочемКаталоге(ОбработчикРезультата, ИмяФайлаСПутем, ДанныеФайла) Если ДанныеФайла.Свойство("ПутьОбновленияИзФайлаНаДиске") Тогда ВернутьРезультат(ОбработчикРезультата, "ВзятьИзХранилищаИОткрыть"); Возврат; КонецЕсли; Параметры = Новый Структура; Параметры.Вставить("ДействиеНадФайлом", "ОткрытиеВРабочемКаталоге"); Параметры.Вставить("ПолноеИмяФайлаВРабочемКаталоге", ИмяФайлаСПутем); Файл = Новый Файл(Параметры.ПолноеИмяФайлаВРабочемКаталоге); Параметры.Вставить("ДатаИзмененияУниверсальнаяВХранилищеФайлов", ДанныеФайла.ДатаМодификацииУниверсальная); Параметры.Вставить("ДатаИзмененияУниверсальнаяВРабочемКаталоге", Файл.ПолучитьУниверсальноеВремяИзменения()); Параметры.Вставить("ДатаИзмененияВРабочемКаталоге", МестноеВремя(Параметры.ДатаИзмененияУниверсальнаяВРабочемКаталоге)); Параметры.Вставить("ДатаИзмененияВХранилищеФайлов", МестноеВремя(Параметры.ДатаИзмененияУниверсальнаяВХранилищеФайлов)); Параметры.Вставить("РазмерВРабочемКаталоге", Файл.Размер()); Параметры.Вставить("РазмерВХранилищеФайлов", ДанныеФайла.Размер); РазницаДат = Параметры.ДатаИзмененияУниверсальнаяВРабочемКаталоге - Параметры.ДатаИзмененияУниверсальнаяВХранилищеФайлов; Если РазницаДат < 0 Тогда РазницаДат = -РазницаДат; КонецЕсли; Если РазницаДат <= 1 Тогда // С секунда - допустимая разница (на Win95 может быть такое). Если Параметры.РазмерВХранилищеФайлов <> 0 И Параметры.РазмерВХранилищеФайлов <> Параметры.РазмерВРабочемКаталоге Тогда // Дата одинаковая, но размер отличается - редкий, но возможный случай. Параметры.Вставить("Заголовок", НСтр("ru = 'Размер файла отличается'")); Параметры.Вставить("Сообщение", НСтр("ru = 'Размер файла в рабочем каталоге на компьютере и его копии в программе отличается. | |Взять файл из программы и заменить им существующий на компьютере или |открыть существующий без обновления?'")); Иначе ВернутьРезультат(ОбработчикРезультата, "ОткрытьСуществующий"); Возврат; КонецЕсли; ИначеЕсли Параметры.ДатаИзмененияУниверсальнаяВРабочемКаталоге < Параметры.ДатаИзмененияУниверсальнаяВХранилищеФайлов Тогда // В хранилище файлов более новый файл. Если ДанныеФайла.ВРабочемКаталогеНаЧтение = Ложь Тогда Параметры.Вставить("Заголовок", НСтр("ru = 'В программе более новая версия файла'")); Параметры.Вставить("Сообщение", НСтр("ru = 'Файл в программе, отмеченный как занятый для редактирования, |имеет более позднюю дату изменения (новее), чем его копия в рабочем каталоге на компьютере. | |Взять файл из программы и заменить им существующий на компьютере или |открыть существующий?'")); Иначе ВернутьРезультат(ОбработчикРезультата, "ВзятьИзХранилищаИОткрыть"); Возврат; КонецЕсли; ИначеЕсли Параметры.ДатаИзмененияУниверсальнаяВРабочемКаталоге > Параметры.ДатаИзмененияУниверсальнаяВХранилищеФайлов Тогда // В рабочем каталоге более новый файл. Если ДанныеФайла.ВРабочемКаталогеНаЧтение = Ложь И ДанныеФайла.Редактирует = ПользователиКлиент.АвторизованныйПользователь() Тогда // Файл в рабочем каталоге для редактирования и занят текущим пользователем. ВернутьРезультат(ОбработчикРезультата, "ОткрытьСуществующий"); Возврат; Иначе // Файл в рабочем каталоге для чтения. Параметры.Вставить("Заголовок", НСтр("ru = 'На компьютере более новая копия файла'")); Параметры.Вставить( "Сообщение", НСтр("ru = 'Копия файла в рабочем каталоге на компьютере имеет более позднюю дату изменения (новее), чем в программе. Возможно, эта копия была отредактирована. | |Открыть существующий файл на компьютере или заменить его на файл |из программы c потерей изменений и открыть?'")); КонецЕсли; КонецЕсли; ОткрытьФорму("ОбщаяФорма.ВыборДействияПриОбнаруженииОтличийФайла", Параметры, , , , , ОбработчикРезультата, РежимОткрытияОкнаФормы.БлокироватьВесьИнтерфейс); КонецПроцедуры // Возвращает каталог "Мои Документы". // Функция КаталогМоиДокументы() Возврат КаталогДокументов(); КонецФункции // Возвращает путь к рабочему каталогу пользователя. // // Параметры: // Оповещение - ОписаниеОповещения - оповещение, которое выполняется после получения рабочего // каталога пользователя. В качестве результата возвращается Структура со свойствами: // * Каталог - Строка - полное имя рабочего каталога пользователя. // * ОписаниеОшибки - Строка - текст ошибки, если каталог получить не удалось. // Процедура ПолучитьРабочийКаталогПользователя(Оповещение) ИмяПараметра = "СтандартныеПодсистемы.ПроверкаДоступаКРабочемуКаталогуВыполнена"; Если ПараметрыПриложения[ИмяПараметра] = Неопределено Тогда ПараметрыПриложения.Вставить(ИмяПараметра, Ложь); КонецЕсли; ИмяКаталога = СтандартныеПодсистемыКлиент.ПараметрыРаботыКлиента().ПерсональныеНастройкиРаботыСФайлами.ПутьКЛокальномуКэшуФайлов; // Уже установлен. Если ИмяКаталога <> Неопределено И НЕ ПустаяСтрока(ИмяКаталога) И ПараметрыПриложения["СтандартныеПодсистемы.ПроверкаДоступаКРабочемуКаталогуВыполнена"] Тогда Результат = Новый Структура; Результат.Вставить("Каталог", ИмяКаталога); Результат.Вставить("ОписаниеОшибки", ""); ВыполнитьОбработкуОповещения(Оповещение, Результат); Возврат; КонецЕсли; Контекст = Новый Структура; Контекст.Вставить("Оповещение", Оповещение); Контекст.Вставить("Каталог", ИмяКаталога); ПолучитьРабочийКаталогДанныхПользователя(Новый ОписаниеОповещения( "ПолучитьРабочийКаталогПользователяПослеПолученияКаталогаДанных", ЭтотОбъект, Контекст)); КонецПроцедуры // Продолжение процедуры ПолучитьРабочийКаталогПользователя. Процедура ПолучитьРабочийКаталогПользователяПослеПолученияКаталогаДанных(Результат, Контекст) Экспорт Если ЗначениеЗаполнено(Результат.ОписаниеОшибки) Тогда ВыполнитьОбработкуОповещения(Контекст.Оповещение, Результат); Возврат; КонецЕсли; #Если НЕ ВебКлиент Тогда Если Результат.Каталог <> Контекст.Каталог Тогда // Создать каталог для файлов. Попытка СоздатьКаталог(Контекст.Каталог); ИмяКаталогаТестовое = Контекст.Каталог + "ПроверкаДоступа\"; СоздатьКаталог(ИмяКаталогаТестовое); УдалитьФайлы(ИмяКаталогаТестовое); Исключение // Нет прав на создание каталога, или такой путь отсутствует, // тогда установка настроек по умолчанию. Контекст.Каталог = Неопределено; ЖурналРегистрацииКлиент.ДобавитьСообщениеДляЖурналаРегистрации(СобытиеЖурналаРегистрации(), "Предупреждение", ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()),, Истина); КонецПопытки; КонецЕсли; #КонецЕсли ПараметрыПриложения["СтандартныеПодсистемы.ПроверкаДоступаКРабочемуКаталогуВыполнена"] = Истина; Если Контекст.Каталог = Неопределено Тогда УстановитьРабочийКаталогПользователя(Результат.Каталог); Иначе Результат.Каталог = Контекст.Каталог; КонецЕсли; ВыполнитьОбработкуОповещения(Контекст.Оповещение, Результат); КонецПроцедуры // Показывает напоминание о порядке работы с файлом в веб-клиенте, // если включена настройка "Показывать подсказки при редактировании файлов". // // Параметры: // ОбработчикРезультата - ОписаниеОповещения // - Неопределено - описание процедуры, принимающей результат работы метода. // Процедура ВывестиНапоминаниеПриРедактировании(ОбработчикРезультата) ПерсональныеНастройки = ПерсональныеНастройкиРаботыСФайлами(); Если ПерсональныеНастройки.ПоказыватьПодсказкиПриРедактированииФайлов = Истина Тогда Если НЕ РасширениеРаботыСФайламиПодключено() Тогда ТекстНапоминания = НСтр("ru = 'Сейчас будет предложено открыть или сохранить файл. | |1. Нажмите кнопку ""Сохранить"" (""Save""). | |2. Выберите каталог для сохранения файла на компьютере и запомните его |(каталог понадобится для редактирования и помещения файла обратно в программу). | |3. Для редактирования файла перейдите в выбранный ранее каталог, |найдите там сохраненный файл и откройте его.'"); СистемнаяИнформация = Новый СистемнаяИнформация; Если СтрНайти(СистемнаяИнформация.ИнформацияПрограммыПросмотра, "Firefox") <> 0 Тогда ТекстНапоминания = ТекстНапоминания + " | |" + НСтр("ru = '(По умолчанию браузер Mozilla Firefox автоматически сохраняет файлы в каталоге ""Мои документы"")'"); КонецЕсли; Кнопки = Новый СписокЗначений; Кнопки.Добавить("Продолжить", НСтр("ru = 'Продолжить'")); Кнопки.Добавить("Отмена", НСтр("ru = 'Отмена'")); ПараметрыНапоминания = Новый Структура; ПараметрыНапоминания.Вставить("Картинка", БиблиотекаКартинок.Информация32); ПараметрыНапоминания.Вставить("ТекстФлажка", НСтр("ru = 'Больше не показывать это сообщение'")); ПараметрыНапоминания.Вставить("Заголовок", НСтр("ru = 'Получение файла для просмотра или редактирования'")); СтандартныеПодсистемыКлиент.ПоказатьВопросПользователю( ОбработчикРезультата, ТекстНапоминания, Кнопки, ПараметрыНапоминания); Возврат; КонецЕсли; КонецЕсли; ВернутьРезультат(ОбработчикРезультата, Истина); КонецПроцедуры // Продолжение процедуры ПроверитьПодписи. Процедура ПроверитьПодписиПослеПодготовкиДанных(Данные, ДополнительныеПараметры) Если Не ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.ЭлектроннаяПодпись") Тогда Возврат; КонецЕсли; Если ДополнительныеПараметры.ВыделенныеСтроки = Неопределено Тогда Коллекция = ДополнительныеПараметры.Форма.ЭлектронныеПодписи; Иначе Коллекция = ДополнительныеПараметры.ВыделенныеСтроки; КонецЕсли; Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("ТехнологияСервиса.ЭлектроннаяПодписьВМоделиСервиса") Тогда МодульЭлектроннаяПодписьВМоделиСервисаКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("ЭлектроннаяПодписьВМоделиСервисаКлиент"); ИспользоватьЭлектроннуюПодписьВМоделиСервиса = МодульЭлектроннаяПодписьВМоделиСервисаКлиент.ИспользованиеВозможно(); Иначе ИспользоватьЭлектроннуюПодписьВМоделиСервиса = Ложь; КонецЕсли; ИспользоватьОблачнуюПодпись = Ложь; Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.ЭлектроннаяПодписьСервисаDSS") Тогда МодульСервисКриптографииDSSКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("СервисКриптографииDSSКлиент"); ИспользоватьОблачнуюПодпись = МодульСервисКриптографииDSSКлиент.ИспользоватьСервисОблачнойПодписи(); КонецЕсли; МодульЭлектроннаяПодписьКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("ЭлектроннаяПодписьКлиент"); Если ИспользоватьЭлектроннуюПодписьВМоделиСервиса Или ИспользоватьОблачнуюПодпись Или Не МодульЭлектроннаяПодписьКлиент.ПроверятьЭлектронныеПодписиНаСервере() Тогда ДополнительныеПараметры.Вставить("Данные", Данные); ДополнительныеПараметры.Вставить("Коллекция", Коллекция); ДополнительныеПараметры.Вставить("МодульЭлектроннаяПодписьКлиент", МодульЭлектроннаяПодписьКлиент); ДополнительныеПараметры.Вставить("Индекс", -1); ПроверитьПодписиЦиклНачало(ДополнительныеПараметры); Возврат; КонецЕсли; Если ТипЗнч(Данные) = Тип("ДвоичныеДанные") Тогда АдресДанных = ПоместитьВоВременноеХранилище(Данные, ДополнительныеПараметры.ИдентификаторФормы); Иначе АдресДанных = Данные; КонецЕсли; ДанныеСтрок = Новый Массив; Для каждого Элемент Из Коллекция Цикл СтрокаПодписи = ?(ТипЗнч(Элемент) <> Тип("Число"), Элемент, ДополнительныеПараметры.Форма.ЭлектронныеПодписи.НайтиПоИдентификатору(Элемент)); ДанныеСтроки = ДанныеСтрокиПодписи(); ЗаполнитьЗначенияСвойств(ДанныеСтроки, СтрокаПодписи); ДанныеСтрок.Добавить(ДанныеСтроки); КонецЦикла; РаботаСФайламиСлужебныйВызовСервера.ПроверитьПодписи(АдресДанных, ДанныеСтрок, ДополнительныеПараметры.ПодписанныйОбъект); Индекс = 0; Для каждого Элемент Из Коллекция Цикл СтрокаПодписи = ?(ТипЗнч(Элемент) <> Тип("Число"), Элемент, ДополнительныеПараметры.Форма.ЭлектронныеПодписи.НайтиПоИдентификатору(Элемент)); ЗаполнитьЗначенияСвойств(СтрокаПодписи, ДанныеСтрок[Индекс]); Индекс = Индекс + 1; КонецЦикла; КонецПроцедуры Функция ДанныеСтрокиПодписи() ДанныеСтроки = Новый Структура; ДанныеСтроки.Вставить("АдресПодписи"); ДанныеСтроки.Вставить("Статус"); ДанныеСтроки.Вставить("ПодписьВерна"); ДанныеСтроки.Вставить("ДатаПодписи"); ДанныеСтроки.Вставить("ОписаниеОшибки"); ДанныеСтроки.Вставить("ДатаПроверкиПодписи"); ДанныеСтроки.Вставить("ТипПодписи"); ДанныеСтроки.Вставить("ТребуетсяПроверка"); ДанныеСтроки.Вставить("СрокДействияПоследнейМеткиВремени"); ДанныеСтроки.Вставить("РезультатПроверкиПодписиПоМЧД"); Возврат ДанныеСтроки; КонецФункции // Помещает файлы с компьютера в хранилище присоединенных файлов. // // Параметры: // ВыбранныеФайлы - Массив из Строка - пути к файлам. // ВладелецФайла - ОпределяемыйТип.ВладелецФайлов - ссылка на владельца файла. // НастройкиРаботыСФайлами - Структура. // ПрисоединенныеФайлыМассив - Массив из ОпределяемыйТип.ПрисоединенныйФайл - возвращаемое значение. заполняется ссылками // на добавленные файлы. // ИдентификаторФормы - УникальныйИдентификатор - УникальныйИдентификатор формы. // Процедура ПоместитьВыбранныеФайлыВХранилище(Знач ВыбранныеФайлы, Знач ВладелецФайла, ПрисоединенныеФайлыМассив, Знач ИдентификаторФормы, Знач ИмяСоздаваемогоФайла = "", Знач ГруппаФайлов = Неопределено) ОбщиеНастройки = ОбщиеНастройкиРаботыСФайлами(); ТекущаяПозиция = 0; ПоследнийСохраненныйФайл = Неопределено; Для Каждого ПолноеИмяФайла Из ВыбранныеФайлы Цикл ТекущаяПозиция = ТекущаяПозиция + 1; Файл = Новый Файл(ПолноеИмяФайла); ПроверитьВозможностьЗагрузкиФайла(Файл); Если ОбщиеНастройки.ИзвлекатьТекстыФайловНаСервере Тогда АдресВременногоХранилищаТекста = ""; Иначе АдресВременногоХранилищаТекста = ИзвлечьТекстВоВременноеХранилище(ПолноеИмяФайла, ИдентификаторФормы); КонецЕсли; ВремяИзмененияУниверсальное = Файл.ПолучитьУниверсальноеВремяИзменения(); ОбновитьСостояниеОСохраненииФайлов(ВыбранныеФайлы, Файл, ТекущаяПозиция, ИмяСоздаваемогоФайла); ПоследнийСохраненныйФайл = Файл; ПомещаемыеФайлы = Новый Массив; Описание = Новый ОписаниеПередаваемогоФайла(Файл.ПолноеИмя, ""); ПомещаемыеФайлы.Добавить(Описание); ПомещенныеФайлы = Новый Массив; Если НЕ ПоместитьФайлы(ПомещаемыеФайлы, ПомещенныеФайлы, , Ложь, ИдентификаторФормы) Тогда ОбщегоНазначенияКлиент.СообщитьПользователю( СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = 'Не удалось поместить в программу файл ""%1"".'"), Файл.ПолноеИмя) ); Продолжить; КонецЕсли; АдресВременногоХранилищаФайла = ПомещенныеФайлы[0].Хранение; #Если МобильныйКлиент Тогда ПредставлениеНаМобильномУстройстве = Файл.ПолучитьПредставлениеФайлаБиблиотекиМобильногоУстройства(); РасширениеФайла = ОбщегоНазначенияКлиентСервер.ПолучитьРасширениеИмениФайла(ПредставлениеНаМобильномУстройстве); ИмяФайлаБезРасширения = СтрЗаменить(ПредставлениеНаМобильномУстройстве, "." + РасширениеФайла, ""); #Иначе РасширениеФайла = ОбщегоНазначенияКлиентСервер.РасширениеБезТочки(Файл.Расширение); ИмяФайлаБезРасширения = Файл.ИмяБезРасширения; #КонецЕсли ИмяБезРасширения = ?(ПустаяСтрока(ИмяСоздаваемогоФайла), ИмяФайлаБезРасширения, ИмяСоздаваемогоФайла); ПараметрыФайла = РаботаСФайламиСлужебныйКлиентСервер.ПараметрыДобавленияФайла(); ПараметрыФайла.ГруппаФайлов = ГруппаФайлов; ПараметрыФайла.ВладелецФайлов = ВладелецФайла; ПараметрыФайла.ИмяБезРасширения = ИмяБезРасширения; ПараметрыФайла.РасширениеБезТочки = РасширениеФайла; ПараметрыФайла.ВремяИзмененияУниверсальное = ВремяИзмененияУниверсальное; ПрисоединенныйФайл = РаботаСФайламиСлужебныйВызовСервера.ДобавитьФайл(ПараметрыФайла, АдресВременногоХранилищаФайла, АдресВременногоХранилищаТекста); Если ПрисоединенныйФайл = Неопределено Тогда Продолжить; КонецЕсли; ПрисоединенныеФайлыМассив.Добавить(ПрисоединенныйФайл); КонецЦикла; ОбновитьСостояниеОСохраненииФайлов(ВыбранныеФайлы, ПоследнийСохраненныйФайл, , ИмяБезРасширения); КонецПроцедуры Процедура ОбновитьСостояниеОСохраненииФайлов(Знач ВыбранныеФайлы, Знач Файл, Знач ТекущаяПозиция = Неопределено, ИмяСоздаваемогоФайла = ""); Если Файл = Неопределено Тогда Возврат; КонецЕсли; СохраняемоеИмяФайла = ?(ПустаяСтрока(ИмяСоздаваемогоФайла), Файл.Имя, ИмяСоздаваемогоФайла); РазмерВМб = РаботаСФайламиСлужебныйКлиентСервер.ПолучитьСтрокуСРазмеромФайла(Файл.Размер() / (1024 * 1024)); Если ВыбранныеФайлы.Количество() > 1 Тогда Если ТекущаяПозиция = Неопределено Тогда ПоказатьОповещениеПользователя(НСтр("ru = 'Сохранение файлов'"),, НСтр("ru = 'Сохранение файлов успешно завершено'")); КонецЕсли; Иначе Если ТекущаяПозиция = Неопределено Тогда ТекстПояснения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = 'Файл ""%1"" (%2 Мб) сохранен.'"), СохраняемоеИмяФайла, РазмерВМб); ПоказатьОповещениеПользователя(НСтр("ru = 'Сохранение файла'"), , ТекстПояснения, БиблиотекаКартинок.Информация32); КонецЕсли; КонецЕсли; КонецПроцедуры // Помещает файл с компьютера в хранилище присоединенных файлов (веб-клиент). // // Параметры: // ОбработчикРезультата - ОписаниеОповещения - процедура, в которую необходимо передать управление при завершении. // Параметры вызываемой процедуры: // ПрисоединенныйФайл - ЛюбаяСсылка, Неопределено - ссылка на добавленный файл, либо // Неопределено, если файл не был помещен; // ДополнительныеПараметры - Произвольный - значение, которое было указано при создании // объекта оповещения. // ВладелецФайла - ссылка на владельца файла. // НастройкиРаботыСФайлами - Структура. // ИдентификаторФормы - УникальныйИдентификатор формы. // Процедура ПоместитьВыбранныеФайлыВХранилищеВеб(ОбработчикРезультата, Знач ВладелецФайла, Знач ИдентификаторФормы) Параметры = Новый Структура; Параметры.Вставить("ВладелецФайла", ВладелецФайла); Параметры.Вставить("ОбработчикРезультата", ОбработчикРезультата); ОписаниеОповещения = Новый ОписаниеОповещения("ПоместитьВыбранныеФайлыВХранилищеВебЗавершение", ЭтотОбъект, Параметры); НачатьПомещениеФайла(ОписаниеОповещения, , ,Истина, ИдентификаторФормы); КонецПроцедуры // Продолжение процедуры ПоместитьВыбранныеФайлыВХранилищеВеб. Процедура ПоместитьВыбранныеФайлыВХранилищеВебЗавершение(Результат, Адрес, ВыбранноеИмяФайла, ДополнительныеПараметры) Экспорт Обработчик = ДополнительныеПараметры.ОбработчикРезультата; // ОписаниеОповещения Если Не Результат Тогда ВыполнитьОбработкуОповещения(Обработчик, Неопределено); Возврат; КонецЕсли; ВладелецФайла = ДополнительныеПараметры.ВладелецФайла; СтруктураПути = ОбщегоНазначенияКлиентСервер.РазложитьПолноеИмяФайла(ВыбранноеИмяФайла); ГруппаФайлов = ?(Обработчик.ДополнительныеПараметры.Свойство("ГруппаФайлов"), Обработчик.ДополнительныеПараметры.ГруппаФайлов, ""); Если Не ПустаяСтрока(СтруктураПути.Расширение) Тогда Расширение = ОбщегоНазначенияКлиентСервер.РасширениеБезТочки(СтруктураПути.Расширение); ИмяБезРасширения = СтруктураПути.ИмяБезРасширения; Иначе ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = 'Не удалось поместить в программу файл ""%1"".'"), ВыбранноеИмяФайла); КонецЕсли; ПроверитьРасширениеФайлаДляЗагрузки(Расширение); ОбщиеНастройки = ОбщиеНастройкиРаботыСФайлами(); РазмерЗагружаемогоФайла = ПолучитьИзВременногоХранилища(Адрес).Размер(); Если РазмерЗагружаемогоФайла > ОбщиеНастройки.МаксимальныйРазмерФайла Тогда РазмерВМб = РазмерЗагружаемогоФайла / (1024 * 1024); РазмерВМбМакс = ОбщиеНастройки.МаксимальныйРазмерФайла / (1024 * 1024); ОписаниеОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = 'Размер файла ""%1"" (%2 Мб) |превышает максимально допустимый размер файла (%3 Мб).'"), ВыбранноеИмяФайла, РаботаСФайламиСлужебныйКлиентСервер.ПолучитьСтрокуСРазмеромФайла(РазмерВМб), РаботаСФайламиСлужебныйКлиентСервер.ПолучитьСтрокуСРазмеромФайла(РазмерВМбМакс)); ВызватьИсключение ОписаниеОшибки; КонецЕсли; ПараметрыФайла = РаботаСФайламиСлужебныйКлиентСервер.ПараметрыДобавленияФайла(); ПараметрыФайла.ВладелецФайлов = ВладелецФайла; ПараметрыФайла.ИмяБезРасширения = ИмяБезРасширения; ПараметрыФайла.РасширениеБезТочки = Расширение; Если ЗначениеЗаполнено(ГруппаФайлов) Тогда ПараметрыФайла.ГруппаФайлов = ГруппаФайлов; КонецЕсли; // Создание карточки Файла в базе данных. ПрисоединенныйФайл = РаботаСФайламиСлужебныйВызовСервера.ДобавитьФайл( ПараметрыФайла, Адрес); ВыполнитьОбработкуОповещения(Обработчик, ПрисоединенныйФайл); КонецПроцедуры // Проверяет можно ли освободить Файл. // // Параметры: // ОбъектСсылка - СправочникСсылка.Файлы - файл. // // РедактируетТекущийПользователь - Булево - // файл редактирует текущий пользователь. // // Редактирует - СправочникСсылка.Пользователи - тот, кто занял файл. // // СтрокаОшибки - Строка - в которой возвращается причина ошибки в случае неуспеха // (например, "Файл занят другим пользователем"). // // Возвращаемое значение: // Булево - Истина, если файл можно освободить. // Функция ВозможностьОсвободитьФайл(ОбъектСсылка, РедактируетТекущийПользователь, Редактирует, СтрокаОшибки = "") Экспорт Если РедактируетТекущийПользователь Тогда Возврат Истина; ИначеЕсли Не ЗначениеЗаполнено(Редактирует) Тогда СтрокаОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = 'Невозможно освободить файл ""%1"", |т.к. он никем не занят.'"), Строка(ОбъектСсылка)); Возврат Ложь; Иначе Если ПользователиКлиент.ЭтоПолноправныйПользователь() Тогда Возврат Истина; КонецЕсли; СтрокаОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = 'Невозможно освободить файл ""%1"", |т.к. он занят пользователем ""%2"".'"), Строка(ОбъектСсылка), Строка(Редактирует)); Возврат Ложь; КонецЕсли; КонецФункции Процедура ОсвободитьФайлы(СписокФайлов) Экспорт МассивФайлов = Новый Массив; Для Каждого ЭлементСписка Из СписокФайлов.ВыделенныеСтроки Цикл ДанныеСтроки = СписокФайлов.ДанныеСтроки(ЭлементСписка); // ОпределяемыйТип.ПрисоединенныйФайл Если Не ВозможностьОсвободитьФайл( ДанныеСтроки.Ссылка, ДанныеСтроки.ФайлРедактируетТекущийПользователь, ДанныеСтроки.Редактирует) Тогда Продолжить; КонецЕсли; МассивФайлов.Добавить(ДанныеСтроки.Ссылка); КонецЦикла; Если МассивФайлов.Количество() = 0 Тогда Возврат; КонецЕсли; ДанныеФайлов = РаботаСФайламиСлужебныйВызовСервера.ОсвободитьФайлы(МассивФайлов); // Удаляем файлы из рабочего каталога, чтобы не подхватить измененные файлы при новом редактировании. Обработчик = Новый ОписаниеОповещения; Для Каждого Файл Из МассивФайлов Цикл ВерсияФайла = ДанныеФайлов.ВерсииФайлов.Получить(Файл); УдалитьФайлИзРабочегоКаталога(Обработчик, ВерсияФайла, Истина); КонецЦикла; СтандартныеПодсистемыКлиент.УстановитьПараметрКлиента("КоличествоЗанятыхФайлов", ДанныеФайлов.КоличествоЗанятыхФайлов); Если МассивФайлов.Количество() > 1 Тогда ОповеститьОбИзменении(ТипЗнч(МассивФайлов[0])); Оповестить("Запись_Файл", ПараметрыОповещенияЗаписиФайла(), Неопределено); Иначе ОповеститьОбИзменении(МассивФайлов[0]); Оповестить("Запись_Файл", ПараметрыОповещенияЗаписиФайла(), МассивФайлов[0]); КонецЕсли; КонецПроцедуры // Освобождает файл без обновления. // // Параметры: // ДанныеФайла - Структура // УникальныйИдентификатор - УникальныйИдентификатор управляемой формы. // Процедура ОсвободитьФайлБезВопроса(ДанныеФайла, УникальныйИдентификатор = Неопределено) РаботаСФайламиСлужебныйВызовСервера.ОсвободитьФайл(ДанныеФайла, УникальныйИдентификатор); ИзменитьКоличествоЗанятыхФайлов(); РасширениеПодключено = РасширениеРаботыСФайламиПодключено(); Если РасширениеПодключено Тогда ПеререгистрироватьФайлВРабочемКаталоге(ДанныеФайла, Истина, ДанныеФайла.РабочийКаталогВладельца <> ""); КонецЕсли; ПоказатьОповещениеПользователя(НСтр("ru = 'Файл освобожден'"), ДанныеФайла.НавигационнаяСсылка, ДанныеФайла.ПолноеНаименованиеВерсии, БиблиотекаКартинок.Информация32); КонецПроцедуры // Перемещает файлы в указанную папку. // // Параметры: // ОбъектыСсылка - Массив - массив файлов. // // Папка - СправочникСсылка.ПапкиФайлов - папка, // в которую требуется перенести файлы. // Процедура ПеренестиФайлыВПапку(ОбъектыСсылка, Папка) Экспорт ДанныеФайлов = РаботаСФайламиСлужебныйВызовСервера.ПеренестиФайлы(ОбъектыСсылка, Папка); Для Каждого ДанныеФайла Из ДанныеФайлов Цикл ПоказатьОповещениеПользователя( НСтр("ru = 'Перенос файла'"), ДанныеФайла.НавигационнаяСсылка, СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = 'Файл ""%1"" |перенесен в папку ""%2"".'"), Строка(ДанныеФайла.Ссылка), Строка(Папка)), БиблиотекаКартинок.Информация32); КонецЦикла; КонецПроцедуры // Извлечь текст из файла и поместить во временное хранилище. Функция ИзвлечьТекстВоВременноеХранилище(ПолноеИмяФайла, УникальныйИдентификатор = "", Отказ = Ложь, Кодировка = Неопределено) АдресВременногоХранилища = ""; #Если Не ВебКлиент Тогда Текст = ИзвлечьТекст(ПолноеИмяФайла, Отказ, Кодировка); Если ПустаяСтрока(Текст) Тогда Возврат ""; КонецЕсли; ИмяВременногоФайла = ПолучитьИмяВременногоФайла(); ТекстовыйФайл = Новый ЗаписьТекста(ИмяВременногоФайла, КодировкаТекста.UTF8); ТекстовыйФайл.Записать(Текст); ТекстовыйФайл.Закрыть(); РезультатЗагрузки = ПоместитьФайлСДискаВоВременноеХранилище(ИмяВременногоФайла, , УникальныйИдентификатор); Если РезультатЗагрузки <> Неопределено Тогда АдресВременногоХранилища = РезультатЗагрузки; КонецЕсли; Попытка УдалитьФайлы(ИмяВременногоФайла); Исключение ЖурналРегистрацииКлиент.ДобавитьСообщениеДляЖурналаРегистрации(СобытиеЖурналаРегистрации(), "Предупреждение", ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()),, Истина); КонецПопытки; #КонецЕсли Возврат АдресВременногоХранилища; КонецФункции // Возвращает строковую константу для формирования сообщений журнала регистрации. // // Возвращаемое значение: // Строка // Функция СобытиеЖурналаРегистрации() Возврат НСтр("ru = 'Файлы'", ОбщегоНазначенияКлиент.КодОсновногоЯзыка()); КонецФункции // Возвращает текст сообщения об ошибке создания нового файла. // // Параметры: // ИнформацияОбОшибке - ИнформацияОбОшибке. // Функция ОшибкаСозданияНовогоФайла(ИнформацияОбОшибке) Возврат СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = 'Не удалось создать файл по причине: |%1'"), ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке)); КонецФункции // Проверяет расширение файла и размер. // // Параметры: // Файл - Файл // ВызыватьИсключение - Булево // ФайлыСОшибками - Массив из Структура: // * ИмяФайла - Строка // * Ошибка - Строка // Функция ПроверитьВозможностьЗагрузкиФайла(Файл, ВызыватьИсключение = Истина, ФайлыСОшибками = Неопределено) ОбщиеНастройки = ОбщиеНастройкиРаботыСФайлами(); // Размер файла слишком большой. Если Файл.Размер() > ОбщиеНастройки.МаксимальныйРазмерФайла Тогда РазмерВМб = Файл.Размер() / (1024 * 1024); РазмерВМбМакс = ОбщиеНастройки.МаксимальныйРазмерФайла / (1024 * 1024); ОписаниеОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = 'Размер файла ""%1"" (%2 Мб) |превышает максимально допустимый размер файла (%3 Мб).'"), Файл.Имя, РаботаСФайламиСлужебныйКлиентСервер.ПолучитьСтрокуСРазмеромФайла(РазмерВМб), РаботаСФайламиСлужебныйКлиентСервер.ПолучитьСтрокуСРазмеромФайла(РазмерВМбМакс)); Если ВызыватьИсключение Тогда ВызватьИсключение ОписаниеОшибки; КонецЕсли; Запись = Новый Структура; Запись.Вставить("ИмяФайла", Файл.ПолноеИмя); Запись.Вставить("Ошибка", ОписаниеОшибки); ФайлыСОшибками.Добавить(Запись); Возврат Ложь; КонецЕсли; // Проверка расширения файла. Если Не ПроверитьРасширениеФайлаДляЗагрузки(Файл.Расширение, Ложь) Тогда ОписаниеОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = 'Загрузка файлов с расширением ""%1"" запрещена. |Обратитесь к администратору.'"), Файл.Расширение); Если ВызыватьИсключение Тогда ВызватьИсключение ОписаниеОшибки; КонецЕсли; Запись = Новый Структура; Запись.Вставить("ИмяФайла", Файл.ПолноеИмя); Запись.Вставить("Ошибка", ОписаниеОшибки); ФайлыСОшибками.Добавить(Запись); Возврат Ложь; КонецЕсли; // Временные файлы Word не импортируются. Если СтрНачинаетсяС(Файл.Имя, "~") И Файл.ПолучитьНевидимость() Тогда Возврат Ложь; КонецЕсли; Возврат Истина; КонецФункции //////////////////////////////////////////////////////////////////////////////// // Завершение редактирования Файла и помещение его на сервер. // Завершить редактирования Файла и поместить его на сервер. // // Параметры: // Параметры - см. ПараметрыОбновленияФайла. // Процедура ЗакончитьРедактирование(Параметры) Обработчик = Новый ОписаниеОповещения("ЗакончитьРедактированиеПослеУстановкиРасширения", ЭтотОбъект, Параметры); ПоказатьВопросОбУстановкеРасширенияРаботыСФайлами(Обработчик); КонецПроцедуры // Продолжение процедуры (см. выше). Процедура ЗакончитьРедактированиеПослеУстановкиРасширения(РасширениеУстановлено, ПараметрыВыполнения) Экспорт ПараметрыВыполнения.Вставить("ДанныеФайла", Неопределено); Если РасширениеРаботыСФайламиПодключено() Тогда ЗакончитьРедактированиеСРасширением(ПараметрыВыполнения); Иначе ЗакончитьРедактированиеБезРасширения(ПараметрыВыполнения); КонецЕсли; КонецПроцедуры // Продолжение процедуры (см. выше). Процедура ЗакончитьРедактированиеСРасширением(ПараметрыВыполнения) // Веб-клиент с расширением для работы с файлами, // Тонкий клиент, // Толстый клиент. ДанныеФайла = РаботаСФайламиСлужебныйВызовСервера.ДанныеФайлаИРабочийКаталог(ПараметрыВыполнения.ОбъектСсылка); ПараметрыВыполнения.ДанныеФайла = ДанныеФайла; // Проверка возможности освобождения файла. ТекстОшибки = ""; МожноОсвободитьФайл = ВозможностьОсвободитьФайл( ДанныеФайла.Ссылка, ДанныеФайла.ФайлРедактируетТекущийПользователь, ДанныеФайла.Редактирует, ТекстОшибки); Если Не МожноОсвободитьФайл Тогда ВернутьРезультатПослеПоказаПредупреждения(ПараметрыВыполнения.ОбработчикРезультата, ТекстОшибки, Ложь); Возврат; КонецЕсли; ПараметрыВыполнения.Вставить("ПолныйПутьКФайлу", ПараметрыВыполнения.ПереданныйПолныйПутьКФайлу); Если ПараметрыВыполнения.ПолныйПутьКФайлу = "" Тогда ПараметрыВыполнения.ПолныйПутьКФайлу = ДанныеФайла.ПолноеИмяФайлаВРабочемКаталоге; КонецЕсли; // Проверка наличия файла. ПараметрыВыполнения.Вставить("ФайлНовойВерсии", Новый Файл(ПараметрыВыполнения.ПолныйПутьКФайлу)); Если Не ЗначениеЗаполнено(ПараметрыВыполнения.ПолныйПутьКФайлу) Или Не ПараметрыВыполнения.ФайлНовойВерсии.Существует() Тогда Если ПараметрыВыполнения.ПрименитьКоВсем = Ложь Тогда Если Не ПустаяСтрока(ПараметрыВыполнения.ПолныйПутьКФайлу) Тогда СтрокаПредупреждения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = 'Не удалось поместить файл |""%1"" (%2) |в программу, т.к. он не существует в рабочем каталоге на компьютере. | |Освободить файл?'"), Строка(ДанныеФайла.Ссылка), ПараметрыВыполнения.ПолныйПутьКФайлу); Иначе СтрокаПредупреждения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = 'Не удалось поместить файл ""%1"" |в программу, т.к. он не существует в рабочем каталоге на компьютере. | |Освободить файл?'"), Строка(ДанныеФайла.Ссылка)); КонецЕсли; Обработчик = Новый ОписаниеОповещения("ЗакончитьРедактированиеСРасширениемПослеОтветаНаВопросОсвободитьФайл", ЭтотОбъект, ПараметрыВыполнения); ПоказатьВопрос(Обработчик, СтрокаПредупреждения, РежимДиалогаВопрос.ДаНет); Иначе ЗакончитьРедактированиеСРасширениемПослеОтветаНаВопросОсвободитьФайл(-1, ПараметрыВыполнения) КонецЕсли; Возврат; КонецЕсли; Попытка ТолькоЧтение = ПараметрыВыполнения.ФайлНовойВерсии.ПолучитьТолькоЧтение(); ПараметрыВыполнения.ФайлНовойВерсии.УстановитьТолькоЧтение(Не ТолькоЧтение); ПараметрыВыполнения.ФайлНовойВерсии.УстановитьТолькоЧтение(ТолькоЧтение); Исключение ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = 'Не удалось поместить файл ""%1"" в рабочий каталог на компьютер, |так как возможно он заблокирован другой программой.'"), Строка(ДанныеФайла.Ссылка)); ВызватьИсключение ТекстОшибки + Символы.ПС + Символы.ПС + ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); КонецПопытки; // Запрос комментария и признака хранения версии. Если ПараметрыВыполнения.СоздатьНовуюВерсию = Неопределено Тогда ПараметрыВыполнения.СоздатьНовуюВерсию = ДанныеФайла.ХранитьВерсии; Если ДанныеФайла.ХранитьВерсии Тогда // Если автор текущей версии не текущий пользователь, тогда // отключается доступность флажка "Не создавать новую версию". СоздатьНовуюВерсиюДоступность = ДанныеФайла.АвторТекущейВерсии = ДанныеФайла.Редактирует; ВозвратФайла = Новый Структура; ВозвратФайла.Вставить("ФайлСсылка", ДанныеФайла.Ссылка); ВозвратФайла.Вставить("КомментарийКВерсии", ""); ВозвратФайла.Вставить("СоздатьНовуюВерсию", ПараметрыВыполнения.СоздатьНовуюВерсию); ВозвратФайла.Вставить("СоздатьНовуюВерсиюДоступность", СоздатьНовуюВерсиюДоступность); Обработчик = Новый ОписаниеОповещения("ЗакончитьРедактированиеСРасширениемПослеПомещенияФайлаНаСервер", ЭтотОбъект, ПараметрыВыполнения); ОткрытьФорму("Обработка.РаботаСФайлами.Форма.ФормаВозвратаФайла", ВозвратФайла, , , , , Обработчик); Иначе ЗакончитьРедактированиеСРасширениемПослеПроверкиНовойВерсии(ПараметрыВыполнения); КонецЕсли; Иначе // Параметры СоздатьНовуюВерсию и КомментарийКВерсии переданы извне. Если ДанныеФайла.ХранитьВерсии Тогда // Если автор текущей версии не текущий пользователь, тогда // отключается доступность флажка "Не создавать новую версию". Если ДанныеФайла.АвторТекущейВерсии <> ДанныеФайла.Редактирует Тогда ПараметрыВыполнения.СоздатьНовуюВерсию = Истина; КонецЕсли; Иначе ПараметрыВыполнения.СоздатьНовуюВерсию = Ложь; КонецЕсли; ЗакончитьРедактированиеСРасширениемПослеПроверкиНовойВерсии(ПараметрыВыполнения); КонецЕсли; КонецПроцедуры // Продолжение процедуры (см. выше). Процедура ЗакончитьРедактированиеСРасширениемПослеОтветаНаВопросОсвободитьФайл(Ответ, ПараметрыВыполнения) Экспорт Если Ответ <> -1 Тогда Если Ответ = КодВозвратаДиалога.Да Тогда ПараметрыВыполнения.ОсвобождатьФайлы = Истина; Иначе ПараметрыВыполнения.ОсвобождатьФайлы = Ложь; КонецЕсли; КонецЕсли; Если ПараметрыВыполнения.ОсвобождатьФайлы Тогда ОсвободитьФайлБезВопроса(ПараметрыВыполнения.ДанныеФайла, ПараметрыВыполнения.ИдентификаторФормы); ВернутьРезультат(ПараметрыВыполнения.ОбработчикРезультата, Истина); Иначе ВернутьРезультат(ПараметрыВыполнения.ОбработчикРезультата, Ложь); КонецЕсли; КонецПроцедуры // Продолжение процедуры (см. выше). Процедура ЗакончитьРедактированиеСРасширениемПослеПомещенияФайлаНаСервер(Результат, ПараметрыВыполнения) Экспорт Если ТипЗнч(Результат) <> Тип("Структура") Тогда ВернутьРезультат(ПараметрыВыполнения.ОбработчикРезультата, Ложь); Возврат; КонецЕсли; Если Результат.КодВозврата <> КодВозвратаДиалога.ОК Тогда ВернутьРезультат(ПараметрыВыполнения.ОбработчикРезультата, Ложь); Возврат; КонецЕсли; ПараметрыВыполнения.СоздатьНовуюВерсию = Результат.СоздатьНовуюВерсию; ПараметрыВыполнения.КомментарийКВерсии = Результат.КомментарийКВерсии; ЗакончитьРедактированиеСРасширениемПослеПроверкиНовойВерсии(ПараметрыВыполнения); КонецПроцедуры // Продолжение процедуры (см. выше). Процедура ЗакончитьРедактированиеСРасширениемПослеПроверкиНовойВерсии(ПараметрыВыполнения) Если Не ПараметрыВыполнения.ДанныеФайла.Зашифрован Тогда ЗакончитьРедактированиеСРасширениемПослеПроверкиЗашифрован(ПараметрыВыполнения); Возврат; КонецЕсли; // Файл с признаком шифрован снова шифруется для тех же сертификатов. ЗашифроватьФайлПередПомещениемВХранилищеФайлов(ПараметрыВыполнения); КонецПроцедуры // Продолжение процедуры (см. выше). Процедура ЗакончитьРедактированиеСРасширениемПослеПроверкиЗашифрован(ПараметрыВыполнения) СведенияОФайле = РаботаСФайламиКлиентСервер.СведенияОФайле("ФайлСВерсией", ПараметрыВыполнения.ФайлНовойВерсии); СведенияОФайле.Комментарий = ПараметрыВыполнения.КомментарийКВерсии; СведенияОФайле.ХранитьВерсии = ПараметрыВыполнения.СоздатьНовуюВерсию; Если ПараметрыВыполнения.Свойство("АдресПослеШифрования") Тогда СведенияОФайле.АдресВременногоХранилищаФайла = ПараметрыВыполнения.АдресПослеШифрования; Иначе ПомещаемыеФайлы = Новый Массив; Описание = Новый ОписаниеПередаваемогоФайла(ПараметрыВыполнения.ПолныйПутьКФайлу, ""); ПомещаемыеФайлы.Добавить(Описание); ПомещенныеФайлы = Новый Массив; Попытка ФайлыПомещены = ПоместитьФайлы(ПомещаемыеФайлы, ПомещенныеФайлы,, Ложь, ПараметрыВыполнения.ИдентификаторФормы); Исключение ИнформацияОбОшибке = ИнформацияОбОшибке(); ТекстВопроса = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = 'Не удалось поместить файл с компьютера в программу по причине: |""%1"". | |Повторить операцию?'"), ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке)); Оповещение = Новый ОписаниеОповещения("ЗакончитьРедактированиеСРасширениемПослеПроверкиЗашифрованПовтор", ЭтотОбъект, ПараметрыВыполнения); ПоказатьВопрос(Оповещение, ТекстВопроса, РежимДиалогаВопрос.ПовторитьОтмена); Возврат; КонецПопытки; Если Не ФайлыПомещены Тогда ВернутьРезультат(ПараметрыВыполнения.ОбработчикРезультата, Ложь); Возврат; КонецЕсли; Если ПомещенныеФайлы.Количество() = 1 Тогда СведенияОФайле.АдресВременногоХранилищаФайла = ПомещенныеФайлы[0].Хранение; КонецЕсли; КонецЕсли; ОбщиеНастройкиРаботыСФайлами = ОбщиеНастройкиРаботыСФайлами(); Если Не ОбщиеНастройкиРаботыСФайлами.ИзвлекатьТекстыФайловНаСервере Тогда Попытка СведенияОФайле.АдресВременногоХранилищаТекста = ИзвлечьТекстВоВременноеХранилище(ПараметрыВыполнения.ПолныйПутьКФайлу, ПараметрыВыполнения.ИдентификаторФормы,, ПараметрыВыполнения.Кодировка); Исключение ЗакончитьРедактированиеСРасширениемОбработкаИсключения(ИнформацияОбОшибке(), ПараметрыВыполнения); Возврат; КонецПопытки; КонецЕсли; НеМенятьЗаписьВРабочемКаталоге = Ложь; Если ПараметрыВыполнения.ПереданныйПолныйПутьКФайлу <> "" Тогда НеМенятьЗаписьВРабочемКаталоге = Истина; КонецЕсли; Попытка ВерсияОбновлена = РаботаСФайламиСлужебныйВызовСервера.СохранитьИзмененияИОсвободитьФайл(ПараметрыВыполнения.ДанныеФайла, СведенияОФайле, НеМенятьЗаписьВРабочемКаталоге, ПараметрыВыполнения.ПолныйПутьКФайлу, РабочийКаталогПользователя(), ПараметрыВыполнения.ИдентификаторФормы); Исключение ЗакончитьРедактированиеСРасширениемОбработкаИсключения(ИнформацияОбОшибке(), ПараметрыВыполнения); Возврат; КонецПопытки; ИзменитьКоличествоЗанятыхФайлов(); ПараметрыВыполнения.Вставить("ВерсияОбновлена", ВерсияОбновлена); НоваяВерсия = ПараметрыВыполнения.ДанныеФайла.ТекущаяВерсия; Если ПараметрыВыполнения.ПереданныйПолныйПутьКФайлу = "" Тогда ПерсональныеНастройкиРаботыСФайлами = ПерсональныеНастройкиРаботыСФайлами(); УдалятьФайлИзЛокальногоКэшаФайловПриЗавершенииРедактирования = ПерсональныеНастройкиРаботыСФайлами.УдалятьФайлИзЛокальногоКэшаФайловПриЗавершенииРедактирования; Если ПараметрыВыполнения.ДанныеФайла.РабочийКаталогВладельца <> "" Тогда УдалятьФайлИзЛокальногоКэшаФайловПриЗавершенииРедактирования = Ложь; КонецЕсли; Если УдалятьФайлИзЛокальногоКэшаФайловПриЗавершенииРедактирования Тогда Обработчик = Новый ОписаниеОповещения("ЗакончитьРедактированиеСРасширениемПослеУдаленияФайлаИзРабочегоКаталога", ЭтотОбъект, ПараметрыВыполнения); УдалитьФайлИзРабочегоКаталога(Обработчик, НоваяВерсия, УдалятьФайлИзЛокальногоКэшаФайловПриЗавершенииРедактирования); Возврат; Иначе Файл = Новый Файл(ПараметрыВыполнения.ПолныйПутьКФайлу); Файл.УстановитьТолькоЧтение(Истина); КонецЕсли; КонецЕсли; ЗакончитьРедактированиеСРасширениемПослеУдаленияФайлаИзРабочегоКаталога(-1, ПараметрыВыполнения); КонецПроцедуры // Продолжение процедуры (см. выше). // Процедура ЗакончитьРедактированиеСРасширениемПослеПроверкиЗашифрованПовтор(Результат, Параметр) Экспорт Если Результат = КодВозвратаДиалога.Повторить Тогда ЗакончитьРедактированиеСРасширениемПослеПроверкиЗашифрован(Параметр); КонецЕсли; КонецПроцедуры // Продолжение процедуры (см. выше). // // Параметры: // ПараметрыВыполнения - Структура: // * ДанныеФайла - см. РаботаСФайламиСлужебныйВызовСервера.ДанныеФайлаИРабочийКаталог // Процедура ЗакончитьРедактированиеСРасширениемПослеУдаленияФайлаИзРабочегоКаталога(Результат, ПараметрыВыполнения) Экспорт Если ПараметрыВыполнения.ПоказыватьОповещение Тогда Если ПараметрыВыполнения.ВерсияОбновлена Тогда ШаблонПояснения = НСтр("ru = 'Файл ""%1"" |обновлен и освобожден.'"); Иначе ШаблонПояснения = НСтр("ru = 'Файл ""%1"" |не изменился и освобожден.'"); КонецЕсли; ПоказатьОповещениеПользователя( НСтр("ru = 'Редактирование закончено'"), ПараметрыВыполнения.ДанныеФайла.НавигационнаяСсылка, СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( ШаблонПояснения, Строка(ПараметрыВыполнения.ДанныеФайла.Ссылка)), БиблиотекаКартинок.Информация32); Если Не ПараметрыВыполнения.ВерсияОбновлена Тогда Обработчик = Новый ОписаниеОповещения("ЗакончитьРедактированиеСРасширениемПослеПоказаОповещения", ЭтотОбъект, ПараметрыВыполнения); ПоказатьИнформациюФайлНеБылИзменен(Обработчик); Возврат; КонецЕсли; КонецЕсли; ЗакончитьРедактированиеСРасширениемПослеПоказаОповещения(-1, ПараметрыВыполнения); КонецПроцедуры // Продолжение процедуры (см. выше). Процедура ЗакончитьРедактированиеСРасширениемПослеПоказаОповещения(Результат, ПараметрыВыполнения) Экспорт Если ТипЗнч(Результат) = Тип("Структура") И Результат.БольшеНеЗадаватьЭтотВопрос Тогда ОбщегоНазначенияВызовСервера.ХранилищеОбщихНастроекСохранить( "НастройкиПрограммы", "ПоказыватьИнформациюЧтоФайлНеБылИзменен", Ложь,,, Истина); КонецЕсли; ВернутьРезультат(ПараметрыВыполнения.ОбработчикРезультата, Истина); КонецПроцедуры // Продолжение процедуры (см. выше). // // Параметры: // ПараметрыВыполнения - Структура: // * ДанныеФайла - см. РаботаСФайламиСлужебныйВызовСервера.ДанныеФайлаИРабочийКаталог // Процедура ЗакончитьРедактированиеСРасширениемОбработкаИсключения(ИнформацияОбОшибке, ПараметрыВыполнения) ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = 'Не удалось поместить файл ""%1"" |с компьютере в программу по причине: |%2.'"), Строка(ПараметрыВыполнения.ДанныеФайла.Ссылка), ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке)); ЖурналРегистрацииКлиент.ДобавитьСообщениеДляЖурналаРегистрации(СобытиеЖурналаРегистрации(), "Предупреждение", ТекстСообщения,, Истина); ТекстВопроса = ТекстСообщения + Символы.ПС + Символы.ПС + НСтр("ru = 'Повторить операцию?'"); Обработчик = Новый ОписаниеОповещения("ЗакончитьРедактированиеСРасширениемПослеОтветаНаВопросПовторить", ЭтотОбъект, ПараметрыВыполнения); ПоказатьВопрос(Обработчик, ТекстВопроса, РежимДиалогаВопрос.ПовторитьОтмена); КонецПроцедуры // Продолжение процедуры (см. выше). Процедура ЗакончитьРедактированиеСРасширениемПослеОтветаНаВопросПовторить(Ответ, ПараметрыВыполнения) Экспорт Если Ответ = КодВозвратаДиалога.Отмена Тогда ВернутьРезультат(ПараметрыВыполнения.ОбработчикРезультата, Ложь); Возврат; КонецЕсли; ЗакончитьРедактированиеСРасширениемПослеПроверкиЗашифрован(ПараметрыВыполнения); КонецПроцедуры // Продолжение процедуры (см. выше). Процедура ЗакончитьРедактированиеБезРасширения(ПараметрыВыполнения) // Веб-клиент без расширения для работы с 1С:Предприятием. Если ПараметрыВыполнения.ДанныеФайла = Неопределено Тогда ПараметрыДанныхФайла = РаботаСФайламиКлиентСервер.ПараметрыДанныхФайла(); ПараметрыДанныхФайла.ПолучатьСсылкуНаДвоичныеДанные = Ложь; ПараметрыВыполнения.ДанныеФайла = РаботаСФайламиСлужебныйВызовСервера.ДанныеФайла(ПараметрыВыполнения.ОбъектСсылка,,ПараметрыДанныхФайла); ПараметрыВыполнения.ХранитьВерсии = ПараметрыВыполнения.ДанныеФайла.ХранитьВерсии; ПараметрыВыполнения.ФайлРедактируетТекущийПользователь = ПараметрыВыполнения.ДанныеФайла.ФайлРедактируетТекущийПользователь; ПараметрыВыполнения.Редактирует = ПараметрыВыполнения.ДанныеФайла.Редактирует; ПараметрыВыполнения.АвторТекущейВерсии = ПараметрыВыполнения.ДанныеФайла.АвторТекущейВерсии; ПараметрыВыполнения.Кодировка = ПараметрыВыполнения.ДанныеФайла.КодировкаТекущейВерсии; КонецЕсли; // Проверка возможности освобождения файла. ТекстОшибки = ""; МожноОсвободитьФайл = ВозможностьОсвободитьФайл( ПараметрыВыполнения.ОбъектСсылка, ПараметрыВыполнения.ФайлРедактируетТекущийПользователь, ПараметрыВыполнения.Редактирует, ТекстОшибки); Если Не МожноОсвободитьФайл Тогда ВернутьРезультатПослеПоказаПредупреждения(ПараметрыВыполнения.ОбработчикРезультата, ТекстОшибки, Ложь); Возврат; КонецЕсли; ПараметрыВыполнения.Вставить("ПолныйПутьКФайлу", ""); Если ПараметрыВыполнения.СоздатьНовуюВерсию = Неопределено Тогда ПараметрыВыполнения.СоздатьНовуюВерсию = Истина; СоздатьНовуюВерсиюДоступность = Истина; Если ПараметрыВыполнения.ХранитьВерсии Тогда ПараметрыВыполнения.СоздатьНовуюВерсию = Истина; // Если автор текущей версии не текущий пользователь, тогда // отключается доступность флажка "Не создавать новую версию". Если ПараметрыВыполнения.АвторТекущейВерсии <> ПараметрыВыполнения.Редактирует Тогда СоздатьНовуюВерсиюДоступность = Ложь; Иначе СоздатьНовуюВерсиюДоступность = Истина; КонецЕсли; Иначе ПараметрыВыполнения.СоздатьНовуюВерсию = Ложь; СоздатьНовуюВерсиюДоступность = Ложь; КонецЕсли; СтруктураПараметров = Новый Структура; СтруктураПараметров.Вставить("ФайлСсылка", ПараметрыВыполнения.ОбъектСсылка); СтруктураПараметров.Вставить("КомментарийКВерсии", ""); СтруктураПараметров.Вставить("СоздатьНовуюВерсию", ПараметрыВыполнения.СоздатьНовуюВерсию); СтруктураПараметров.Вставить("СоздатьНовуюВерсиюДоступность", СоздатьНовуюВерсиюДоступность); Обработчик = Новый ОписаниеОповещения("ЗакончитьРедактированиеБезРасширенияПослеПомещенияФайлаНаСервер", ЭтотОбъект, ПараметрыВыполнения); ОткрытьФорму("Обработка.РаботаСФайлами.Форма.ФормаВозвратаФайла", СтруктураПараметров, , , , , Обработчик); Иначе // Параметры СоздатьНовуюВерсию и КомментарийКВерсии переданы извне. Если ПараметрыВыполнения.ХранитьВерсии Тогда // Если автор текущей версии не текущий пользователь, тогда // отключается доступность флажка "Не создавать новую версию". Если ПараметрыВыполнения.АвторТекущейВерсии <> ПараметрыВыполнения.Редактирует Тогда ПараметрыВыполнения.СоздатьНовуюВерсию = Истина; КонецЕсли; Иначе ПараметрыВыполнения.СоздатьНовуюВерсию = Ложь; КонецЕсли; ЗакончитьРедактированиеБезРасширенияПослеПроверкиНовойВерсии(ПараметрыВыполнения) КонецЕсли; КонецПроцедуры // Продолжение процедуры (см. выше). Процедура ЗакончитьРедактированиеБезРасширенияПослеПомещенияФайлаНаСервер(Результат, ПараметрыВыполнения) Экспорт Если ТипЗнч(Результат) <> Тип("Структура") Тогда ВернутьРезультат(ПараметрыВыполнения.ОбработчикРезультата, Ложь); Возврат; КонецЕсли; Если Результат.КодВозврата <> КодВозвратаДиалога.ОК Тогда ВернутьРезультат(ПараметрыВыполнения.ОбработчикРезультата, Ложь); Возврат; КонецЕсли; ПараметрыВыполнения.СоздатьНовуюВерсию = Результат.СоздатьНовуюВерсию; ПараметрыВыполнения.КомментарийКВерсии = Результат.КомментарийКВерсии; ЗакончитьРедактированиеБезРасширенияПослеПроверкиНовойВерсии(ПараметрыВыполнения); КонецПроцедуры // Продолжение процедуры (см. выше). Процедура ЗакончитьРедактированиеБезРасширенияПослеПроверкиНовойВерсии(ПараметрыВыполнения) Обработчик = Новый ОписаниеОповещения("ЗакончитьРедактированиеБезРасширенияПослеНапоминания", ЭтотОбъект, ПараметрыВыполнения); ПоказатьНапоминаниеПередПоместитьФайл(Обработчик); КонецПроцедуры // Продолжение процедуры (см. выше). Процедура ЗакончитьРедактированиеБезРасширенияПослеНапоминания(Результат, ПараметрыВыполнения) Экспорт Если Результат = КодВозвратаДиалога.Отмена Или Результат = Неопределено Тогда Возврат; КонецЕсли; Если ТипЗнч(Результат) = Тип("Структура") И Результат.Свойство("БольшеНеЗадаватьЭтотВопрос") И Результат.БольшеНеЗадаватьЭтотВопрос Тогда ОбщегоНазначенияВызовСервера.ХранилищеОбщихНастроекСохранить( "НастройкиПрограммы", "ПоказыватьПодсказкиПриРедактированииФайлов", Ложь,,, Истина); КонецЕсли; Обработчик = Новый ОписаниеОповещения("ЗакончитьРедактированиеБезРасширенияПослеЗагрузкиФайла", ЭтотОбъект, ПараметрыВыполнения); НачатьПомещениеФайла(Обработчик, , ПараметрыВыполнения.ПолныйПутьКФайлу, , ПараметрыВыполнения.ИдентификаторФормы); КонецПроцедуры // Продолжение процедуры (см. выше). Процедура ЗакончитьРедактированиеБезРасширенияПослеЗагрузкиФайла(Помещен, Адрес, ВыбранноеИмяФайла, ПараметрыВыполнения) Экспорт Если Не Помещен Тогда ВернутьРезультат(ПараметрыВыполнения.ОбработчикРезультата, Ложь); Возврат; КонецЕсли; ПараметрыВыполнения.Вставить("АдресЗагруженногоФайла", Адрес); ПараметрыВыполнения.Вставить("ВыбранноеИмяФайла", ВыбранноеИмяФайла); Если ПараметрыВыполнения.ДанныеФайла = Неопределено Тогда ПараметрыДанныхФайла = РаботаСФайламиКлиентСервер.ПараметрыДанныхФайла(); ПараметрыДанныхФайла.ПолучатьСсылкуНаДвоичныеДанные = Ложь; ДанныеФайла = РаботаСФайламиСлужебныйВызовСервера.ДанныеФайла(ПараметрыВыполнения.ОбъектСсылка,,ПараметрыДанныхФайла); Иначе ДанныеФайла = ПараметрыВыполнения.ДанныеФайла; КонецЕсли; Если Не ДанныеФайла.Зашифрован Тогда ЗакончитьРедактированиеБезРасширенияПослеШифрованияФайла(Null, ПараметрыВыполнения); Возврат; КонецЕсли; Если СертификатыНеУказаны(ДанныеФайла.МассивСертификатовШифрования) Тогда ВернутьРезультат(ПараметрыВыполнения.ОбработчикРезультата, Ложь); Возврат; КонецЕсли; Если Не ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.ЭлектроннаяПодпись") Тогда ВернутьРезультат(ПараметрыВыполнения.ОбработчикРезультата, Ложь); Возврат; КонецЕсли; // Не нужно ПредложитьУстановкуРасширенияРаботыСФайлами(), т.к. все делается в памяти через ДвоичныеДанные. ОписаниеДанных = Новый Структура; ОписаниеДанных.Вставить("Операция", НСтр("ru = 'Шифрование файла'")); ОписаниеДанных.Вставить("ЗаголовокДанных", НСтр("ru = 'Файл'")); ОписаниеДанных.Вставить("Данные", Адрес); ОписаниеДанных.Вставить("Представление", ПараметрыВыполнения.ОбъектСсылка); ОписаниеДанных.Вставить("НаборСертификатов", ПараметрыВыполнения.ОбъектСсылка); ОписаниеДанных.Вставить("БезПодтверждения", Истина); ОписаниеДанных.Вставить("СообщитьОЗавершении", Ложь); ОбработчикПродолжения = Новый ОписаниеОповещения("ЗакончитьРедактированиеБезРасширенияПослеШифрованияФайла", ЭтотОбъект, ПараметрыВыполнения); МодульЭлектроннаяПодписьКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("ЭлектроннаяПодписьКлиент"); МодульЭлектроннаяПодписьКлиент.Зашифровать(ОписаниеДанных, , ОбработчикПродолжения); КонецПроцедуры // Продолжение процедуры (см. выше). // // Параметры: // ПараметрыВыполнения - Структура: // * ДанныеФайла - см. РаботаСФайламиСлужебныйВызовСервера.ДанныеФайлаИРабочийКаталог // Процедура ЗакончитьРедактированиеБезРасширенияПослеШифрованияФайла(ОписаниеДанных, ПараметрыВыполнения) Экспорт Если ОписаниеДанных = Null Тогда Адрес = ПараметрыВыполнения.АдресЗагруженногоФайла; ИначеЕсли Не ОписаниеДанных.Успех Тогда ВернутьРезультат(ПараметрыВыполнения.ОбработчикРезультата, Ложь); Возврат; Иначе Если ТипЗнч(ОписаниеДанных.ЗашифрованныеДанные) = Тип("ДвоичныеДанные") Тогда Адрес = ПоместитьВоВременноеХранилище(ОписаниеДанных.ЗашифрованныеДанные, ПараметрыВыполнения.ИдентификаторФормы); Иначе Адрес = ОписаниеДанных.ЗашифрованныеДанные; КонецЕсли; КонецЕсли; СведенияОФайле = РаботаСФайламиКлиентСервер.СведенияОФайле("ФайлСВерсией"); СведенияОФайле.АдресВременногоХранилищаФайла = Адрес; СведенияОФайле.Комментарий = ПараметрыВыполнения.КомментарийКВерсии; СтруктураПути = ОбщегоНазначенияКлиентСервер.РазложитьПолноеИмяФайла(ПараметрыВыполнения.ВыбранноеИмяФайла); Если Не ПустаяСтрока(СтруктураПути.Расширение) Тогда СведенияОФайле.РасширениеБезТочки = ОбщегоНазначенияКлиентСервер.РасширениеБезТочки(СтруктураПути.Расширение); СведенияОФайле.ИмяБезРасширения = СтруктураПути.ИмяБезРасширения; КонецЕсли; СведенияОФайле.ХранитьВерсии = ПараметрыВыполнения.СоздатьНовуюВерсию; Попытка Результат = РаботаСФайламиСлужебныйВызовСервера.СохранитьИзмененияИОсвободитьФайлПоСсылке(ПараметрыВыполнения.ОбъектСсылка, СведенияОФайле, ПараметрыВыполнения.ПолныйПутьКФайлу, РабочийКаталогПользователя(), ПараметрыВыполнения.ИдентификаторФормы); ПараметрыВыполнения.ДанныеФайла = Результат.ДанныеФайла; Исключение ЗакончитьРедактированиеОбработчикИсключения(ИнформацияОбОшибке(), ПараметрыВыполнения); Возврат; КонецПопытки; ИзменитьКоличествоЗанятыхФайлов(); Если ПараметрыВыполнения.ПоказыватьОповещение Тогда Если Результат.Успешно Тогда ШаблонПояснения = НСтр("ru = 'Файл ""%1"" |обновлен и освобожден.'"); Иначе ШаблонПояснения = НСтр("ru = 'Файл ""%1"" |не изменился и освобожден.'"); КонецЕсли; ПоказатьОповещениеПользователя( НСтр("ru = 'Редактирование закончено'"), ПараметрыВыполнения.ДанныеФайла.НавигационнаяСсылка, СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( ШаблонПояснения, Строка(ПараметрыВыполнения.ДанныеФайла.Ссылка)), БиблиотекаКартинок.Информация32); Если Не Результат.Успешно Тогда Обработчик = Новый ОписаниеОповещения("ЗакончитьРедактированиеБезРасширенияПослеПоказаОповещения", ЭтотОбъект, ПараметрыВыполнения); ПоказатьИнформациюФайлНеБылИзменен(Обработчик); Возврат; КонецЕсли; КонецЕсли; ЗакончитьРедактированиеБезРасширенияПослеПоказаОповещения(-1, ПараметрыВыполнения); КонецПроцедуры // Продолжение процедуры (см. выше). Процедура ЗакончитьРедактированиеБезРасширенияПослеПоказаОповещения(Результат, ПараметрыВыполнения) Экспорт Если ТипЗнч(Результат) = Тип("Структура") И Результат.Свойство("БольшеНеЗадаватьЭтотВопрос") И Результат.БольшеНеЗадаватьЭтотВопрос Тогда ОбщегоНазначенияВызовСервера.ХранилищеОбщихНастроекСохранить( "НастройкиПрограммы","ПоказыватьИнформациюЧтоФайлНеБылИзменен", Ложь,,, Истина); КонецЕсли; ВернутьРезультат(ПараметрыВыполнения.ОбработчикРезультата, Истина); КонецПроцедуры // Продолжение процедуры (см. выше). Процедура ЗакончитьРедактированиеОбработчикИсключения(ИнформацияОбОшибке, ПараметрыВыполнения) ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = 'Не удалось поместить файл ""%1"" |с компьютера в программу по причине |""%2"". | |Повторить операцию?'"), Строка(ПараметрыВыполнения.ОбъектСсылка), ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке)); Обработчик = Новый ОписаниеОповещения("ЗакончитьРедактированиеБезРасширенияПослеОтветаНаВопросПовторить", ЭтотОбъект, ПараметрыВыполнения); ПоказатьВопрос(Обработчик, ТекстОшибки, РежимДиалогаВопрос.ПовторитьОтмена); КонецПроцедуры // Продолжение процедуры (см. выше). Процедура ЗакончитьРедактированиеБезРасширенияПослеОтветаНаВопросПовторить(Ответ, ПараметрыВыполнения) Экспорт Если Ответ = КодВозвратаДиалога.Отмена Тогда ВернутьРезультат(ПараметрыВыполнения.ОбработчикРезультата, Ложь); Иначе ЗакончитьРедактированиеБезРасширенияПослеПроверкиНовойВерсии(ПараметрыВыполнения); КонецЕсли; КонецПроцедуры //////////////////////////////////////////////////////////////////////////////// // Выбор файла и создание из него новой версии. // Загружает файл и создает новую версию. // // Параметры: // ОбработчикРезультата - ОписаниеОповещения // - Неопределено - описание процедуры, принимающей // результат работы метода, с параметрами: // * Результат - Булево - Истина, если файл обновлен. // * ДополнительныеПараметры - Произвольный - значение, которое было указано при создании объекта // ОписаниеОповещения. // ДанныеФайла - см. РаботаСФайламиСлужебныйВызовСервера.ДанныеФайлаИРабочийКаталог // ИдентификаторФормы - УникальныйИдентификатор - уникальный идентификатор формы. // Процедура ОбновитьИзФайлаНаДиске(ОбработчикРезультата, ДанныеФайла, ИдентификаторФормы, ПараметрыДобавленияФайла = Неопределено) Если Не РасширениеРаботыСФайламиПодключено() Тогда ВернутьРезультат(ОбработчикРезультата, Ложь); Возврат; КонецЕсли; Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие); Если Не ПустаяСтрока(ДанныеФайла.РабочийКаталогВладельца) Тогда ПутьВыбора = ДанныеФайла.РабочийКаталогВладельца; Иначе ПутьВыбора = ОбщегоНазначенияВызовСервера.ХранилищеОбщихНастроекЗагрузить("НастройкиПрограммы", "ПапкаДляОбновитьИзФайла"); КонецЕсли; Если ПутьВыбора = Неопределено Или ПутьВыбора = "" Тогда ПутьВыбора = КаталогМоиДокументы(); КонецЕсли; Диалог.Заголовок = НСтр("ru = 'Выбор файла'"); Диалог.ПредварительныйПросмотр = Ложь; Диалог.ПроверятьСуществованиеФайла = Ложь; Диалог.МножественныйВыбор = Ложь; Диалог.Каталог = ПутьВыбора; Диалог.ПолноеИмяФайла = ОбщегоНазначенияКлиентСервер.ПолучитьИмяСРасширением( ДанныеФайла.ПолноеНаименованиеВерсии, ДанныеФайла.Расширение); Если ПараметрыДобавленияФайла <> Неопределено И ПараметрыДобавленияФайла.Свойство("ФильтрДиалогаВыбора") И Не ПустаяСтрока(ПараметрыДобавленияФайла.ФильтрДиалогаВыбора) Тогда Диалог.Фильтр = ПараметрыДобавленияФайла.ФильтрДиалогаВыбора; Иначе РасширениеДляЗашифрованныхФайлов = ""; Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.ЭлектроннаяПодпись") Тогда МодульЭлектроннаяПодписьКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("ЭлектроннаяПодписьКлиент"); Если МодульЭлектроннаяПодписьКлиент.ИспользоватьШифрование() Тогда РасширениеДляЗашифрованныхФайлов = МодульЭлектроннаяПодписьКлиент.ПерсональныеНастройки().РасширениеДляЗашифрованныхФайлов; КонецЕсли; КонецЕсли; Если ЗначениеЗаполнено(РасширениеДляЗашифрованныхФайлов) Тогда Фильтр = НСтр("ru = 'Файл (*.%1)|*.%1|Зашифрованный файл (*.%2)|*.%2'") + "|" + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Все файлы (%1)|%1'"), ПолучитьМаскуВсеФайлы()); Диалог.Фильтр = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(Фильтр, ДанныеФайла.Расширение, РасширениеДляЗашифрованныхФайлов); Иначе Фильтр = НСтр("ru = 'Файл (*.%1)|*.%1'") + "|" + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Все файлы (%1)|%1'"), ПолучитьМаскуВсеФайлы()); Диалог.Фильтр = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(Фильтр, ДанныеФайла.Расширение); КонецЕсли; КонецЕсли; Если Не Диалог.Выбрать() Тогда ВернутьРезультат(ОбработчикРезультата, Ложь); Возврат; КонецЕсли; ПутьВыбораПрежний = ПутьВыбора; ФайлНаДиске = Новый Файл(Диалог.ПолноеИмяФайла); Если ПараметрыДобавленияФайла <> Неопределено И ПараметрыДобавленияФайла.Свойство("МаксимальныйРазмер") И ПараметрыДобавленияФайла.МаксимальныйРазмер > 0 И ФайлНаДиске.Размер() > ПараметрыДобавленияФайла.МаксимальныйРазмер*1024*1024 Тогда ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = 'Размер файла превышает %1 Мб.'"), ПараметрыДобавленияФайла.МаксимальныйРазмер); ВернутьРезультатПослеПоказаПредупреждения(ОбработчикРезультата, ТекстОшибки, Ложь); Возврат; КонецЕсли; ПутьВыбора = ФайлНаДиске.Путь; Если ПустаяСтрока(ДанныеФайла.РабочийКаталогВладельца) Тогда Если ПутьВыбораПрежний <> ПутьВыбора Тогда ОбщегоНазначенияВызовСервера.ХранилищеОбщихНастроекСохранить("НастройкиПрограммы", "ПапкаДляОбновитьИзФайла", ПутьВыбора); КонецЕсли; КонецЕсли; ПараметрыВыполнения = Новый Структура; ПараметрыВыполнения.Вставить("ОбработчикРезультата", ОбработчикРезультата); ПараметрыВыполнения.Вставить("ДанныеФайла", ДанныеФайла); ПараметрыВыполнения.Вставить("ИдентификаторФормы", ИдентификаторФормы); ПараметрыВыполнения.Вставить("ДиалогПолноеИмяФайла", Диалог.ПолноеИмяФайла); ПараметрыВыполнения.Вставить("СоздатьНовуюВерсию", Неопределено); ПараметрыВыполнения.Вставить("КомментарийКВерсии", Неопределено); ПараметрыВыполнения.Вставить("ФайлНаДиске", Новый Файл(ПараметрыВыполнения.ДиалогПолноеИмяФайла)); ПараметрыВыполнения.Вставить("ИмяИРасширениеФайлаНаДиске", ПараметрыВыполнения.ФайлНаДиске.Имя); ПараметрыВыполнения.Вставить("ИмяФайла", ПараметрыВыполнения.ФайлНаДиске.ИмяБезРасширения); ПараметрыВыполнения.Вставить("ВремяИзмененияВыбранное", ПараметрыВыполнения.ФайлНаДиске.ПолучитьУниверсальноеВремяИзменения()); ПараметрыВыполнения.Вставить("РасширениеФайлаНаДиске", ОбщегоНазначенияКлиентСервер.РасширениеБезТочки(ПараметрыВыполнения.ФайлНаДиске.Расширение)); ПараметрыВыполнения.Вставить("РасширениеДляЗашифрованныхФайлов", РасширениеДляЗашифрованныхФайлов); ПараметрыВыполнения.Вставить("ФайлЗашифрован", НРег(ПараметрыВыполнения.РасширениеФайлаНаДиске) = НРег(ПараметрыВыполнения.РасширениеДляЗашифрованныхФайлов)); ПроверитьВозможностьЗагрузкиФайла(ФайлНаДиске); Если Не ПараметрыВыполнения.ФайлЗашифрован Тогда ОбновитьИзФайлаНаДискеПродолжение(ПараметрыВыполнения); Возврат; КонецЕсли; // отрезаем .p7m в конце Позиция = СтрНайти(ПараметрыВыполнения.ИмяИРасширениеФайлаНаДиске, ПараметрыВыполнения.РасширениеФайлаНаДиске); ПараметрыВыполнения.ИмяИРасширениеФайлаНаДиске = Лев(ПараметрыВыполнения.ИмяИРасширениеФайлаНаДиске, Позиция - 2); // отрезаем .p7m в конце ПараметрыВыполнения.Вставить("ДиалогПолноеИмяФайлаПрежнее", ПараметрыВыполнения.ДиалогПолноеИмяФайла); Позиция = СтрНайти(ПараметрыВыполнения.ДиалогПолноеИмяФайла, ПараметрыВыполнения.РасширениеФайлаНаДиске); ПараметрыВыполнения.ДиалогПолноеИмяФайла = Лев(ПараметрыВыполнения.ДиалогПолноеИмяФайла, Позиция - 2); ВременныйФайлНешифрованный = Новый Файл(ПараметрыВыполнения.ДиалогПолноеИмяФайла); ПараметрыВыполнения.РасширениеФайлаНаДиске = ОбщегоНазначенияКлиентСервер.РасширениеБезТочки( ВременныйФайлНешифрованный.Расширение); // Тут расшифровать и поставить ту же дату изменения, что и ДиалогПолноеИмяФайлаПрежнее. ПомещаемыеФайлы = Новый Массив; ОписаниеФайла = Новый ОписаниеПередаваемогоФайла(ПараметрыВыполнения.ДиалогПолноеИмяФайлаПрежнее); ПомещаемыеФайлы.Добавить(ОписаниеФайла); НачатьПомещениеФайлов(Новый ОписаниеОповещения("ОбновитьИзФайлаНаДискеПередРасшифровкой", ЭтотОбъект, ПараметрыВыполнения), ПомещаемыеФайлы, , Ложь, ПараметрыВыполнения.ИдентификаторФормы); КонецПроцедуры // Продолжение процедуры (см. выше). // // Параметры: // ПараметрыВыполнения - Структура: // * ДанныеФайла - см. РаботаСФайламиСлужебныйВызовСервера.ДанныеФайлаИРабочийКаталог // Процедура ОбновитьИзФайлаНаДискеПередРасшифровкой(ПомещаемыеФайлы, ПараметрыВыполнения) Экспорт Если Не ЗначениеЗаполнено(ПомещаемыеФайлы) Тогда ВернутьРезультат(ПараметрыВыполнения.ОбработчикРезультата, Ложь); Возврат; КонецЕсли; Если Не ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.ЭлектроннаяПодпись") Тогда Возврат; КонецЕсли; ОписаниеДанных = Новый Структура; ОписаниеДанных.Вставить("Операция", НСтр("ru = 'Расшифровка файла'")); ОписаниеДанных.Вставить("ЗаголовокДанных", НСтр("ru = 'Файл'")); ОписаниеДанных.Вставить("Данные", ПомещаемыеФайлы[0].Хранение); ОписаниеДанных.Вставить("Представление", ПараметрыВыполнения.ДанныеФайла.Ссылка); ОписаниеДанных.Вставить("СертификатыШифрования", Новый Массив); ОписаниеДанных.Вставить("СообщитьОЗавершении", Ложь); ОбработчикПродолжения = Новый ОписаниеОповещения("ОбновитьИзФайлаНаДискеПослеРасшифровки", ЭтотОбъект, ПараметрыВыполнения); МодульЭлектроннаяПодписьКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("ЭлектроннаяПодписьКлиент"); МодульЭлектроннаяПодписьКлиент.Расшифровать(ОписаниеДанных, , ОбработчикПродолжения); КонецПроцедуры // Продолжение процедуры (см. выше). Процедура ОбновитьИзФайлаНаДискеПослеРасшифровки(ОписаниеДанных, ПараметрыВыполнения) Экспорт Если Не ОписаниеДанных.Успех Тогда ВернутьРезультат(ПараметрыВыполнения.ОбработчикРезультата, Ложь); Возврат; КонецЕсли; Если ТипЗнч(ОписаниеДанных.РасшифрованныеДанные) = Тип("ДвоичныеДанные") Тогда АдресФайла = ПоместитьВоВременноеХранилище(ОписаниеДанных.РасшифрованныеДанные, ПараметрыВыполнения.ИдентификаторФормы); Иначе АдресФайла = ОписаниеДанных.РасшифрованныеДанные; КонецЕсли; ПараметрыВыполнения.Вставить("АдресФайла", АдресФайла); ПередаваемыеФайлы = Новый Массив; ОписаниеФайла = Новый ОписаниеПередаваемогоФайла(ПараметрыВыполнения.ДиалогПолноеИмяФайла, АдресФайла); ПередаваемыеФайлы.Добавить(ОписаниеФайла); Если Не ПолучитьФайлы(ПередаваемыеФайлы, , , Ложь) Тогда ВернутьРезультат(ПараметрыВыполнения.ОбработчикРезультата, Ложь); Возврат; КонецЕсли; УстановитьУниверсальноеВремяИзменения(ПараметрыВыполнения.ДиалогПолноеИмяФайла, ПараметрыВыполнения.ВремяИзмененияВыбранное); ПараметрыВыполнения.ФайлЗашифрован = Ложь; ОбновитьИзФайлаНаДискеПродолжение(ПараметрыВыполнения); КонецПроцедуры // Продолжение процедуры (см. выше). // // Параметры: // ПараметрыВыполнения - Структура: // * ДанныеФайла - см. РаботаСФайламиСлужебныйВызовСервера.ДанныеФайлаИРабочийКаталог // Процедура ОбновитьИзФайлаНаДискеПродолжение(ПараметрыВыполнения) ПараметрыВыполнения.ДанныеФайла = РаботаСФайламиСлужебныйВызовСервера.ДанныеФайлаИРабочийКаталог(ПараметрыВыполнения.ДанныеФайла.Ссылка); ПредыдущаяВерсия = ПараметрыВыполнения.ДанныеФайла.Версия; ИмяИРасширениеФайлаВБазе = ОбщегоНазначенияКлиентСервер.ПолучитьИмяСРасширением( ПараметрыВыполнения.ДанныеФайла.ПолноеНаименованиеВерсии, ПараметрыВыполнения.ДанныеФайла.Расширение); ОбщегоНазначенияСлужебныйКлиент.СократитьИмяФайла(ИмяИРасширениеФайлаВБазе); ПараметрыВыполнения.Вставить("ДатаФайлаВБазе", ПараметрыВыполнения.ДанныеФайла.ДатаМодификацииУниверсальная); Если ПараметрыВыполнения.ВремяИзмененияВыбранное < ПараметрыВыполнения.ДатаФайлаВБазе Тогда // В хранилище более новый. #Если МобильныйКлиент Тогда ШаблонТекстаВопроса = НСтр("ru = 'Загружаемый файл с устройства ""%1"" |имеет более раннюю дату изменения, чем файл в программе: | |%2 изменен загружаемый файл; |%3 изменен файл в программе. | |Заменить файл более старой версией с устройства?'"); #Иначе ШаблонТекстаВопроса = НСтр("ru = 'Загружаемый файл с компьютера ""%1"" |имеет более раннюю дату изменения, чем файл в программе: | |%2 изменен загружаемый файл; |%3 изменен файл в программе. | |Заменить файл более старой версией с компьютера?'"); #КонецЕсли ТекстВопроса = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ШаблонТекстаВопроса, Строка(ПараметрыВыполнения.ДанныеФайла.Ссылка), МестноеВремя(ПараметрыВыполнения.ВремяИзмененияВыбранное), МестноеВремя(ПараметрыВыполнения.ДатаФайлаВБазе)); ОписаниеОповещения = Новый ОписаниеОповещения("ОбновитьИзФайлаНаДискеСтараяВерсия", ЭтотОбъект, ПараметрыВыполнения); ПоказатьВопрос(ОписаниеОповещения, ТекстВопроса, РежимДиалогаВопрос.ДаНет); Возврат; КонецЕсли; // Проверка редактирования копии файла в рабочем каталоге. ВРабочемКаталогеНаЧтение = Истина; ВРабочемКаталогеВладельца = Ложь; ПолноеИмяФайла = ""; ФайлВРабочемКаталоге = ФайлНаходитсяВЛокальномКэшеФайлов(Неопределено, ПредыдущаяВерсия, ПолноеИмяФайла, ВРабочемКаталогеНаЧтение, ВРабочемКаталогеВладельца); #Если Не ВебКлиент И НЕ МобильныйКлиент Тогда Если ПараметрыВыполнения.ДанныеФайла.ФайлРедактируетТекущийПользователь И ФайлВРабочемКаталоге Тогда // Проверка, что файл не занят приложением. Попытка ВыбранныйФайл = Новый Файл(ПолноеИмяФайла); ТолькоЧтение = ВыбранныйФайл.ПолучитьТолькоЧтение(); ВыбранныйФайл.УстановитьТолькоЧтение(Не ТолькоЧтение); ВыбранныйФайл.УстановитьТолькоЧтение(ТолькоЧтение); Исключение ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = 'Файл ""%1"" открыт для редактирования. |Сначала необходимо закончить редактирование, а затем повторить действие.'"), ПолноеИмяФайла); ВернутьРезультатПослеПоказаПредупреждения(ПараметрыВыполнения.ОбработчикРезультата, ТекстОшибки, Неопределено); Возврат; КонецПопытки; КонецЕсли; #КонецЕсли Если ФайлВРабочемКаталоге И ПараметрыВыполнения.ИмяИРасширениеФайлаНаДиске <> ИмяИРасширениеФайлаВБазе Тогда Обработчик = Новый ОписаниеОповещения("ОбновитьИзФайлаНаДискеПослеУдаленияФайлаИзРабочегоКаталога", ЭтотОбъект, ПараметрыВыполнения); УдалитьФайлИзРабочегоКаталога(Обработчик, ПараметрыВыполнения.ДанныеФайла.ТекущаяВерсия, Истина); Возврат; КонецЕсли; ОбновитьИзФайлаНаДискеПослеУдаленияФайлаИзРабочегоКаталога(-1, ПараметрыВыполнения); КонецПроцедуры // Продолжение процедуры (см. выше). // // Параметры: // ПараметрыВыполнения - Структура: // * ДанныеФайла - см. РаботаСФайламиСлужебныйВызовСервера.ДанныеФайлаИРабочийКаталог // Процедура ОбновитьИзФайлаНаДискеСтараяВерсия(Результат, ПараметрыВыполнения) Экспорт Если Результат <> КодВозвратаДиалога.Да Тогда ВернутьРезультат(ПараметрыВыполнения.ОбработчикРезультата, Ложь); Возврат; КонецЕсли; ПараметрыВыполнения.ВремяИзмененияВыбранное = ПараметрыВыполнения.ДатаФайлаВБазе; ОбновитьИзФайлаНаДискеПродолжение(ПараметрыВыполнения); КонецПроцедуры // Продолжение процедуры (см. выше). // // Параметры: // ПараметрыВыполнения - Структура: // * ДанныеФайла - см. РаботаСФайламиСлужебныйВызовСервера.ДанныеФайлаИРабочийКаталог // Процедура ОбновитьИзФайлаНаДискеПослеУдаленияФайлаИзРабочегоКаталога(Результат, ПараметрыВыполнения) Экспорт Если Результат <> -1 Тогда Если Результат.Успех <> Истина Тогда ВернутьРезультат(ПараметрыВыполнения.ОбработчикРезультата, Ложь); Возврат; КонецЕсли; КонецЕсли; ПараметрыВыполнения.Вставить("ФайлРедактируетТекущийПользователь", ПараметрыВыполнения.ДанныеФайла.ФайлРедактируетТекущийПользователь); Если Не ПараметрыВыполнения.ДанныеФайла.ФайлРедактируетТекущийПользователь Тогда ТекстОшибки = ""; МожноЗанятьФайл = РаботаСФайламиКлиентСервер.МожноЛиЗанятьФайл(ПараметрыВыполнения.ДанныеФайла, ТекстОшибки); Если Не МожноЗанятьФайл Тогда ВернутьРезультатПослеПоказаПредупреждения(ПараметрыВыполнения.ОбработчикРезультата, ТекстОшибки, Неопределено); Возврат; КонецЕсли; ТекстОшибки = ""; ПараметрыЗанятияФайла = РаботаСФайламиСлужебныйКлиентСервер.ПараметрыЗанятияФайла(); ПараметрыЗанятияФайла.УникальныйИдентификатор = ПараметрыВыполнения.ИдентификаторФормы; ПараметрыЗанятияФайла.ВызыватьИсключение = Ложь; ФайлЗанят = РаботаСФайламиСлужебныйВызовСервера.ЗанятьФайл(ПараметрыВыполнения.ДанныеФайла, ТекстОшибки, ПараметрыЗанятияФайла); Если Не ФайлЗанят Тогда ВернутьРезультатПослеПоказаПредупреждения(ПараметрыВыполнения.ОбработчикРезультата, ТекстОшибки, Неопределено); Возврат; КонецЕсли; НаЧтение = Ложь; ВРабочемКаталогеВладельца = ПараметрыВыполнения.ДанныеФайла.РабочийКаталогВладельца <> ""; ПеререгистрироватьФайлВРабочемКаталоге(ПараметрыВыполнения.ДанныеФайла, НаЧтение, ВРабочемКаталогеВладельца); КонецЕсли; НовоеПолноеИмяФайла = ""; ПараметрыВыполнения.ДанныеФайла.Вставить("ПутьОбновленияИзФайлаНаДиске", ПараметрыВыполнения.ДиалогПолноеИмяФайла); ПараметрыВыполнения.ДанныеФайла.Расширение = ОбщегоНазначенияКлиентСервер.РасширениеБезТочки( ПараметрыВыполнения.РасширениеФайлаНаДиске); // Помещаем в рабочий каталог выбранный файл, т.к. указано свойство ПутьОбновленияИзФайлаНаДиске. Обработчик = Новый ОписаниеОповещения("ОбновитьИзФайлаНаДискеПослеПолученияФайлаВРабочийКаталог", ЭтотОбъект, ПараметрыВыполнения); ПолучитьФайлВерсииВРабочийКаталог(Обработчик, ПараметрыВыполнения.ДанныеФайла, НовоеПолноеИмяФайла, ПараметрыВыполнения.ИдентификаторФормы); КонецПроцедуры // Продолжение процедуры (см. выше). // // Параметры: // ПараметрыВыполнения - Структура: // * ДанныеФайла - см. РаботаСФайламиСлужебныйВызовСервера.ДанныеФайлаИРабочийКаталог // Процедура ОбновитьИзФайлаНаДискеПослеПолученияФайлаВРабочийКаталог(Результат, ПараметрыВыполнения) Экспорт // Обработка результата не требуется. Если ПараметрыВыполнения.ФайлЗашифрован Тогда РаботаСФайламиСлужебныйВызовСервера.УстановитьПризнакЗашифрован(ПараметрыВыполнения.ДанныеФайла.Ссылка, ПараметрыВыполнения.ФайлЗашифрован); КонецЕсли; ПереданныйПолныйПутьКФайлу = ""; Обработчик = Новый ОписаниеОповещения("ОбновитьИзФайлаНаДискеПослеЗавершенияРедактирования", ЭтотОбъект, ПараметрыВыполнения); Если ПараметрыВыполнения.ФайлРедактируетТекущийПользователь Тогда // Файл уже был занят. ПараметрыОбработчика = ПараметрыОбновленияФайла(Обработчик, ПараметрыВыполнения.ДанныеФайла.Ссылка, ПараметрыВыполнения.ИдентификаторФормы); ПараметрыОбработчика.ПереданныйПолныйПутьКФайлу = ПереданныйПолныйПутьКФайлу; ПараметрыОбработчика.СоздатьНовуюВерсию = ПараметрыВыполнения.СоздатьНовуюВерсию; ПараметрыОбработчика.КомментарийКВерсии = ПараметрыВыполнения.КомментарийКВерсии; СохранитьИзмененияФайла(ПараметрыОбработчика); Иначе ПараметрыОбработчика = ПараметрыОбновленияФайла(Обработчик, ПараметрыВыполнения.ДанныеФайла.Ссылка, ПараметрыВыполнения.ИдентификаторФормы); ПараметрыОбработчика.ХранитьВерсии = ПараметрыВыполнения.ДанныеФайла.ХранитьВерсии; ПараметрыОбработчика.ФайлРедактируетТекущийПользователь = ПараметрыВыполнения.ДанныеФайла.ФайлРедактируетТекущийПользователь; ПараметрыОбработчика.Редактирует = ПараметрыВыполнения.ДанныеФайла.Редактирует; ПараметрыОбработчика.АвторТекущейВерсии = ПараметрыВыполнения.ДанныеФайла.АвторТекущейВерсии; ПараметрыОбработчика.ПереданныйПолныйПутьКФайлу = ПереданныйПолныйПутьКФайлу; ПараметрыОбработчика.СоздатьНовуюВерсию = ПараметрыВыполнения.СоздатьНовуюВерсию; ПараметрыОбработчика.КомментарийКВерсии = ПараметрыВыполнения.КомментарийКВерсии; ЗакончитьРедактирование(ПараметрыОбработчика); КонецЕсли; КонецПроцедуры // Продолжение процедуры (см. выше). Процедура ОбновитьИзФайлаНаДискеПослеЗавершенияРедактирования(РезультатРедактирования, ПараметрыВыполнения) Экспорт Если ПараметрыВыполнения.ФайлЗашифрован Тогда УдалитьФайлБезПодтверждения(ПараметрыВыполнения.ДиалогПолноеИмяФайла); КонецЕсли; ВернутьРезультат(ПараметрыВыполнения.ОбработчикРезультата, Истина); КонецПроцедуры //////////////////////////////////////////////////////////////////////////////// // Пометка файла как занятого для редактирования. // Помечает файл, как занятый для редактирования. // // Параметры: // ОбработчикРезультата - ОписаниеОповещения // - Неопределено - описание процедуры, принимающей результат работы метода: // * Результат - Булево - Истина, если операция выполнена успешно. // * ДополнительныеПараметры - Произвольный - значение, которое было указано при создании объекта // ОписаниеОповещения. // ОбъектСсылка - СправочникСсылка.Файлы - файл. // УникальныйИдентификатор - УникальныйИдентификатор - уникальный идентификатор формы. // Процедура ЗанятьФайлПоСсылке(ОбработчикРезультата, ОбъектСсылка, УникальныйИдентификатор = Неопределено) ПараметрыОбработчика = Новый Структура; ПараметрыОбработчика.Вставить("ОбработчикРезультата", ОбработчикРезультата); ПараметрыОбработчика.Вставить("ОбъектСсылка", ОбъектСсылка); ПараметрыОбработчика.Вставить("УникальныйИдентификатор", УникальныйИдентификатор); Обработчик = Новый ОписаниеОповещения("ЗанятьФайлПоСсылкеПослеУстановкиРасширения", ЭтотОбъект, ПараметрыОбработчика); ПоказатьВопросОбУстановкеРасширенияРаботыСФайлами(Обработчик); КонецПроцедуры // Продолжение процедуры (см. выше). Процедура ЗанятьФайлПоСсылкеПослеУстановкиРасширения(РасширениеУстановлено, ПараметрыВыполнения) Экспорт ПараметрыВыполнения.Вставить("ДанныеФайла", Неопределено); ТекстОшибки = ""; ДанныеФайлаПолученыИОнЗанят = РаботаСФайламиСлужебныйВызовСервера.ПолучитьДанныеФайлаИЗанятьФайл( ПараметрыВыполнения.ОбъектСсылка, ПараметрыВыполнения.ДанныеФайла, ТекстОшибки, ПараметрыВыполнения.УникальныйИдентификатор); Если Не ДанныеФайлаПолученыИОнЗанят Тогда // Если занять нельзя, тогда выводится сообщение об ошибке. ВернутьРезультатПослеПоказаПредупреждения(ПараметрыВыполнения.ОбработчикРезультата, ТекстОшибки, Ложь); Возврат; КонецЕсли; Если РасширениеРаботыСФайламиПодключено() Тогда НаЧтение = Ложь; ВРабочемКаталогеВладельца = ПараметрыВыполнения.ДанныеФайла.РабочийКаталогВладельца <> ""; ПеререгистрироватьФайлВРабочемКаталоге(ПараметрыВыполнения.ДанныеФайла, НаЧтение, ВРабочемКаталогеВладельца); КонецЕсли; ДанныеФайла = ПараметрыВыполнения.ДанныеФайла; // см. РаботаСФайламиСлужебныйВызовСервера.ДанныеФайла ПоказатьОповещениеПользователя( НСтр("ru = 'Редактирование файла'"), ПараметрыВыполнения.ДанныеФайла.НавигационнаяСсылка, СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = 'Файл ""%1"" |занят для редактирования.'"), Строка(ДанныеФайла.Ссылка)), БиблиотекаКартинок.Информация32); ИзменитьКоличествоЗанятыхФайлов(1); ВернутьРезультат(ПараметрыВыполнения.ОбработчикРезультата, Истина); КонецПроцедуры //////////////////////////////////////////////////////////////////////////////// // Пометка файлов как занятых для редактирования. // Помечает файлы, как занятые для редактирования. // // Параметры: // ОбработчикРезультата - ОписаниеОповещения // - Неопределено - описание процедуры, принимающей результат работы метода. // МассивФайлов - Массив - массив файлов. // Процедура ЗанятьФайлыПоСсылкам(ОбработчикРезультата, Знач МассивФайлов) ПараметрыОбработчика = Новый Структура; ПараметрыОбработчика.Вставить("ОбработчикРезультата", ОбработчикРезультата); ПараметрыОбработчика.Вставить("МассивФайлов", МассивФайлов); Обработчик = Новый ОписаниеОповещения("ЗанятьФайлыПоСсылкамПослеУстановкиРасширения", ЭтотОбъект, ПараметрыОбработчика); ПоказатьВопросОбУстановкеРасширенияРаботыСФайлами(Обработчик); КонецПроцедуры // Продолжение процедуры (см. выше). Процедура ЗанятьФайлыПоСсылкамПослеУстановкиРасширения(РасширениеУстановлено, ПараметрыВыполнения) Экспорт // Получение массива данных файлов. ДанныеФайлов = Новый Массив; РаботаСФайламиСлужебныйВызовСервера.ПолучитьДанныеДляМассиваФайлов(ПараметрыВыполнения.МассивФайлов, ДанныеФайлов); ВГраницаМассива = ДанныеФайлов.ВГраница(); Для Инд = 0 По ВГраницаМассива Цикл ДанныеФайла = ДанныеФайлов[ВГраницаМассива - Инд]; СтрокаОшибки = ""; Если Не РаботаСФайламиКлиентСервер.МожноЛиЗанятьФайл(ДанныеФайла, СтрокаОшибки) Или ЗначениеЗаполнено(ДанныеФайла.Редактирует) Тогда // Занять невозможно. ДанныеФайлов.Удалить(ВГраницаМассива - Инд); КонецЕсли; КонецЦикла; // Занять файлы. КоличествоЗанятых = 0; Для Каждого ДанныеФайла Из ДанныеФайлов Цикл Если Не РаботаСФайламиСлужебныйВызовСервера.ЗанятьФайл(ДанныеФайла, "") Тогда Продолжить; КонецЕсли; Если РасширениеРаботыСФайламиПодключено() Тогда НаЧтение = Ложь; ВРабочемКаталогеВладельца = ДанныеФайла.РабочийКаталогВладельца <> ""; ПеререгистрироватьФайлВРабочемКаталоге(ДанныеФайла, НаЧтение, ВРабочемКаталогеВладельца); КонецЕсли; КоличествоЗанятых = КоличествоЗанятых + 1; КонецЦикла; ПоказатьОповещениеПользователя( НСтр("ru = 'Занять файлы'"), , СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = 'Файлы (%1 из %2) заняты для редактирования.'"), КоличествоЗанятых, ПараметрыВыполнения.МассивФайлов.Количество()), БиблиотекаКартинок.Информация32); ИзменитьКоличествоЗанятыхФайлов(ДанныеФайлов.Количество()); ВернутьРезультат(ПараметрыВыполнения.ОбработчикРезультата, Истина); КонецПроцедуры //////////////////////////////////////////////////////////////////////////////// // Открытие файла для редактирования по ссылке. // Открывает файл для редактирования. // // Параметры: // ОбработчикРезультата - ОписаниеОповещения // - Неопределено - описание процедуры, принимающей результат работы метода. // ОбъектСсылка - СправочникСсылка.Файлы - файл. // УникальныйИдентификатор - УникальныйИдентификатор - идентификатор формы. // РабочийКаталогВладельца - Строка - рабочий каталог владельца. // Процедура РедактироватьФайлПоСсылке(ОбработчикРезультата, ОбъектСсылка, УникальныйИдентификатор = Неопределено, РабочийКаталогВладельца = Неопределено) ПараметрыОбработчика = Новый Структура; ПараметрыОбработчика.Вставить("ОбработчикРезультата", ОбработчикРезультата); ПараметрыОбработчика.Вставить("ОбъектСсылка", ОбъектСсылка); ПараметрыОбработчика.Вставить("УникальныйИдентификатор", УникальныйИдентификатор); ПараметрыОбработчика.Вставить("РабочийКаталогВладельца", РабочийКаталогВладельца); Обработчик = Новый ОписаниеОповещения("РедактироватьФайлПоСсылкеПослеУстановкиРасширения", ЭтотОбъект, ПараметрыОбработчика); ПоказатьВопросОбУстановкеРасширенияРаботыСФайлами(Обработчик); КонецПроцедуры // Продолжение процедуры (см. выше). Процедура РедактироватьФайлПоСсылкеПослеУстановкиРасширения(РасширениеУстановлено, ПараметрыВыполнения) Экспорт ПараметрыВыполнения.Вставить("ДанныеФайла", Неопределено); ПараметрыВыполнения.Вставить("РасширениеПодключено", РасширениеРаботыСФайламиПодключено()); ПараметрыВыполнения.Вставить("ФайлУжеРедактируетТекущийПользователь", Ложь); Результат = РаботаСФайламиСлужебныйВызовСервера.ЗанятьФайлДляРедактирования(ПараметрыВыполнения.ОбъектСсылка, ПараметрыВыполнения.УникальныйИдентификатор, ПараметрыВыполнения.РабочийКаталогВладельца); ПараметрыВыполнения.ДанныеФайла = Результат.ДанныеФайла; ПараметрыВыполнения.ФайлУжеРедактируетТекущийПользователь = Результат.ФайлУжеРедактируетТекущийПользователь; Если Не Результат.ДанныеПолучены Тогда СтандартнаяОбработка = Истина; РаботаСФайламиКлиентПереопределяемый.ПриОшибкеЗахватаФайла(ПараметрыВыполнения.ДанныеФайла, СтандартнаяОбработка); Если СтандартнаяОбработка Тогда // Если занять нельзя, тогда выводится сообщение об ошибке. ВернутьРезультатПослеПоказаПредупреждения(ПараметрыВыполнения.ОбработчикРезультата, Результат.ТекстСообщения, Ложь); Возврат; КонецЕсли; ВернутьРезультат(ПараметрыВыполнения.ОбработчикРезультата, Истина); Возврат; КонецЕсли; Если Не ПараметрыВыполнения.ФайлУжеРедактируетТекущийПользователь Тогда ИзменитьКоличествоЗанятыхФайлов(1); КонецЕсли; Если ПараметрыВыполнения.РасширениеПодключено Тогда НаЧтение = Ложь; ВРабочемКаталогеВладельца = ПараметрыВыполнения.ДанныеФайла.РабочийКаталогВладельца <> ""; ПеререгистрироватьФайлВРабочемКаталоге(ПараметрыВыполнения.ДанныеФайла, НаЧтение, ВРабочемКаталогеВладельца); КонецЕсли; ДанныеФайла = ПараметрыВыполнения.ДанныеФайла; // см. РаботаСФайламиСлужебныйВызовСервера.ДанныеФайла ПоказатьОповещениеПользователя(НСтр("ru = 'Редактирование файла'"), ПараметрыВыполнения.ДанныеФайла.НавигационнаяСсылка, СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = 'Файл ""%1"" |занят для редактирования.'"), Строка(ДанныеФайла.Ссылка)), БиблиотекаКартинок.Информация32); Если ПараметрыВыполнения.ДанныеФайла.Версия.Пустая() Тогда ВернутьРезультатПослеПоказаЗначения(ПараметрыВыполнения.ОбработчикРезультата, ДанныеФайла.Ссылка, Истина); Возврат; КонецЕсли; Если ПараметрыВыполнения.РасширениеПодключено Тогда Обработчик = Новый ОписаниеОповещения("РедактироватьФайлПоСсылкеСРасширениемПослеПолученияФайлаВРабочийКаталог", ЭтотОбъект, ПараметрыВыполнения); ПолучитьФайлВерсииВРабочийКаталог(Обработчик, ПараметрыВыполнения.ДанныеФайла, "", ПараметрыВыполнения.УникальныйИдентификатор); Иначе ЗаполнитьВременныйИдентификаторФормы(ПараметрыВыполнения.УникальныйИдентификатор, ПараметрыВыполнения); Обработчик = Новый ОписаниеОповещения("РедактироватьФайлПоСсылкеЗавершение", ЭтотОбъект, ПараметрыВыполнения); ОткрытьФайлБезРасширения(Обработчик, ПараметрыВыполнения.ДанныеФайла, ПараметрыВыполнения.УникальныйИдентификатор); КонецЕсли; КонецПроцедуры // Продолжение процедуры (см. выше). Процедура РедактироватьФайлПоСсылкеСРасширениемПослеПолученияФайлаВРабочийКаталог(Результат, ПараметрыВыполнения) Экспорт Если Результат.ФайлПолучен = Истина Тогда УникальныйИдентификатор = ?(ПараметрыВыполнения.Свойство("УникальныйИдентификатор"), ПараметрыВыполнения.УникальныйИдентификатор, Неопределено); ОткрытьФайлПриложением(ПараметрыВыполнения.ДанныеФайла, Результат.ПолноеИмяФайла, УникальныйИдентификатор); КонецЕсли; ФайлУжеРедактируетТекущийПользователь = Ложь; Если Не ПараметрыВыполнения.ФайлУжеРедактируетТекущийПользователь Тогда ФайлУжеРедактируетТекущийПользователь = Истина; КонецЕсли; ВернутьРезультат(ПараметрыВыполнения.ОбработчикРезультата, ФайлУжеРедактируетТекущийПользователь); КонецПроцедуры // Продолжение процедуры (см. выше). Процедура РедактироватьФайлПоСсылкеЗавершение(Результат, ПараметрыВыполнения) Экспорт ОчиститьВременныйИдентификаторФормы(ПараметрыВыполнения); ВернутьРезультат(ПараметрыВыполнения.ОбработчикРезультата, Результат = Истина); КонецПроцедуры //////////////////////////////////////////////////////////////////////////////// // Открытие файла для редактирования. // Открывает файл для редактирования. // // Параметры: // ОбработчикРезультата - ОписаниеОповещения // - Неопределено - описание процедуры, принимающей результат работы метода. // ДанныеФайла - Структура // УникальныйИдентификатор - УникальныйИдентификатор формы. // Процедура РедактироватьФайл(ОбработчикРезультата, ДанныеФайла, УникальныйИдентификатор = Неопределено) Экспорт ПараметрыОбработчика = Новый Структура; ПараметрыОбработчика.Вставить("ОбработчикРезультата", ОбработчикРезультата); ПараметрыОбработчика.Вставить("ДанныеФайла", ДанныеФайла); ПараметрыОбработчика.Вставить("УникальныйИдентификатор", УникальныйИдентификатор); Обработчик = Новый ОписаниеОповещения("РедактироватьФайлПослеУстановкиРасширения", ЭтотОбъект, ПараметрыОбработчика); ПоказатьВопросОбУстановкеРасширенияРаботыСФайлами(Обработчик); КонецПроцедуры // Продолжение процедуры (см. выше). Процедура РедактироватьФайлПослеУстановкиРасширения(РасширениеУстановлено, ПараметрыВыполнения) Экспорт ТекстОшибки = ""; МожноЗанятьФайл = РаботаСФайламиКлиентСервер.МожноЛиЗанятьФайл( ПараметрыВыполнения.ДанныеФайла, ТекстОшибки); Если Не МожноЗанятьФайл Тогда ВернутьРезультатПослеПоказаПредупреждения(ПараметрыВыполнения.ОбработчикРезультата, ТекстОшибки, Ложь); Возврат; КонецЕсли; // Если Файл не занят, тогда занять файл. Если Не ЗначениеЗаполнено(ПараметрыВыполнения.ДанныеФайла.Редактирует) Тогда Обработчик = Новый ОписаниеОповещения("РедактироватьФайлПослеЗанятияФайла", ЭтотОбъект, ПараметрыВыполнения); ЗанятьФайл(Обработчик, ПараметрыВыполнения.ДанныеФайла, ПараметрыВыполнения.УникальныйИдентификатор); Возврат; КонецЕсли; РедактироватьФайлПослеЗанятияФайла(-1, ПараметрыВыполнения); КонецПроцедуры // Продолжение процедуры (см. выше). // // Параметры: // ДанныеФайла - см. РаботаСФайламиСлужебныйВызовСервера.ДанныеФайлаДляОткрытия // ПараметрыВыполнения - Структура: // * ДанныеФайла - см. РаботаСФайламиСлужебныйВызовСервера.ДанныеФайлаДляОткрытия // Процедура РедактироватьФайлПослеЗанятияФайла(ДанныеФайла, ПараметрыВыполнения) Экспорт Если ДанныеФайла = Неопределено Тогда ВернутьРезультат(ПараметрыВыполнения.ОбработчикРезультата, Ложь); Возврат; КонецЕсли; Если ДанныеФайла <> -1 Тогда ПараметрыВыполнения.ДанныеФайла = ДанныеФайла; КонецЕсли; // Если Файл без файла, тогда открыть карточку. Если ПараметрыВыполнения.ДанныеФайла.Версия.Пустая() Тогда ВернутьРезультатПослеПоказаЗначения( ПараметрыВыполнения.ОбработчикРезультата, ПараметрыВыполнения.ДанныеФайла.Ссылка, Истина); Возврат; КонецЕсли; Если РасширениеРаботыСФайламиПодключено() Тогда Обработчик = Новый ОписаниеОповещения( "РедактироватьФайлСРасширениемПослеПолученияФайлаВРабочийКаталог", ЭтотОбъект, ПараметрыВыполнения); ПолучитьФайлВерсииВРабочийКаталог( Обработчик, ПараметрыВыполнения.ДанныеФайла, "", ПараметрыВыполнения.УникальныйИдентификатор); Иначе ЗаполнитьВременныйИдентификаторФормы(ПараметрыВыполнения.УникальныйИдентификатор, ПараметрыВыполнения); Обработчик = Новый ОписаниеОповещения("РедактироватьФайлБезРасширенияЗавершение", ЭтотОбъект, ПараметрыВыполнения); ОткрытьФайлБезРасширения(Обработчик, ПараметрыВыполнения.ДанныеФайла, ПараметрыВыполнения.УникальныйИдентификатор); КонецЕсли; КонецПроцедуры // Продолжение процедуры (см. выше). Процедура РедактироватьФайлСРасширениемПослеПолученияФайлаВРабочийКаталог(Результат, ПараметрыВыполнения) Экспорт Если Результат.ФайлПолучен = Истина Тогда УникальныйИдентификатор = ?(ПараметрыВыполнения.Свойство("УникальныйИдентификатор"), ПараметрыВыполнения.УникальныйИдентификатор, Неопределено); ОткрытьФайлПриложением(ПараметрыВыполнения.ДанныеФайла, Результат.ПолноеИмяФайла, УникальныйИдентификатор); КонецЕсли; ВернутьРезультат(ПараметрыВыполнения.ОбработчикРезультата, Результат.ФайлПолучен = Истина); КонецПроцедуры // Продолжение процедуры (см. выше). Процедура РедактироватьФайлБезРасширенияЗавершение(Результат, ПараметрыВыполнения) Экспорт ОчиститьВременныйИдентификаторФормы(ПараметрыВыполнения); ВернутьРезультат(ПараметрыВыполнения.ОбработчикРезультата, Результат = Истина); КонецПроцедуры //////////////////////////////////////////////////////////////////////////////// // Открытие версии файла. // Продолжение процедуры (см. выше). // // Параметры: // РасширениеУстановлено - Булево // ПараметрыВыполнения - Структура: // * ДанныеФайла - см. РаботаСФайламиСлужебныйВызовСервера.ДанныеФайлаДляОткрытия // Процедура ОткрытьВерсиюФайлаПослеУстановкиРасширения(РасширениеУстановлено, ПараметрыВыполнения) Экспорт Если РасширениеРаботыСФайламиПодключено() Тогда Обработчик = Новый ОписаниеОповещения("ОткрытьВерсиюФайлаПослеПолученияФайлаВРабочийКаталог", ЭтотОбъект, ПараметрыВыполнения); ПолучитьФайлВерсииВРабочийКаталог( Обработчик, ПараметрыВыполнения.ДанныеФайла, "", ПараметрыВыполнения.УникальныйИдентификатор); Иначе Адрес = РаботаСФайламиСлужебныйВызовСервера.ПолучитьНавигационнуюСсылкуДляОткрытия( ПараметрыВыполнения.ДанныеФайла.Версия, ПараметрыВыполнения.УникальныйИдентификатор); ИмяФайла = ОбщегоНазначенияКлиентСервер.ПолучитьИмяСРасширением( ПараметрыВыполнения.ДанныеФайла.ПолноеНаименованиеВерсии, ПараметрыВыполнения.ДанныеФайла.Расширение); ПолучитьФайл(Адрес, ИмяФайла, Истина); ВернутьРезультат(ПараметрыВыполнения.ОбработчикРезультата, Неопределено); КонецЕсли; КонецПроцедуры // Продолжение процедуры (см. выше). Процедура ОткрытьВерсиюФайлаПослеПолученияФайлаВРабочийКаталог(Результат, ПараметрыВыполнения) Экспорт Если Результат.ФайлПолучен Тогда УникальныйИдентификатор = ?(ПараметрыВыполнения.Свойство("УникальныйИдентификатор"), ПараметрыВыполнения.УникальныйИдентификатор, Неопределено); ОткрытьФайлПриложением(ПараметрыВыполнения.ДанныеФайла, Результат.ПолноеИмяФайла, УникальныйИдентификатор); КонецЕсли; ВернутьРезультат(ПараметрыВыполнения.ОбработчикРезультата, Неопределено); КонецПроцедуры //////////////////////////////////////////////////////////////////////////////// // Освобождение файлов без обновления. // Освобождает файлы без обновления. // // Параметры: // ОбработчикРезультата - ОписаниеОповещения // - Неопределено - описание процедуры, принимающей результат работы метода. // МассивФайлов - Массив - массив файлов. // Процедура ОсвободитьФайлыПоСсылкам(ОбработчикРезультата, Знач МассивФайлов) ПараметрыОбработчика = Новый Структура; ПараметрыОбработчика.Вставить("ОбработчикРезультата", ОбработчикРезультата); ПараметрыОбработчика.Вставить("МассивФайлов", МассивФайлов); Обработчик = Новый ОписаниеОповещения("ОсвободитьФайлыПоСсылкамПослеУстановкиРасширения", ЭтотОбъект, ПараметрыОбработчика); ПоказатьВопросОбУстановкеРасширенияРаботыСФайлами(Обработчик); КонецПроцедуры // Продолжение процедуры (см. выше). Процедура ОсвободитьФайлыПоСсылкамПослеУстановкиРасширения(РасширениеУстановлено, ПараметрыВыполнения) Экспорт // Получение массива данных файлов. ПараметрыВыполнения.Вставить("ДанныеФайлов", Новый Массив); РаботаСФайламиСлужебныйВызовСервера.ПолучитьДанныеДляМассиваФайлов(ПараметрыВыполнения.МассивФайлов, ПараметрыВыполнения.ДанныеФайлов); ВГраницаМассива = ПараметрыВыполнения.ДанныеФайлов.ВГраница(); // Проверка возможности освобождения файлов. Для Инд = 0 По ВГраницаМассива Цикл ДанныеФайла = ПараметрыВыполнения.ДанныеФайлов[ВГраницаМассива - Инд]; // см. РаботаСФайламиСлужебныйВызовСервера.ДанныеФайла ТекстОшибки = ""; МожноОсвободитьФайл = ВозможностьОсвободитьФайл( ДанныеФайла.Ссылка, ДанныеФайла.ФайлРедактируетТекущийПользователь, ДанныеФайла.Редактирует, ТекстОшибки); Если Не МожноОсвободитьФайл Тогда ПараметрыВыполнения.ДанныеФайлов.Удалить(ВГраницаМассива - Инд); КонецЕсли; КонецЦикла; Если Не РасширениеРаботыСФайламиПодключено() Тогда Возврат; КонецЕсли; Обработчик = Новый ОписаниеОповещения("ОсвободитьФайлыПоСсылкамПослеОтветаНаВопросОтменитьРедактирование", ЭтотОбъект, ПараметрыВыполнения); ПоказатьВопрос( Обработчик, НСтр("ru = 'Отмена редактирования файлов может |привести к потере Ваших изменений. | |Продолжить?'"), РежимДиалогаВопрос.ДаНет, , КодВозвратаДиалога.Нет); КонецПроцедуры // Продолжение процедуры (см. выше). // // Параметры: // Ответ - КодВозвратаДиалога // - Неопределено // ПараметрыВыполнения - Структура: // * ДанныеФайлов - Массив из см. РаботаСФайлами.ДанныеФайла // Процедура ОсвободитьФайлыПоСсылкамПослеОтветаНаВопросОтменитьРедактирование(Ответ, ПараметрыВыполнения) Экспорт Если Ответ <> КодВозвратаДиалога.Да Тогда ВернутьРезультат(ПараметрыВыполнения.ОбработчикРезультата, Неопределено); Возврат; КонецЕсли; // Занятие файлов. Для Каждого ДанныеФайла Из ПараметрыВыполнения.ДанныеФайлов Цикл Параметры = ПараметрыОсвобожденияФайла(Неопределено, ДанныеФайла.Ссылка); Параметры.ХранитьВерсии = ДанныеФайла.ХранитьВерсии; Параметры.ФайлРедактируетТекущийПользователь = ДанныеФайла.ФайлРедактируетТекущийПользователь; Параметры.Редактирует = ДанныеФайла.Редактирует; Параметры.НеЗадаватьВопрос = Истина; ОсвободитьФайл(Параметры); КонецЦикла; ПоказатьОповещениеПользователя( НСтр("ru = 'Отменить редактирование файлов'"),, СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = 'Отменено редактирование файлов (%1 из %2).'"), ПараметрыВыполнения.ДанныеФайлов.Количество(), ПараметрыВыполнения.МассивФайлов.Количество()), БиблиотекаКартинок.Информация32); ВернутьРезультат(ПараметрыВыполнения.ОбработчикРезультата, Неопределено); КонецПроцедуры //////////////////////////////////////////////////////////////////////////////// // Освобождение файла без обновления. // Возвращаемое значение: // Структура: // * ОбработчикРезультата - ОписаниеОповещения // - Неопределено - описание процедуры, принимающей результат работы // метода. // * ОбъектСсылка - СправочникСсылка.Файлы - файл. // * Версия - СправочникСсылка.ВерсииФайлов - версия файла. // * ХранитьВерсии - Булево - хранить версии. // * РедактируетТекущийПользователь - Булево - файл редактирует текущий пользователь. // * Редактирует - СправочникСсылка.Пользователи - кто занял файл. // * УникальныйИдентификатор - УникальныйИдентификатор - идентификатор управляемой формы. // * НеЗадаватьВопрос - Булево - не задавать вопрос "Отмена редактирования файла // может привести к потере Ваших изменений. Продолжить?". // Функция ПараметрыОсвобожденияФайла(ОбработчикРезультата, ОбъектСсылка) Экспорт ПараметрыОбработчика = Новый Структура; ПараметрыОбработчика.Вставить("ОбработчикРезультата", ОбработчикРезультата); ПараметрыОбработчика.Вставить("ОбъектСсылка", ОбъектСсылка); ПараметрыОбработчика.Вставить("Версия"); ПараметрыОбработчика.Вставить("ХранитьВерсии"); ПараметрыОбработчика.Вставить("ФайлРедактируетТекущийПользователь"); ПараметрыОбработчика.Вставить("Редактирует"); ПараметрыОбработчика.Вставить("УникальныйИдентификатор"); ПараметрыОбработчика.Вставить("НеЗадаватьВопрос", Ложь); Возврат ПараметрыОбработчика; КонецФункции // Освобождает файл без обновления. // // Параметры: // ПараметрыОсвобожденияФайла - см. ПараметрыОсвобожденияФайла. // Процедура ОсвободитьФайл(ПараметрыОсвобожденияФайла) Обработчик = Новый ОписаниеОповещения("ОсвободитьФайлПослеУстановкиРасширения", ЭтотОбъект, ПараметрыОсвобожденияФайла); ПоказатьВопросОбУстановкеРасширенияРаботыСФайлами(Обработчик); КонецПроцедуры // Продолжение процедуры (см. выше). Процедура ОсвободитьФайлПослеУстановкиРасширения(РасширениеУстановлено, ПараметрыВыполнения) Экспорт ПараметрыВыполнения.Вставить("ДанныеФайла", Неопределено); ПараметрыВыполнения.Вставить("ПродолжитьРаботу", Истина); Если ПараметрыВыполнения.ХранитьВерсии = Неопределено Тогда ПараметрыДанныхФайла = РаботаСФайламиКлиентСервер.ПараметрыДанныхФайла(); ПараметрыДанныхФайла.ПолучатьСсылкуНаДвоичныеДанные = Ложь; ДанныеФайла = РаботаСФайламиСлужебныйВызовСервера.ДанныеФайла( ?(ПараметрыВыполнения.ОбъектСсылка <> Неопределено, ПараметрыВыполнения.ОбъектСсылка, ПараметрыВыполнения.Версия),,ПараметрыДанныхФайла); Если НЕ ЗначениеЗаполнено(ПараметрыВыполнения.ОбъектСсылка) Тогда ПараметрыВыполнения.ОбъектСсылка = ДанныеФайла.Ссылка; КонецЕсли; ПараметрыВыполнения.ХранитьВерсии = ДанныеФайла.ХранитьВерсии; ПараметрыВыполнения.ФайлРедактируетТекущийПользователь = ДанныеФайла.ФайлРедактируетТекущийПользователь; ПараметрыВыполнения.Редактирует = ДанныеФайла.Редактирует; ПараметрыВыполнения.ДанныеФайла = ДанныеФайла; КонецЕсли; // Проверка возможности освобождения файла. ТекстОшибки = ""; МожноОсвободитьФайл = ВозможностьОсвободитьФайл( ПараметрыВыполнения.ОбъектСсылка, ПараметрыВыполнения.ФайлРедактируетТекущийПользователь, ПараметрыВыполнения.Редактирует, ТекстОшибки); Если Не МожноОсвободитьФайл Тогда ВернутьРезультатПослеПоказаПредупреждения(ПараметрыВыполнения.ОбработчикРезультата, ТекстОшибки, Ложь); Возврат; КонецЕсли; Если ПараметрыВыполнения.НеЗадаватьВопрос = Ложь Тогда ПараметрыВыполнения.ОбработчикРезультата = ОбработчикЗавершения(ПараметрыВыполнения.ОбработчикРезультата); Обработчик = Новый ОписаниеОповещения("ОсвободитьФайлПослеОтветаНаВопросОтменаРедактирования", ЭтотОбъект, ПараметрыВыполнения); ТекстВопроса = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = 'Отмена редактирования файла |""%1"" |может привести к потере внесенных изменений. | |Продолжить?'"), Строка(ПараметрыВыполнения.ОбъектСсылка)); ПоказатьВопрос(Обработчик, ТекстВопроса, РежимДиалогаВопрос.ДаНет, , КодВозвратаДиалога.Нет); Возврат; КонецЕсли; ОсвободитьФайлПослеОтветаНаВопросОтменаРедактирования(-1, ПараметрыВыполнения); КонецПроцедуры // Продолжение процедуры (см. выше). Процедура ОсвободитьФайлПослеОтветаНаВопросОтменаРедактирования(Ответ, ПараметрыВыполнения) Экспорт Если Ответ <> -1 Тогда Если Ответ = КодВозвратаДиалога.Да Тогда ПараметрыВыполнения.ПродолжитьРаботу = Истина; Иначе ПараметрыВыполнения.ПродолжитьРаботу = Ложь; КонецЕсли; КонецЕсли; Если ПараметрыВыполнения.ПродолжитьРаботу Тогда РаботаСФайламиСлужебныйВызовСервера.ПолучитьДанныеФайлаИОсвободитьФайл(ПараметрыВыполнения.ОбъектСсылка, ПараметрыВыполнения.ДанныеФайла, ПараметрыВыполнения.УникальныйИдентификатор); ОповеститьОбИзменении(ТипЗнч(ПараметрыВыполнения.ОбъектСсылка)); Оповестить("Запись_Файл", ПараметрыОповещенияЗаписиФайла("ДанныеФайлаИзменены"), ПараметрыВыполнения.ОбъектСсылка); Если РасширениеРаботыСФайламиПодключено() Тогда НаЧтение = Истина; ВРабочемКаталогеВладельца = ПараметрыВыполнения.ДанныеФайла.РабочийКаталогВладельца <> ""; ПеререгистрироватьФайлВРабочемКаталоге(ПараметрыВыполнения.ДанныеФайла, НаЧтение, ВРабочемКаталогеВладельца); КонецЕсли; Если Не ПараметрыВыполнения.НеЗадаватьВопрос Тогда ПоказатьОповещениеПользователя( НСтр("ru = 'Файл освобожден'"), ПараметрыВыполнения.ДанныеФайла.НавигационнаяСсылка, ПараметрыВыполнения.ДанныеФайла.ПолноеНаименованиеВерсии, БиблиотекаКартинок.Информация32); КонецЕсли; ИзменитьКоличествоЗанятыхФайлов(); КонецЕсли; ВернутьРезультат(ПараметрыВыполнения.ОбработчикРезультата, Истина); КонецПроцедуры //////////////////////////////////////////////////////////////////////////////// // Запись изменений файла. // Начало записи изменений файла. // // Параметры: // ПараметрыОбновленияФайла - см. ПараметрыОбновленияФайла. // Процедура СохранитьИзмененияФайла(ПараметрыОбновленияФайла) Обработчик = Новый ОписаниеОповещения("СохранитьИзмененияФайлаПослеУстановкиРасширения", ЭтотОбъект, ПараметрыОбновленияФайла); ПоказатьВопросОбУстановкеРасширенияРаботыСФайлами(Обработчик); КонецПроцедуры // Продолжение процедуры (см. выше). Процедура СохранитьИзмененияФайлаПослеУстановкиРасширения(РасширениеУстановлено, ПараметрыВыполнения) Экспорт ПараметрыВыполнения.Вставить("ДанныеФайла", Неопределено); ПараметрыВыполнения.Вставить("АдресВременногоХранилища", Неопределено); ПараметрыВыполнения.Вставить("ПолныйПутьКФайлу", Неопределено); Если РасширениеРаботыСФайламиПодключено() Тогда СохранитьИзмененияФайлаСРасширением(ПараметрыВыполнения); Иначе СохранитьИзмененияФайлаБезРасширения(ПараметрыВыполнения); КонецЕсли; КонецПроцедуры // Продолжение процедуры (см. выше). Процедура СохранитьИзмененияФайлаСРасширением(ПараметрыВыполнения) // Код для тонкого клиента, толстого клиента и веб-клиента с подключенным расширением. ДанныеФайла = РаботаСФайламиСлужебныйВызовСервера.ДанныеФайлаИРабочийКаталог(ПараметрыВыполнения.ОбъектСсылка); ПараметрыВыполнения.ДанныеФайла = ДанныеФайла; ПараметрыВыполнения.ХранитьВерсии = ДанныеФайла.ХранитьВерсии; // Проверка возможности освобождения файла. ТекстОшибки = ""; МожноОсвободитьФайл = ВозможностьОсвободитьФайл( ДанныеФайла.Ссылка, ДанныеФайла.ФайлРедактируетТекущийПользователь, ДанныеФайла.Редактирует, ТекстОшибки); Если Не МожноОсвободитьФайл Тогда ВернутьРезультатПослеПоказаПредупреждения(ПараметрыВыполнения.ОбработчикРезультата, ТекстОшибки, Ложь); Возврат; КонецЕсли; ПараметрыВыполнения.ПолныйПутьКФайлу = ПараметрыВыполнения.ПереданныйПолныйПутьКФайлу; Если ПараметрыВыполнения.ПолныйПутьКФайлу = "" Тогда ПараметрыВыполнения.ПолныйПутьКФайлу = ДанныеФайла.ПолноеИмяФайлаВРабочемКаталоге; КонецЕсли; // Проверка наличия файла на компьютере. ПараметрыВыполнения.Вставить("ФайлНовойВерсии", Новый Файл(ПараметрыВыполнения.ПолныйПутьКФайлу)); Если Не ПараметрыВыполнения.ФайлНовойВерсии.Существует() Тогда Если Не ПустаяСтрока(ПараметрыВыполнения.ПолныйПутьКФайлу) Тогда СтрокаПредупреждения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = 'Не удалось поместить файл ""%1"" |в программу, так как он не существует на компьютере: |%2. | |Освободить файл?'"), Строка(ДанныеФайла.Ссылка), ПараметрыВыполнения.ПолныйПутьКФайлу); Иначе СтрокаПредупреждения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = 'Не удалось поместить файл ""%1"" |в программу, так как он не существует на компьютере. | |Освободить файл?'"), Строка(ДанныеФайла.Ссылка)); КонецЕсли; Обработчик = Новый ОписаниеОповещения("СохранитьИзмененияФайлаСРасширениемПослеОтветаНаВопросОсвободитьФайл", ЭтотОбъект, ПараметрыВыполнения); ПоказатьВопрос(Обработчик, СтрокаПредупреждения, РежимДиалогаВопрос.ДаНет); Возврат; КонецЕсли; // Запрос комментария и признака хранения версии. Если ПараметрыВыполнения.СоздатьНовуюВерсию = Неопределено Тогда ПараметрыВыполнения.СоздатьНовуюВерсию = Истина; СоздатьНовуюВерсиюДоступность = Истина; Если ДанныеФайла.ХранитьВерсии Тогда ПараметрыВыполнения.СоздатьНовуюВерсию = Истина; // Если автор текущей версии не текущий пользователь, тогда // отключается доступность флажка "Не создавать новую версию". Если ДанныеФайла.АвторТекущейВерсии <> ДанныеФайла.Редактирует Тогда СоздатьНовуюВерсиюДоступность = Ложь; Иначе СоздатьНовуюВерсиюДоступность = Истина; КонецЕсли; Иначе ПараметрыВыполнения.СоздатьНовуюВерсию = Ложь; СоздатьНовуюВерсиюДоступность = Ложь; СохранитьИзмененияФайлаСРасширениемПослеПроверкиНовойВерсии(ПараметрыВыполнения); Возврат; КонецЕсли; СтруктураПараметров = Новый Структура; СтруктураПараметров.Вставить("ФайлСсылка", ДанныеФайла.Ссылка); СтруктураПараметров.Вставить("КомментарийКВерсии", ""); СтруктураПараметров.Вставить("СоздатьНовуюВерсию", ПараметрыВыполнения.СоздатьНовуюВерсию); СтруктураПараметров.Вставить("СоздатьНовуюВерсиюДоступность", СоздатьНовуюВерсиюДоступность); Обработчик = Новый ОписаниеОповещения("СохранитьИзмененияФайлаСРасширениемПослеПомещенияФайлаНаСервер", ЭтотОбъект, ПараметрыВыполнения); ОткрытьФорму("Обработка.РаботаСФайлами.Форма.ФормаВозвратаФайла", СтруктураПараметров, , , , , Обработчик); Иначе // Параметры СоздатьНовуюВерсию и КомментарийКВерсии переданы извне. Если ПараметрыВыполнения.ХранитьВерсии Тогда // Если автор текущей версии не текущий пользователь, тогда // отключается доступность флажка "Не создавать новую версию". Если ПараметрыВыполнения.АвторТекущейВерсии <> ПараметрыВыполнения.Редактирует Тогда ПараметрыВыполнения.СоздатьНовуюВерсию = Истина; КонецЕсли; Иначе ПараметрыВыполнения.СоздатьНовуюВерсию = Ложь; КонецЕсли; СохранитьИзмененияФайлаСРасширениемПослеПроверкиНовойВерсии(ПараметрыВыполнения); КонецЕсли; КонецПроцедуры // Продолжение процедуры (см. выше). Процедура СохранитьИзмененияФайлаСРасширениемПослеОтветаНаВопросОсвободитьФайл(Ответ, ПараметрыВыполнения) Экспорт Если Ответ = КодВозвратаДиалога.Да Тогда ОсвободитьФайлБезВопроса(ПараметрыВыполнения.ДанныеФайла, ПараметрыВыполнения.ИдентификаторФормы); КонецЕсли; ВернутьРезультат(ПараметрыВыполнения.ОбработчикРезультата, Ложь); КонецПроцедуры // Продолжение процедуры (см. выше). Процедура СохранитьИзмененияФайлаСРасширениемПослеПомещенияФайлаНаСервер(Результат, ПараметрыВыполнения) Экспорт Если ТипЗнч(Результат) <> Тип("Структура") Тогда ВернутьРезультат(ПараметрыВыполнения.ОбработчикРезультата, Ложь); Возврат; КонецЕсли; КодВозврата = Результат.КодВозврата; Если КодВозврата <> КодВозвратаДиалога.ОК Тогда ВернутьРезультат(ПараметрыВыполнения.ОбработчикРезультата, Ложь); Возврат; КонецЕсли; ПараметрыВыполнения.СоздатьНовуюВерсию = Результат.СоздатьНовуюВерсию; ПараметрыВыполнения.КомментарийКВерсии = Результат.КомментарийКВерсии; СохранитьИзмененияФайлаСРасширениемПослеПроверкиНовойВерсии(ПараметрыВыполнения); КонецПроцедуры // Продолжение процедуры (см. выше). Процедура СохранитьИзмененияФайлаСРасширениемПослеПроверкиНовойВерсии(ПараметрыВыполнения) Если Не ПараметрыВыполнения.ДанныеФайла.Зашифрован Тогда СохранитьИзмененияФайлаСРасширениемПослеПроверкиЗашифрован(ПараметрыВыполнения); Возврат; КонецЕсли; // Файл с признаком шифрован снова шифруется для тех же сертификатов. ЗашифроватьФайлПередПомещениемВХранилищеФайлов(ПараметрыВыполнения); КонецПроцедуры // Продолжение процедуры (см. выше). // // Параметры: // ПараметрыВыполнения - Структура: // * ДанныеФайла - см. РаботаСФайламиСлужебныйВызовСервера.ДанныеФайлаИРабочийКаталог // Процедура СохранитьИзмененияФайлаСРасширениемПослеПроверкиЗашифрован(ПараметрыВыполнения) СведенияОФайле = РаботаСФайламиКлиентСервер.СведенияОФайле("ФайлСВерсией", ПараметрыВыполнения.ФайлНовойВерсии); СведенияОФайле.Комментарий = ПараметрыВыполнения.КомментарийКВерсии; СведенияОФайле.ХранитьВерсии = ПараметрыВыполнения.СоздатьНовуюВерсию; Если ПараметрыВыполнения.Свойство("АдресПослеШифрования") Тогда СведенияОФайле.АдресВременногоХранилищаФайла = ПараметрыВыполнения.АдресПослеШифрования; Иначе ПомещаемыеФайлы = Новый Массив; Описание = Новый ОписаниеПередаваемогоФайла(ПараметрыВыполнения.ПолныйПутьКФайлу, ""); ПомещаемыеФайлы.Добавить(Описание); ПомещенныеФайлы = Новый Массив; ФайлыПомещены = ПоместитьФайлы(ПомещаемыеФайлы, ПомещенныеФайлы, , Ложь, ПараметрыВыполнения.ИдентификаторФормы); Если Не ФайлыПомещены Тогда ВернутьРезультат(ПараметрыВыполнения.ОбработчикРезультата, Истина); Возврат; КонецЕсли; Если ПомещенныеФайлы.Количество() = 1 Тогда СведенияОФайле.АдресВременногоХранилищаФайла = ПомещенныеФайлы[0].Хранение; КонецЕсли; КонецЕсли; ОбщиеНастройкиРаботыСФайлами = ОбщиеНастройкиРаботыСФайлами(); ИмяКаталога = РабочийКаталогПользователя(); ОтносительныйПутьКФайлу = ""; Если ПараметрыВыполнения.ДанныеФайла.РабочийКаталогВладельца <> "" Тогда // Есть рабочий каталог. ОтносительныйПутьКФайлу = ПараметрыВыполнения.ПолныйПутьКФайлу; Иначе Позиция = СтрНайти(ПараметрыВыполнения.ПолныйПутьКФайлу, ИмяКаталога); Если Позиция <> 0 Тогда ОтносительныйПутьКФайлу = Сред(ПараметрыВыполнения.ПолныйПутьКФайлу, СтрДлина(ИмяКаталога) + 1); КонецЕсли; КонецЕсли; Если Не ОбщиеНастройкиРаботыСФайлами.ИзвлекатьТекстыФайловНаСервере Тогда СведенияОФайле.АдресВременногоХранилищаТекста = ИзвлечьТекстВоВременноеХранилище(ПараметрыВыполнения.ПолныйПутьКФайлу, ПараметрыВыполнения.ИдентификаторФормы); Иначе СведенияОФайле.АдресВременногоХранилищаТекста = ""; КонецЕсли; НеМенятьЗаписьВРабочемКаталоге = Ложь; Если ПараметрыВыполнения.ПереданныйПолныйПутьКФайлу <> "" Тогда НеМенятьЗаписьВРабочемКаталоге = Истина; КонецЕсли; ВерсияОбновлена = РаботаСФайламиСлужебныйВызовСервера.СохранитьИзмененияФайла(ПараметрыВыполнения.ДанныеФайла.Ссылка, СведенияОФайле, НеМенятьЗаписьВРабочемКаталоге, ОтносительныйПутьКФайлу, ПараметрыВыполнения.ПолныйПутьКФайлу, ПараметрыВыполнения.ДанныеФайла.РабочийКаталогВладельца <> "", ПараметрыВыполнения.ИдентификаторФормы); Если ПараметрыВыполнения.ПоказыватьОповещение Тогда Если ВерсияОбновлена Тогда ПоказатьОповещениеПользователя( НСтр("ru = 'Новая версия сохранена'"), ПараметрыВыполнения.ДанныеФайла.НавигационнаяСсылка, ПараметрыВыполнения.ДанныеФайла.ПолноеНаименованиеВерсии, БиблиотекаКартинок.Информация32); Иначе ПоказатьОповещениеПользователя( НСтр("ru = 'Новая версия не сохранена'"),, НСтр("ru = 'Файл не изменился'"), БиблиотекаКартинок.Информация32); Обработчик = Новый ОписаниеОповещения("СохранитьИзмененияФайлаСРасширениемПослеПоказаОповещения", ЭтотОбъект, ПараметрыВыполнения); ПоказатьИнформациюФайлНеБылИзменен(Обработчик); Возврат; КонецЕсли; КонецЕсли; СохранитьИзмененияФайлаСРасширениемПослеПоказаОповещения(-1, ПараметрыВыполнения); КонецПроцедуры // Продолжение процедуры (см. выше). Процедура СохранитьИзмененияФайлаСРасширениемПослеПоказаОповещения(Результат, ПараметрыВыполнения) Экспорт Если ТипЗнч(Результат) = Тип("Структура") И Результат.Свойство("БольшеНеЗадаватьЭтотВопрос") И Результат.БольшеНеЗадаватьЭтотВопрос Тогда ОбщегоНазначенияВызовСервера.ХранилищеОбщихНастроекСохранить( "НастройкиПрограммы","ПоказыватьИнформациюЧтоФайлНеБылИзменен", Ложь,,, Истина); ОбновитьПовторноИспользуемыеЗначения(); КонецЕсли; ВернутьРезультат(ПараметрыВыполнения.ОбработчикРезультата, Истина); КонецПроцедуры // Продолжение процедуры (см. выше). Процедура СохранитьИзмененияФайлаБезРасширения(ПараметрыВыполнения) Если ПараметрыВыполнения.ХранитьВерсии = Неопределено Тогда ПараметрыДанныхФайла = РаботаСФайламиКлиентСервер.ПараметрыДанныхФайла(); ПараметрыДанныхФайла.ПолучатьСсылкуНаДвоичныеДанные = Ложь; ПараметрыВыполнения.ДанныеФайла = РаботаСФайламиСлужебныйВызовСервера.ДанныеФайла(ПараметрыВыполнения.ОбъектСсылка,,ПараметрыДанныхФайла); ПараметрыВыполнения.ХранитьВерсии = ПараметрыВыполнения.ДанныеФайла.ХранитьВерсии; ПараметрыВыполнения.ФайлРедактируетТекущийПользователь = ПараметрыВыполнения.ДанныеФайла.ФайлРедактируетТекущийПользователь; ПараметрыВыполнения.Редактирует = ПараметрыВыполнения.ДанныеФайла.Редактирует; ПараметрыВыполнения.АвторТекущейВерсии = ПараметрыВыполнения.ДанныеФайла.АвторТекущейВерсии; КонецЕсли; // Проверка возможности освобождения файла. ТекстОшибки = ""; МожноОсвободитьФайл = ВозможностьОсвободитьФайл( ПараметрыВыполнения.ОбъектСсылка, ПараметрыВыполнения.ФайлРедактируетТекущийПользователь, ПараметрыВыполнения.Редактирует, ТекстОшибки); Если Не МожноОсвободитьФайл Тогда ВернутьРезультатПослеПоказаПредупреждения(ПараметрыВыполнения.ОбработчикРезультата, ТекстОшибки, Ложь); Возврат; КонецЕсли; ПараметрыВыполнения.ПолныйПутьКФайлу = ""; Если ПараметрыВыполнения.СоздатьНовуюВерсию = Неопределено Тогда // Запрос комментария и признака хранения версии. ПараметрыВыполнения.СоздатьНовуюВерсию = Истина; СоздатьНовуюВерсиюДоступность = Истина; Если ПараметрыВыполнения.ХранитьВерсии Тогда ПараметрыВыполнения.СоздатьНовуюВерсию = Истина; // Если автор текущей версии не текущий пользователь, тогда // отключается доступность флажка "Не создавать новую версию". Если ПараметрыВыполнения.АвторТекущейВерсии <> ПараметрыВыполнения.Редактирует Тогда СоздатьНовуюВерсиюДоступность = Ложь; Иначе СоздатьНовуюВерсиюДоступность = Истина; КонецЕсли; Иначе ПараметрыВыполнения.СоздатьНовуюВерсию = Ложь; СоздатьНовуюВерсиюДоступность = Ложь; КонецЕсли; СтруктураПараметров = Новый Структура; СтруктураПараметров.Вставить("ФайлСсылка", ПараметрыВыполнения.ОбъектСсылка); СтруктураПараметров.Вставить("КомментарийКВерсии", ""); СтруктураПараметров.Вставить("СоздатьНовуюВерсию", ПараметрыВыполнения.СоздатьНовуюВерсию); СтруктураПараметров.Вставить("СоздатьНовуюВерсиюДоступность", СоздатьНовуюВерсиюДоступность); Обработчик = Новый ОписаниеОповещения("СохранитьИзмененияФайлаБезРасширенияПослеПомещенияФайлаНаСервер", ЭтотОбъект, ПараметрыВыполнения); ОткрытьФорму("Обработка.РаботаСФайлами.Форма.ФормаВозвратаФайла", СтруктураПараметров, , , , , Обработчик); Иначе // Параметры СоздатьНовуюВерсию и КомментарийКВерсии переданы извне. Если ПараметрыВыполнения.ХранитьВерсии Тогда // Если автор текущей версии не текущий пользователь, тогда // отключается доступность флажка "Не создавать новую версию". Если ПараметрыВыполнения.АвторТекущейВерсии <> ПараметрыВыполнения.Редактирует Тогда ПараметрыВыполнения.СоздатьНовуюВерсию = Истина; КонецЕсли; Иначе ПараметрыВыполнения.СоздатьНовуюВерсию = Ложь; КонецЕсли; СохранитьИзмененияФайлаБезРасширенияПослеПроверкиНовойВерсии(ПараметрыВыполнения); КонецЕсли; КонецПроцедуры // Продолжение процедуры (см. выше). Процедура СохранитьИзмененияФайлаБезРасширенияПослеПомещенияФайлаНаСервер(Результат, ПараметрыВыполнения) Экспорт Если ТипЗнч(Результат) <> Тип("Структура") Тогда ВернутьРезультат(ПараметрыВыполнения.ОбработчикРезультата, Ложь); Возврат; КонецЕсли; Если Результат.КодВозврата <> КодВозвратаДиалога.ОК Тогда ВернутьРезультат(ПараметрыВыполнения.ОбработчикРезультата, Ложь); Возврат; КонецЕсли; ПараметрыВыполнения.СоздатьНовуюВерсию = Результат.СоздатьНовуюВерсию; ПараметрыВыполнения.КомментарийКВерсии = Результат.КомментарийКВерсии; СохранитьИзмененияФайлаБезРасширенияПослеПроверкиНовойВерсии(ПараметрыВыполнения); КонецПроцедуры // Продолжение процедуры (см. выше). Процедура СохранитьИзмененияФайлаБезРасширенияПослеПроверкиНовойВерсии(ПараметрыВыполнения) Обработчик = Новый ОписаниеОповещения("СохранитьИзмененияФайлаБезРасширенияПослеНапоминания", ЭтотОбъект, ПараметрыВыполнения); ПоказатьНапоминаниеПередПоместитьФайл(Обработчик); КонецПроцедуры // Продолжение процедуры (см. выше). Процедура СохранитьИзмененияФайлаБезРасширенияПослеНапоминания(Результат, ПараметрыВыполнения) Экспорт Если Результат.Значение = КодВозвратаДиалога.ОК Тогда Если ТипЗнч(Результат) = Тип("Структура") И Результат.Свойство("БольшеНеЗадаватьЭтотВопрос") И Результат.БольшеНеЗадаватьЭтотВопрос Тогда ОбщегоНазначенияВызовСервера.ХранилищеОбщихНастроекСохранить( "НастройкиПрограммы", "ПоказыватьПодсказкиПриРедактированииФайлов", Ложь,,, Истина); КонецЕсли; Обработчик = Новый ОписаниеОповещения("СохранитьИзмененияФайлаБезРасширенияПослеЗагрузкиФайла", ЭтотОбъект, ПараметрыВыполнения); НачатьПомещениеФайла(Обработчик, , ПараметрыВыполнения.ПолныйПутьКФайлу, , ПараметрыВыполнения.ИдентификаторФормы); КонецЕсли; КонецПроцедуры // Продолжение процедуры (см. выше). Процедура СохранитьИзмененияФайлаБезРасширенияПослеЗагрузкиФайла(Помещен, Адрес, ВыбранноеИмяФайла, ПараметрыВыполнения) Экспорт Если Не Помещен Тогда ВернутьРезультат(ПараметрыВыполнения.ОбработчикРезультата, Ложь); Возврат; КонецЕсли; ПараметрыВыполнения.Вставить("АдресЗагруженногоФайла", Адрес); ПараметрыВыполнения.Вставить("ВыбранноеИмяФайла", ВыбранноеИмяФайла); Если ПараметрыВыполнения.ДанныеФайла = Неопределено Тогда ПараметрыДанныхФайла = РаботаСФайламиКлиентСервер.ПараметрыДанныхФайла(); ПараметрыДанныхФайла.ПолучатьСсылкуНаДвоичныеДанные = Ложь; ДанныеФайла = РаботаСФайламиСлужебныйВызовСервера.ДанныеФайла(ПараметрыВыполнения.ОбъектСсылка,,ПараметрыДанныхФайла); Иначе ДанныеФайла = ПараметрыВыполнения.ДанныеФайла; КонецЕсли; Если Не ДанныеФайла.Зашифрован Тогда СохранитьИзмененияФайлаБезРасширенияПослеШифрованияФайла(Null, ПараметрыВыполнения); Возврат; КонецЕсли; Если СертификатыНеУказаны(ДанныеФайла.МассивСертификатовШифрования) Тогда ВернутьРезультат(ПараметрыВыполнения.ОбработчикРезультата, Ложь); Возврат; КонецЕсли; Если Не ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.ЭлектроннаяПодпись") Тогда ВернутьРезультат(ПараметрыВыполнения.ОбработчикРезультата, Ложь); Возврат; КонецЕсли; // Не нужно ПредложитьУстановкуРасширенияРаботыСФайлами(), т.к. все делается в памяти через ДвоичныеДанные. ОписаниеДанных = Новый Структура; ОписаниеДанных.Вставить("Операция", НСтр("ru = 'Шифрование файла'")); ОписаниеДанных.Вставить("ЗаголовокДанных", НСтр("ru = 'Файл'")); ОписаниеДанных.Вставить("Данные", Адрес); ОписаниеДанных.Вставить("Представление", ПараметрыВыполнения.ОбъектСсылка); ОписаниеДанных.Вставить("НаборСертификатов", ПараметрыВыполнения.ОбъектСсылка); ОписаниеДанных.Вставить("БезПодтверждения", Истина); ОписаниеДанных.Вставить("СообщитьОЗавершении", Ложь); ОбработчикПродолжения = Новый ОписаниеОповещения("СохранитьИзмененияФайлаБезРасширенияПослеШифрованияФайла", ЭтотОбъект, ПараметрыВыполнения); МодульЭлектроннаяПодписьКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("ЭлектроннаяПодписьКлиент"); МодульЭлектроннаяПодписьКлиент.Зашифровать(ОписаниеДанных, , ОбработчикПродолжения); КонецПроцедуры // Продолжение процедуры (см. выше). Процедура СохранитьИзмененияФайлаБезРасширенияПослеШифрованияФайла(ОписаниеДанных, ПараметрыВыполнения) Экспорт Если ОписаниеДанных = Null Тогда Адрес = ПараметрыВыполнения.АдресЗагруженногоФайла; ИначеЕсли Не ОписаниеДанных.Успех Тогда ВернутьРезультат(ПараметрыВыполнения.ОбработчикРезультата, Ложь); Возврат; Иначе Если ТипЗнч(ОписаниеДанных.ЗашифрованныеДанные) = Тип("ДвоичныеДанные") Тогда Адрес = ПоместитьВоВременноеХранилище(ОписаниеДанных.ЗашифрованныеДанные, ПараметрыВыполнения.ИдентификаторФормы); Иначе Адрес = ОписаниеДанных.ЗашифрованныеДанные; КонецЕсли; КонецЕсли; СведенияОФайле = РаботаСФайламиКлиентСервер.СведенияОФайле("ФайлСВерсией"); ПараметрыВыполнения.АдресВременногоХранилища = Адрес; СведенияОФайле.АдресВременногоХранилищаФайла = Адрес; СведенияОФайле.ХранитьВерсии = ПараметрыВыполнения.СоздатьНовуюВерсию; СтруктураПути = ОбщегоНазначенияКлиентСервер.РазложитьПолноеИмяФайла(ПараметрыВыполнения.ВыбранноеИмяФайла); Если Не ПустаяСтрока(СтруктураПути.Расширение) Тогда СведенияОФайле.РасширениеБезТочки = ОбщегоНазначенияКлиентСервер.РасширениеБезТочки(СтруктураПути.Расширение); СведенияОФайле.ИмяБезРасширения = СтруктураПути.ИмяБезРасширения; КонецЕсли; Результат = РаботаСФайламиСлужебныйВызовСервера.ПолучитьДанныеФайлаИСохранитьИзмененияФайла(ПараметрыВыполнения.ОбъектСсылка, СведенияОФайле, "", ПараметрыВыполнения.ПолныйПутьКФайлу, Ложь, ПараметрыВыполнения.ИдентификаторФормы); ПараметрыВыполнения.ДанныеФайла = Результат.ДанныеФайла; Если ПараметрыВыполнения.ПоказыватьОповещение Тогда ПоказатьОповещениеПользователя( НСтр("ru = 'Новая версия сохранена'"), ПараметрыВыполнения.ДанныеФайла.НавигационнаяСсылка, ПараметрыВыполнения.ДанныеФайла.ПолноеНаименованиеВерсии, БиблиотекаКартинок.Информация32); КонецЕсли; ВернутьРезультат(ПараметрыВыполнения.ОбработчикРезультата, Истина); КонецПроцедуры // Для процедур СохранитьИзмененияФайла, ЗакончитьРедактирование. Процедура ЗашифроватьФайлПередПомещениемВХранилищеФайлов(ПараметрыВыполнения) Если СертификатыНеУказаны(ПараметрыВыполнения.ДанныеФайла.МассивСертификатовШифрования) Тогда ВернутьРезультат(ПараметрыВыполнения.ОбработчикРезультата, Ложь); Возврат; КонецЕсли; Если Не ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.ЭлектроннаяПодпись") Тогда ВернутьРезультат(ПараметрыВыполнения.ОбработчикРезультата, Ложь); Возврат; КонецЕсли; // Не нужно ПредложитьУстановкуРасширенияРаботыСФайлами(), т.к. все делается в памяти через ДвоичныеДанные. ОписаниеДанных = Новый Структура; ОписаниеДанных.Вставить("Операция", НСтр("ru = 'Шифрование файла'")); ОписаниеДанных.Вставить("ЗаголовокДанных", НСтр("ru = 'Файл'")); ОписаниеДанных.Вставить("Данные", ПараметрыВыполнения.ПолныйПутьКФайлу); ОписаниеДанных.Вставить("Представление", ПараметрыВыполнения.ОбъектСсылка); ОписаниеДанных.Вставить("НаборСертификатов", ПараметрыВыполнения.ОбъектСсылка); ОписаниеДанных.Вставить("БезПодтверждения", Истина); ОписаниеДанных.Вставить("СообщитьОЗавершении", Ложь); ОбработчикПродолжения = Новый ОписаниеОповещения("ЗашифроватьФайлПередПомещениемВХранилищеФайловПослеШифрованияФайла", ЭтотОбъект, ПараметрыВыполнения); МодульЭлектроннаяПодписьКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("ЭлектроннаяПодписьКлиент"); МодульЭлектроннаяПодписьКлиент.Зашифровать(ОписаниеДанных, , ОбработчикПродолжения); КонецПроцедуры // Продолжение процедуры (см. выше). Процедура ЗашифроватьФайлПередПомещениемВХранилищеФайловПослеШифрованияФайла(ОписаниеДанных, ПараметрыВыполнения) Экспорт Если ОписаниеДанных = Null Тогда Адрес = ПараметрыВыполнения.АдресЗагруженногоФайла; ИначеЕсли Не ОписаниеДанных.Успех Тогда ВернутьРезультат(ПараметрыВыполнения.ОбработчикРезультата, Ложь); Возврат; Иначе Если ТипЗнч(ОписаниеДанных.ЗашифрованныеДанные) = Тип("ДвоичныеДанные") Тогда Адрес = ПоместитьВоВременноеХранилище(ОписаниеДанных.ЗашифрованныеДанные, ПараметрыВыполнения.ИдентификаторФормы); Иначе Адрес = ОписаниеДанных.ЗашифрованныеДанные; КонецЕсли; КонецЕсли; ПараметрыВыполнения.Вставить("АдресПослеШифрования", Адрес); ЗакончитьРедактированиеСРасширениемПослеПроверкиЗашифрован(ПараметрыВыполнения); КонецПроцедуры // Для процедур СохранитьИзмененияФайла, ЗакончитьРедактирование. Функция СертификатыНеУказаны(МассивСертификатов) Если МассивСертификатов.Количество() = 0 Тогда ПоказатьПредупреждение(, НСтр("ru = 'У зашифрованного файла не указаны сертификаты. |Расшифруйте файл и зашифруйте заново.'")); Возврат Истина; КонецЕсли; Возврат Ложь; КонецФункции //////////////////////////////////////////////////////////////////////////////// // Пометка файла как занятого для редактирования. // Пометка файла как занятого для редактирования. // // Параметры: // ОбработчикРезультата - ОписаниеОповещения // - Неопределено - описание процедуры, принимающей результат работы метода. // ДанныеФайла - Структура // Процедура ЗанятьФайл(ОбработчикРезультата, ДанныеФайла, УникальныйИдентификатор) ПараметрыОбработчика = Новый Структура; ПараметрыОбработчика.Вставить("ОбработчикРезультата", ОбработчикРезультата); ПараметрыОбработчика.Вставить("ДанныеФайла", ДанныеФайла); ПараметрыОбработчика.Вставить("УникальныйИдентификатор", УникальныйИдентификатор); Обработчик = Новый ОписаниеОповещения("ЗанятьФайлПослеУстановкиРасширения", ЭтотОбъект, ПараметрыОбработчика); ПоказатьВопросОбУстановкеРасширенияРаботыСФайлами(Обработчик); КонецПроцедуры // Продолжение процедуры (см. выше). // // Параметры: // РасширениеУстановлено - Булево // ПараметрыВыполнения - Структура: // * ДанныеФайла - см. РаботаСФайламиСлужебныйВызовСервера.ДанныеФайла // Процедура ЗанятьФайлПослеУстановкиРасширения(РасширениеУстановлено, ПараметрыВыполнения) Экспорт ТекстОшибки = ""; МожноЗанятьФайл = РаботаСФайламиКлиентСервер.МожноЛиЗанятьФайл( ПараметрыВыполнения.ДанныеФайла, ТекстОшибки); Если Не МожноЗанятьФайл Тогда ВернутьРезультатПослеПоказаПредупреждения(ПараметрыВыполнения.ОбработчикРезультата, ТекстОшибки, Неопределено); Возврат; КонецЕсли; ТекстОшибки = ""; ПараметрыЗанятияФайла = РаботаСФайламиСлужебныйКлиентСервер.ПараметрыЗанятияФайла(); ПараметрыЗанятияФайла.УникальныйИдентификатор = ПараметрыВыполнения.УникальныйИдентификатор; ФайлЗанят = РаботаСФайламиСлужебныйВызовСервера.ЗанятьФайл(ПараметрыВыполнения.ДанныеФайла, ТекстОшибки, ПараметрыЗанятияФайла); Если Не ФайлЗанят Тогда ВернутьРезультатПослеПоказаПредупреждения(ПараметрыВыполнения.ОбработчикРезультата, ТекстОшибки, Неопределено); Возврат; КонецЕсли; Если РасширениеРаботыСФайламиПодключено() Тогда НаЧтение = Ложь; ВРабочемКаталогеВладельца = ПараметрыВыполнения.ДанныеФайла.РабочийКаталогВладельца <> ""; ПеререгистрироватьФайлВРабочемКаталоге(ПараметрыВыполнения.ДанныеФайла, НаЧтение, ВРабочемКаталогеВладельца); КонецЕсли; ПоказатьОповещениеПользователя( НСтр("ru = 'Редактирование файла'"), ПараметрыВыполнения.ДанныеФайла.НавигационнаяСсылка, СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = 'Файл ""%1"" |занят для редактирования.'"), Строка(ПараметрыВыполнения.ДанныеФайла.Ссылка)), БиблиотекаКартинок.Информация32); ИзменитьКоличествоЗанятыхФайлов(1); ВернутьРезультат(ПараметрыВыполнения.ОбработчикРезультата, ПараметрыВыполнения.ДанныеФайла); КонецПроцедуры //////////////////////////////////////////////////////////////////////////////// // Добавление файлов. // Продолжение процедуры ПрисоединенныеФайлыКлиент.ДобавитьФайлы. Процедура ДобавитьФайлыЗавершение(ПрисоединенныйФайл, ДополнительныеПараметры) Экспорт Если ПрисоединенныйФайл = Неопределено Тогда Возврат; КонецЕсли; ВладелецФайла = ДополнительныеПараметры.ВладелецФайла; ОповеститьОбИзменении(ПрисоединенныйФайл); ОповеститьОбИзменении(ВладелецФайла); ПараметрыОповещения = ПараметрыОповещенияЗаписиФайла(); ПараметрыОповещения.Владелец = ВладелецФайла; ПараметрыОповещения.ВладелецФайла = ПараметрыОповещения.Владелец; ПараметрыОповещения.Файл = ПрисоединенныйФайл; ПараметрыОповещения.ЭтоНовый = Истина; Оповестить("Запись_Файл", ПараметрыОповещения, ПрисоединенныйФайл); Если ДополнительныеПараметры.Свойство("ОбработчикРезультата") И ДополнительныеПараметры.ОбработчикРезультата <> Неопределено Тогда ПрисоединенныеФайлыМассив = Новый Массив; ПрисоединенныеФайлыМассив.Добавить(ПрисоединенныйФайл); ВыполнитьОбработкуОповещения(ДополнительныеПараметры.ОбработчикРезультата, ПрисоединенныеФайлыМассив); КонецЕсли; ОткрыватьКарточкуПослеСозданияИзФайла = Ложь; Если ДополнительныеПараметры.Свойство("НеОткрыватьКарточкуПослеСозданияИзФайла") Тогда ОткрыватьКарточкуПослеСозданияИзФайла = Не ДополнительныеПараметры.НеОткрыватьКарточкуПослеСозданияИзФайла; КонецЕсли; Если ОткрыватьКарточкуПослеСозданияИзФайла Тогда ПоказатьОповещениеПользователя( НСтр("ru = 'Создание'"), ПолучитьНавигационнуюСсылку(ПрисоединенныйФайл), ПрисоединенныйФайл, БиблиотекаКартинок.Информация32); РаботаСФайламиКлиент.ОткрытьФормуФайла(ПрисоединенныйФайл); КонецЕсли; КонецПроцедуры //////////////////////////////////////////////////////////////////////////////// // Освобождение файлов без обновления. //////////////////////////////////////////////////////////////////////////////// // Удаление файла. Перед удалением снимается атрибут "Только для чтения". // Параметры: // ПолноеИмяФайла - Строка // Процедура УдалитьФайлБезПодтверждения(ПолноеИмяФайла) Файл = Новый Файл(ПолноеИмяФайла); Если Файл.Существует() Тогда Попытка Файл.УстановитьТолькоЧтение(Ложь); УдалитьФайлы(ПолноеИмяФайла); Исключение ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = 'Не удалось удалить файл в рабочем каталоге: |""%1"". |Возможно он занят другим приложением. | |%2'"), ПолноеИмяФайла, ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); ЖурналРегистрацииКлиент.ДобавитьСообщениеДляЖурналаРегистрации(СобытиеЖурналаРегистрации(), "Предупреждение", ТекстСообщения,, Истина); КонецПопытки; КонецЕсли; КонецПроцедуры // Удаление файла со снятием атрибута readonly. // // Параметры: // ОбработчикРезультата - ОписаниеОповещения // - Структура // - Неопределено - описание процедуры, принимающей результат // работы метода. // ПолноеИмяФайла - Строка - полное имя файла. // ЗадаватьВопрос - Булево- задавать вопрос об удалении. // ШапкаВопроса - Строка - шапка вопроса - добавляет текст к вопросу об удалении. // Процедура УдалитьФайл(Знач ОбработчикРезультата, ПолноеИмяФайла) УдалитьФайлБезПодтверждения(ПолноеИмяФайла); ВернутьРезультат(ОбработчикРезультата, Истина); КонецПроцедуры //////////////////////////////////////////////////////////////////////////////// // Получение файла из хранилища в рабочий каталог. // Получает Файл из хранилища файлов в рабочий каталог // и возвращает путь к этому файлу. // // Параметры: // ОбработчикРезультата - ОписаниеОповещения // - Неопределено - описание процедуры, принимающей результат работы метода. // ДанныеФайла - см. РаботаСФайламиСлужебныйВызовСервера.ДанныеФайлаИРабочийКаталог // ПолноеИмяФайла - Строка. // НаЧтение - Булево - Ложь - для чтения, Истина для редактирования. // ИдентификаторФормы - УникальныйИдентификатор - идентификатор формы. // Процедура ПолучитьФайлВерсииВЛокальныйКэшФайлов(ОбработчикРезультата, ДанныеФайла, НаЧтение, ИдентификаторФормы, ДополнительныеПараметры) ПараметрыВыполнения = Новый Структура; ПараметрыВыполнения.Вставить("ОбработчикРезультата", ОбработчикРезультата); ПараметрыВыполнения.Вставить("ДанныеФайла", ДанныеФайла); ПараметрыВыполнения.Вставить("НаЧтение", НаЧтение); ПараметрыВыполнения.Вставить("ИдентификаторФормы", ИдентификаторФормы); ПараметрыВыполнения.Вставить("ДополнительныеПараметры", ДополнительныеПараметры); ПараметрыВыполнения.Вставить("ПолноеИмяФайла", ""); ПараметрыВыполнения.Вставить("ФайлПолучен", Ложь); ВРабочемКаталогеНаЧтение = Истина; ВРабочемКаталогеВладельца = Ложь; ФайлВРабочемКаталоге = ФайлНаходитсяВЛокальномКэшеФайлов(ДанныеФайла, ДанныеФайла.Версия, ПараметрыВыполнения.ПолноеИмяФайла, ВРабочемКаталогеНаЧтение, ВРабочемКаталогеВладельца); Если Не ФайлВРабочемКаталоге Тогда ПолучитьССервераИЗарегистрироватьВЛокальномКэшеФайлов(ПараметрыВыполнения); Возврат; КонецЕсли; // Получаем путь файла в рабочем каталоге - с проверкой на уникальность. Если ПараметрыВыполнения.ПолноеИмяФайла = "" Тогда ОбщегоНазначенияКлиент.СообщитьПользователю( НСтр("ru = 'Не удалось получить файл из программы в рабочий каталог на компьютере.'")); ВернутьРезультат(ОбработчикРезультата, ПараметрыВыполнения); Возврат; КонецЕсли; // Выяснено, что Файл в рабочем каталоге есть. // Проверка даты изменения и принятие решения, что делать дальше. Обработчик = Новый ОписаниеОповещения("ПолучитьФайлВерсииВЛокальныйКэшФайловПослеВыбораДействия", ЭтотОбъект, ПараметрыВыполнения); ДействиеПриОткрытииФайлаВРабочемКаталоге(Обработчик, ПараметрыВыполнения.ПолноеИмяФайла, ДанныеФайла); КонецПроцедуры // Продолжение процедуры (см. выше). Процедура ПолучитьФайлВерсииВЛокальныйКэшФайловПослеВыбораДействия(Результат, ПараметрыВыполнения) Экспорт Если Результат = "ВзятьИзХранилищаИОткрыть" Тогда Обработчик = Новый ОписаниеОповещения("ПолучитьФайлВерсииВЛокальныйКэшФайловПослеУдаления", ЭтотОбъект, ПараметрыВыполнения); УдалитьФайл(Обработчик, ПараметрыВыполнения.ПолноеИмяФайла); ИначеЕсли Результат = "ОткрытьСуществующий" Тогда Если ПараметрыВыполнения.ДанныеФайла.ВРабочемКаталогеНаЧтение <> ПараметрыВыполнения.НаЧтение Тогда ВРабочемКаталогеВладельца = ПараметрыВыполнения.ДанныеФайла.РабочийКаталогВладельца <> ""; ПеререгистрироватьВРабочемКаталоге( ПараметрыВыполнения.ДанныеФайла.Версия, ПараметрыВыполнения.ПолноеИмяФайла, ПараметрыВыполнения.НаЧтение, ВРабочемКаталогеВладельца); КонецЕсли; ПараметрыВыполнения.ФайлПолучен = Истина; ВернутьРезультат(ПараметрыВыполнения.ОбработчикРезультата, ПараметрыВыполнения); Иначе // Результат = "Отмена". ПараметрыВыполнения.ПолноеИмяФайла = ""; ВернутьРезультат(ПараметрыВыполнения.ОбработчикРезультата, ПараметрыВыполнения); КонецЕсли; КонецПроцедуры // Продолжение процедуры (см. выше). // Процедура ПолучитьФайлВерсииВЛокальныйКэшФайловПослеУдаления(ФайлУдален, ПараметрыВыполнения) Экспорт ПолучитьССервераИЗарегистрироватьВЛокальномКэшеФайлов(ПараметрыВыполнения); КонецПроцедуры //////////////////////////////////////////////////////////////////////////////// // Получение файла из программы на компьютер. // Получить файл из программы на компьютер и возвращает путь к этому файлу. // // Параметры: // ОбработчикРезультата - ОписаниеОповещения // - Неопределено - описание процедуры, принимающей результат работы процедуры. // ДанныеФайла - Структура // ПолноеИмяФайла - Строка - здесь возвращается полное имя файла. // ИдентификаторФормы - УникальныйИдентификатор - идентификатор формы. // Процедура ПолучитьФайлВерсииВРабочийКаталог(ОбработчикРезультата, ДанныеФайла, ПолноеИмяФайла, ИдентификаторФормы = Неопределено, ДополнительныеПараметры = Неопределено) Экспорт ИмяКаталога = РабочийКаталогПользователя(); Если ИмяКаталога = Неопределено Или ПустаяСтрока(ИмяКаталога) Тогда ВернутьРезультат(ОбработчикРезультата, Новый Структура("ФайлПолучен, ПолноеИмяФайла", Ложь, ПолноеИмяФайла)); Возврат; КонецЕсли; Если ДанныеФайла.РабочийКаталогВладельца = "" Или ДанныеФайла.Версия <> ДанныеФайла.ТекущаяВерсия И ЗначениеЗаполнено(ДанныеФайла.ТекущаяВерсия) Тогда ПолучитьФайлВерсииВЛокальныйКэшФайлов(ОбработчикРезультата, ДанныеФайла, ДанныеФайла.НаЧтение, ИдентификаторФормы, ДополнительныеПараметры); Иначе Если Не РабочийКаталогДоступен(ДанныеФайла.РабочийКаталогВладельца, ДанныеФайла.Владелец) Тогда ПолучитьФайлВерсииВЛокальныйКэшФайлов(ОбработчикРезультата, ДанныеФайла, ДанныеФайла.НаЧтение, ИдентификаторФормы, ДополнительныеПараметры); Возврат; КонецЕсли; ПолучитьФайлВерсииВРабочийКаталогПапки(ОбработчикРезультата, ДанныеФайла, ПолноеИмяФайла, ДанныеФайла.НаЧтение, ИдентификаторФормы, ДополнительныеПараметры); КонецЕсли; КонецПроцедуры Функция РабочийКаталогДоступен(РабочийКаталогВладельца, Владелец) Результат = Ложь; // Создать каталог для файлов. Попытка // В случае если передан каталог, имя которого запрещено в текущей файловой системе, // исключение вызвано не будет, хотя каталог будет не доступен. СведенияОКаталоге = Новый Файл(РабочийКаталогВладельца); Если НЕ СведенияОКаталоге.Существует() Тогда ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru='Каталог папки файлов %1 не существует.'"), Владелец); КонецЕсли; СоздатьКаталог(РабочийКаталогВладельца); ИмяКаталогаТестовое = РабочийКаталогВладельца + "ПроверкаДоступа\"; СоздатьКаталог(ИмяКаталогаТестовое); УдалитьФайлы(ИмяКаталогаТестовое); Результат = Истина; Исключение // Нет прав на создание каталога, или такой путь отсутствует, // тогда установка настроек по умолчанию. СообщениеЖурналаРегистрации = НСтр("ru='Не найден рабочий каталог %1 для папки файлов %2 или нет права на запись. Восстановлены настройки по умолчанию.'"); СообщениеЖурналаРегистрации = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(СообщениеЖурналаРегистрации, РабочийКаталогВладельца, Владелец); РабочийКаталогВладельца = ""; РаботаСФайламиСлужебныйВызовСервера.ОчиститьРабочийКаталог(Владелец); ЖурналРегистрацииКлиент.ДобавитьСообщениеДляЖурналаРегистрации( НСтр("ru='Работа с файлами'", ОбщегоНазначенияКлиент.КодОсновногоЯзыка()), "Предупреждение", СообщениеЖурналаРегистрации, ОбщегоНазначенияКлиент.ДатаСеанса(), Истина); КонецПопытки; Возврат Результат; КонецФункции // См. одноименную процедуру в общем модуле РаботаСФайламиКлиент. Процедура ПолучитьПрисоединенныйФайл(Оповещение, ПрисоединенныйФайл, ИдентификаторФормы, ДополнительныеПараметры = Неопределено) Экспорт Если ДополнительныеПараметры = Неопределено Тогда ДополнительныеПараметры = Новый Структура; КонецЕсли; ДополнительныеПараметрыПоУмолчанию = Новый Структура; ДополнительныеПараметрыПоУмолчанию.Вставить("ДляРедактирования", Ложь); ДополнительныеПараметрыПоУмолчанию.Вставить("ДанныеФайла", Неопределено); ЗаполнитьЗначенияСвойств(ДополнительныеПараметрыПоУмолчанию, ДополнительныеПараметры); Контекст = Новый Структура; Контекст.Вставить("Оповещение", Оповещение); Контекст.Вставить("ПрисоединенныйФайл", ПрисоединенныйФайл); Контекст.Вставить("ИдентификаторФормы", ИдентификаторФормы); ОбщегоНазначенияКлиентСервер.ДополнитьСтруктуру(Контекст, ДополнительныеПараметрыПоУмолчанию); Если ТипЗнч(Контекст.ДанныеФайла) <> Тип("Структура") Или Не ЗначениеЗаполнено(Контекст.ДанныеФайла.СсылкаНаДвоичныеДанныеФайла) Тогда Контекст.Вставить("ДанныеФайла", РаботаСФайламиСлужебныйВызовСервера.ПолучитьДанныеФайла( Контекст.ПрисоединенныйФайл, Контекст.ИдентификаторФормы, Истина, Контекст.ДляРедактирования)); КонецЕсли; Контекст.Вставить("ЗаголовокОшибки", НСтр("ru = 'Не удалось получить файл на компьютер из программы по причине:'") + Символы.ПС); Если Контекст.ДляРедактирования И Контекст.ДанныеФайла.Редактирует <> ПользователиКлиент.АвторизованныйПользователь() Тогда Результат = Новый Структура; Результат.Вставить("ПолноеИмяФайла", ""); Результат.Вставить("ОписаниеОшибки", Контекст.ЗаголовокОшибки + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = 'Файл уже редактирует %1.'"), Строка(Контекст.ДанныеФайла.Редактирует))); ВыполнитьОбработкуОповещения(Контекст.Оповещение, Результат); Возврат; КонецЕсли; Контекст.Вставить("ДляРедактирования", ЗначениеЗаполнено(Контекст.ДанныеФайла.Редактирует)); ФайловаяСистемаКлиент.ПодключитьРасширениеДляРаботыСФайлами(Новый ОписаниеОповещения( "ПолучитьПрисоединенныйФайлПослеПодключенияРасширения", ЭтотОбъект, Контекст)); КонецПроцедуры // Продолжение процедуры ПолучитьПрисоединенныйФайл. Процедура ПолучитьПрисоединенныйФайлПослеПодключенияРасширения(РасширениеПодключено, Контекст) Экспорт Если Не РасширениеПодключено Тогда Результат = Новый Структура; Результат.Вставить("ПолноеИмяФайла", ""); Результат.Вставить("ОписаниеОшибки", Контекст.ЗаголовокОшибки + НСтр("ru = 'Не установлено расширение для работы с 1С:Предприятием.'")); ВыполнитьОбработкуОповещения(Контекст.Оповещение, Результат); Возврат; КонецЕсли; ПолучитьРабочийКаталогПользователя(Новый ОписаниеОповещения( "ПолучитьПрисоединенныйФайлПослеПолученияРабочегоКаталога", ЭтотОбъект, Контекст)); КонецПроцедуры // Продолжение процедуры ПолучитьПрисоединенныйФайл. Процедура ПолучитьПрисоединенныйФайлПослеПолученияРабочегоКаталога(Результат, Контекст) Экспорт Если ЗначениеЗаполнено(Результат.ОписаниеОшибки) Тогда Результат = Новый Структура; Результат.Вставить("ПолноеИмяФайла", ""); Результат.Вставить("ОписаниеОшибки", Контекст.ЗаголовокОшибки + Результат.ОписаниеОшибки); ВыполнитьОбработкуОповещения(Контекст.Оповещение, Результат); Возврат; КонецЕсли; Контекст.Вставить("РабочийКаталогПользователя", Результат.Каталог); Контекст.Вставить("КаталогФайла", Контекст.РабочийКаталогПользователя + Контекст.ДанныеФайла.ОтносительныйПуть); Контекст.Вставить("ПолноеИмяФайла", Контекст.КаталогФайла + Контекст.ДанныеФайла.ИмяФайла); ДействияСФайлом = Новый Массив; Действие = Новый Структура; Действие.Вставить("Действие", "СоздатьКаталог"); Действие.Вставить("Файл", Контекст.КаталогФайла); Действие.Вставить("ЗаголовокОшибки", Контекст.ЗаголовокОшибки + НСтр("ru = 'Создание каталога не выполнено по причине:'")); ДействияСФайлом.Добавить(Действие); Действие = Новый Структура; Действие.Вставить("Действие", "УстановитьСвойства"); Действие.Вставить("Файл", Контекст.ПолноеИмяФайла); Действие.Вставить("Свойства", Новый Структура("ТолькоЧтение", Ложь)); Действие.Вставить("ЗаголовокОшибки", Контекст.ЗаголовокОшибки + НСтр("ru = 'Изменение свойства файла ""Только просмотр"" не выполнено по причине:'")); ДействияСФайлом.Добавить(Действие); Действие = Новый Структура; Действие.Вставить("Действие", "Получить"); Действие.Вставить("Файл", Контекст.ПолноеИмяФайла); Действие.Вставить("Адрес", Контекст.ДанныеФайла.СсылкаНаДвоичныеДанныеФайла); Действие.Вставить("ЗаголовокОшибки", Контекст.ЗаголовокОшибки); ДействияСФайлом.Добавить(Действие); СвойстваФайла = Новый Структура; СвойстваФайла.Вставить("ТолькоЧтение", Не Контекст.ДляРедактирования); СвойстваФайла.Вставить("УниверсальноеВремяИзменения", Контекст.ДанныеФайла.ДатаМодификацииУниверсальная); Действие = Новый Структура; Действие.Вставить("Действие", "УстановитьСвойства"); Действие.Вставить("Файл", Контекст.ПолноеИмяФайла); Действие.Вставить("Свойства", СвойстваФайла); Действие.Вставить("ЗаголовокОшибки", Контекст.ЗаголовокОшибки + НСтр("ru = 'Установка свойств файла не выполнена по причине:'")); ДействияСФайлом.Добавить(Действие); ОбработатьФайл(Новый ОписаниеОповещения( "ПолучитьПрисоединенныйФайлПослеОбработкиФайла", ЭтотОбъект, Контекст), ДействияСФайлом, Контекст.ИдентификаторФормы); КонецПроцедуры // Продолжение процедуры ПолучитьПрисоединенныйФайл. Процедура ПолучитьПрисоединенныйФайлПослеОбработкиФайла(РезультатДействий, Контекст) Экспорт Результат = Новый Структура; Если ЗначениеЗаполнено(РезультатДействий.ОписаниеОшибки) Тогда Результат.Вставить("ПолноеИмяФайла", ""); Результат.Вставить("ОписаниеОшибки", РезультатДействий.ОписаниеОшибки); Иначе Результат.Вставить("ПолноеИмяФайла", Контекст.ПолноеИмяФайла); Результат.Вставить("ОписаниеОшибки", ""); КонецЕсли; ВыполнитьОбработкуОповещения(Контекст.Оповещение, Результат); КонецПроцедуры // См. одноименную процедуру в общем модуле ПрисоединенныеФайлыКлиент. Процедура ПоместитьПрисоединенныйФайл(Оповещение, ПрисоединенныйФайл, ИдентификаторФормы, ДополнительныеПараметры = Неопределено) Экспорт Если ДополнительныеПараметры = Неопределено Тогда ДополнительныеПараметры = Новый Структура; КонецЕсли; Контекст = Новый Структура; Контекст.Вставить("Оповещение", Оповещение); Контекст.Вставить("ПрисоединенныйФайл", ПрисоединенныйФайл); Контекст.Вставить("ИдентификаторФормы", ИдентификаторФормы); Контекст.Вставить("ДанныеФайла", Неопределено); Контекст.Вставить("ПолноеИмяПомещаемогоФайла", Неопределено); ДополнительныеПараметры.Свойство("ДанныеФайла", Контекст.ДанныеФайла); ДополнительныеПараметры.Свойство("ПолноеИмяФайла", Контекст.ПолноеИмяПомещаемогоФайла); Если ТипЗнч(Контекст.ДанныеФайла) <> Тип("Структура") Тогда Контекст.Вставить("ДанныеФайла", РаботаСФайламиСлужебныйВызовСервера.ПолучитьДанныеФайла( Контекст.ПрисоединенныйФайл, Контекст.ИдентификаторФормы, Ложь)); КонецЕсли; Контекст.Вставить("ЗаголовокОшибки", НСтр("ru = 'Не удалось поместить файл с компьютера в программу по причине:'") + Символы.ПС); ФайловаяСистемаКлиент.ПодключитьРасширениеДляРаботыСФайлами(Новый ОписаниеОповещения( "ПоместитьПрисоединенныйФайлПослеПодключенияРасширения", ЭтотОбъект, Контекст)); КонецПроцедуры // Продолжение процедуры ПоместитьПрисоединенныйФайл. Процедура ПоместитьПрисоединенныйФайлПослеПодключенияРасширения(РасширениеПодключено, Контекст) Экспорт Если Не РасширениеПодключено Тогда Результат = Новый Структура; Результат.Вставить("ОписаниеОшибки", Контекст.ЗаголовокОшибки + НСтр("ru = 'Не установлено расширение для работы с 1С:Предприятием.'")); ВыполнитьОбработкуОповещения(Контекст.Оповещение, Результат); Возврат; КонецЕсли; ПолучитьРабочийКаталогПользователя(Новый ОписаниеОповещения( "ПоместитьПрисоединенныйФайлПослеПолученияРабочегоКаталога", ЭтотОбъект, Контекст)); КонецПроцедуры // Продолжение процедуры ПоместитьПрисоединенныйФайл. Процедура ПоместитьПрисоединенныйФайлПослеПолученияРабочегоКаталога(Результат, Контекст) Экспорт Если ЗначениеЗаполнено(Результат.ОписаниеОшибки) Тогда ОшибочныйРезультат = Новый Структура; ОшибочныйРезультат.Вставить("ОписаниеОшибки", Контекст.ЗаголовокОшибки + Результат.ОписаниеОшибки); ВыполнитьОбработкуОповещения(Контекст.Оповещение, ОшибочныйРезультат); Возврат; КонецЕсли; Контекст.Вставить("РабочийКаталогПользователя", Результат.Каталог); Контекст.Вставить("КаталогФайла", Контекст.РабочийКаталогПользователя + Контекст.ДанныеФайла.ОтносительныйПуть); Контекст.Вставить("ПолноеИмяФайла", Контекст.КаталогФайла + Контекст.ДанныеФайла.ИмяФайла); Файл = Новый Файл(Контекст.ПолноеИмяФайла); Файл.НачатьПроверкуСуществования(Новый ОписаниеОповещения( "ПоместитьПрисоединенныйФайлПослеПолученияРабочегоКаталогаПродолжение", ЭтотОбъект, Контекст)); КонецПроцедуры Процедура ПоместитьПрисоединенныйФайлПослеПолученияРабочегоКаталогаПродолжение(ФайлСуществует, Контекст) Экспорт Если НЕ ФайлСуществует Тогда // для совместимости двух подсистем. Контекст.Вставить("КаталогФайла", Контекст.РабочийКаталогПользователя); Контекст.Вставить("ПолноеИмяФайла", Контекст.ДанныеФайла.ПолноеИмяФайлаВРабочемКаталоге); Если ПустаяСтрока(Контекст.ДанныеФайла.ПолноеИмяФайлаВРабочемКаталоге) Тогда // файла нет в рабочем каталоге, просто освобождаем его. ОсвободитьФайлБезВопроса(Контекст.ДанныеФайла, Контекст.ИдентификаторФормы); Возврат; КонецЕсли; КонецЕсли; Если Не ЗначениеЗаполнено(Контекст.ПолноеИмяПомещаемогоФайла) Тогда Контекст.ПолноеИмяПомещаемогоФайла = Контекст.ПолноеИмяФайла; КонецЕсли; ОписаниеФайла = Новый ОписаниеПередаваемогоФайла(Контекст.ПолноеИмяФайла); ПомещаемыеФайлы = Новый Массив; ПомещаемыеФайлы.Добавить(ОписаниеФайла); ДействияСФайлом = Новый Массив; Вызовы = Новый Массив; Если Контекст.ПолноеИмяФайла <> Контекст.ПолноеИмяПомещаемогоФайла Тогда Действие = Новый Структура; Действие.Вставить("Действие", "СоздатьКаталог"); Действие.Вставить("Файл", Контекст.КаталогФайла); Действие.Вставить("ЗаголовокОшибки", Контекст.ЗаголовокОшибки + НСтр("ru = 'Создание каталога не выполнено по причине:'")); ДействияСФайлом.Добавить(Действие); Действие = Новый Структура; Действие.Вставить("Действие", "УстановитьСвойства"); Действие.Вставить("Файл", Контекст.ПолноеИмяФайла); Действие.Вставить("Свойства", Новый Структура("ТолькоЧтение", Ложь)); Действие.Вставить("ЗаголовокОшибки", Контекст.ЗаголовокОшибки + НСтр("ru = 'Изменение свойства файла ""Только просмотр"" не выполнено по причине:'")); ДействияСФайлом.Добавить(Действие); Действие = Новый Структура; Действие.Вставить("Действие", "СкопироватьИзИсточника"); Действие.Вставить("Файл", Контекст.ПолноеИмяФайла); Действие.Вставить("Источник", Контекст.ПолноеИмяПомещаемогоФайла); Действие.Вставить("ЗаголовокОшибки", Контекст.ЗаголовокОшибки + НСтр("ru = 'Копирование файла не выполнено по причине:'")); ДействияСФайлом.Добавить(Действие); ДобавитьВызов(Вызовы, "НачатьКопированиеФайла", Контекст.ПолноеИмяПомещаемогоФайла, Контекст.ПолноеИмяФайла, Неопределено, Неопределено); КонецЕсли; Действие = Новый Структура; Действие.Вставить("Действие", "УстановитьСвойства"); Действие.Вставить("Файл", Контекст.ПолноеИмяФайла); Действие.Вставить("Свойства", Новый Структура("ТолькоЧтение", Истина)); Действие.Вставить("ЗаголовокОшибки", Контекст.ЗаголовокОшибки + НСтр("ru = 'Изменение свойства файла ""Только просмотр"" не выполнено по причине:'")); ДействияСФайлом.Добавить(Действие); Контекст.Вставить("СвойстваФайла", Новый Структура); Контекст.СвойстваФайла.Вставить("УниверсальноеВремяИзменения"); Контекст.СвойстваФайла.Вставить("ИмяБезРасширения"); Контекст.СвойстваФайла.Вставить("Расширение"); Действие = Новый Структура; Действие.Вставить("Действие", "ПолучитьСвойства"); Действие.Вставить("Файл", Контекст.ПолноеИмяФайла); Действие.Вставить("Свойства", Контекст.СвойстваФайла); Действие.Вставить("ЗаголовокОшибки", Контекст.ЗаголовокОшибки + НСтр("ru = 'Получение свойств файла не выполнено по причине:'")); ДействияСФайлом.Добавить(Действие); Контекст.Вставить("ДействиеПомещения", Новый Структура); Контекст.ДействиеПомещения.Вставить("Действие", "Поместить"); Контекст.ДействиеПомещения.Вставить("Файл", Контекст.ПолноеИмяФайла); Контекст.ДействиеПомещения.Вставить("ЗаголовокОшибки", Контекст.ЗаголовокОшибки); ДействияСФайлом.Добавить(Контекст.ДействиеПомещения); ДобавитьВызов(Вызовы, "НачатьПомещениеФайлов", ПомещаемыеФайлы, Неопределено, Ложь, Контекст.ИдентификаторФормы); Контекст.Вставить("ДействияСФайлом", ДействияСФайлом); НачатьЗапросРазрешенияПользователя(Новый ОписаниеОповещения( "ПоместитьПрисоединенныйФайлПослеПолученияРазрешений", ЭтотОбъект, Контекст), Вызовы); КонецПроцедуры Процедура ДобавитьВызов(Вызовы, Метод, П1, П2, П3, П4) Вызов = Новый Массив; Вызов.Добавить(Метод); Вызов.Добавить(П1); Вызов.Добавить(П2); Вызов.Добавить(П3); Вызов.Добавить(П4); Вызовы.Добавить(Вызов); КонецПроцедуры // Продолжение процедуры ПоместитьПрисоединенныйФайл. Процедура ПоместитьПрисоединенныйФайлПослеПолученияРазрешений(РазрешенияПолучены, Контекст) Экспорт Если РазрешенияПолучены Тогда ОбработатьФайл(Новый ОписаниеОповещения( "ПоместитьПрисоединенныйФайлПослеОбработкиФайла", ЭтотОбъект, Контекст), Контекст.ДействияСФайлом, Контекст.ИдентификаторФормы); КонецЕсли; КонецПроцедуры // Продолжение процедуры ПоместитьПрисоединенныйФайл. Процедура ПоместитьПрисоединенныйФайлПослеОбработкиФайла(РезультатДействий, Контекст) Экспорт Результат = Новый Структура; Если ЗначениеЗаполнено(РезультатДействий.ОписаниеОшибки) Тогда Результат.Вставить("ОписаниеОшибки", РезультатДействий.ОписаниеОшибки); ВыполнитьОбработкуОповещения(Контекст.Оповещение, Результат); Возврат; КонецЕсли; Результат.Вставить("ОписаниеОшибки", ""); Расширение = Контекст.СвойстваФайла.Расширение; ИнформацияОФайле = Новый Структура; ИнформацияОФайле.Вставить("ДатаМодификацииУниверсальная", Контекст.СвойстваФайла.УниверсальноеВремяИзменения); ИнформацияОФайле.Вставить("АдресФайлаВоВременномХранилище", Контекст.ДействиеПомещения.Адрес); ИнформацияОФайле.Вставить("АдресВременногоХранилищаТекста", ""); ИнформацияОФайле.Вставить("ИмяБезРасширения", Контекст.СвойстваФайла.ИмяБезРасширения); ИнформацияОФайле.Вставить("Расширение", Прав(Расширение, СтрДлина(Расширение)-1)); ИнформацияОФайле.Вставить("Редактирует", Неопределено); Попытка РаботаСФайламиСлужебныйВызовСервера.ОбновитьПрисоединенныйФайл( Контекст.ПрисоединенныйФайл, ИнформацияОФайле); Исключение ИнформацияОбОшибке = ИнформацияОбОшибке(); Результат.Вставить("ОписаниеОшибки", Контекст.ЗаголовокОшибки + Символы.ПС + ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке)); КонецПопытки; ВыполнитьОбработкуОповещения(Контекст.Оповещение, Результат); КонецПроцедуры /////////////////////////////////////////////////////////////////////////////// // Открытие проводника с позиционированием на файле. // Процедура открывает проводник Windows, позиционируясь на Файл. // // Параметры: // ОбработчикРезультата - ОписаниеОповещения // - Неопределено - описание процедуры, принимающей результат работы метода. // ДанныеФайла - см. РаботаСФайламиСлужебныйВызовСервера.ДанныеФайла // Процедура КаталогФайла(ОбработчикРезультата, ДанныеФайла) Экспорт // Если Файл без файла - эта операция не имеет смысла. Если ДанныеФайла.Версия.Пустая() Тогда Возврат; КонецЕсли; #Если ВебКлиент Тогда Если НЕ РасширениеРаботыСФайламиПодключено() Тогда ПоказатьПредупреждениеОНеобходимостиРасширенияРаботыСФайлами(ОбработчикРезультата); Возврат; КонецЕсли; #КонецЕсли ПолноеИмяФайла = ПолучитьПутьФайлаВРабочемКаталоге(ДанныеФайла); Если ОткрытьПроводникСФайлом(ПолноеИмяФайла) Тогда Возврат; КонецЕсли; ИмяФайла = ОбщегоНазначенияКлиентСервер.ПолучитьИмяСРасширением( ДанныеФайла.ПолноеНаименованиеВерсии, ДанныеФайла.Расширение); ПараметрыОбработчика = Новый Структура; ПараметрыОбработчика.Вставить("ОбработчикРезультата", ОбработчикРезультата); ПараметрыОбработчика.Вставить("ДанныеФайла", ДанныеФайла); ПараметрыОбработчика.Вставить("ИмяФайла", ИмяФайла); ПараметрыОбработчика.Вставить("ПолноеИмяФайла", ПолноеИмяФайла); Обработчик = Новый ОписаниеОповещения("КаталогФайлаПослеОтветаНаВопросПолучитьФайл", ЭтотОбъект, ПараметрыОбработчика); КнопкиВопроса = Новый СписокЗначений; КнопкиВопроса.Добавить(КодВозвратаДиалога.Да, НСтр("ru = 'Сохранить и открыть каталог'")); КнопкиВопроса.Добавить(КодВозвратаДиалога.Нет, НСтр("ru = 'Отмена'")); ПоказатьВопрос(Обработчик, СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Каталог файла не существует. Возможно, на данном компьютере файл ""%1"" еще не открывался. |Сохранить файл на компьютер и открыть его каталог?'"), ИмяФайла), КнопкиВопроса); КонецПроцедуры // Продолжение процедуры (см. выше). Процедура КаталогФайлаПослеОтветаНаВопросПолучитьФайл(Ответ, ПараметрыВыполнения) Экспорт Если Ответ = КодВозвратаДиалога.Да Тогда Обработчик = Новый ОписаниеОповещения("КаталогФайлаПослеПолученияФайлаВРабочийКаталог", ЭтотОбъект, ПараметрыВыполнения); ПолучитьФайлВерсииВРабочийКаталог(Обработчик, ПараметрыВыполнения.ДанныеФайла, ПараметрыВыполнения.ПолноеИмяФайла); Иначе КаталогФайлаПослеПолученияФайлаВРабочийКаталог(-1, ПараметрыВыполнения); КонецЕсли; КонецПроцедуры // Продолжение процедуры (см. выше). Процедура КаталогФайлаПослеПолученияФайлаВРабочийКаталог(Результат, ПараметрыВыполнения) Экспорт Если Результат <> -1 Тогда ПараметрыВыполнения.ПолноеИмяФайла = Результат.ПолноеИмяФайла; ОткрытьПроводникСФайлом(ПараметрыВыполнения.ПолноеИмяФайла); КонецЕсли; // Для варианта с хранением файлов в томах удаляем Файл из временного хранилища после получения. Если ЭтоАдресВременногоХранилища(ПараметрыВыполнения.ДанныеФайла.НавигационнаяСсылкаТекущейВерсии) Тогда УдалитьИзВременногоХранилища(ПараметрыВыполнения.ДанныеФайла.НавигационнаяСсылкаТекущейВерсии); КонецЕсли; КонецПроцедуры //////////////////////////////////////////////////////////////////////////////// // Удаление файла с компьютера и из регистра сведений. // Удалить с компьютера и из регистра сведений. // // Параметры: // ОбработчикРезультата - ОписаниеОповещения // - Неопределено - описание процедуры, принимающей результат работы метода. // Ссылка - СправочникСсылка.Файлы - файл. // УдалитьВРабочемКаталоге - Булево - удалить даже в рабочем каталоге. // Процедура УдалитьФайлИзРабочегоКаталога(ОбработчикРезультата, Ссылка, УдалитьВРабочемКаталоге = Ложь) ПараметрыВыполнения = Новый Структура; ПараметрыВыполнения.Вставить("ОбработчикРезультата", ОбработчикРезультата); ПараметрыВыполнения.Вставить("Ссылка", Ссылка); ПараметрыВыполнения.Вставить("Успех", Ложь); ПараметрыВыполнения.Вставить("ИмяКаталога", РабочийКаталогПользователя()); ПараметрыВыполнения.Вставить("ПолноеИмяФайлаИзРегистра", Неопределено); ВРабочемКаталогеВладельца = Ложь; ПараметрыВыполнения.ПолноеИмяФайлаИзРегистра = РаботаСФайламиСлужебныйВызовСервера.ПолноеИмяФайлаВРабочемКаталоге( ПараметрыВыполнения.Ссылка, ПараметрыВыполнения.ИмяКаталога, Ложь, ВРабочемКаталогеВладельца); Если ПараметрыВыполнения.ПолноеИмяФайлаИзРегистра <> "" Тогда // Обычно в рабочем каталоге не удаляем - только если передан УдалитьВРабочемКаталоге. Если Не ВРабочемКаталогеВладельца ИЛИ УдалитьВРабочемКаталоге = Истина Тогда ФайлНаДиске = Новый Файл(ПараметрыВыполнения.ПолноеИмяФайлаИзРегистра); Если ФайлНаДиске.Существует() Тогда ФайлНаДиске.УстановитьТолькоЧтение(Ложь); ОбработчикЗавершения = Новый ОписаниеОповещения("УдалитьФайлИзРабочегоКаталогаПослеУдаленияФайла", ЭтотОбъект); ЗарегистрироватьОбработчикЗавершения(ПараметрыВыполнения, ОбработчикЗавершения); УдалитьФайл(ПараметрыВыполнения, ПараметрыВыполнения.ПолноеИмяФайлаИзРегистра); Если ПараметрыВыполнения.АсинхронныйДиалог.Открыт = Истина Тогда Возврат; КонецЕсли; УдалитьФайлИзРабочегоКаталогаПослеУдаленияФайла( ПараметрыВыполнения.АсинхронныйДиалог.РезультатКогдаНеОткрыт, ПараметрыВыполнения); Возврат; КонецЕсли; КонецЕсли; КонецЕсли; УдалитьФайлИзРабочегоКаталогаЗавершение(ПараметрыВыполнения); КонецПроцедуры // Продолжение процедуры (см. выше). Процедура УдалитьФайлИзРабочегоКаталогаПослеУдаленияФайла(Результат, ПараметрыВыполнения) Экспорт ПутьСПодкаталогом = ПараметрыВыполнения.ИмяКаталога; Позиция = СтрНайти(ПараметрыВыполнения.ПолноеИмяФайлаИзРегистра, ПолучитьРазделительПути()); Если Позиция <> 0 Тогда ПутьСПодкаталогом = ПутьСПодкаталогом + Лев(ПараметрыВыполнения.ПолноеИмяФайлаИзРегистра, Позиция); КонецЕсли; МассивФайловВКаталоге = НайтиФайлы(ПутьСПодкаталогом, "*"); Если МассивФайловВКаталоге.Количество() = 0 Тогда Если ПутьСПодкаталогом <> ПараметрыВыполнения.ИмяКаталога Тогда Попытка УдалитьФайлы(ПутьСПодкаталогом); Исключение ЖурналРегистрацииКлиент.ДобавитьСообщениеДляЖурналаРегистрации(СобытиеЖурналаРегистрации(), "Предупреждение", ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()),, Истина); КонецПопытки; КонецЕсли; КонецЕсли; УдалитьФайлИзРабочегоКаталогаЗавершение(ПараметрыВыполнения); КонецПроцедуры // Продолжение процедуры (см. выше). Процедура УдалитьФайлИзРабочегоКаталогаЗавершение(ПараметрыВыполнения) Если ПараметрыВыполнения.ПолноеИмяФайлаИзРегистра = "" Тогда РаботаСФайламиСлужебныйВызовСервера.УдалитьИзРегистра(ПараметрыВыполнения.Ссылка); Иначе ФайлНаДиске = Новый Файл(ПараметрыВыполнения.ПолноеИмяФайлаИзРегистра); Если НЕ ФайлНаДиске.Существует() Тогда РаботаСФайламиСлужебныйВызовСервера.УдалитьИзРегистра(ПараметрыВыполнения.Ссылка); КонецЕсли; КонецЕсли; ПараметрыВыполнения.Успех = Истина; ВернутьРезультат(ПараметрыВыполнения.ОбработчикРезультата, ПараметрыВыполнения); КонецПроцедуры //////////////////////////////////////////////////////////////////////////////// // Очистка рабочего каталога. // Освободить место для помещения файла - если место есть, ничего не делает. // // Параметры: // ОбработчикРезультата - ОписаниеОповещения // - Неопределено - описание процедуры, принимающей результат работы метода. // РеквизитыВерсии - см. РаботаСФайламиСлужебныйВызовСервера.ДанныеФайла // Процедура ОсвободитьМестоВРабочемКаталоге(ОбработчикРезультата, РеквизитыВерсии) #Если ВебКлиент Тогда // В веб-клиенте нельзя определить количество свободного места на диске. ВернутьРезультатПослеПоказаПредупреждения( ОбработчикРезультата, НСтр("ru = 'Очистка рабочего каталога возможна только в тонком клиенте.'"), Неопределено); Возврат; #КонецЕсли МаксРазмер = ПерсональныеНастройкиРаботыСФайлами().МаксимальныйРазмерЛокальногоКэшаФайлов; // Если размер РабочийКаталог установлен равным 0, // то считается, что никакого ограничения нет и умолчание в 10 Мб не используется. Если МаксРазмер = 0 Тогда Возврат; КонецЕсли; ИмяКаталога = РабочийКаталогПользователя(); МассивФайлов = НайтиФайлы(ИмяКаталога, ПолучитьМаскуВсеФайлы()); РазмерФайловВРабочемКаталоге = 0; КоличествоСуммарное = 0; // Вычисление полного размера файлов в рабочем каталоге. ОбходФайловРазмер(ИмяКаталога, МассивФайлов, РазмерФайловВРабочемКаталоге, КоличествоСуммарное); Размер = РеквизитыВерсии.Размер; Если РазмерФайловВРабочемКаталоге + Размер > МаксРазмер Тогда ОчиститьРабочийКаталог(ОбработчикРезультата, РазмерФайловВРабочемКаталоге, Размер, Ложь); // ОчищатьВсе = Ложь. КонецЕсли; КонецПроцедуры // Очистка рабочего каталога - для освобождения места - в первую очередь удаляет файлы // наиболее давно помещенные в рабочий каталог. // // Параметры: // ОбработчикРезультата - ОписаниеОповещения // - Неопределено - описание процедуры, принимающей результат работы метода. // РазмерФайловВРабочемКаталоге - Число - размер файлов в рабочем каталоге. // РазмерДобавляемогоФайла - Число - размер добавляемого файла. // ОчищатьВсе - Булево - удалять все файлы в каталоге (а не только до освобождения нужного объема места на диске). // Процедура ОчиститьРабочийКаталог(ОбработчикРезультата, РазмерФайловВРабочемКаталоге, РазмерДобавляемогоФайла, ОчищатьВсе) Экспорт #Если ВебКлиент Тогда ВернутьРезультатПослеПоказаПредупреждения(ОбработчикРезультата, НСтр("ru = 'Очистка рабочего каталога возможна только в приложении (тонкий клиент).'"), Неопределено); Возврат; #КонецЕсли ПараметрыОбработчика = Новый Структура; ПараметрыОбработчика.Вставить("ОбработчикРезультата", ОбработчикРезультата); ПараметрыОбработчика.Вставить("РазмерФайловВРабочемКаталоге", РазмерФайловВРабочемКаталоге); ПараметрыОбработчика.Вставить("РазмерДобавляемогоФайла", РазмерДобавляемогоФайла); ПараметрыОбработчика.Вставить("ОчищатьВсе", ОчищатьВсе); ОчиститьРабочийКаталогЗапуск(ПараметрыОбработчика); КонецПроцедуры // Продолжение процедуры (см. выше). Процедура ОчиститьРабочийКаталогЗапуск(ПараметрыВыполнения) ИмяКаталога = РабочийКаталогПользователя(); ТаблицаФайлов = Новый Массив; МассивФайлов = НайтиФайлы(ИмяКаталога, "*"); ОбходФайловТаблица(ИмяКаталога, МассивФайлов, ТаблицаФайлов); // Вызов сервера - для сортировки // сортировка по дате - в начале будут самые давно помещенные в рабочий каталог. РаботаСФайламиСлужебныйВызовСервера.СортироватьМассивСтруктур(ТаблицаФайлов); ПерсональныеНастройки = ПерсональныеНастройкиРаботыСФайлами(); МаксРазмер = ПерсональныеНастройки.МаксимальныйРазмерЛокальногоКэшаФайлов; СреднийРазмерФайла = 1000; Если ТаблицаФайлов.Количество() <> 0 Тогда СреднийРазмерФайла = ПараметрыВыполнения.РазмерФайловВРабочемКаталоге / ТаблицаФайлов.Количество(); КонецЕсли; Если ПараметрыВыполнения.ОчищатьВсе Тогда СколькоНадоОсвободитьМеста = 0; Иначе СколькоНадоОсвободитьМеста = МаксРазмер / 10; Если СреднийРазмерФайла * 3 / 2 > СколькоНадоОсвободитьМеста Тогда СколькоНадоОсвободитьМеста = СреднийРазмерФайла * 3 / 2; КонецЕсли; КонецЕсли; СколькоОсталось = ПараметрыВыполнения.РазмерФайловВРабочемКаталоге + ПараметрыВыполнения.РазмерДобавляемогоФайла; ПараметрыВыполнения.Вставить("ИмяКаталога", ИмяКаталога); ПараметрыВыполнения.Вставить("МаксРазмер", МаксРазмер); ПараметрыВыполнения.Вставить("СколькоОсталось", СколькоОсталось); ПараметрыВыполнения.Вставить("СколькоНадоОсвободитьМеста", СколькоНадоОсвободитьМеста); ПараметрыВыполнения.Вставить("ТаблицаФайлов", ТаблицаФайлов); ОчиститьРабочийКаталогДляОткрываемогоФайла(ПараметрыВыполнения); КонецПроцедуры // Параметры: // ПараметрыВыполнения - Структура: // * ТаблицаФайлов - Массив из см. ДанныеФайловВРабочемКаталоге // Процедура ОчиститьРабочийКаталогДляОткрываемогоФайла(ПараметрыВыполнения) Индекс = 0; Заголовок = НСтр("ru = 'Очистка рабочего каталога'"); Текст = НСтр("ru = 'Пожалуйста, подождите...'"); Состояние(Заголовок, 1, Текст); Для каждого Элемент Из ПараметрыВыполнения.ТаблицаФайлов Цикл Индекс = Индекс + 1; ПолныйПуть = ПараметрыВыполнения.ИмяКаталога + Элемент.Путь; ФайлНаДиске = Новый Файл(ПолныйПуть); ФайлНаДиске.УстановитьТолькоЧтение(Ложь); УдалитьФайл(ПараметрыВыполнения, ПолныйПуть); ПутьСПодкаталогом = ПараметрыВыполнения.ИмяКаталога; Позиция = СтрНайти(Элемент.Путь, ПолучитьРазделительПути()); Если Позиция <> 0 Тогда ПутьСПодкаталогом = ПараметрыВыполнения.ИмяКаталога + Лев(Элемент.Путь, Позиция); КонецЕсли; // Если каталог стал пуст - удалить его. МассивФайловВКаталоге = НайтиФайлы(ПутьСПодкаталогом, "*"); Если МассивФайловВКаталоге.Количество() = 0 Тогда Если ПутьСПодкаталогом <> ПараметрыВыполнения.ИмяКаталога Тогда Попытка УдалитьФайлы(ПутьСПодкаталогом); Исключение ЖурналРегистрацииКлиент.ДобавитьСообщениеДляЖурналаРегистрации(СобытиеЖурналаРегистрации(), "Предупреждение", ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()),, Истина); КонецПопытки; КонецЕсли; КонецЕсли; РаботаСФайламиСлужебныйВызовСервера.УдалитьИзРегистра(Элемент.Версия); Если ПараметрыВыполнения.СколькоНадоОсвободитьМеста > 0 Тогда ПараметрыВыполнения.СколькоОсталось = ПараметрыВыполнения.СколькоОсталось - Элемент.Размер; Если ПараметрыВыполнения.СколькоОсталось < ПараметрыВыполнения.МаксРазмер - ПараметрыВыполнения.СколькоНадоОсвободитьМеста Тогда Возврат; // Освободили достаточно - выход из цикла. КонецЕсли; КонецЕсли; Если Индекс % 10 = 0 Тогда Прогресс = ?(ПараметрыВыполнения.СколькоНадоОсвободитьМеста > 0, (ПараметрыВыполнения.СколькоНадоОсвободитьМеста - ПараметрыВыполнения.СколькоОсталось) * 100 / ПараметрыВыполнения.СколькоНадоОсвободитьМеста, Индекс * 100 / ПараметрыВыполнения.ТаблицаФайлов.Количество()); Состояние(Заголовок, Прогресс, Текст); КонецЕсли; КонецЦикла; КонецПроцедуры //////////////////////////////////////////////////////////////////////////////// // Получение файла с сервера и регистрация в локальном кэше. // Получить Файл с сервера и зарегистрировать в локальном кэше. // // Параметры: // ПараметрыВыполнения - Структура: // * ОбработчикРезультата - ОписаниеОповещения // - Неопределено - описание процедуры, принимающей результат работы. // * ДанныеФайла - см. РаботаСФайламиСлужебныйВызовСервера.ДанныеФайла // * ПолноеИмяФайлаВРабочемКаталоге - Строка - здесь возвращается полное имя файла. // * ДатаФайлаВБазе - Дата - дата файла в базе. // * НаЧтение - Булево - файл помещен на чтение. // * ИдентификаторФормы - УникальныйИдентификатор - идентификатор формы. // Процедура ПолучитьССервераИЗарегистрироватьВЛокальномКэшеФайлов(Знач ПараметрыВыполнения) ПараметрыВыполнения = ОбщегоНазначенияКлиент.СкопироватьРекурсивно(ПараметрыВыполнения); ПараметрыВыполнения.Вставить("ВРабочемКаталогеВладельца", ПараметрыВыполнения.ДанныеФайла.РабочийКаталогВладельца <> ""); ПараметрыВыполнения.Вставить("ИмяКаталога", ""); ПараметрыВыполнения.Вставить("ИмяКаталогаПрежнееЗначение", ""); ПараметрыВыполнения.Вставить("ИмяФайла", ""); ПараметрыВыполнения.Вставить("МаксимальнаяДлинаПолногоПути", 260); ПараметрыВыполнения.Вставить("ФайлПолучен", Ложь); Если ПараметрыВыполнения.ПолноеИмяФайла = "" Тогда ПараметрыВыполнения.ИмяКаталога = РабочийКаталогПользователя(); ПараметрыВыполнения.ИмяКаталогаПрежнееЗначение = ПараметрыВыполнения.ИмяКаталога; // Формирование имени файла с расширением. ПараметрыВыполнения.ИмяФайла = ПараметрыВыполнения.ДанныеФайла.ПолноеНаименованиеВерсии; Если Не ПустаяСтрока(ПараметрыВыполнения.ДанныеФайла.Расширение) Тогда ПараметрыВыполнения.ИмяФайла = ОбщегоНазначенияКлиентСервер.ПолучитьИмяСРасширением( ПараметрыВыполнения.ИмяФайла, ПараметрыВыполнения.ДанныеФайла.Расширение); КонецЕсли; ОбщегоНазначенияСлужебныйКлиент.СократитьИмяФайла(ПараметрыВыполнения.ИмяФайла); ПараметрыВыполнения.ПолноеИмяФайла = ""; Если Не ПустаяСтрока(ПараметрыВыполнения.ИмяФайла) Тогда ПараметрыВыполнения.ПолноеИмяФайла = ПараметрыВыполнения.ИмяКаталога + РаботаСФайламиСлужебныйКлиентСервер.УникальноеИмяСПутем(ПараметрыВыполнения.ИмяКаталога, ПараметрыВыполнения.ИмяФайла); КонецЕсли; Если ПустаяСтрока(ПараметрыВыполнения.ИмяФайла) Тогда ВернутьРезультат(ПараметрыВыполнения.ОбработчикРезультата, ПараметрыВыполнения); Возврат; КонецЕсли; ПараметрыВыполнения.МаксимальнаяДлинаПолногоПути = 260; Если НРег(ПараметрыВыполнения.ДанныеФайла.Расширение) = "xls" Или НРег(ПараметрыВыполнения.ДанныеФайла.Расширение) = "xlsx" Тогда // Для Excel длина имени файла вместе с путем не должна превышать 218 знака. ПараметрыВыполнения.МаксимальнаяДлинаПолногоПути = 218; КонецЕсли; МаксимальнаяДлинаИмениФайла = ПараметрыВыполнения.МаксимальнаяДлинаПолногоПути - 5; // 5 - минимум для "C:\1\" Если ПараметрыВыполнения.ВРабочемКаталогеВладельца = Ложь Тогда #Если Не ВебКлиент Тогда Если СтрДлина(ПараметрыВыполнения.ПолноеИмяФайла) > ПараметрыВыполнения.МаксимальнаяДлинаПолногоПути Тогда ПутьКаталогаПользователя = КаталогДанныхПользователя(); МаксимальнаяДлинаИмениФайла = ПараметрыВыполнения.МаксимальнаяДлинаПолногоПути - СтрДлина(ПутьКаталогаПользователя); // Если имя файла плюс 5 превышает 260 - пишем "Измените имя файла на более короткое. ОК" и выходим. Если СтрДлина(ПараметрыВыполнения.ИмяФайла) > МаксимальнаяДлинаИмениФайла Тогда ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = 'Длина пути к файлу (рабочий каталог плюс имя файла) превышает %1 символов |%2'"), ПараметрыВыполнения.МаксимальнаяДлинаПолногоПути, ПараметрыВыполнения.ПолноеИмяФайла); ТекстСообщения = ТекстСообщения + Символы.ВК + Символы.ВК + НСтр("ru = 'Измените имя файла на более короткое.'"); ВернутьРезультатПослеПоказаПредупреждения(ПараметрыВыполнения.ОбработчикРезультата, ТекстСообщения, ПараметрыВыполнения); Возврат; КонецЕсли; ПолучитьССервераИЗарегистрироватьВЛокальномКэшеФайловПредложитьВыборКаталога(-1, ПараметрыВыполнения); Возврат; КонецЕсли; #КонецЕсли КонецЕсли; КонецЕсли; ПолучитьССервераИЗарегистрироватьВЛокальномКэшеФайловПродолжение(ПараметрыВыполнения); КонецПроцедуры // Продолжение процедуры (см. выше). Процедура ПолучитьССервераИЗарегистрироватьВЛокальномКэшеФайловПредложитьВыборКаталога(Ответ, ПараметрыВыполнения) ТекстВопроса = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = 'Длина пути к файлу превышает %1 символов: |%2 | |Выбрать другой основной рабочий каталог?'"), ПараметрыВыполнения.МаксимальнаяДлинаПолногоПути, ПараметрыВыполнения.ПолноеИмяФайла); Обработчик = Новый ОписаниеОповещения("ПолучитьССервераИЗарегистрироватьВЛокальномКэшеФайловНачатьВыборКаталога", ЭтотОбъект, ПараметрыВыполнения); ПоказатьВопрос(Обработчик, ТекстВопроса, РежимДиалогаВопрос.ДаНет); КонецПроцедуры // Продолжение процедуры (см. выше). Процедура ПолучитьССервераИЗарегистрироватьВЛокальномКэшеФайловНачатьВыборКаталога(Ответ, ПараметрыВыполнения) Экспорт Если Ответ = КодВозвратаДиалога.Нет Тогда ВернутьРезультат(ПараметрыВыполнения.ОбработчикРезультата, ПараметрыВыполнения); Возврат; КонецЕсли; // Выбираем другой путь к рабочему каталогу. Заголовок = НСтр("ru = 'Выберите другой основной рабочий каталог'"); КаталогВыбран = ВыбратьПутьКРабочемуКаталогу(ПараметрыВыполнения.ИмяКаталога, Заголовок, Ложь); Если Не КаталогВыбран Тогда ВернутьРезультат(ПараметрыВыполнения.ОбработчикРезультата, ПараметрыВыполнения); Возврат; КонецЕсли; ПараметрыВыполнения.ПолноеИмяФайла = ПараметрыВыполнения.ИмяКаталога + РаботаСФайламиСлужебныйКлиентСервер.УникальноеИмяСПутем( ПараметрыВыполнения.ИмяКаталога, ПараметрыВыполнения.ИмяФайла); // уложились в 260 символов Если СтрДлина(ПараметрыВыполнения.ПолноеИмяФайла) <= ПараметрыВыполнения.МаксимальнаяДлинаПолногоПути Тогда Обработчик = Новый ОписаниеОповещения("ПолучитьССервераИЗарегистрироватьВЛокальномКэшеФайловПослеПереносаСодержимогоРабочегоКаталога", ЭтотОбъект, ПараметрыВыполнения); ПеренестиСодержимоеРабочегоКаталога(Обработчик, ПараметрыВыполнения.ИмяКаталогаПрежнееЗначение, ПараметрыВыполнения.ИмяКаталога); Иначе ПолучитьССервераИЗарегистрироватьВЛокальномКэшеФайловПредложитьВыборКаталога(-1, ПараметрыВыполнения); КонецЕсли; КонецПроцедуры // Продолжение процедуры (см. выше). Процедура ПолучитьССервераИЗарегистрироватьВЛокальномКэшеФайловПослеПереносаСодержимогоРабочегоКаталога(СодержимоеПеренесено, ПараметрыВыполнения) Экспорт Если СодержимоеПеренесено Тогда УстановитьРабочийКаталогПользователя(ПараметрыВыполнения.ИмяКаталога); ПолучитьССервераИЗарегистрироватьВЛокальномКэшеФайловПродолжение(ПараметрыВыполнения); Иначе ВернутьРезультат(ПараметрыВыполнения.ОбработчикРезультата, ПараметрыВыполнения); КонецЕсли; КонецПроцедуры // Продолжение процедуры (см. выше). // // Параметры: // ПараметрыВыполнения - Структура: // * ДанныеФайла - см. РаботаСФайламиСлужебныйВызовСервера.ДанныеФайла // Процедура ПолучитьССервераИЗарегистрироватьВЛокальномКэшеФайловПродолжение(ПараметрыВыполнения) #Если Не ВебКлиент Тогда Если ПараметрыВыполнения.ВРабочемКаталогеВладельца = Ложь Тогда ОсвободитьМестоВРабочемКаталоге(Неопределено, ПараметрыВыполнения.ДанныеФайла); КонецЕсли; #КонецЕсли // Запись Файл в каталог ПараметрыВыполнения.ИмяФайла = ОбщегоНазначенияКлиентСервер.ПолучитьИмяСРасширением( ПараметрыВыполнения.ДанныеФайла.ПолноеНаименованиеВерсии, ПараметрыВыполнения.ДанныеФайла.Расширение); ОбщегоНазначенияСлужебныйКлиент.СократитьИмяФайла(ПараметрыВыполнения.ИмяФайла); ФайлНаДискеПоИмени = Новый Файл(ПараметрыВыполнения.ПолноеИмяФайла); ИмяИРасширениеВПути = ФайлНаДискеПоИмени.Имя; Позиция = СтрНайти(ПараметрыВыполнения.ПолноеИмяФайла, ИмяИРасширениеВПути); ПутьКФайлу = ""; Если Позиция <> 0 Тогда ПутьКФайлу = Лев(ПараметрыВыполнения.ПолноеИмяФайла, Позиция - 1); // -1 - вычет слэша КонецЕсли; ПутьКФайлу = ОбщегоНазначенияКлиентСервер.ДобавитьКонечныйРазделительПути(ПутьКФайлу); ПараметрыВыполнения.Вставить("ПараметрПутьКФайлу", ПутьКФайлу); ПараметрыВыполнения.ПолноеИмяФайла = ПутьКФайлу + ПараметрыВыполнения.ИмяФайла; // могло смениться расширение Если ПараметрыВыполнения.ДанныеФайла.Свойство("ПутьОбновленияИзФайлаНаДиске") Тогда КопироватьФайл(ПараметрыВыполнения.ДанныеФайла.ПутьОбновленияИзФайлаНаДиске, ПараметрыВыполнения.ПолноеИмяФайла); ПолучитьССервераИЗарегистрироватьВЛокальномКэшеФайловЗавершение(ПараметрыВыполнения); Возврат; КонецЕсли; Если ПараметрыВыполнения.ДанныеФайла.Зашифрован Тогда Если Не ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.ЭлектроннаяПодпись") Тогда Возврат; КонецЕсли; ЗаполнитьВременныйИдентификаторФормы(ПараметрыВыполнения.ИдентификаторФормы, ПараметрыВыполнения); СтруктураВозврата = РаботаСФайламиСлужебныйВызовСервера.ДанныеФайлаИДвоичныеДанные( ПараметрыВыполнения.ДанныеФайла.Версия,, ПараметрыВыполнения.ИдентификаторФормы); ОписаниеДанных = Новый Структура; ОписаниеДанных.Вставить("Операция", НСтр("ru = 'Расшифровка файла'")); ОписаниеДанных.Вставить("ЗаголовокДанных", НСтр("ru = 'Файл'")); ОписаниеДанных.Вставить("Данные", СтруктураВозврата.ДвоичныеДанные); ОписаниеДанных.Вставить("Представление", ПараметрыВыполнения.ДанныеФайла.Ссылка); ОписаниеДанных.Вставить("СертификатыШифрования", ПараметрыВыполнения.ДанныеФайла.Ссылка); ОписаниеДанных.Вставить("СообщитьОЗавершении", Ложь); ОбработчикПродолжения = Новый ОписаниеОповещения( "ПолучитьССервераИЗарегистрироватьВЛокальномКэшеФайловПослеРасшифровки", ЭтотОбъект, ПараметрыВыполнения); МодульЭлектроннаяПодписьКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("ЭлектроннаяПодписьКлиент"); МодульЭлектроннаяПодписьКлиент.Расшифровать(ОписаниеДанных, , ОбработчикПродолжения); Возврат; КонецЕсли; ПолучитьССервераИЗарегистрироватьВЛокальномКэшеФайловПередачаФайла(ПараметрыВыполнения); КонецПроцедуры // Продолжение процедуры (см. выше). Процедура ПолучитьССервераИЗарегистрироватьВЛокальномКэшеФайловПослеРасшифровки(ОписаниеДанных, ПараметрыВыполнения) Экспорт Если Не ОписаниеДанных.Успех Тогда ВернутьРезультат(ПараметрыВыполнения.ОбработчикРезультата, ПараметрыВыполнения); Возврат; КонецЕсли; Если ТипЗнч(ОписаниеДанных.РасшифрованныеДанные) = Тип("ДвоичныеДанные") Тогда АдресФайла = ПоместитьВоВременноеХранилище(ОписаниеДанных.РасшифрованныеДанные, ПараметрыВыполнения.ИдентификаторФормы); ДанныеФайла = ПараметрыВыполнения.ОбработчикРезультата.ДополнительныеПараметры.ДанныеФайла; ДанныеФайла.Кодировка = РаботаСФайламиСлужебныйКлиентСервер.ОпределитьКодировкуДвоичныхДанных(ОписаниеДанных.РасшифрованныеДанные, ДанныеФайла.Расширение); Иначе АдресФайла = ОписаниеДанных.РасшифрованныеДанные; КонецЕсли; ПолучитьССервераИЗарегистрироватьВЛокальномКэшеФайловПередачаФайла(ПараметрыВыполнения, АдресФайла); КонецПроцедуры // Продолжение процедуры (см. выше). Процедура ПолучитьССервераИЗарегистрироватьВЛокальномКэшеФайловПередачаФайла(ПараметрыВыполнения, АдресФайла = Неопределено) Если АдресФайла = Неопределено Тогда Если ПараметрыВыполнения.ДанныеФайла.Версия <> ПараметрыВыполнения.ДанныеФайла.ТекущаяВерсия Тогда АдресФайла = РаботаСФайламиСлужебныйВызовСервера.ПолучитьНавигационнуюСсылкуДляОткрытия( ПараметрыВыполнения.ДанныеФайла.Версия, ПараметрыВыполнения.ИдентификаторФормы); Иначе АдресФайла = ПараметрыВыполнения.ДанныеФайла.СсылкаНаДвоичныеДанныеФайла; КонецЕсли; КонецЕсли; ПередаваемыеФайлы = Новый Массив; Описание = Новый ОписаниеПередаваемогоФайла(ПараметрыВыполнения.ПолноеИмяФайла, АдресФайла); ПередаваемыеФайлы.Добавить(Описание); #Если ВебКлиент Тогда Если ПараметрыВыполнения.ДополнительныеПараметры <> Неопределено И ПараметрыВыполнения.ДополнительныеПараметры.Свойство("ОткрытьФайл") Тогда МассивОпераций = Новый Массив; ОписаниеВызова = Новый Массив; ОписаниеВызова.Добавить("ПолучитьФайлы"); ОписаниеВызова.Добавить(ПередаваемыеФайлы); ОписаниеВызова.Добавить(Неопределено); // Не используется. ОписаниеВызова.Добавить(ПараметрыВыполнения.ПараметрПутьКФайлу); ОписаниеВызова.Добавить(Ложь); // Интерактивно = Ложь. МассивОпераций.Добавить(ОписаниеВызова); ОписаниеВызова = Новый Массив; ОписаниеВызова.Добавить("ЗапуститьПриложение"); ОписаниеВызова.Добавить(ПараметрыВыполнения.ПолноеИмяФайла); МассивОпераций.Добавить(ОписаниеВызова); Если Не ЗапроситьРазрешениеПользователя(МассивОпераций) Тогда // Пользователь не дал разрешения. ОчиститьВременныйИдентификаторФормы(ПараметрыВыполнения); ВернутьРезультат(ПараметрыВыполнения.ОбработчикРезультата, ПараметрыВыполнения); Возврат; КонецЕсли; КонецЕсли; #КонецЕсли ПолученныеФайлы = Новый Массив; Если Не ПолучитьФайлы(ПередаваемыеФайлы, ПолученныеФайлы , , Ложь) Тогда ОчиститьВременныйИдентификаторФормы(ПараметрыВыполнения); ВернутьРезультат(ПараметрыВыполнения.ОбработчикРезультата, ПараметрыВыполнения); Возврат; КонецЕсли; // Для варианта с хранением файлов в томах файл удаляется из временного хранилища после получения. Если ЭтоАдресВременногоХранилища(АдресФайла) Тогда УдалитьИзВременногоХранилища(АдресФайла); КонецЕсли; // Установим время изменения файла таким, как оно указано в текущей версии. УстановитьУниверсальноеВремяИзменения(ПараметрыВыполнения.ПолноеИмяФайла, ПараметрыВыполнения.ДанныеФайла.ДатаМодификацииУниверсальная); ПолучитьССервераИЗарегистрироватьВЛокальномКэшеФайловЗавершение(ПараметрыВыполнения); КонецПроцедуры // Продолжение процедуры (см. выше). Процедура ПолучитьССервераИЗарегистрироватьВЛокальномКэшеФайловЗавершение(ПараметрыВыполнения) ФайлНаДиске = Новый Файл(ПараметрыВыполнения.ПолноеИмяФайла); // Т.к. размер на компьютере может отличаться от размера в базе (при добавлении в веб-клиенте). РазмерФайла = ФайлНаДиске.Размер(); ФайлНаДиске.УстановитьТолькоЧтение(ПараметрыВыполнения.НаЧтение); ПараметрыВыполнения.ИмяКаталога = РабочийКаталогПользователя(); РаботаСФайламиСлужебныйВызовСервера.ЗанестиИнформациюФайлаВРегистр(ПараметрыВыполнения.ДанныеФайла.Версия, ПараметрыВыполнения.ПолноеИмяФайла, ПараметрыВыполнения.ИмяКаталога, ПараметрыВыполнения.НаЧтение, РазмерФайла, ПараметрыВыполнения.ВРабочемКаталогеВладельца); Если ПараметрыВыполнения.ДанныеФайла.Размер <> РазмерФайла Тогда Если Не ПараметрыВыполнения.ДанныеФайла.Свойство("ПутьОбновленияИзФайлаНаДиске") Тогда РаботаСФайламиСлужебныйВызовСервера.ОбновитьРазмерФайлаИВерсии(ПараметрыВыполнения.ДанныеФайла, РазмерФайла, ПараметрыВыполнения.ИдентификаторФормы); ОповеститьОбИзменении(ПараметрыВыполнения.ДанныеФайла.Ссылка); ОповеститьОбИзменении(ПараметрыВыполнения.ДанныеФайла.Версия); ПараметрыОповещения = ПараметрыОповещенияЗаписиФайла(); ПараметрыОповещения.Файл = ПараметрыВыполнения.ДанныеФайла.Ссылка; ПараметрыОповещения.Событие = "ДанныеФайлаИзменены"; ПараметрыОповещения.ЭтоНовый = Ложь; Оповестить("Запись_Файл", ПараметрыОповещения, ПараметрыВыполнения.ДанныеФайла.Ссылка); КонецЕсли; КонецЕсли; ОчиститьВременныйИдентификаторФормы(ПараметрыВыполнения); ПараметрыВыполнения.ФайлПолучен = Истина; ВернутьРезультат(ПараметрыВыполнения.ОбработчикРезультата, ПараметрыВыполнения); КонецПроцедуры //////////////////////////////////////////////////////////////////////////////// // Получение файла из хранилища в рабочий каталог. // Получает Файл из хранилища файлов в рабочий каталог папки // и возвращает путь к этому файлу. // // Параметры: // ОбработчикРезультата - ОписаниеОповещения // - Неопределено - описание процедуры, принимающей результат работы метода. // ДанныеФайла - см. РаботаСФайламиСлужебныйВызовСервера.ДанныеФайла // ПолноеИмяФайла - Строка - возвращаемое значение. // НаЧтение - Булево - Ложь - для чтения, Истина для редактирования. // ИдентификаторФормы - УникальныйИдентификатор // Процедура ПолучитьФайлВерсииВРабочийКаталогПапки(ОбработчикРезультата, ДанныеФайла, ПолноеИмяФайла, НаЧтение, ИдентификаторФормы, ДополнительныеПараметры) ПараметрыВыполнения = Новый Структура; ПараметрыВыполнения.Вставить("ОбработчикРезультата", ОбработчикРезультата); ПараметрыВыполнения.Вставить("ДанныеФайла", ДанныеФайла); ПараметрыВыполнения.Вставить("ПолноеИмяФайла", ПолноеИмяФайла); ПараметрыВыполнения.Вставить("НаЧтение", НаЧтение); ПараметрыВыполнения.Вставить("ИдентификаторФормы", ИдентификаторФормы); ПараметрыВыполнения.Вставить("ДополнительныеПараметры", ДополнительныеПараметры); ПараметрыВыполнения.Вставить("ФайлПолучен", Ложь); // Формирование имени файла с расширением. ИмяФайла = ДанныеФайла.ПолноеНаименованиеВерсии; Если Не ПустаяСтрока(ДанныеФайла.Расширение) Тогда ИмяФайла = ОбщегоНазначенияКлиентСервер.ПолучитьИмяСРасширением(ИмяФайла, ДанныеФайла.Расширение); КонецЕсли; ОбщегоНазначенияСлужебныйКлиент.СократитьИмяФайла(ИмяФайла); Если ПараметрыВыполнения.ПолноеИмяФайла = "" Тогда ПараметрыВыполнения.ПолноеИмяФайла = ДанныеФайла.РабочийКаталогВладельца + ИмяФайла; Обработчик = Новый ОписаниеОповещения("ПолучитьФайлВерсииВРабочийКаталогПапкиПослеПроверкиДлиныПути", ЭтотОбъект, ПараметрыВыполнения); ПроверитьМаксимальнуюДлинуПолногоПутиВРабочемКаталоге(Обработчик, ДанныеФайла, ПараметрыВыполнения.ПолноеИмяФайла, ИмяФайла); Иначе ПолучитьФайлВерсииВРабочийКаталогПапкиПродолжение(ПараметрыВыполнения); КонецЕсли; КонецПроцедуры // Продолжение процедуры (см. выше). Процедура ПолучитьФайлВерсииВРабочийКаталогПапкиПослеПроверкиДлиныПути(Результат, ПараметрыВыполнения) Экспорт Если Результат = Ложь Тогда ВернутьРезультат(ПараметрыВыполнения.ОбработчикРезультата, ПараметрыВыполнения); Иначе ПолучитьФайлВерсииВРабочийКаталогПапкиПродолжение(ПараметрыВыполнения); КонецЕсли; КонецПроцедуры // Продолжение процедуры (см. выше). Процедура ПолучитьФайлВерсииВРабочийКаталогПапкиПродолжение(ПараметрыВыполнения) // Поиск регистрации файла в рабочем каталоге (полное имя с путем). НайденныеСвойства = РаботаСФайламиСлужебныйВызовСервера.НайтиВРегистреПоПути(ПараметрыВыполнения.ПолноеИмяФайла); ПараметрыВыполнения.Вставить("ФайлЕстьВРегистре", НайденныеСвойства.ФайлЕстьВРегистре); Версия = НайденныеСвойства.Файл; Владелец = НайденныеСвойства.Владелец; ВРегистреНаЧтение = НайденныеСвойства.ВРегистреНаЧтение; ВРегистреПапка = НайденныеСвойства.ВРегистреПапка; ФайлНаДиске = Новый Файл(ПараметрыВыполнения.ПолноеИмяФайла); ФайлНаДискеСуществует = ФайлНаДиске.Существует(); // Удаление регистрации файла, если он не существует. Если ПараметрыВыполнения.ФайлЕстьВРегистре И Не ФайлНаДискеСуществует Тогда РаботаСФайламиСлужебныйВызовСервера.УдалитьИзРегистра(Версия); ПараметрыВыполнения.ФайлЕстьВРегистре = Ложь; КонецЕсли; Если Не ПараметрыВыполнения.ФайлЕстьВРегистре И Не ФайлНаДискеСуществует Тогда ПолучитьССервераИЗарегистрироватьВРабочемКаталогеПапки( ПараметрыВыполнения.ОбработчикРезультата, ПараметрыВыполнения.ДанныеФайла, ПараметрыВыполнения.ПолноеИмяФайла, ПараметрыВыполнения.ДанныеФайла.ДатаМодификацииУниверсальная, ПараметрыВыполнения.НаЧтение, ПараметрыВыполнения.ИдентификаторФормы, ПараметрыВыполнения.ДополнительныеПараметры); Возврат; КонецЕсли; // Установлено, что в рабочем каталоге файл существует. Если ПараметрыВыполнения.ФайлЕстьВРегистре И Версия <> ПараметрыВыполнения.ДанныеФайла.ТекущаяВерсия Тогда Если Владелец = ПараметрыВыполнения.ДанныеФайла.Ссылка И ВРегистреНаЧтение = Истина Тогда // Если владелец версий файла совпадает и // существующий файл в рабочем каталоге зарегистрирован для чтения, // тогда можно заменить его другим файлом из хранилища. ПолучитьССервераИЗарегистрироватьВРабочемКаталогеПапки( ПараметрыВыполнения.ОбработчикРезультата, ПараметрыВыполнения.ДанныеФайла, ПараметрыВыполнения.ПолноеИмяФайла, ПараметрыВыполнения.ДанныеФайла.ДатаМодификацииУниверсальная, ПараметрыВыполнения.НаЧтение, ПараметрыВыполнения.ИдентификаторФормы, ПараметрыВыполнения.ДополнительныеПараметры); Возврат; КонецЕсли; Если ПараметрыВыполнения.ДанныеФайла.Владелец = ВРегистреПапка Тогда // Одна и та же папка. ТекстПредупреждения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = 'В рабочем каталоге на компьютере уже есть файл |""%1"", |соответствующий другому файлу в программе. | |Рекомендуется переименовать один из файлов в программе.'"), ПараметрыВыполнения.ПолноеИмяФайла); Иначе ТекстПредупреждения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = 'В рабочем каталоге на компьютере уже есть файл |""%1"", |соответствующий другому файлу в программе. | |Рекомендуется указать другой рабочий каталог для одной из папок в программе. |(У двух папок не должно быть одинакового рабочего каталога).'"), ПараметрыВыполнения.ПолноеИмяФайла); КонецЕсли; ВернутьРезультатПослеПоказаПредупреждения(ПараметрыВыполнения.ОбработчикРезультата, ТекстПредупреждения, ПараметрыВыполнения); Возврат; КонецЕсли; // Выяснено, что Файл в рабочем каталоге есть. // Либо файл незарегистрирован, либо зарегистрирован и версия совпадает. // Проверка даты изменения и принятие решения, что делать дальше. Обработчик = Новый ОписаниеОповещения("ПолучитьФайлВерсииВРабочийКаталогПапкиПослеВыбораДействия", ЭтотОбъект, ПараметрыВыполнения); ДействиеПриОткрытииФайлаВРабочемКаталоге( Обработчик, ПараметрыВыполнения.ПолноеИмяФайла, ПараметрыВыполнения.ДанныеФайла); КонецПроцедуры // Продолжение процедуры (см. выше). // // Параметры: // ПараметрыВыполнения - Структура: // * ДополнительныеПараметры - см. ПолучитьФайлВерсииВРабочийКаталогПапки.ДополнительныеПараметры // Процедура ПолучитьФайлВерсииВРабочийКаталогПапкиПослеВыбораДействия(Результат, ПараметрыВыполнения) Экспорт Если Результат = "ВзятьИзХранилищаИОткрыть" Тогда // В рабочем каталоге папки настройка подтверждения при удалении не используется. УдалитьФайлБезПодтверждения(ПараметрыВыполнения.ПолноеИмяФайла); ПолучитьССервераИЗарегистрироватьВЛокальномКэшеФайлов(ПараметрыВыполнения); ИначеЕсли Результат = "ОткрытьСуществующий" Тогда Если ПараметрыВыполнения.ДанныеФайла.ВРабочемКаталогеНаЧтение <> ПараметрыВыполнения.НаЧтение Или Не ПараметрыВыполнения.ФайлЕстьВРегистре Тогда ВРабочемКаталогеВладельца = ПараметрыВыполнения.ДанныеФайла.РабочийКаталогВладельца <> ""; ПеререгистрироватьВРабочемКаталоге(ПараметрыВыполнения.ДанныеФайла.Версия, ПараметрыВыполнения.ПолноеИмяФайла, ПараметрыВыполнения.НаЧтение, ВРабочемКаталогеВладельца); КонецЕсли; ПараметрыВыполнения.ФайлПолучен = Истина; ВернутьРезультат(ПараметрыВыполнения.ОбработчикРезультата, ПараметрыВыполнения); Иначе // Результат = "Отмена". ПараметрыВыполнения.ПолноеИмяФайла = ""; ВернутьРезультат(ПараметрыВыполнения.ОбработчикРезультата, ПараметрыВыполнения); КонецЕсли; КонецПроцедуры //////////////////////////////////////////////////////////////////////////////// // Получение файла с сервера и регистрация в рабочем каталоге. // Получить Файл с сервера и зарегистрировать в рабочем каталоге. // // Параметры: // ОбработчикРезультата - ОписаниеОповещения // - Неопределено - описание процедуры, принимающей результат работы метода. // ДанныеФайла - см. РаботаСФайламиСлужебныйВызовСервера.ДанныеФайла // ПолноеИмяФайлаВРабочемКаталоге - Строка - здесь возвращается полное имя файла. // ДатаФайлаВБазе - Дата - дата файла в базе. // НаЧтение - Булево - файл помещен на чтение. // ИдентификаторФормы - УникальныйИдентификатор - идентификатор формы. // ДополнительныеПараметры - Произвольный - дополнительные параметры обработки. // Процедура ПолучитьССервераИЗарегистрироватьВРабочемКаталогеПапки(ОбработчикРезультата, ДанныеФайла, ПолноеИмяФайлаВРабочемКаталоге, ДатаФайлаВБазе, НаЧтение, ИдентификаторФормы, ДополнительныеПараметры) ПараметрыВыполнения = Новый Структура; ПараметрыВыполнения.Вставить("ОбработчикРезультата", ОбработчикРезультата); ПараметрыВыполнения.Вставить("ДанныеФайла", ДанныеФайла); ПараметрыВыполнения.Вставить("ПолноеИмяФайлаВРабочемКаталоге", ПолноеИмяФайлаВРабочемКаталоге); ПараметрыВыполнения.Вставить("ДатаФайлаВБазе", ДатаФайлаВБазе); ПараметрыВыполнения.Вставить("НаЧтение", НаЧтение); ПараметрыВыполнения.Вставить("ИдентификаторФормы", ИдентификаторФормы); ПараметрыВыполнения.Вставить("ДополнительныеПараметры", ДополнительныеПараметры); ПараметрыВыполнения.Вставить("ПолноеИмяФайла", ""); ПараметрыВыполнения.Вставить("ФайлПолучен", Ложь); ВРабочемКаталогеНаЧтение = Истина; ВРабочемКаталогеВладельца = Ложь; ФайлВРабочемКаталоге = ФайлНаходитсяВЛокальномКэшеФайлов(ДанныеФайла, ДанныеФайла.Версия, ПараметрыВыполнения.ПолноеИмяФайла, ВРабочемКаталогеНаЧтение, ВРабочемКаталогеВладельца); Если Не ФайлВРабочемКаталоге Тогда ПараметрыВыполнения.Вставить("ПолноеИмяФайла", ПараметрыВыполнения.ПолноеИмяФайлаВРабочемКаталоге); ПолучитьССервераИЗарегистрироватьВЛокальномКэшеФайлов(ПараметрыВыполнения); Возврат; КонецЕсли; // Получаем путь файла в рабочем каталоге - с проверкой на уникальность. Если ПараметрыВыполнения.ПолноеИмяФайла = "" Тогда ОбщегоНазначенияКлиент.СообщитьПользователю( НСтр("ru = 'Не удалось получить файл из программы в рабочий каталог на компьютере.'")); ВернутьРезультат(ПараметрыВыполнения.ОбработчикРезультата, ПараметрыВыполнения); Возврат; КонецЕсли; // Выяснено, что Файл в рабочем каталоге есть. // Проверка даты изменения и принятие решения, что делать дальше. Обработчик = Новый ОписаниеОповещения("ПолучитьССервераИЗарегистрироватьВРабочемКаталогеПапкиПослеВыбораДействия", ЭтотОбъект, ПараметрыВыполнения); ДействиеПриОткрытииФайлаВРабочемКаталоге(Обработчик, ПараметрыВыполнения.ПолноеИмяФайла, ПараметрыВыполнения.ДанныеФайла); КонецПроцедуры // Продолжение процедуры (см. выше). // // Параметры: // ПараметрыВыполнения - Структура: // * ДополнительныеПараметры - см. ПолучитьССервераИЗарегистрироватьВРабочемКаталогеПапки.ДополнительныеПараметры // Процедура ПолучитьССервераИЗарегистрироватьВРабочемКаталогеПапкиПослеВыбораДействия(Результат, ПараметрыВыполнения) Экспорт Если Результат = "ВзятьИзХранилищаИОткрыть" Тогда // В рабочем каталоге папки настройка подтверждения при удалении не используется. УдалитьФайлБезПодтверждения(ПараметрыВыполнения.ПолноеИмяФайла); ПолучитьССервераИЗарегистрироватьВЛокальномКэшеФайлов(ПараметрыВыполнения); ИначеЕсли Результат = "ОткрытьСуществующий" Тогда Если ПараметрыВыполнения.ДанныеФайла.ВРабочемКаталогеНаЧтение <> ПараметрыВыполнения.НаЧтение Тогда ВРабочемКаталогеВладельца = ПараметрыВыполнения.ДанныеФайла.РабочийКаталогВладельца <> ""; ПеререгистрироватьВРабочемКаталоге(ПараметрыВыполнения.ДанныеФайла.Версия, ПараметрыВыполнения.ПолноеИмяФайла, ПараметрыВыполнения.НаЧтение, ВРабочемКаталогеВладельца); КонецЕсли; ПараметрыВыполнения.ФайлПолучен = Истина; ВернутьРезультат(ПараметрыВыполнения.ОбработчикРезультата, ПараметрыВыполнения); Иначе // Результат = "Отмена". ПараметрыВыполнения.ПолноеИмяФайла = ""; ВернутьРезультат(ПараметрыВыполнения.ОбработчикРезультата, ПараметрыВыполнения); КонецЕсли; КонецПроцедуры //////////////////////////////////////////////////////////////////////////////// // Проверка максимальной длины рабочего каталога с заменой и переносом файлов. // Проверяет максимальную длину, если нужно - меняет рабочий каталог и переносит файлы. // // Параметры: // ОбработчикРезультата - ОписаниеОповещения // - Неопределено - описание процедуры, принимающей результат работы метода. // ДанныеФайла - см. РаботаСФайламиСлужебныйВызовСервера.ДанныеФайла // ПолноеИмяФайла - Строка - полное имя файла. // НормальноеИмяФайла - Строка - имя файла без пути. // Процедура ПроверитьМаксимальнуюДлинуПолногоПутиВРабочемКаталоге(ОбработчикРезультата, ДанныеФайла, ПолноеИмяФайла, НормальноеИмяФайла) #Если ВебКлиент Тогда ВернутьРезультат(ОбработчикРезультата, Истина); Возврат; #КонецЕсли ПараметрыВыполнения = Новый Структура; ПараметрыВыполнения.Вставить("ОбработчикРезультата", ОбработчикРезультата); ПараметрыВыполнения.Вставить("ДанныеФайла", ДанныеФайла); ПараметрыВыполнения.Вставить("ПолноеИмяФайла", ПолноеИмяФайла); ПараметрыВыполнения.Вставить("НормальноеИмяФайла", НормальноеИмяФайла); ПараметрыВыполнения.Вставить("ИмяКаталогаПрежнееЗначение", ДанныеФайла.РабочийКаталогВладельца); ПараметрыВыполнения.Вставить("МаксимальнаяДлинаПолногоПути", 260); Если НРег(ДанныеФайла.Расширение) = "xls" Или НРег(ДанныеФайла.Расширение) = "xlsx" Тогда // Для Excel длина имени файла вместе с путем не должна превышать 218 знака. ПараметрыВыполнения.МаксимальнаяДлинаПолногоПути = 218; КонецЕсли; МаксимальнаяДлинаИмениФайла = ПараметрыВыполнения.МаксимальнаяДлинаПолногоПути - 5; // 5 - минимум для "C:\1\" Если СтрДлина(ПараметрыВыполнения.ПолноеИмяФайла) <= ПараметрыВыполнения.МаксимальнаяДлинаПолногоПути Тогда ВернутьРезультат(ОбработчикРезультата, Истина); Возврат; КонецЕсли; ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = 'Длина полного пути к файлу (рабочий каталог плюс имя файла) превышает %1 символов |""%2"".'"), ПараметрыВыполнения.МаксимальнаяДлинаПолногоПути, ПараметрыВыполнения.ПолноеИмяФайла); ПутьКаталогаПользователя = КаталогДанныхПользователя(); МаксимальнаяДлинаИмениФайла = ПараметрыВыполнения.МаксимальнаяДлинаПолногоПути - СтрДлина(ПутьКаталогаПользователя); // Если имя файла плюс 5 превышает 260 - пишем "Измените имя файла на более короткое. ОК" и выходим. Если СтрДлина(ПараметрыВыполнения.НормальноеИмяФайла) > МаксимальнаяДлинаИмениФайла Тогда ТекстСообщения = ТекстСообщения + Символы.ВК + Символы.ВК + НСтр("ru = 'Измените имя файла на более короткое.'"); ВернутьРезультатПослеПоказаПредупреждения(ОбработчикРезультата, ТекстСообщения, Ложь); Возврат; КонецЕсли; // Если структура папок (путь к рабочему каталогу текущей папки) превышает 260-5 (1.txt), пишем "Измените имена папок // или перенесите текущую папку в другую папку". Если СтрДлина(ДанныеФайла.РабочийКаталогВладельца) > ПараметрыВыполнения.МаксимальнаяДлинаПолногоПути - 5 Тогда ТекстСообщения = ТекстСообщения + Символы.ВК + Символы.ВК + НСтр("ru = 'Измените имена папок или перенесите текущую папку в другую папку.'"); ВернутьРезультатПослеПоказаПредупреждения(ОбработчикРезультата, ТекстСообщения, Ложь); Возврат; КонецЕсли; ПроверитьМаксимальнуюДлинуПолногоПутиВРабочемКаталогеПредложитьВыборКаталога(ПараметрыВыполнения); КонецПроцедуры // Продолжение процедуры (см. выше). Процедура ПроверитьМаксимальнуюДлинуПолногоПутиВРабочемКаталогеПредложитьВыборКаталога(ПараметрыВыполнения) ТекстВопроса = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = 'Длина полного пути к файлу (рабочий каталог плюс имя файла) превышает %1 символов |""%2"". | |Выбрать другой основной рабочий каталог? |(Содержимое рабочего каталога будет перенесено в выбранный каталог).'"), ПараметрыВыполнения.МаксимальнаяДлинаПолногоПути, ПараметрыВыполнения.ПолноеИмяФайла); Обработчик = Новый ОписаниеОповещения("ПроверитьМаксимальнуюДлинуПолногоПутиВРабочемКаталогеНачатьВыборКаталога", ЭтотОбъект, ПараметрыВыполнения); ПоказатьВопрос(Обработчик, ТекстВопроса, РежимДиалогаВопрос.ДаНет); КонецПроцедуры // Продолжение процедуры (см. выше). Процедура ПроверитьМаксимальнуюДлинуПолногоПутиВРабочемКаталогеНачатьВыборКаталога(Ответ, ПараметрыВыполнения) Экспорт Если Ответ = КодВозвратаДиалога.Нет Тогда ВернутьРезультат(ПараметрыВыполнения.ОбработчикРезультата, Ложь); Возврат; КонецЕсли; // Выбираем другой путь к рабочему каталогу. Заголовок = НСтр("ru = 'Выберите другой рабочий каталог'"); КаталогВыбран = ВыбратьПутьКРабочемуКаталогу(ПараметрыВыполнения.ДанныеФайла.РабочийКаталогВладельца, Заголовок, Истина); Если Не КаталогВыбран Тогда ВернутьРезультат(ПараметрыВыполнения.ОбработчикРезультата, Ложь); Возврат; КонецЕсли; ПараметрыВыполнения.ПолноеИмяФайла = ПараметрыВыполнения.ДанныеФайла.РабочийКаталогВладельца + ПараметрыВыполнения.НормальноеИмяФайла; // уложились в 260 символов Если СтрДлина(ПараметрыВыполнения.ПолноеИмяФайла) <= ПараметрыВыполнения.МаксимальнаяДлинаПолногоПути Тогда Обработчик = Новый ОписаниеОповещения("ПроверитьМаксимальнуюДлинуПолногоПутиВРабочемКаталогеПослеПереносаСодержимогоРабочегоКаталога", ЭтотОбъект, ПараметрыВыполнения); ПеренестиСодержимоеРабочегоКаталога(Обработчик, ПараметрыВыполнения.ИмяКаталогаПрежнееЗначение, ПараметрыВыполнения.ДанныеФайла.РабочийКаталогВладельца); Иначе ПроверитьМаксимальнуюДлинуПолногоПутиВРабочемКаталогеПредложитьВыборКаталога(ПараметрыВыполнения); КонецЕсли; КонецПроцедуры // Продолжение процедуры (см. выше). Процедура ПроверитьМаксимальнуюДлинуПолногоПутиВРабочемКаталогеПослеПереносаСодержимогоРабочегоКаталога(СодержимоеПеренесено, ПараметрыВыполнения) Экспорт Если СодержимоеПеренесено Тогда // Регистр сведений ФайлыВРабочемКаталоге - сейчас там полный путь к файлу - // надо его менять - выделять общую часть и replace. -просто SQL запросом - // для текущего пользователя. РаботаСФайламиСлужебныйВызовСервера.СохранитьРабочийКаталогПапкиИЗаменитьПутиВРегистре( ПараметрыВыполнения.ДанныеФайла.Владелец, ПараметрыВыполнения.ДанныеФайла.РабочийКаталогВладельца, ПараметрыВыполнения.ИмяКаталогаПрежнееЗначение); КонецЕсли; ВернутьРезультат(ПараметрыВыполнения.ОбработчикРезультата, СодержимоеПеренесено); КонецПроцедуры //////////////////////////////////////////////////////////////////////////////// // Копирование содержимого из одного каталога в другой. // Копирует все файлы в указанном каталоге в другой каталог. // // Параметры: // ОбработчикРезультата - ОписаниеОповещения // - Неопределено - описание процедуры, принимающей результат работы метода. // КаталогИсточника - Строка - прежнее имя каталога. // КаталогПриемника - Строка - новое имя каталога. // Процедура СкопироватьСодержимоеКаталога(ОбработчикРезультата, Знач КаталогИсточника, Знач КаталогПриемника) Результат = Новый Структура; Результат.Вставить("ВозниклаОшибка", Ложь); Результат.Вставить("ПолноеИмяСбойногоФайла", ""); Результат.Вставить("ИнформацияОбОшибке", ""); Результат.Вставить("СкопированныеФайлыИПапки", Новый Массив); Результат.Вставить("ОригинальныеФайлыИПапки", Новый Массив); КопироватьСодержимоеКаталога(Результат, КаталогИсточника, КаталогПриемника); Если Результат.ВозниклаОшибка Тогда ТекстВопроса = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = 'Не удалось скопировать файл |""%1"". |Возможно он занят другим приложением. | |Повторить операцию?'"), Результат.ПолноеИмяСбойногоФайла); ПараметрыВыполнения = Новый Структура; ПараметрыВыполнения.Вставить("ОбработчикРезультата", ОбработчикРезультата); ПараметрыВыполнения.Вставить("КаталогИсточника", КаталогИсточника); ПараметрыВыполнения.Вставить("КаталогПриемника", КаталогПриемника); ПараметрыВыполнения.Вставить("Результат", Результат); Обработчик = Новый ОписаниеОповещения("СкопироватьСодержимоеКаталогаПослеОтветаНаВопрос", ЭтотОбъект, ПараметрыВыполнения); ПоказатьВопрос(Обработчик, ТекстВопроса, РежимДиалогаВопрос.ДаНет); Иначе ВернутьРезультат(ОбработчикРезультата, Результат); КонецЕсли; КонецПроцедуры // Продолжение процедуры (см. выше). Процедура СкопироватьСодержимоеКаталогаПослеОтветаНаВопрос(Ответ, ПараметрыВыполнения) Экспорт Если Ответ = КодВозвратаДиалога.Нет Тогда ВернутьРезультат(ПараметрыВыполнения.ОбработчикРезультата, ПараметрыВыполнения.Результат); Иначе СкопироватьСодержимоеКаталога( ПараметрыВыполнения.ОбработчикРезультата, ПараметрыВыполнения.КаталогИсточника, ПараметрыВыполнения.КаталогПриемника); КонецЕсли; КонецПроцедуры // Копирует все файлы в указанном каталоге в другой каталог. // // Параметры: // Результат - Структура - результат копирования. См. СкопироватьСодержимоеКаталога(), возвращаемое значение. // КаталогИсточника - Строка - прежнее имя каталога. // КаталогПриемника - Строка - новое имя каталога. // Процедура КопироватьСодержимоеКаталога(Результат, КаталогИсточника, КаталогПриемника) КаталогПриемника = ОбщегоНазначенияКлиентСервер.ДобавитьКонечныйРазделительПути(КаталогПриемника); КаталогИсточника = ОбщегоНазначенияКлиентСервер.ДобавитьКонечныйРазделительПути(КаталогИсточника); СоздатьКаталог(КаталогПриемника); Результат.СкопированныеФайлыИПапки.Добавить(КаталогПриемника); Результат.ОригинальныеФайлыИПапки.Добавить(КаталогИсточника); ФайлыИсточника = НайтиФайлы(КаталогИсточника, "*"); Для Каждого ФайлИсточника Из ФайлыИсточника Цикл ФайлИсточникаПолноеИмя = ФайлИсточника.ПолноеИмя; ФайлИсточникаИмя = ФайлИсточника.Имя; ФайлПриемникаПолноеИмя = КаталогПриемника + ФайлИсточникаИмя; Если ФайлИсточника.ЭтоКаталог() Тогда КопироватьСодержимоеКаталога(Результат, ФайлИсточникаПолноеИмя, ФайлПриемникаПолноеИмя); Если Результат.ВозниклаОшибка Тогда Возврат; КонецЕсли; Иначе Результат.ОригинальныеФайлыИПапки.Добавить(ФайлИсточникаПолноеИмя); ФайлПриемника = Новый Файл(ФайлПриемникаПолноеИмя); Если ФайлПриемника.Существует() Тогда // Это нужно для обратного копирования - в этом случае файлы уже могут существовать. Результат.СкопированныеФайлыИПапки.Добавить(ФайлПриемникаПолноеИмя); Иначе Попытка КопироватьФайл(ФайлИсточникаПолноеИмя, ФайлПриемникаПолноеИмя); Исключение Результат.ВозниклаОшибка = Истина; Результат.ИнформацияОбОшибке = ИнформацияОбОшибке(); Результат.ПолноеИмяСбойногоФайла = ФайлИсточникаПолноеИмя; Возврат; КонецПопытки; Результат.СкопированныеФайлыИПапки.Добавить(ФайлПриемникаПолноеИмя); КонецЕсли; КонецЕсли; КонецЦикла; КонецПроцедуры //////////////////////////////////////////////////////////////////////////////// // Перенос содержимого рабочего каталога в новый. // Переносит все файлы в рабочем каталоге в другой каталог (в том числе и взятые на редактирование). // // Параметры: // ОбработчикРезультата - ОписаниеОповещения // - Неопределено - описание процедуры, принимающей результат работы метода. // КаталогИсточника - Строка - прежнее имя каталога. // КаталогПриемника - Строка - новое имя каталога. // Процедура ПеренестиСодержимоеРабочегоКаталога(ОбработчикРезультата, КаталогИсточника, КаталогПриемника) Экспорт // Новый путь является подмножеством старого. Это запрещено, т.к. может привести к зацикливанию. Если СтрНайти(НРег(КаталогПриемника), НРег(КаталогИсточника)) <> 0 Тогда ТекстПредупреждения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = 'Выбранный рабочий каталог |""%1"" |входит в старый рабочий каталог |""%2"".'"), КаталогПриемника, КаталогИсточника); ВернутьРезультатПослеПоказаПредупреждения(ОбработчикРезультата, ТекстПредупреждения, Ложь); Возврат; КонецЕсли; // Копирование файлов из старого каталога в новый. ПараметрыОбработчика = Новый Структура; ПараметрыОбработчика.Вставить("ОбработчикРезультата", ОбработчикРезультата); ПараметрыОбработчика.Вставить("КаталогИсточника", КаталогИсточника); ПараметрыОбработчика.Вставить("КаталогПриемника", КаталогПриемника); Обработчик = Новый ОписаниеОповещения("ПеренестиСодержимоеРабочегоКаталогаПослеКопированияВНовыйКаталог", ЭтотОбъект, ПараметрыОбработчика); СкопироватьСодержимоеКаталога(Обработчик, КаталогИсточника, КаталогПриемника); КонецПроцедуры // Продолжение процедуры (см. выше). Процедура ПеренестиСодержимоеРабочегоКаталогаПослеКопированияВНовыйКаталог(Результат, ПараметрыВыполнения) Экспорт Если Результат.ВозниклаОшибка Тогда // Возникла ошибка копирования, затем пользователь отменил операцию. Обработчик = Новый ОписаниеОповещения( "ПеренестиСодержимоеРабочегоКаталогаПослеОтменыИОчисткиПриемника", ЭтотОбъект, ПараметрыВыполнения); УдалитьСодержимоеКаталога(Обработчик, Результат.СкопированныеФайлыИПапки); // Очистка папки приемника. Иначе // Копирование прошло успешно. Очистка старого каталога. Обработчик = Новый ОписаниеОповещения( "ПеренестиСодержимоеРабочегоКаталогаПослеУспехаИОчисткиИсточника", ЭтотОбъект, ПараметрыВыполнения); УдалитьСодержимоеКаталога(Обработчик, Результат.ОригинальныеФайлыИПапки); КонецЕсли; КонецПроцедуры // Продолжение процедуры (см. выше). Процедура ПеренестиСодержимоеРабочегоКаталогаПослеОтменыИОчисткиПриемника(КаталогПриемникаОчищен, ПараметрыВыполнения) Экспорт ВернутьРезультат(ПараметрыВыполнения.ОбработчикРезультата, Ложь); КонецПроцедуры // Продолжение процедуры (см. выше). Процедура ПеренестиСодержимоеРабочегоКаталогаПослеУспехаИОчисткиИсточника(КаталогИсточникаОчищен, ПараметрыВыполнения) Экспорт Если КаталогИсточникаОчищен Тогда // Старый каталог очищен. Все шаги операции успешно завершены. ВернутьРезультат(ПараметрыВыполнения.ОбработчикРезультата, Истина); Иначе // Старый каталог не очищен. Откат всей операции. Обработчик = Новый ОписаниеОповещения("ПеренестиСодержимоеРабочегоКаталогаПослеУспехаИОтменыОчистки", ЭтотОбъект, ПараметрыВыполнения); СкопироватьСодержимоеКаталога(Обработчик, ПараметрыВыполнения.КаталогПриемника, ПараметрыВыполнения.КаталогИсточника); КонецЕсли; КонецПроцедуры // Продолжение процедуры (см. выше). Процедура ПеренестиСодержимоеРабочегоКаталогаПослеУспехаИОтменыОчистки(Результат, ПараметрыВыполнения) Экспорт // Откат операции. Если Результат.ВозниклаОшибка Тогда // Надо предупредить, что даже во время отката операции произошла ошибка. ТекстПредупреждения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = 'Не удалось скопировать обратно содержимое каталога |""%1"" |в каталог |""%2"".'"), ПараметрыВыполнения.КаталогПриемника, ПараметрыВыполнения.КаталогИсточника); ВернутьРезультатПослеПоказаПредупреждения(ПараметрыВыполнения.ОбработчикРезультата, ТекстПредупреждения, Ложь); Иначе // Откат операции прошел успешно. ВернутьРезультат(ПараметрыВыполнения.ОбработчикРезультата, Ложь); КонецЕсли; КонецПроцедуры //////////////////////////////////////////////////////////////////////////////// // Удаление массива путей переданных папок и файлов. // Удаляет все файлы и папки из переданного массива. // // Параметры: // ОбработчикРезультата - ОписаниеОповещения // - Неопределено - описание процедуры, принимающей результат работы метода. // СкопированныеФайлыИПапки - Массив из Строка - пути файлов и папок. // Процедура УдалитьСодержимоеКаталога(ОбработчикРезультата, СкопированныеФайлыИПапки) ПараметрыВыполнения = Новый Структура; ПараметрыВыполнения.Вставить("ОбработчикРезультата", ОбработчикРезультата); ПараметрыВыполнения.Вставить("СкопированныеФайлыИПапки", СкопированныеФайлыИПапки); УдалитьСодержимоеКаталогаЗапуск(ПараметрыВыполнения); КонецПроцедуры // Продолжение процедуры (см. выше). Процедура УдалитьСодержимоеКаталогаЗапуск(ПараметрыВыполнения) ВерхняяГраница = ПараметрыВыполнения.СкопированныеФайлыИПапки.Количество() - 1; Для Индекс = 0 По ВерхняяГраница Цикл Путь = ПараметрыВыполнения.СкопированныеФайлыИПапки[ВерхняяГраница - Индекс]; Файл = Новый Файл(Путь); Если Не Файл.Существует() Тогда Продолжить; // Например временный файл Word ~aaa.doc мог быть удален при закрытии Word. КонецЕсли; Попытка Если Файл.ЭтоФайл() И Файл.ПолучитьТолькоЧтение() Тогда Файл.УстановитьТолькоЧтение(Ложь); КонецЕсли; УдалитьФайлы(Путь); Исключение ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = 'Не удалось удалить файл в рабочем каталоге: |""%1"". |Возможно он занят другим приложением. | |%2'"), Путь, ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); ЖурналРегистрацииКлиент.ДобавитьСообщениеДляЖурналаРегистрации(СобытиеЖурналаРегистрации(), "Предупреждение", ТекстСообщения,, Истина); КонецПопытки; КонецЦикла; ВернутьРезультат(ПараметрыВыполнения.ОбработчикРезультата, Истина); КонецПроцедуры //////////////////////////////////////////////////////////////////////////////// // Импорт файлов с проверкой размера. // Импорт со вспомогательными операциями (проверка предельного размера, удаление файлов и показ // ошибок при импорте). // // Параметры: // ПараметрыВыполнения - см. ПараметрыИмпортаФайлов. // Процедура ВыполнитьИмпортФайлов(Знач ПараметрыВыполнения) Экспорт СлужебныеПараметры = ОбщегоНазначенияКлиент.СкопироватьРекурсивно(ПараметрыВыполнения); Обработчик = Новый ОписаниеОповещения("ИмпортФайловПослеПроверкиРазмеров", ЭтотОбъект, СлужебныеПараметры); ПроверитьПредельныйРазмерФайлов(Обработчик, СлужебныеПараметры); КонецПроцедуры // Продолжение процедуры (см. выше). Процедура ИмпортФайловПослеПроверкиРазмеров(Результат, ПараметрыВыполнения) Экспорт Если Результат.Успех = Ложь Тогда ВернутьРезультат(ПараметрыВыполнения.ОбработчикРезультата, Неопределено); Возврат; КонецЕсли; ПараметрыВыполнения.Вставить("КоличествоСуммарное", Результат.КоличествоСуммарное); Если ПараметрыВыполнения.КоличествоСуммарное = 0 Тогда ВернутьРезультатПослеПоказаПредупреждения(ПараметрыВыполнения.ОбработчикРезультата, НСтр("ru = 'Нет файлов для добавления'"), Неопределено); Возврат; КонецЕсли; ПараметрыВыполнения.Вставить("ПерваяПапкаСТакимЖеИменем", Неопределено); ПараметрыВыполнения.Вставить("ПапкаДляДобавленияТекущая", Неопределено); ПараметрыВыполнения.Вставить("ВыбранныеФайлыВГраница", ПараметрыВыполнения.ВыбранныеФайлы.Количество()-1); ПараметрыВыполнения.Вставить("ВыбранныеФайлыИндекс", -1); ПараметрыВыполнения.Вставить("Индикатор", 0); ПараметрыВыполнения.Вставить("Счетчик", 0); ПараметрыВыполнения.Вставить("МассивФайлов", Новый Массив); ПараметрыВыполнения.Вставить("МассивИменФайловСОшибками", Новый Массив); ПараметрыВыполнения.Вставить("МассивСтруктурВсехФайлов", Новый Массив); ПараметрыВыполнения.Вставить("МассивВсехПапок", Новый Массив); ПараметрыВыполнения.Вставить("МассивФайловЭтогоКаталога", Неопределено); ПараметрыВыполнения.Вставить("ИмяПапки", Неопределено); ПараметрыВыполнения.Вставить("Путь", Неопределено); ПараметрыВыполнения.Вставить("ПапкаУжеНайдена", Неопределено); ОбработчикЗавершения = Новый ОписаниеОповещения("ИмпортФайловЦиклПродолжитьИмпортПослеВопросовВРекурсии", ЭтотОбъект); ЗарегистрироватьОбработчикЗавершения(ПараметрыВыполнения, ОбработчикЗавершения); ИмпортФайловЦикл(ПараметрыВыполнения); КонецПроцедуры // Продолжение процедуры (см. выше). Процедура ИмпортФайловЦикл(ПараметрыВыполнения) ПараметрыВыполнения.ВыбранныеФайлыИндекс = ПараметрыВыполнения.ВыбранныеФайлыИндекс + 1; Для Индекс = ПараметрыВыполнения.ВыбранныеФайлыИндекс По ПараметрыВыполнения.ВыбранныеФайлыВГраница Цикл ПараметрыВыполнения.ВыбранныеФайлыИндекс = Индекс; ИмяФайла = ПараметрыВыполнения.ВыбранныеФайлы[Индекс]; ВыбранныйФайл = Новый Файл(ИмяФайла.Значение); ВыбранКаталог = Ложь; Если ВыбранныйФайл.Существует() Тогда ВыбранКаталог = ВыбранныйФайл.ЭтоКаталог(); КонецЕсли; Если ВыбранКаталог Тогда ПараметрыВыполнения.Путь = ИмяФайла.Значение; ПараметрыВыполнения.МассивФайловЭтогоКаталога = НайтиФайлыПсевдо(ПараметрыВыполнения.ПсевдоФайловаяСистема, ПараметрыВыполнения.Путь); ПараметрыВыполнения.ИмяПапки = ВыбранныйФайл.Имя; ПараметрыВыполнения.ПапкаУжеНайдена = Ложь; Если РаботаСФайламиСлужебныйВызовСервера.ЕстьПапкаСТакимИменем( ПараметрыВыполнения.ИмяПапки, ПараметрыВыполнения.ГруппаФайлов, ПараметрыВыполнения.ПерваяПапкаСТакимЖеИменем) Тогда ТекстВопроса = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = 'Папка ""%1"" уже существует. | |Продолжить импорт папки?'"), ПараметрыВыполнения.ИмяПапки); Обработчик = Новый ОписаниеОповещения("ИмпортФайловЦиклПослеОтветаНаВопросПродолжить", ЭтотОбъект, ПараметрыВыполнения); ПоказатьВопрос(Обработчик, ТекстВопроса, РежимДиалогаВопрос.ДаНет); Возврат; КонецЕсли; ИмпортФайловЦиклПродолжитьИмпорт(ПараметрыВыполнения); Если ПараметрыВыполнения.АсинхронныйДиалог.Открыт = Истина Тогда Возврат; КонецЕсли; Иначе ПараметрыВыполнения.МассивФайлов.Добавить(ВыбранныйФайл); КонецЕсли; КонецЦикла; Если ПараметрыВыполнения.МассивФайлов.Количество() <> 0 Тогда ОбработчикЗавершения = Новый ОписаниеОповещения("ИмпортФайловПослеЦиклаПослеВопросовВРекурсии", ЭтотОбъект); ЗарегистрироватьОбработчикЗавершения(ПараметрыВыполнения, ОбработчикЗавершения); ИмпортФайловРекурсивно(ПараметрыВыполнения.Владелец, ПараметрыВыполнения.МассивФайлов, ПараметрыВыполнения); Если ПараметрыВыполнения.АсинхронныйДиалог.Открыт = Истина Тогда Возврат; КонецЕсли; КонецЕсли; ИмпортФайловПослеЦиклаПродолжение(ПараметрыВыполнения); КонецПроцедуры // Продолжение процедуры (см. выше). Процедура ИмпортФайловЦиклПослеОтветаНаВопросПродолжить(Ответ, ПараметрыВыполнения) Экспорт Если Ответ <> КодВозвратаДиалога.Нет Тогда ИмпортФайловЦиклПродолжитьИмпорт(ПараметрыВыполнения); КонецЕсли; ИмпортФайловЦикл(ПараметрыВыполнения); КонецПроцедуры // Продолжение процедуры (см. выше). // // Параметры: // ПараметрыВыполнения - Структура: // * МассивВсехПапок - Массив // Процедура ИмпортФайловЦиклПродолжитьИмпорт(ПараметрыВыполнения) Если Не ПараметрыВыполнения.ПапкаУжеНайдена Тогда РазделительПути = ПолучитьРазделительПути(); РабочийКаталог = ПараметрыВыполнения.Путь + ?(Прав(ПараметрыВыполнения.Путь, 1) = РазделительПути, "", РазделительПути); Если РаботаСФайламиСлужебныйКлиентПовтИсп.ЭтоСправочникФайлы(ПараметрыВыполнения.Владелец) Тогда ПараметрыВыполнения.ПапкаДляДобавленияТекущая = РаботаСФайламиСлужебныйВызовСервера.СоздатьПапкуФайлов( ПараметрыВыполнения.ИмяПапки, ПараметрыВыполнения.Владелец, , , РабочийКаталог); Иначе ПараметрыВыполнения.ПапкаДляДобавленияТекущая = ПараметрыВыполнения.Владелец; ПараметрыВыполнения.ГруппаФайлов = РаботаСФайламиСлужебныйВызовСервера.СоздатьПапкуФайлов( ПараметрыВыполнения.ИмяПапки, ПараметрыВыполнения.Владелец, , ПараметрыВыполнения.ГруппаФайлов, РабочийКаталог); КонецЕсли; КонецЕсли; // Собственно импорт ИмпортФайловРекурсивно(ПараметрыВыполнения.ПапкаДляДобавленияТекущая, ПараметрыВыполнения.МассивФайловЭтогоКаталога, ПараметрыВыполнения); Если ПараметрыВыполнения.АсинхронныйДиалог.Открыт = Истина Тогда Возврат; КонецЕсли; ПараметрыВыполнения.МассивВсехПапок.Добавить(ПараметрыВыполнения.Путь); КонецПроцедуры // Продолжение процедуры (см. выше). // // Параметры: // ПараметрыВыполнения - Структура: // * МассивВсехПапок - Массив // Процедура ИмпортФайловЦиклПродолжитьИмпортПослеВопросовВРекурсии(Результат, ПараметрыВыполнения) Экспорт ПараметрыВыполнения.АсинхронныйДиалог.Открыт = Ложь; ПараметрыВыполнения.МассивВсехПапок.Добавить(ПараметрыВыполнения.Путь); ИмпортФайловЦикл(ПараметрыВыполнения); КонецПроцедуры // Продолжение процедуры (см. выше). Процедура ИмпортФайловПослеЦиклаПослеВопросовВРекурсии(Результат, ПараметрыВыполнения) Экспорт ИмпортФайловПослеЦиклаПродолжение(ПараметрыВыполнения); КонецПроцедуры // Продолжение процедуры (см. выше). Процедура ИмпортФайловПослеЦиклаПродолжение(ПараметрыВыполнения) Если ПараметрыВыполнения.МассивСтруктурВсехФайлов.Количество() > 1 Тогда ТекстСостояния = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = 'Импорт файлов завершен. Импортировано файлов: %1'"), Строка(ПараметрыВыполнения.МассивСтруктурВсехФайлов.Количество()) ); ПоказатьОповещениеПользователя(ТекстСостояния); КонецЕсли; Если ПараметрыВыполнения.УдалятьФайлыПослеДобавления = Истина Тогда УдалитьФайлыПослеДобавления(ПараметрыВыполнения.МассивСтруктурВсехФайлов, ПараметрыВыполнения.МассивВсехПапок); КонецЕсли; Если ПараметрыВыполнения.МассивСтруктурВсехФайлов.Количество() = 1 Тогда Элемент0 = ПараметрыВыполнения.МассивСтруктурВсехФайлов[0]; Ссылка = ПолучитьНавигационнуюСсылку(Элемент0.Файл); ПоказатьОповещениеПользователя( НСтр("ru = 'Изменение:'"), Ссылка, Элемент0.Файл, БиблиотекаКартинок.Информация32); КонецЕсли; // Вывод сообщений об ошибках Если ПараметрыВыполнения.МассивИменФайловСОшибками.Количество() <> 0 Тогда Параметры = Новый Структура; Параметры.Вставить("МассивИменФайловСОшибками", ПараметрыВыполнения.МассивИменФайловСОшибками); ОткрытьФорму("Обработка.РаботаСФайлами.Форма.ФормаОтчета", Параметры); КонецЕсли; Если ПараметрыВыполнения.ВыбранныеФайлы.Количество() <> 1 Тогда ПараметрыВыполнения.ПапкаДляДобавленияТекущая = Неопределено; КонецЕсли; ВернутьРезультат(ПараметрыВыполнения.ОбработчикРезультата, ПараметрыВыполнения); КонецПроцедуры // Удаляет файлы после импорта или загрузки. Процедура УдалитьФайлыПослеДобавления(МассивСтруктурВсехФайлов, МассивВсехПапок) Для Каждого Элемент Из МассивСтруктурВсехФайлов Цикл ВыбранныйФайл = Новый Файл(Элемент.ИмяФайла); Попытка ВыбранныйФайл.УстановитьТолькоЧтение(Ложь); УдалитьФайлы(ВыбранныйФайл.ПолноеИмя); Исключение ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = 'Не удалось удалить файл после добавления в программу: |""%1"". |Возможно он занят другим приложением. | |%2'"), ВыбранныйФайл.ПолноеИмя, ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); ЖурналРегистрацииКлиент.ДобавитьСообщениеДляЖурналаРегистрации(СобытиеЖурналаРегистрации(), "Предупреждение", ТекстСообщения,, Истина); КонецПопытки; КонецЦикла; КонецПроцедуры //////////////////////////////////////////////////////////////////////////////// // Сохранение файла на компьютер // Сохранение файла на компьютер. // // Параметры: // ОбработчикРезультата - ОписаниеОповещения // - Неопределено - описание процедуры, принимающей результат работы метода. // ДанныеФайла - Структура // УникальныйИдентификатор - УникальныйИдентификатор - идентификатор формы.. // Процедура СохранитьКак(ОбработчикРезультата, ДанныеФайла, УникальныйИдентификатор) Экспорт ПараметрыВыполнения = Новый Структура; ПараметрыВыполнения.Вставить("ОбработчикРезультата", ОбработчикРезультата); ПараметрыВыполнения.Вставить("ДанныеФайла", ДанныеФайла); ПараметрыВыполнения.Вставить("УникальныйИдентификатор", УникальныйИдентификатор); Если РасширениеРаботыСФайламиПодключено() Тогда СохранитьКакСРасширением(ПараметрыВыполнения); Иначе СохранитьКакБезРасширения(ПараметрыВыполнения); КонецЕсли; КонецПроцедуры // Продолжение процедуры (см. выше). // // Параметры: // ПараметрыВыполнения - Структура: // * ДанныеФайла - см. РаботаСФайламиСлужебныйВызовСервера.ДанныеФайла // Процедура СохранитьКакСРасширением(ПараметрыВыполнения) // Проверим - если файл уже есть в кэше, и он новее чем в базе - дадим диалог с выбором. ПараметрыВыполнения.Вставить("ПутьКФайлуВКэше", ""); Если ПараметрыВыполнения.ДанныеФайла.ФайлРедактируетТекущийПользователь Тогда ВРабочемКаталогеНаЧтение = Истина; ВРабочемКаталогеВладельца = Ложь; ПараметрыВыполнения.Вставить("ПолноеИмяФайла", ""); ФайлВРабочемКаталоге = ФайлНаходитсяВЛокальномКэшеФайлов(ПараметрыВыполнения.ДанныеФайла, ПараметрыВыполнения.ДанныеФайла.Версия, ПараметрыВыполнения.ПолноеИмяФайла, ВРабочемКаталогеНаЧтение, ВРабочемКаталогеВладельца); Если ФайлВРабочемКаталоге Тогда ДатаФайлаВБазе = ПараметрыВыполнения.ДанныеФайла.ДатаМодификацииУниверсальная; ФайлВерсии = Новый Файл(ПараметрыВыполнения.ПолноеИмяФайла); ДатаФайлаНаДиске = ФайлВерсии.ПолучитьУниверсальноеВремяИзменения(); Если ДатаФайлаНаДиске > ДатаФайлаВБазе Тогда // В рабочем каталоге более новый (изменен пользователем со стороны). ПараметрыОткрытияФормы = Новый Структура; ПараметрыОткрытияФормы.Вставить("Файл", ПараметрыВыполнения.ПолноеИмяФайла); Сообщение = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = 'Дата изменения файла ""%1"" |в рабочем каталоге на компьютере более поздняя (новее), чем в программе. |Возможно, файл на компьютере был отредактирован.'"), Строка(ПараметрыВыполнения.ДанныеФайла.Ссылка)); ПараметрыОткрытияФормы.Вставить("Сообщение", Сообщение); Обработчик = Новый ОписаниеОповещения("СохранитьКакСРасширениемПослеОтветаНаВопросДатаНовее", ЭтотОбъект, ПараметрыВыполнения); ОткрытьФорму("Обработка.РаботаСФайлами.Форма.РежимСозданияФайлаДляСохранитьКак", ПараметрыОткрытияФормы, , , , , Обработчик, РежимОткрытияОкнаФормы.БлокироватьВесьИнтерфейс); Возврат; КонецЕсли; КонецЕсли; КонецЕсли; СохранитьКакСРасширениемПродолжение(ПараметрыВыполнения); КонецПроцедуры // Продолжение процедуры (см. выше). Процедура СохранитьКакСРасширениемПослеОтветаНаВопросДатаНовее(Ответ, ПараметрыВыполнения) Экспорт Если Ответ = КодВозвратаДиалога.Отмена Или Ответ = Неопределено Тогда ВернутьРезультат(ПараметрыВыполнения.ОбработчикРезультата, ""); Возврат; КонецЕсли; Если Ответ = 1 Тогда // На основе файла на локальном компьютере. ПараметрыВыполнения.ПутьКФайлуВКэше = ПараметрыВыполнения.ПолноеИмяФайла; КонецЕсли; СохранитьКакСРасширениемПродолжение(ПараметрыВыполнения); КонецПроцедуры // Продолжение процедуры (см. выше). Процедура СохранитьКакСРасширениемПродолжение(ПараметрыВыполнения) ПараметрыВыполнения.Вставить("ПутьВыбора", ПараметрыВыполнения.ДанныеФайла.ПапкаДляСохранитьКак); Если ПараметрыВыполнения.ПутьВыбора = Неопределено Или ПараметрыВыполнения.ПутьВыбора = "" Тогда ПараметрыВыполнения.ПутьВыбора = КаталогМоиДокументы(); КонецЕсли; ПараметрыВыполнения.Вставить("СохранятьСРасшифровкой", Ложь); ПараметрыВыполнения.Вставить("РасширениеДляЗашифрованныхФайлов", ""); Если ПараметрыВыполнения.ДанныеФайла.Зашифрован Тогда Обработчик = Новый ОписаниеОповещения("СохранитьКакСРасширениемПослеВыбораРежимаСохранения", ЭтотОбъект, ПараметрыВыполнения); ОткрытьФорму("Обработка.РаботаСФайлами.Форма.ВыборСохраненияШифрованногоФайла", , , , , , Обработчик, РежимОткрытияОкнаФормы.БлокироватьВесьИнтерфейс); Иначе СохранитьКакСРасширениемПослеВыбораРежимаСохранения(-1, ПараметрыВыполнения); КонецЕсли; КонецПроцедуры // Продолжение процедуры (см. выше). // // Параметры: // ПараметрыВыполнения - Структура: // * ДанныеФайла - см. РаботаСФайламиСлужебныйВызовСервера.ДанныеФайла // Процедура СохранитьКакСРасширениемПослеВыбораРежимаСохранения(Результат, ПараметрыВыполнения) Экспорт Если ТипЗнч(Результат) = Тип("Структура") Тогда ПараметрыВыполнения.РасширениеДляЗашифрованныхФайлов = Результат.РасширениеДляЗашифрованныхФайлов; Если Результат.СохранятьСРасшифровкой = 1 Тогда ПараметрыВыполнения.СохранятьСРасшифровкой = Истина; Иначе ПараметрыВыполнения.СохранятьСРасшифровкой = Ложь; КонецЕсли; ИначеЕсли Результат <> -1 Тогда ВернутьРезультат(ПараметрыВыполнения.ОбработчикРезультата, ""); Возврат; КонецЕсли; Если Не ПараметрыВыполнения.СохранятьСРасшифровкой Тогда СохранитьКакСРасширениемПослеРасшифровки(-1, ПараметрыВыполнения); Возврат; КонецЕсли; Если Не ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.ЭлектроннаяПодпись") Тогда Возврат; КонецЕсли; СтруктураВозврата = РаботаСФайламиСлужебныйВызовСервера.ДанныеФайлаИДвоичныеДанные(ПараметрыВыполнения.ДанныеФайла.Версия,, ПараметрыВыполнения.УникальныйИдентификатор); ОписаниеДанных = Новый Структура; ОписаниеДанных.Вставить("Операция", НСтр("ru = 'Расшифровка файла'")); ОписаниеДанных.Вставить("ЗаголовокДанных", НСтр("ru = 'Файл'")); ОписаниеДанных.Вставить("Данные", СтруктураВозврата.ДвоичныеДанные); ОписаниеДанных.Вставить("Представление", ПараметрыВыполнения.ДанныеФайла.Ссылка); ОписаниеДанных.Вставить("СертификатыШифрования", ПараметрыВыполнения.ДанныеФайла.Ссылка); ОписаниеДанных.Вставить("СообщитьОЗавершении", Ложь); ОбработчикПродолжения = Новый ОписаниеОповещения("СохранитьКакСРасширениемПослеРасшифровки", ЭтотОбъект, ПараметрыВыполнения); МодульЭлектроннаяПодписьКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("ЭлектроннаяПодписьКлиент"); МодульЭлектроннаяПодписьКлиент.Расшифровать(ОписаниеДанных, , ОбработчикПродолжения); КонецПроцедуры // Продолжение процедуры (см. выше). // // Параметры: // ПараметрыВыполнения - Структура: // * ДанныеФайла - см. РаботаСФайламиСлужебныйВызовСервера.ДанныеФайла // Процедура СохранитьКакСРасширениемПослеРасшифровки(ОписаниеДанных, ПараметрыВыполнения) Экспорт Если ОписаниеДанных <> -1 Тогда Если Не ОписаниеДанных.Успех Тогда ВернутьРезультат(ПараметрыВыполнения.ОбработчикРезультата, ПараметрыВыполнения); Возврат; КонецЕсли; Если ТипЗнч(ОписаниеДанных.РасшифрованныеДанные) = Тип("ДвоичныеДанные") Тогда АдресФайла = ПоместитьВоВременноеХранилище(ОписаниеДанных.РасшифрованныеДанные, ПараметрыВыполнения.УникальныйИдентификатор); Иначе АдресФайла = ОписаниеДанных.РасшифрованныеДанные; КонецЕсли; Иначе Если ПараметрыВыполнения.ДанныеФайла.Свойство("СсылкаНаДвоичныеДанныеФайла") Тогда АдресФайла = ПараметрыВыполнения.ДанныеФайла.СсылкаНаДвоичныеДанныеФайла; ПараметрыВыполнения.ДанныеФайла.Вставить("ПолноеНаименованиеВерсии", ПараметрыВыполнения.ДанныеФайла.Наименование); Иначе АдресФайла = ПараметрыВыполнения.ДанныеФайла.НавигационнаяСсылкаТекущейВерсии; Если ПараметрыВыполнения.ДанныеФайла.ТекущаяВерсия <> ПараметрыВыполнения.ДанныеФайла.Версия Тогда АдресФайла = РаботаСФайламиСлужебныйВызовСервера.ПолучитьНавигационнуюСсылкуДляОткрытия( ПараметрыВыполнения.ДанныеФайла.Версия, ПараметрыВыполнения.УникальныйИдентификатор); КонецЕсли; КонецЕсли; КонецЕсли; ИмяСРасширением = ОбщегоНазначенияКлиентСервер.ПолучитьИмяСРасширением( ПараметрыВыполнения.ДанныеФайла.ПолноеНаименованиеВерсии, ПараметрыВыполнения.ДанныеФайла.Расширение); Расширение = ПараметрыВыполнения.ДанныеФайла.Расширение; Если ПараметрыВыполнения.ДанныеФайла.Зашифрован И Не ПараметрыВыполнения.СохранятьСРасшифровкой Тогда Если Не ПустаяСтрока(ПараметрыВыполнения.РасширениеДляЗашифрованныхФайлов) Тогда ИмяСРасширением = ИмяСРасширением + "." + ПараметрыВыполнения.РасширениеДляЗашифрованныхФайлов; Расширение = ПараметрыВыполнения.РасширениеДляЗашифрованныхФайлов; КонецЕсли; КонецЕсли; ВыборФайла = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Сохранение); ВыборФайла.МножественныйВыбор = Ложь; ВыборФайла.ПолноеИмяФайла = ИмяСРасширением; ВыборФайла.Расширение = Расширение; Фильтр = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = 'Все файлы (*.%1)|*.%1'"), Расширение); ВыборФайла.Фильтр = Фильтр; ВыборФайла.Каталог = ПараметрыВыполнения.ПутьВыбора; Если Не ВыборФайла.Выбрать() Тогда ВернутьРезультат(ПараметрыВыполнения.ОбработчикРезультата, Новый Структура); Возврат; КонецЕсли; ПолноеИмяФайла = ВыборФайла.ПолноеИмяФайла; Файл = Новый Файл(ПолноеИмяФайла); Если Файл.Существует() Тогда Если ПараметрыВыполнения.ПутьКФайлуВКэше <> ПолноеИмяФайла Тогда Попытка Файл.УстановитьТолькоЧтение(Ложь); УдалитьФайлы(ВыборФайла.ПолноеИмяФайла); Исключение ЖурналРегистрацииКлиент.ДобавитьСообщениеДляЖурналаРегистрации(СобытиеЖурналаРегистрации(), "Предупреждение", ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()),, Истина); КонецПопытки; КонецЕсли; КонецЕсли; Если ПараметрыВыполнения.ПутьКФайлуВКэше <> "" Тогда Если ПараметрыВыполнения.ПутьКФайлуВКэше <> ПолноеИмяФайла Тогда КопироватьФайл(ПараметрыВыполнения.ПутьКФайлуВКэше, ВыборФайла.ПолноеИмяФайла); КонецЕсли; Иначе ПередаваемыеФайлы = Новый Массив; Описание = Новый ОписаниеПередаваемогоФайла(ПолноеИмяФайла, АдресФайла); ПередаваемыеФайлы.Добавить(Описание); ПутьКФайлу = Файл.Путь; ПутьКФайлу = ОбщегоНазначенияКлиентСервер.ДобавитьКонечныйРазделительПути(ПутьКФайлу); Если ПолучитьФайлы(ПередаваемыеФайлы,, ПутьКФайлу, Ложь) Тогда // Для варианта с хранением файлов в томах удаляем Файл из временного хранилища после получения. Если ЭтоАдресВременногоХранилища(АдресФайла) Тогда УдалитьИзВременногоХранилища(АдресФайла); КонецЕсли; УстановитьУниверсальноеВремяИзменения(ПолноеИмяФайла, ПараметрыВыполнения.ДанныеФайла.ДатаМодификацииУниверсальная); КонецЕсли; КонецЕсли; ПоказатьОповещениеПользователя(НСтр("ru = 'Файл успешно сохранен'"), , ПолноеИмяФайла); ПутьВыбораПрежний = ПараметрыВыполнения.ПутьВыбора; ПараметрыВыполнения.ПутьВыбора = Файл.Путь; Если ПутьВыбораПрежний <> ПараметрыВыполнения.ПутьВыбора Тогда ОбщегоНазначенияВызовСервера.ХранилищеОбщихНастроекСохранить("НастройкиПрограммы", "ПапкаДляСохранитьКак", ПараметрыВыполнения.ПутьВыбора); КонецЕсли; ВернутьРезультат(ПараметрыВыполнения.ОбработчикРезультата, Новый Структура("ПолноеИмяФайла", ПолноеИмяФайла)); КонецПроцедуры // Продолжение процедуры (см. выше). Процедура СохранитьКакБезРасширения(ПараметрыВыполнения) ПараметрыВыполнения.Вставить("СохранятьСРасшифровкой", Ложь); ПараметрыВыполнения.Вставить("РасширениеДляЗашифрованныхФайлов", ""); Если ПараметрыВыполнения.ДанныеФайла.Зашифрован Тогда Обработчик = Новый ОписаниеОповещения("СохранитьКакБезРасширенияПослеВыбораРежимаСохранения", ЭтотОбъект, ПараметрыВыполнения); ОткрытьФорму("Обработка.РаботаСФайлами.Форма.ВыборСохраненияШифрованногоФайла", , , , , , Обработчик, РежимОткрытияОкнаФормы.БлокироватьВесьИнтерфейс); Иначе СохранитьКакБезРасширенияПослеВыбораРежимаСохранения(-1, ПараметрыВыполнения); КонецЕсли; КонецПроцедуры // Продолжение процедуры (см. выше). Процедура СохранитьКакБезРасширенияПослеВыбораРежимаСохранения(Результат, ПараметрыВыполнения) Экспорт Если ТипЗнч(Результат) = Тип("Структура") Тогда ПараметрыВыполнения.РасширениеДляЗашифрованныхФайлов = Результат.РасширениеДляЗашифрованныхФайлов; Если Результат.СохранятьСРасшифровкой = 1 Тогда ПараметрыВыполнения.СохранятьСРасшифровкой = Истина; Иначе ПараметрыВыполнения.СохранятьСРасшифровкой = Ложь; КонецЕсли; ИначеЕсли Результат <> -1 Тогда ВернутьРезультат(ПараметрыВыполнения.ОбработчикРезультата, ""); Возврат; КонецЕсли; ЗаполнитьВременныйИдентификаторФормы(ПараметрыВыполнения.УникальныйИдентификатор, ПараметрыВыполнения); Обработчик = Новый ОписаниеОповещения("СохранитьКакБезРасширенияЗавершение", ЭтотОбъект, ПараметрыВыполнения); ОткрытьФайлБезРасширения(Обработчик, ПараметрыВыполнения.ДанныеФайла, ПараметрыВыполнения.УникальныйИдентификатор, Ложь, ПараметрыВыполнения.СохранятьСРасшифровкой, ПараметрыВыполнения.РасширениеДляЗашифрованныхФайлов); КонецПроцедуры // Продолжение процедуры (см. выше). Процедура СохранитьКакБезРасширенияЗавершение(Результат, ПараметрыВыполнения) Экспорт ОчиститьВременныйИдентификаторФормы(ПараметрыВыполнения); Если Результат <> Истина Тогда Возврат; КонецЕсли; Если Не ПараметрыВыполнения.СохранятьСРасшифровкой И ПараметрыВыполнения.ДанныеФайла.Зашифрован И ЗначениеЗаполнено(ПараметрыВыполнения.РасширениеДляЗашифрованныхФайлов) Тогда Расширение = ПараметрыВыполнения.РасширениеДляЗашифрованныхФайлов; Иначе Расширение = ПараметрыВыполнения.ДанныеФайла.Расширение; КонецЕсли; ИмяФайла = ОбщегоНазначенияКлиентСервер.ПолучитьИмяСРасширением( ПараметрыВыполнения.ДанныеФайла.ПолноеНаименованиеВерсии, Расширение); ВернутьРезультат(ПараметрыВыполнения.ОбработчикРезультата, Новый Структура("ПолноеИмяФайла", ИмяФайла)); КонецПроцедуры // Продолжение процедуры РаботаСФайламиКлиент.СохранитьФайлКак. Процедура СохранитьФайлКакПослеСохранения(Результат, ОбработчикЗавершения) Экспорт Если ОбработчикЗавершения = Неопределено Тогда Возврат; КонецЕсли; ПутьКФайлу = ""; Если ТипЗнч(Результат) = Тип("Структура") И Результат.Свойство("ПолноеИмяФайла") Тогда ПутьКФайлу = Результат.ПолноеИмяФайла; КонецЕсли; ВыполнитьОбработкуОповещения(ОбработчикЗавершения, ПутьКФайлу); КонецПроцедуры //////////////////////////////////////////////////////////////////////////////// // Показывает напоминание перед помещением файла, если оно настроено. // Покажет напоминание - если стоит настройка. // // Параметры: // ОбработчикРезультата - ОписаниеОповещения // - Неопределено - описание процедуры, принимающей результат работы метода. // Процедура ПоказатьНапоминаниеПередПоместитьФайл(ОбработчикРезультата) ПерсональныеНастройки = ПерсональныеНастройкиРаботыСФайлами(); Если ПерсональныеНастройки.ПоказыватьПодсказкиПриРедактированииФайлов = Истина Тогда Если Не РасширениеРаботыСФайламиПодключено() Тогда ТекстНапоминания = НСтр("ru = 'Сейчас будет предложено выбрать файл для того, |чтобы поместить его в программу и закончить редактирование. | |Найдите нужный файл в том каталоге, который был |указан ранее при начале редактирования.'"); Кнопки = Новый СписокЗначений; Кнопки.Добавить("Продолжить", НСтр("ru = 'Продолжить'")); Кнопки.Добавить("Отмена", НСтр("ru = 'Отмена'")); ПараметрыНапоминания = Новый Структура; ПараметрыНапоминания.Вставить("Картинка", БиблиотекаКартинок.Информация32); ПараметрыНапоминания.Вставить("ТекстФлажка", НСтр("ru = 'Больше не показывать это сообщение'")); ПараметрыНапоминания.Вставить("Заголовок", НСтр("ru = 'Помещение файла'")); СтандартныеПодсистемыКлиент.ПоказатьВопросПользователю( ОбработчикРезультата, ТекстНапоминания, Кнопки, ПараметрыНапоминания); Возврат; КонецЕсли; КонецЕсли; ВернутьРезультат(ОбработчикРезультата, Истина); КонецПроцедуры //////////////////////////////////////////////////////////////////////////////// // Проверяет размер файлов. // Проверить предельный размер файлов. // Возвращает Ложь, если есть файлы, превышающие предельный размер, // и пользователь в диалоге предупреждения о наличии таких файлов выбрал "Отмена". // // Параметры: // ОбработчикРезультата - ОписаниеОповещения // - Неопределено - описание процедуры, принимающей результат работы метода. // ПараметрыПроверки - Структура: // * ВыбранныеФайлы - Массив - массив объектов "Файл". // * Рекурсивно - Булево - рекурсивно обходить подкаталоги. // * ПсевдоФайловаяСистема - Соответствие - для строки (каталога) возвращает массив // строк (подкаталоги и файлы). // Процедура ПроверитьПредельныйРазмерФайлов(ОбработчикРезультата, ПараметрыПроверки) ПараметрыВыполнения = Новый Структура; ПараметрыВыполнения.Вставить("ОбработчикРезультата", ОбработчикРезультата); ПараметрыВыполнения.Вставить("КоличествоСуммарное", 0); ПараметрыВыполнения.Вставить("Успех", Ложь); МассивСлишкомБольшихФайлов = Новый Массив; Путь = ""; МассивФайлов = Новый Массив; Для Каждого ИмяФайла Из ПараметрыПроверки.ВыбранныеФайлы Цикл Путь = ИмяФайла.Значение; ВыбранныйФайл = Новый Файл(Путь); ВыбранныйФайл = Новый Файл(ИмяФайла.Значение); ВыбранКаталог = Ложь; Если ВыбранныйФайл.Существует() Тогда ВыбранКаталог = ВыбранныйФайл.ЭтоКаталог(); КонецЕсли; Если ВыбранКаталог Тогда МассивФайловЭтогоКаталога = НайтиФайлыПсевдо(ПараметрыПроверки.ПсевдоФайловаяСистема, Путь); НайтиСлишкомБольшиеФайлы(МассивФайловЭтогоКаталога, МассивСлишкомБольшихФайлов, ПараметрыПроверки.Рекурсивно, ПараметрыВыполнения.КоличествоСуммарное, ПараметрыПроверки.ПсевдоФайловаяСистема); Иначе МассивФайлов.Добавить(ВыбранныйФайл); КонецЕсли; КонецЦикла; Если МассивФайлов.Количество() <> 0 Тогда НайтиСлишкомБольшиеФайлы(МассивФайлов, МассивСлишкомБольшихФайлов, ПараметрыПроверки.Рекурсивно, ПараметрыВыполнения.КоличествоСуммарное, ПараметрыПроверки.ПсевдоФайловаяСистема); КонецЕсли; // Был хоть один слишком большой файл. Если МассивСлишкомБольшихФайлов.Количество() <> 0 Тогда ФайлыБольшие = Новый СписокЗначений; Параметры = Новый Структура; Для Каждого Файл Из МассивСлишкомБольшихФайлов Цикл БольшойФайл = Новый Файл(Файл); РазмерФайлаВМб = Цел(БольшойФайл.Размер() / (1024 * 1024)); ТекстСтроки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = '%1 (%2 МБ)'"), Строка(Файл), Строка(РазмерФайлаВМб)); ФайлыБольшие.Добавить(ТекстСтроки); КонецЦикла; Параметры.Вставить("ФайлыБольшие", ФайлыБольшие); Параметры.Вставить("Заголовок", НСтр("ru = 'Предупреждение при загрузке файлов'")); Обработчик = Новый ОписаниеОповещения("ПроверитьПредельныйРазмерФайловПослеОтветаНаВопрос", ЭтотОбъект, ПараметрыВыполнения); ОткрытьФорму("Обработка.РаботаСФайлами.Форма.ВопросПриИмпортеФайлов", Параметры, , , , , Обработчик, РежимОткрытияОкнаФормы.БлокироватьВесьИнтерфейс); Возврат; КонецЕсли; ПараметрыВыполнения.Успех = Истина; ВернутьРезультат(ПараметрыВыполнения.ОбработчикРезультата, ПараметрыВыполнения); КонецПроцедуры // Продолжение процедуры (см. выше). Процедура ПроверитьПредельныйРазмерФайловПослеОтветаНаВопрос(Ответ, ПараметрыВыполнения) Экспорт ПараметрыВыполнения.Успех = (Ответ = КодВозвратаДиалога.ОК); ВернутьРезультат(ПараметрыВыполнения.ОбработчикРезультата, ПараметрыВыполнения); КонецПроцедуры //////////////////////////////////////////////////////////////////////////////// // Показывает информацию о том, что файл не был изменен. // Покажет напоминание - если стоит настройка. // // Параметры: // ОбработчикРезультата - ОписаниеОповещения // - Неопределено - описание процедуры, принимающей результат работы метода. // Процедура ПоказатьИнформациюФайлНеБылИзменен(ОбработчикРезультата) ПерсональныеНастройки = ПерсональныеНастройкиРаботыСФайлами(); Если ПерсональныеНастройки.ПоказыватьИнформациюЧтоФайлНеБылИзменен Тогда ТекстНапоминания = НСтр("ru = 'Версия не была создана, т.к. файл не изменен. Комментарий не сохранен.'"); Кнопки = РежимДиалогаВопрос.ОК; ПараметрыНапоминания = Новый Структура; ПараметрыНапоминания.Вставить("БлокироватьВесьИнтерфейс", Истина); ПараметрыНапоминания.Вставить("Картинка", БиблиотекаКартинок.Информация32); ПараметрыНапоминания.Вставить("ТекстФлажка", НСтр("ru = 'Больше не показывать это сообщение'")); ПараметрыНапоминания.Вставить("Заголовок", НСтр("ru = 'Информация'")); СтандартныеПодсистемыКлиент.ПоказатьВопросПользователю( ОбработчикРезультата, ТекстНапоминания, Кнопки, ПараметрыНапоминания); Иначе ВернутьРезультат(ОбработчикРезультата, Неопределено); КонецЕсли; КонецПроцедуры //////////////////////////////////////////////////////////////////////////////// // Загружает отредактированный файл в программу, снимает блокировку и рассылает оповещение. // Продолжение процедуры (см. выше). Процедура ЗакончитьРедактированиеСОповещениемЗавершение(Результат, ПараметрыВыполнения) Экспорт Если Результат = Истина Тогда Оповестить("Запись_Файл", ПараметрыОповещенияЗаписиФайла("ЗаконченоРедактирование"), ПараметрыВыполнения.ПараметрКоманды); ОповеститьОбИзменении(ПараметрыВыполнения.ПараметрКоманды); Оповестить("Запись_Файл", ПараметрыОповещенияЗаписиФайла("ДанныеФайлаИзменены"), ПараметрыВыполнения.ПараметрКоманды); Оповестить("Запись_Файл", ПараметрыОповещенияЗаписиФайла("ВерсияСохранена"), ПараметрыВыполнения.ПараметрКоманды); КонецЕсли; ВернутьРезультат(ПараметрыВыполнения.ОбработчикРезультата, Результат); КонецПроцедуры // Сохраняет отредактированные файлы в ИБ и снимает блокировку. // // Параметры: // Параметры - см. ПараметрыОбновленияФайла. // Процедура ЗакончитьРедактированиеПоСсылкамСОповещением(Параметры) Экспорт Если ТипЗнч(Параметры.МассивФайлов) <> Тип("Массив") Тогда ВернутьРезультат(Параметры.ОбработчикРезультата, Неопределено); Возврат; КонецЕсли; Обработчик = Новый ОписаниеОповещения("ЗакончитьРедактированиеПоСсылкамПослеУстановкиРасширения", ЭтотОбъект, Параметры); ПоказатьВопросОбУстановкеРасширенияРаботыСФайлами(Обработчик); КонецПроцедуры // Продолжение процедуры (см. выше). Процедура ЗакончитьРедактированиеПоСсылкамПослеУстановкиРасширения(РасширениеУстановлено, ПараметрыВыполнения) Экспорт ПараметрыВыполнения.Вставить("ДанныеФайлов", Новый Массив); РаботаСФайламиСлужебныйВызовСервера.ПолучитьДанныеДляМассиваФайлов(ПараметрыВыполнения.МассивФайлов, ПараметрыВыполнения.ДанныеФайлов); // Завершение редактирования файлов. ДанныеФайлов = ПараметрыВыполнения.ДанныеФайлов; // Массив из см. РаботаСФайламиСлужебныйВызовСервера.ДанныеФайла - Для Каждого ДанныеФайла Из ДанныеФайлов Цикл ПараметрыОбработчика = ПараметрыОбновленияФайла(Неопределено, ДанныеФайла.Ссылка, ПараметрыВыполнения.ИдентификаторФормы); ЗаполнитьЗначенияСвойств(ПараметрыОбработчика, ПараметрыВыполнения); ПараметрыОбработчика.Вставить("ДанныеФайла", Неопределено); ПараметрыОбработчика.ХранитьВерсии = ДанныеФайла.ХранитьВерсии; ПараметрыОбработчика.ФайлРедактируетТекущийПользователь = ДанныеФайла.ФайлРедактируетТекущийПользователь; ПараметрыОбработчика.Редактирует = ДанныеФайла.Редактирует; ПараметрыОбработчика.АвторТекущейВерсии = ДанныеФайла.Редактирует; ПараметрыОбработчика.Кодировка = ДанныеФайла.КодировкаТекущейВерсии; Если ПараметрыВыполнения.ВозможностьСоздаватьВерсииФайлов Тогда ПараметрыОбработчика.СоздатьНовуюВерсию = ПараметрыВыполнения.ХранитьВерсии; Иначе ПараметрыОбработчика.СоздатьНовуюВерсию = Ложь; КонецЕсли; ПараметрыОбработчика.ПрименитьКоВсем = Истина; Если РасширениеУстановлено Тогда ЗакончитьРедактированиеСРасширением(ПараметрыОбработчика); Иначе ЗакончитьРедактированиеБезРасширения(ПараметрыОбработчика); КонецЕсли; КонецЦикла; ПоказатьОповещениеПользователя(НСтр("ru = 'Завершить редактирование файлов'"),, СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = 'Завершено редактирование файлов (%1 из %2).'"), ПараметрыВыполнения.ДанныеФайлов.Количество(), ПараметрыВыполнения.МассивФайлов.Количество()), БиблиотекаКартинок.Информация32); ОбработчикРезультата = Новый ОписаниеОповещения("ЗакончитьРедактированиеМассиваФайловСОповещениемЗавершение", ЭтотОбъект, ПараметрыВыполнения); ВернутьРезультат(ОбработчикРезультата, Истина); КонецПроцедуры Процедура ЗакончитьРедактированиеМассиваФайловСОповещениемЗавершение(Результат, ПараметрыВыполнения) Экспорт Если Результат = Истина Тогда Для Каждого ФайлСсылка Из ПараметрыВыполнения.МассивФайлов Цикл Оповестить("Запись_Файл", ПараметрыОповещенияЗаписиФайла("ЗаконченоРедактирование"), ФайлСсылка); ОповеститьОбИзменении(ФайлСсылка); Оповестить("Запись_Файл", ПараметрыОповещенияЗаписиФайла("ДанныеФайлаИзменены"), ФайлСсылка); Оповестить("Запись_Файл", ПараметрыОповещенияЗаписиФайла("ВерсияСохранена"), ФайлСсылка); КонецЦикла; КонецЕсли; КонецПроцедуры // Добавляет файлы перетаскиванием в список файлов. // // Параметры: // ВладелецФайла - ЛюбаяСсылка - владелец файла. // ИдентификаторФормы - УникальныйИдентификатор формы. // МассивИменФайлов - Массив из Строка - путей к файлам. // Процедура ДобавитьФайлыПеретаскиванием(Знач ВладелецФайла, Знач ИдентификаторФормы, Знач МассивИменФайлов) Экспорт ПрисоединенныеФайлыМассив = Новый Массив; ПоместитьВыбранныеФайлыВХранилище( МассивИменФайлов, ВладелецФайла, ПрисоединенныеФайлыМассив, ИдентификаторФормы); Если ПрисоединенныеФайлыМассив.Количество() = 1 Тогда ПрисоединенныйФайл = ПрисоединенныеФайлыМассив[0]; ПоказатьОповещениеПользователя( НСтр("ru = 'Создание'"), ПолучитьНавигационнуюСсылку(ПрисоединенныйФайл), ПрисоединенныйФайл, БиблиотекаКартинок.Информация32); ПараметрыФормы = Новый Структура("ПрисоединенныйФайл, ЭтоНовый", ПрисоединенныйФайл, Истина); ОткрытьФорму("Обработка.РаботаСФайлами.Форма.ПрисоединенныйФайл", ПараметрыФормы, , ПрисоединенныйФайл); КонецЕсли; Если ПрисоединенныеФайлыМассив.Количество() > 0 Тогда ОповеститьОбИзменении(ПрисоединенныеФайлыМассив[0]); ОповеститьОбИзменении(ВладелецФайла); ПараметрыОповещенияЗаписиФайла = ПараметрыОповещенияЗаписиФайла(); ПараметрыОповещенияЗаписиФайла.ЭтоНовый = Истина; ПараметрыОповещенияЗаписиФайла.Владелец = ВладелецФайла; ПараметрыОповещенияЗаписиФайла.ВладелецФайла = ПараметрыОповещенияЗаписиФайла.Владелец; Оповестить("Запись_Файл", ПараметрыОповещенияЗаписиФайла, ПрисоединенныеФайлыМассив); КонецЕсли; КонецПроцедуры //////////////////////////////////////////////////////////////////////////////// // Захватывает файл, открывает диалог редактирования и рассылает оповещение. // Блокирует файл для редактирования и открывает его. Процедура РедактироватьСОповещением(ОбработчикРезультата, ОбъектСсылка, УникальныйИдентификатор = Неопределено, РабочийКаталогВладельца = Неопределено) Экспорт Если ОбъектСсылка = Неопределено Тогда ВернутьРезультат(ОбработчикРезультата, Неопределено); Возврат; КонецЕсли; ПараметрыВыполнения = Новый Структура; ПараметрыВыполнения.Вставить("ОбработчикРезультата", ОбработчикРезультата); ПараметрыВыполнения.Вставить("ОбъектСсылка", ОбъектСсылка); Обработчик = Новый ОписаниеОповещения("РедактироватьСОповещениемЗавершение", ЭтотОбъект, ПараметрыВыполнения); РедактироватьФайлПоСсылке(Обработчик, ОбъектСсылка, УникальныйИдентификатор, РабочийКаталогВладельца); КонецПроцедуры // Продолжение процедуры (см. выше). Процедура РедактироватьСОповещениемЗавершение(ФайлОтредактирован, ПараметрыВыполнения) Экспорт Если ФайлОтредактирован Тогда ОповеститьОбИзменении(ПараметрыВыполнения.ОбъектСсылка); Оповестить("Запись_Файл", ПараметрыОповещенияЗаписиФайла("ДанныеФайлаИзменены"), ПараметрыВыполнения.ОбъектСсылка); Оповестить("Запись_Файл", ПараметрыОповещенияЗаписиФайла("ФайлРедактировался"), ПараметрыВыполнения.ОбъектСсылка); КонецЕсли; ВернутьРезультат(ПараметрыВыполнения.ОбработчикРезультата, Неопределено); КонецПроцедуры //////////////////////////////////////////////////////////////////////////////// // Захватывает файл или несколько файлов и рассылает оповещение. // Выполняет блокировку файла или нескольких файлов. // // Параметры: // ОбработчикРезультата - ОписаниеОповещения // - Неопределено - описание процедуры, принимающей результат работы метода. // ПараметрКоманды - либо ссылка на файл, либо массив ссылок на файлы. // УникальныйИдентификатор. // Процедура ЗанятьСОповещением(ОбработчикРезультата, ПараметрКоманды, УникальныйИдентификатор = Неопределено) Экспорт Если ПараметрКоманды = Неопределено Тогда ВернутьРезультат(ОбработчикРезультата, Неопределено); Возврат; КонецЕсли; ПараметрыВыполнения = Новый Структура; ПараметрыВыполнения.Вставить("ОбработчикРезультата", ОбработчикРезультата); ПараметрыВыполнения.Вставить("ПараметрКоманды", ПараметрКоманды); Если ТипЗнч(ПараметрКоманды) = Тип("Массив") Тогда Обработчик = Новый ОписаниеОповещения("ЗанятьСОповещениемМассивФайловЗавершение", ЭтотОбъект, ПараметрыВыполнения); ЗанятьФайлыПоСсылкам(Обработчик, ПараметрКоманды); Иначе Обработчик = Новый ОписаниеОповещения("ЗанятьСОповещениемОдинФайлЗавершение", ЭтотОбъект, ПараметрыВыполнения); ЗанятьФайлПоСсылке(Обработчик, ПараметрКоманды, УникальныйИдентификатор) КонецЕсли; КонецПроцедуры // Продолжение процедуры (см. выше). Процедура ЗанятьСОповещениемМассивФайловЗавершение(Результат, ПараметрыВыполнения) Экспорт ОповеститьОбИзменении(Тип("СправочникСсылка.Файлы")); Для Каждого ФайлСсылка Из ПараметрыВыполнения.ПараметрКоманды Цикл Оповестить("Запись_Файл", ПараметрыОповещенияЗаписиФайла("ДанныеФайлаИзменены"), ФайлСсылка); ОповеститьОбИзменении(ФайлСсылка); КонецЦикла; ВернутьРезультат(ПараметрыВыполнения.ОбработчикРезультата, Неопределено); КонецПроцедуры // Продолжение процедуры (см. выше). Процедура ЗанятьСОповещениемОдинФайлЗавершение(Результат, ПараметрыВыполнения) Экспорт Если Результат = Истина Тогда ОповеститьОбИзменении(ПараметрыВыполнения.ПараметрКоманды); Оповестить("Запись_Файл", ПараметрыОповещенияЗаписиФайла("ДанныеФайлаИзменены"), ПараметрыВыполнения.ПараметрКоманды); КонецЕсли; ВернутьРезультат(ПараметрыВыполнения.ОбработчикРезультата, Неопределено); КонецПроцедуры //////////////////////////////////////////////////////////////////////////////// // Снимает блокировку файла и рассылает оповещение. // Освобождает занятый ранее файл. // // Параметры: // Параметры - см. ПараметрыОсвобожденияФайла. // Процедура ОсвободитьФайлСОповещением(Параметры) Экспорт Если Параметры.ОбъектСсылка = Неопределено Тогда ВернутьРезультат(Параметры.ОбработчикРезультата, Неопределено); Возврат; КонецЕсли; ПараметрыВыполнения = Новый Структура; ПараметрыВыполнения.Вставить("ОбработчикРезультата", Параметры.ОбработчикРезультата); ПараметрыВыполнения.Вставить("ПараметрКоманды", Параметры.ОбъектСсылка); Если ТипЗнч(Параметры.ОбъектСсылка) = Тип("Массив") Тогда Обработчик = Новый ОписаниеОповещения("ОсвободитьФайлСОповещениемМассивФайловЗавершение", ЭтотОбъект, ПараметрыВыполнения); ОсвободитьФайлыПоСсылкам(Обработчик, Параметры.ОбъектСсылка); Иначе Обработчик = Новый ОписаниеОповещения("ОсвободитьФайлСОповещениемОдинФайлЗавершение", ЭтотОбъект, ПараметрыВыполнения); ПараметрыОсвобождения = ПараметрыОсвобожденияФайла(Обработчик, Параметры.ОбъектСсылка); ПараметрыОсвобождения.ХранитьВерсии = Параметры.ХранитьВерсии; ПараметрыОсвобождения.ФайлРедактируетТекущийПользователь = Параметры.ФайлРедактируетТекущийПользователь; ПараметрыОсвобождения.Редактирует = Параметры.Редактирует; ПараметрыОсвобождения.УникальныйИдентификатор = Параметры.УникальныйИдентификатор; ОсвободитьФайл(Параметры); КонецЕсли; КонецПроцедуры // Продолжение процедуры (см. выше). Процедура ОсвободитьФайлСОповещениемМассивФайловЗавершение(Результат, ПараметрыВыполнения) Экспорт ОповеститьОбИзменении(Тип("СправочникСсылка.Файлы")); Для Каждого ФайлСсылка Из ПараметрыВыполнения.ПараметрКоманды Цикл Оповестить("Запись_Файл", ПараметрыОповещенияЗаписиФайла("ДанныеФайлаИзменены"), ФайлСсылка); КонецЦикла; ВернутьРезультат(ПараметрыВыполнения.ОбработчикРезультата, Неопределено); КонецПроцедуры // Продолжение процедуры (см. выше). Процедура ОсвободитьФайлСОповещениемОдинФайлЗавершение(Результат, ПараметрыВыполнения) Экспорт Если Результат = Истина Тогда ОповеститьОбИзменении(ПараметрыВыполнения.ПараметрКоманды); Оповестить("Запись_Файл", ПараметрыОповещенияЗаписиФайла("ДанныеФайлаИзменены"), ПараметрыВыполнения.ПараметрКоманды); КонецЕсли; ВернутьРезультат(ПараметрыВыполнения.ОбработчикРезультата, Неопределено); КонецПроцедуры //////////////////////////////////////////////////////////////////////////////// // Открывает файл и рассылает оповещение. // Открывает файл. // // Параметры: // ОбработчикРезультата - ОписаниеОповещения // - Неопределено - описание процедуры, принимающей результат работы метода. // ДанныеФайла - Структура // УникальныйИдентификатор - УникальныйИдентификатор - формы. // Процедура ОткрытьФайлСОповещением(ОбработчикРезультата, ДанныеФайла, УникальныйИдентификатор = Неопределено, ДляРедактирования = Истина) Экспорт ПараметрыВыполнения = Новый Структура; ПараметрыВыполнения.Вставить("ОбработчикРезультата", ОбработчикРезультата); ПараметрыВыполнения.Вставить("ДанныеФайла", ДанныеФайла); ПараметрыВыполнения.Вставить("ДляРедактирования", ДляРедактирования); ПараметрыВыполнения.Вставить("УникальныйИдентификатор", УникальныйИдентификатор); // Файл не содержит владельца, просто открываем его по ссылке из временного хранилища. Если НЕ ПараметрыВыполнения.ДанныеФайла.Свойство("Владелец") Или Не ЗначениеЗаполнено(ПараметрыВыполнения.ДанныеФайла.Владелец) Тогда ОписаниеОповещения = Новый ОписаниеОповещения("ОткрытьФайлРасширениеПредложено", РаботаСФайламиСлужебныйКлиент, ПараметрыВыполнения); ПоказатьВопросОбУстановкеРасширенияРаботыСФайлами(ОписаниеОповещения); Возврат; КонецЕсли; // Если Файл без файла, тогда открыть карточку. Если ПараметрыВыполнения.ДанныеФайла.Версия.Пустая() И ПараметрыВыполнения.ДанныеФайла.ХранитьВерсии Тогда Обработчик = Новый ОписаниеОповещения("ОткрытьФайлСОповещениемЗавершение", ЭтотОбъект, ПараметрыВыполнения); ПоказатьЗначение(Обработчик, ПараметрыВыполнения.ДанныеФайла.Ссылка); Возврат; КонецЕсли; Обработчик = Новый ОписаниеОповещения("ОткрытьФайлСОповещениемПослеУстановкиРасширения", ЭтотОбъект, ПараметрыВыполнения); ПоказатьВопросОбУстановкеРасширенияРаботыСФайлами(Обработчик); КонецПроцедуры // Продолжение процедуры (см. выше). Процедура ОткрытьФайлСОповещениемПослеУстановкиРасширения(РасширениеУстановлено, ПараметрыВыполнения) Экспорт Если РасширениеРаботыСФайламиПодключено() Тогда Обработчик = Новый ОписаниеОповещения("ОткрытьФайлСОповещениемСРасширениемПослеПолученияВерсииВРабочийКаталог", ЭтотОбъект, ПараметрыВыполнения); ПолучитьФайлВерсииВРабочийКаталог( Обработчик, ПараметрыВыполнения.ДанныеФайла, "", ПараметрыВыполнения.УникальныйИдентификатор, Новый Структура("ОткрытьФайл", Истина)); Иначе ЗаполнитьВременныйИдентификаторФормы(ПараметрыВыполнения.УникальныйИдентификатор, ПараметрыВыполнения); Обработчик = Новый ОписаниеОповещения("ОткрытьФайлСОповещениемЗавершение", ЭтотОбъект, ПараметрыВыполнения); ОткрытьФайлБезРасширения(Обработчик, ПараметрыВыполнения.ДанныеФайла, ПараметрыВыполнения.УникальныйИдентификатор); КонецЕсли; КонецПроцедуры // Продолжение процедуры (см. выше). Процедура ОткрытьФайлСОповещениемСРасширениемПослеПолученияВерсииВРабочийКаталог(Результат, ПараметрыВыполнения) Экспорт Если Результат.ФайлПолучен = Истина Тогда ФайлНаДиске = Новый Файл(Результат.ПолноеИмяФайла); ФайлНаДиске.УстановитьТолькоЧтение(Не ПараметрыВыполнения.ДляРедактирования); УникальныйИдентификатор = ?(ПараметрыВыполнения.Свойство("УникальныйИдентификатор"), ПараметрыВыполнения.УникальныйИдентификатор, Неопределено); ОткрытьФайлПриложением(ПараметрыВыполнения.ДанныеФайла, Результат.ПолноеИмяФайла, УникальныйИдентификатор); КонецЕсли; ОткрытьФайлСОповещениемЗавершение(Результат.ФайлПолучен = Истина, ПараметрыВыполнения); КонецПроцедуры // Продолжение процедуры (см. выше). // // Параметры: // ПараметрыВыполнения - Структура: // * ДанныеФайла - см. РаботаСФайламиСлужебныйВызовСервера.ДанныеФайла // Процедура ОткрытьФайлСОповещениемЗавершение(Результат, ПараметрыВыполнения) Экспорт ОчиститьВременныйИдентификаторФормы(ПараметрыВыполнения); Если Результат <> Истина Тогда Возврат; КонецЕсли; ПараметрыОповещения = Новый Структура; ПараметрыОповещения.Вставить("Событие", "ФайлОткрыт"); Оповестить("ФайлОткрыт", ПараметрыОповещения, ПараметрыВыполнения.ДанныеФайла.Ссылка); КонецПроцедуры Процедура ОткрытьФайлБезРасширения(Оповещение, ДанныеФайла, ИдентификаторФормы, СПредупреждением = Истина, СохранятьСРасшифровкой = Истина, РасширениеДляЗашифрованныхФайлов = "") Контекст = Новый Структура; Контекст.Вставить("Оповещение", Оповещение); Контекст.Вставить("ДанныеФайла", ДанныеФайла); Контекст.Вставить("ИдентификаторФормы", ИдентификаторФормы); Контекст.Вставить("СПредупреждением", СПредупреждением); Контекст.Вставить("СохранятьСРасшифровкой", СохранятьСРасшифровкой); Контекст.Вставить("РасширениеДляЗашифрованныхФайлов", РасширениеДляЗашифрованныхФайлов); Если Контекст.СохранятьСРасшифровкой И ДанныеФайла.Зашифрован Тогда Если Не ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.ЭлектроннаяПодпись") Тогда ВыполнитьОбработкуОповещения(Контекст.Оповещение, Ложь); Возврат; КонецЕсли; СтруктураВозврата = РаботаСФайламиСлужебныйВызовСервера.ДанныеФайлаИДвоичныеДанные( ДанныеФайла.Версия,, ИдентификаторФормы); ОписаниеДанных = Новый Структура; ОписаниеДанных.Вставить("Операция", НСтр("ru = 'Расшифровка файла'")); ОписаниеДанных.Вставить("ЗаголовокДанных", НСтр("ru = 'Файл'")); ОписаниеДанных.Вставить("Данные", СтруктураВозврата.ДвоичныеДанные); ОписаниеДанных.Вставить("Представление", ДанныеФайла.Ссылка); ОписаниеДанных.Вставить("СертификатыШифрования", ДанныеФайла.Ссылка); ОписаниеДанных.Вставить("СообщитьОЗавершении", Ложь); ОбработчикПродолжения = Новый ОписаниеОповещения( "ОткрытьФайлБезРасширенияПослеРасшифровки", ЭтотОбъект, Контекст); МодульЭлектроннаяПодписьКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("ЭлектроннаяПодписьКлиент"); МодульЭлектроннаяПодписьКлиент.Расшифровать(ОписаниеДанных, , ОбработчикПродолжения); Возврат; КонецЕсли; Контекст.Вставить("АдресФайла", ДанныеФайла.СсылкаНаДвоичныеДанныеФайла); ОткрытьФайлБезРасширенияНапоминание(Контекст); КонецПроцедуры // Продолжение процедуры (см. выше). Процедура ОткрытьФайлБезРасширенияПослеРасшифровки(ОписаниеДанных, Контекст) Экспорт Если Не ОписаниеДанных.Успех Тогда ВыполнитьОбработкуОповещения(Контекст.Оповещение, Ложь); Возврат; КонецЕсли; Если ТипЗнч(ОписаниеДанных.РасшифрованныеДанные) = Тип("ДвоичныеДанные") Тогда АдресФайла = ПоместитьВоВременноеХранилище(ОписаниеДанных.РасшифрованныеДанные, Контекст.ИдентификаторФормы); Иначе АдресФайла = ОписаниеДанных.РасшифрованныеДанные; КонецЕсли; Контекст.Вставить("АдресФайла", АдресФайла); ОткрытьФайлБезРасширенияНапоминание(Контекст); КонецПроцедуры // Продолжение процедуры (см. выше). Процедура ОткрытьФайлБезРасширенияНапоминание(Контекст) Если Контекст.СПредупреждением И Контекст.ДанныеФайла.ФайлРедактируетТекущийПользователь Тогда ВывестиНапоминаниеПриРедактировании(Новый ОписаниеОповещения( "ОткрытьФайлБезРасширенияПередачаФайла", ЭтотОбъект, Контекст)); Иначе ОткрытьФайлБезРасширенияПередачаФайла(Истина, Контекст); КонецЕсли; КонецПроцедуры // Продолжение процедуры (см. выше). Процедура ОткрытьФайлБезРасширенияПередачаФайла(Результат, Контекст) Экспорт Если (ТипЗнч(Результат) = Тип("Структура") И Результат.Значение = "Отмена") Или Результат = Неопределено Тогда Возврат; КонецЕсли; Если ТипЗнч(Результат) = Тип("Структура") И Результат.Свойство("БольшеНеЗадаватьЭтотВопрос") И Результат.БольшеНеЗадаватьЭтотВопрос Тогда РаботаСФайламиСлужебныйВызовСервера.ПоказыватьПодсказкиПриРедактированииФайлов(Ложь); КонецЕсли; Если Не Контекст.СохранятьСРасшифровкой И Контекст.ДанныеФайла.Зашифрован И ЗначениеЗаполнено(Контекст.РасширениеДляЗашифрованныхФайлов) Тогда Расширение = Контекст.РасширениеДляЗашифрованныхФайлов; Иначе Расширение = Контекст.ДанныеФайла.Расширение; КонецЕсли; ИмяФайла = ОбщегоНазначенияКлиентСервер.ПолучитьИмяСРасширением( Контекст.ДанныеФайла.ПолноеНаименованиеВерсии, Расширение); ПолучитьФайл(Контекст.АдресФайла, ИмяФайла, Истина); ВыполнитьОбработкуОповещения(Контекст.Оповещение, Истина); КонецПроцедуры // Заполняет временный идентификатор формы для случаев, когда не требуется // возвращать данные во временном хранилище в вызывающий код, например, // как в процедурах Открыть, ОткрытьКаталогФайла в общем модуле РаботаСФайламиКлиент. // Процедура ЗаполнитьВременныйИдентификаторФормы(ИдентификаторФормы, ПараметрыВыполнения) Если ЗначениеЗаполнено(ИдентификаторФормы) Тогда Возврат; КонецЕсли; ПараметрыВыполнения.Вставить("ВременнаяФорма", ПолучитьФорму("Обработка.РаботаСФайлами.Форма.ФормаВопроса")); // АПК:65 ИдентификаторФормы = ПараметрыВыполнения.ВременнаяФорма.УникальныйИдентификатор; СтандартныеПодсистемыКлиент.УстановитьХранениеФормы(ПараметрыВыполнения.ВременнаяФорма, Истина); КонецПроцедуры // Отменяет хранение временного идентификатора, заполненного ранее. Процедура ОчиститьВременныйИдентификаторФормы(ПараметрыВыполнения) Если ПараметрыВыполнения.Свойство("ВременнаяФорма") Тогда СтандартныеПодсистемыКлиент.УстановитьХранениеФормы(ПараметрыВыполнения.ВременнаяФорма, Ложь); КонецЕсли; КонецПроцедуры //////////////////////////////////////////////////////////////////////////////// // Загружает файл в программу и рассылает оповещение. // Продолжение процедуры (см. выше). Процедура СохранитьИзмененияФайлаСОповещениемЗавершение(Результат, ПараметрыВыполнения) Экспорт Если Результат = Истина Тогда Оповестить("Запись_Файл", ПараметрыОповещенияЗаписиФайла("ДанныеФайлаИзменены"), ПараметрыВыполнения.ПараметрКоманды); Оповестить("Запись_Файл", ПараметрыОповещенияЗаписиФайла("ВерсияСохранена"), ПараметрыВыполнения.ПараметрКоманды); КонецЕсли; ВернутьРезультат(ПараметрыВыполнения.ОбработчикРезультата, Результат); КонецПроцедуры //////////////////////////////////////////////////////////////////////////////// // Показывает диалог выбора файла, загружает выбранный файл в программу как версию и рассылает оповещение. // Выбирает файл и создает из него новую версию. Процедура ОбновитьИзФайлаНаДискеСОповещением( ОбработчикРезультата, ДанныеФайла, ИдентификаторФормы, ПараметрыДобавленияФайла = Неопределено) Экспорт Если Не РасширениеРаботыСФайламиПодключено() Тогда ПоказатьПредупреждениеОНеобходимостиРасширенияРаботыСФайлами(ОбработчикРезультата); Возврат; КонецЕсли; ПараметрыВыполнения = Новый Структура; ПараметрыВыполнения.Вставить("ОбработчикРезультата", ОбработчикРезультата); ПараметрыВыполнения.Вставить("ДанныеФайла", ДанныеФайла); Обработчик = Новый ОписаниеОповещения("ОбновитьИзФайлаНаДискеСОповещениемЗавершение", ЭтотОбъект, ПараметрыВыполнения); ОбновитьИзФайлаНаДиске(Обработчик, ДанныеФайла, ИдентификаторФормы, ПараметрыДобавленияФайла); КонецПроцедуры // Продолжение процедуры (см. выше). // // Параметры: // ПараметрыВыполнения - Структура: // * ДанныеФайла - см. РаботаСФайламиСлужебныйВызовСервера.ДанныеФайла // Процедура ОбновитьИзФайлаНаДискеСОповещениемЗавершение(Результат, ПараметрыВыполнения) Экспорт Если Результат = Истина Тогда ОповеститьОбИзменении(ПараметрыВыполнения.ДанныеФайла.Ссылка); Оповестить("Запись_Файл", ПараметрыОповещенияЗаписиФайла("ДанныеФайлаИзменены"), ПараметрыВыполнения.ДанныеФайла.Ссылка); Оповестить("Запись_Файл", ПараметрыОповещенияЗаписиФайла("ВерсияСохранена"), ПараметрыВыполнения.ДанныеФайла.Ссылка); КонецЕсли; ВернутьРезультат(ПараметрыВыполнения.ОбработчикРезультата, Неопределено); КонецПроцедуры //////////////////////////////////////////////////////////////////////////////// // Шифрование файла. // Зашифровать файл. // // Параметры: // ОбработчикРезультата - ОписаниеОповещения // - Неопределено - описание процедуры, принимающей результат работы метода. // ДанныеФайла - см. РаботаСФайламиСлужебныйВызовСервера.ДанныеФайла // УникальныйИдентификатор - УникальныйИдентификатор - идентификатор формы. // Процедура Зашифровать(ОбработчикРезультата, ДанныеФайла, УникальныйИдентификатор) Экспорт ПараметрыВыполнения = Новый Структура; ПараметрыВыполнения.Вставить("ОбработчикРезультата", ОбработчикРезультата); ПараметрыВыполнения.Вставить("ДанныеФайла", ДанныеФайла); ПараметрыВыполнения.Вставить("УникальныйИдентификатор", УникальныйИдентификатор); ПараметрыВыполнения.Вставить("Успех", Ложь); ПараметрыВыполнения.Вставить("МассивДанныхДляЗанесенияВБазу", Новый Массив); ПараметрыВыполнения.Вставить("МассивОтпечатков", Новый Массив); Если ПараметрыВыполнения.ДанныеФайла.Зашифрован Тогда ТекстПредупреждения = НСтр("ru = 'Файл ""%1"" уже зашифрован.'"); ТекстПредупреждения = СтрЗаменить(ТекстПредупреждения, "%1", Строка(ПараметрыВыполнения.ДанныеФайла.Ссылка)); ВернутьРезультатПослеПоказаПредупреждения(ПараметрыВыполнения.ОбработчикРезультата, ТекстПредупреждения, ПараметрыВыполнения); Возврат; КонецЕсли; Если ЗначениеЗаполнено(ПараметрыВыполнения.ДанныеФайла.Редактирует) Тогда ТекстПредупреждения = НСтр("ru = 'Нельзя зашифровать занятый файл.'"); ВернутьРезультатПослеПоказаПредупреждения(ПараметрыВыполнения.ОбработчикРезультата, ТекстПредупреждения, ПараметрыВыполнения); Возврат; КонецЕсли; Если Не ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.ЭлектроннаяПодпись") Тогда Возврат; КонецЕсли; // Не нужно ПредложитьУстановкуРасширенияРаботыСФайлами(), т.к. все делается в памяти через ДвоичныеДанные. МассивВерсий = РаботаСФайламиСлужебныйВызовСервера.ДанныеФайлаИНавигационнаяСсылкаВсехВерсийФайла(ПараметрыВыполнения.ДанныеФайла.Ссылка, ПараметрыВыполнения.УникальныйИдентификатор); Если МассивВерсий.Количество() = 0 Тогда ВернутьРезультат(ПараметрыВыполнения.ОбработчикРезультата, Ложь); Возврат; КонецЕсли; ПараметрыВыполнения.МассивДанныхДляЗанесенияВБазу = Новый Массив; ПредставлениеФайла = Строка(ПараметрыВыполнения.ДанныеФайла.Ссылка); Если ПараметрыВыполнения.ДанныеФайла.КоличествоВерсий > 1 Тогда ПредставлениеФайла = ПредставлениеФайла + " (" + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = 'Версий: %1'"), ПараметрыВыполнения.ДанныеФайла.КоличествоВерсий) + ")"; КонецЕсли; СписокПредставлений = Новый СписокЗначений; СписокПредставлений.Добавить(ПараметрыВыполнения.ДанныеФайла.Ссылка, ПредставлениеФайла); НаборДанных = Новый Массив; Для каждого СвойстваВерсии Из МассивВерсий Цикл ТекущиеПараметрыВыполнения = Новый Структура; ТекущиеПараметрыВыполнения.Вставить("ПараметрыВыполнения", ПараметрыВыполнения); ТекущиеПараметрыВыполнения.Вставить("ВерсияСсылка", СвойстваВерсии.ВерсияСсылка); ТекущиеПараметрыВыполнения.Вставить("АдресФайла", СвойстваВерсии.НавигационнаяСсылкаВерсии); ЭлементДанных = Новый Структура; ЭлементДанных.Вставить("Данные", СвойстваВерсии.НавигационнаяСсылкаВерсии); ЭлементДанных.Вставить("РазмещениеРезультата", Новый ОписаниеОповещения( "ПриПолученииЗашифрованныхДанных", ЭтотОбъект, ТекущиеПараметрыВыполнения)); НаборДанных.Добавить(ЭлементДанных); КонецЦикла; ОписаниеДанных = Новый Структура; ОписаниеДанных.Вставить("Операция", НСтр("ru = 'Шифрование файла'")); ОписаниеДанных.Вставить("ЗаголовокДанных", НСтр("ru = 'Файл'")); ОписаниеДанных.Вставить("НаборДанных", НаборДанных); ОписаниеДанных.Вставить("ПредставлениеНабора", НСтр("ru = 'Файлы (%1)'")); ОписаниеДанных.Вставить("СписокПредставлений", СписокПредставлений); ОписаниеДанных.Вставить("СообщитьОЗавершении", Ложь); ОбработчикПродолжения = Новый ОписаниеОповещения("ПослеШифрованияФайла", ЭтотОбъект, ПараметрыВыполнения); МодульЭлектроннаяПодписьКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("ЭлектроннаяПодписьКлиент"); МодульЭлектроннаяПодписьКлиент.Зашифровать(ОписаниеДанных, , ОбработчикПродолжения); КонецПроцедуры // Параметры: // ТекущиеПараметрыВыполнения - Структура: // * ПараметрыВыполнения - Структура: // ** МассивДанныхДляЗанесенияВБазу - Массив // Процедура ПриПолученииЗашифрованныхДанных(Параметры, ТекущиеПараметрыВыполнения) Экспорт ПараметрыВыполнения = ТекущиеПараметрыВыполнения.ПараметрыВыполнения; ЗашифрованныеДанные = Параметры.ОписаниеДанных.ТекущийЭлементНабораДанных.ЗашифрованныеДанные; Если ТипЗнч(ЗашифрованныеДанные) = Тип("ДвоичныеДанные") Тогда АдресВременногоХранилища = ПоместитьВоВременноеХранилище(ЗашифрованныеДанные, ПараметрыВыполнения.УникальныйИдентификатор); Иначе АдресВременногоХранилища = ЗашифрованныеДанные; КонецЕсли; ДанныеДляЗаписиНаСервере = Новый Структура; ДанныеДляЗаписиНаСервере.Вставить("АдресВременногоХранилища", АдресВременногоХранилища); ДанныеДляЗаписиНаСервере.Вставить("ВерсияСсылка", ТекущиеПараметрыВыполнения.ВерсияСсылка); ДанныеДляЗаписиНаСервере.Вставить("АдресФайла", ТекущиеПараметрыВыполнения.АдресФайла); ДанныеДляЗаписиНаСервере.Вставить("АдресВременногоХранилищаТекста", ""); ПараметрыВыполнения.МассивДанныхДляЗанесенияВБазу.Добавить(ДанныеДляЗаписиНаСервере); ВыполнитьОбработкуОповещения(Параметры.Оповещение, Новый Структура); КонецПроцедуры // Завершение процедуры Зашифровать. Вызывается из подсистемы ЭлектроннаяПодпись. Процедура ПослеШифрованияФайла(ОписаниеДанных, ПараметрыВыполнения) Экспорт ПараметрыВыполнения.Успех = ОписаниеДанных.Успех; Если ОписаниеДанных.Успех Тогда Если ТипЗнч(ОписаниеДанных.СертификатыШифрования) = Тип("Строка") Тогда ПараметрыВыполнения.Вставить("МассивОтпечатков", ПолучитьИзВременногоХранилища( ОписаниеДанных.СертификатыШифрования)); Иначе ПараметрыВыполнения.Вставить("МассивОтпечатков", ОписаниеДанных.СертификатыШифрования); КонецЕсли; ОповеститьОбИзмененииФайла(ПараметрыВыполнения.ДанныеФайла); КонецЕсли; ВернутьРезультат(ПараметрыВыполнения.ОбработчикРезультата, ПараметрыВыполнения); КонецПроцедуры //////////////////////////////////////////////////////////////////////////////// // Расшифровка файла. // Расшифровка файла. // // Параметры: // ОбработчикРезультата - ОписаниеОповещения // - Неопределено - описание процедуры, принимающей результат работы метода. // ФайлСсылка - СправочникСсылка.Файлы - файл. // УникальныйИдентификатор - УникальныйИдентификатор - идентификатор формы. // ДанныеФайла - см. РаботаСФайламиСлужебныйВызовСервера.ДанныеФайла // Процедура Расшифровать(ОбработчикРезультата, ФайлСсылка, УникальныйИдентификатор, ДанныеФайла) Экспорт Если Не ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.ЭлектроннаяПодпись") Тогда Возврат; КонецЕсли; ПараметрыВыполнения = Новый Структура; ПараметрыВыполнения.Вставить("ОбработчикРезультата", ОбработчикРезультата); ПараметрыВыполнения.Вставить("ФайлСсылка", ФайлСсылка); ПараметрыВыполнения.Вставить("УникальныйИдентификатор", УникальныйИдентификатор); ПараметрыВыполнения.Вставить("ДанныеФайла", ДанныеФайла); ПараметрыВыполнения.Вставить("Успех", Ложь); ПараметрыВыполнения.Вставить("МассивДанныхДляЗанесенияВБазу", Новый Массив); // Не нужно ПредложитьУстановкуРасширенияРаботыСФайлами(), т.к. все делается в памяти через ДвоичныеДанные. МассивВерсий = РаботаСФайламиСлужебныйВызовСервера.ДанныеФайлаИНавигационнаяСсылкаВсехВерсийФайла( ПараметрыВыполнения.ФайлСсылка, ПараметрыВыполнения.УникальныйИдентификатор); ПараметрыВыполнения.МассивДанныхДляЗанесенияВБазу = Новый Массив; ПараметрыВыполнения.Вставить("ИзвлекатьТекстыФайловНаСервере", ОбщиеНастройкиРаботыСФайлами().ИзвлекатьТекстыФайловНаСервере); ПредставлениеФайла = Строка(ДанныеФайла.Ссылка); Если ДанныеФайла.КоличествоВерсий > 1 Тогда ПредставлениеФайла = ПредставлениеФайла + " (" + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = 'Версий: %1'"), ДанныеФайла.КоличествоВерсий) + ")"; КонецЕсли; СписокПредставлений = Новый СписокЗначений; СписокПредставлений.Добавить(ДанныеФайла.Ссылка, ПредставлениеФайла); СертификатыШифрования = Новый Массив; СертификатыШифрования.Добавить(ДанныеФайла.Ссылка); НаборДанных = Новый Массив; Для каждого СвойстваВерсии Из МассивВерсий Цикл ТекущиеПараметрыВыполнения = Новый Структура; ТекущиеПараметрыВыполнения.Вставить("ПараметрыВыполнения", ПараметрыВыполнения); ТекущиеПараметрыВыполнения.Вставить("ВерсияСсылка", СвойстваВерсии.ВерсияСсылка); ТекущиеПараметрыВыполнения.Вставить("АдресФайла", СвойстваВерсии.НавигационнаяСсылкаВерсии); ЭлементДанных = Новый Структура; ЭлементДанных.Вставить("Данные", СвойстваВерсии.НавигационнаяСсылкаВерсии); ЭлементДанных.Вставить("РазмещениеРезультата", Новый ОписаниеОповещения( "ПриПолученииРасшифрованныхДанных", ЭтотОбъект, ТекущиеПараметрыВыполнения)); НаборДанных.Добавить(ЭлементДанных); КонецЦикла; ОписаниеДанных = Новый Структура; ОписаниеДанных.Вставить("Операция", НСтр("ru = 'Расшифровка файла'")); ОписаниеДанных.Вставить("ЗаголовокДанных", НСтр("ru = 'Файл'")); ОписаниеДанных.Вставить("НаборДанных", НаборДанных); ОписаниеДанных.Вставить("ПредставлениеНабора", НСтр("ru = 'Файлы (%1)'")); ОписаниеДанных.Вставить("СписокПредставлений", СписокПредставлений); ОписаниеДанных.Вставить("СертификатыШифрования", СертификатыШифрования); ОписаниеДанных.Вставить("СообщитьОЗавершении", Ложь); ОбработчикПродолжения = Новый ОписаниеОповещения("ПослеРасшифровкиФайла", ЭтотОбъект, ПараметрыВыполнения); МодульЭлектроннаяПодписьКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("ЭлектроннаяПодписьКлиент"); МодульЭлектроннаяПодписьКлиент.Расшифровать(ОписаниеДанных, , ОбработчикПродолжения); КонецПроцедуры // Параметры: // ТекущиеПараметрыВыполнения - Структура: // * ПараметрыВыполнения - Структура: // ** ДанныеФайла - см. РаботаСФайламиСлужебныйВызовСервера.ДанныеФайла // ** МассивДанныхДляЗанесенияВБазу - Массив // Процедура ПриПолученииРасшифрованныхДанных(Параметры, ТекущиеПараметрыВыполнения) Экспорт ПараметрыВыполнения = ТекущиеПараметрыВыполнения.ПараметрыВыполнения; РасшифрованныеДанные = Параметры.ОписаниеДанных.ТекущийЭлементНабораДанных.РасшифрованныеДанные; Если ТипЗнч(РасшифрованныеДанные) = Тип("ДвоичныеДанные") Тогда АдресВременногоХранилища = ПоместитьВоВременноеХранилище(РасшифрованныеДанные, ПараметрыВыполнения.УникальныйИдентификатор); #Если Не ВебКлиент Тогда ДвоичныеДанныеРасшифрованные = РасшифрованныеДанные; #КонецЕсли Иначе АдресВременногоХранилища = РасшифрованныеДанные; #Если Не ВебКлиент Тогда ДвоичныеДанныеРасшифрованные = ПолучитьИзВременногоХранилища(АдресВременногоХранилища); #КонецЕсли КонецЕсли; АдресВременногоХранилищаТекста = ""; #Если Не ВебКлиент Тогда Если Не ПараметрыВыполнения.ИзвлекатьТекстыФайловНаСервере Тогда ПолныйПутьКФайлу = ПолучитьИмяВременногоФайла(ПараметрыВыполнения.ДанныеФайла.Расширение); ДвоичныеДанныеРасшифрованные.Записать(ПолныйПутьКФайлу); АдресВременногоХранилищаТекста = ИзвлечьТекстВоВременноеХранилище(ПолныйПутьКФайлу, ПараметрыВыполнения.УникальныйИдентификатор); Попытка УдалитьФайлы(ПолныйПутьКФайлу); Исключение ЖурналРегистрацииКлиент.ДобавитьСообщениеДляЖурналаРегистрации(СобытиеЖурналаРегистрации(), "Предупреждение", ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()),, Истина); КонецПопытки; КонецЕсли; #КонецЕсли ДанныеДляЗаписиНаСервере = Новый Структура; ДанныеДляЗаписиНаСервере.Вставить("АдресВременногоХранилища", АдресВременногоХранилища); ДанныеДляЗаписиНаСервере.Вставить("ВерсияСсылка", ТекущиеПараметрыВыполнения.ВерсияСсылка); ДанныеДляЗаписиНаСервере.Вставить("АдресФайла", ТекущиеПараметрыВыполнения.АдресФайла); ДанныеДляЗаписиНаСервере.Вставить("АдресВременногоХранилищаТекста", АдресВременногоХранилищаТекста); ПараметрыВыполнения.МассивДанныхДляЗанесенияВБазу.Добавить(ДанныеДляЗаписиНаСервере); ВыполнитьОбработкуОповещения(Параметры.Оповещение, Новый Структура); КонецПроцедуры // Завершение процедуры Расшифровать. Вызывается из подсистемы ЭлектроннаяПодпись. Процедура ПослеРасшифровкиФайла(ОписаниеДанных, ПараметрыВыполнения) Экспорт ПараметрыВыполнения.Успех = ОписаниеДанных.Успех; Если ОписаниеДанных.Успех Тогда ОповеститьОбИзмененииФайла(ПараметрыВыполнения.ДанныеФайла); КонецЕсли; ВернутьРезультат(ПараметрыВыполнения.ОбработчикРезультата, ПараметрыВыполнения); КонецПроцедуры // Продолжение процедуры ПроверитьПодписи. Вызывается из подсистемы ЭлектроннаяПодпись. Процедура ПослеРасшифровкиФайлаПриПроверкеПодписи(ОписаниеДанных, ДополнительныеПараметры) Экспорт Если Не ОписаниеДанных.Успех Тогда Возврат; КонецЕсли; ПроверитьПодписиПослеПодготовкиДанных(ОписаниеДанных.РасшифрованныеДанные, ДополнительныеПараметры); КонецПроцедуры //////////////////////////////////////////////////////////////////////////////// // Продолжения асинхронных процедур. //////////////////////////////////////////////////////////////////////////////// // Создает новый файл. // Создает новый файл интерактивно с вызовом диалога выбора режима создания Файла. // // Параметры: // см. РаботаСФайламиКлиент.ДобавитьФайл(). // Процедура ДобавитьФайл( ОбработчикРезультата, ВладелецФайла, ФормаВладелец, РежимСоздания = 1, ПараметрыДобавления = Неопределено) Экспорт ПараметрыВыполнения = Новый Структура; Если ПараметрыДобавления = Неопределено Или ТипЗнч(ПараметрыДобавления) = Тип("Булево") Тогда ПараметрыВыполнения.Вставить("МаксимальныйРазмер", 0); ПараметрыВыполнения.Вставить("ФильтрДиалогаВыбора", СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Все файлы (%1)|%1'"), ПолучитьМаскуВсеФайлы())); ПараметрыВыполнения.Вставить("НеОткрыватьКарточкуПослеСозданияИзФайла", ?(ПараметрыДобавления = Неопределено, Ложь, ПараметрыДобавления)); Иначе ПараметрыВыполнения.Вставить("МаксимальныйРазмер", ПараметрыДобавления.МаксимальныйРазмер); ПараметрыВыполнения.Вставить("ФильтрДиалогаВыбора", ПараметрыДобавления.ФильтрДиалогаВыбора); ПараметрыВыполнения.Вставить("НеОткрыватьКарточкуПослеСозданияИзФайла", ПараметрыДобавления.НеОткрыватьКарточку); КонецЕсли; ПараметрыВыполнения.Вставить("ОбработчикРезультата", ОбработчикРезультата); ПараметрыВыполнения.Вставить("ВладелецФайла", ВладелецФайла); ПараметрыВыполнения.Вставить("ФормаВладелец", ФормаВладелец); ПараметрыВыполнения.Вставить("ЭтоФайл", Истина); Обработчик = Новый ОписаниеОповещения("ДобавитьПослеВыбораРежимаСоздания", ЭтотОбъект, ПараметрыВыполнения); ПараметрыФормы = Новый Структура; ПараметрыФормы.Вставить("РежимСоздания", РежимСоздания); Контекст = Новый Структура; Контекст.Вставить("ПараметрыФормы", ПараметрыФормы); Контекст.Вставить("Обработчик", Обработчик); ПараметрыФормы.Вставить("ДоступнаКомандаСканировать", ДоступноСканирование()); ОткрытьФорму("Справочник.Файлы.Форма.ФормаНового", ПараметрыФормы, , , , , Контекст.Обработчик); КонецПроцедуры Процедура ДобавитьФайлИзФайловойСистемы(ВладелецФайла, ФормаВладелец) Экспорт ПараметрыВыполнения = Новый Структура; ПараметрыВыполнения.Вставить("ОбработчикРезультата", Неопределено); ПараметрыВыполнения.Вставить("ВладелецФайла", ВладелецФайла); ПараметрыВыполнения.Вставить("ФормаВладелец", ФормаВладелец); ПараметрыВыполнения.Вставить("ЭтоФайл", Истина); ДобавитьПослеВыбораРежимаСоздания(2, ПараметрыВыполнения); КонецПроцедуры // Создает новый файл интерактивно указанным образом. // // Параметры: // РежимСоздания - Число - режим создания файла. // 1 - из шаблона (копированием другого файла), // 2 - с компьютера (из файловой системы), // 3 - со сканера. // ПараметрыВыполнения - Структура - типы значений и описания см. в РаботаСФайламиКлиент.ДобавитьФайл(). // * ОбработчикРезультата. // * ВладелецФайла. // * ФормаВладелец // * НеОткрыватьКарточкуПослеСозданияИзФайла. // Процедура ДобавитьПослеВыбораРежимаСоздания(РежимСоздания, ПараметрыВыполнения) Экспорт ПараметрыВыполнения.Вставить("НеОткрыватьКарточкуПослеСозданияИзФайла", Истина); Если РежимСоздания = 1 Тогда // Скопировать другой файла. ДобавитьНаОсновеШаблона(ПараметрыВыполнения); ИначеЕсли РежимСоздания = 2 Тогда // Загрузить из файловой системы. Если РасширениеРаботыСФайламиПодключено() Тогда ДобавитьИзФайловойСистемыСРасширением(ПараметрыВыполнения); Иначе ДобавитьИзФайловойСистемыБезРасширения(ПараметрыВыполнения); КонецЕсли; ИначеЕсли РежимСоздания = 3 Тогда // Считать со сканера. ПараметрыДобавления = РаботаСФайламиКлиент.ПараметрыДобавленияСоСканера(); ЗаполнитьЗначенияСвойств(ПараметрыДобавления, ПараметрыВыполнения); ДобавитьСоСканера(ПараметрыДобавления); Иначе ВернутьРезультат(ПараметрыВыполнения.ОбработчикРезультата, Неопределено); КонецЕсли; КонецПроцедуры // Продолжение процедуры (см. выше). Процедура ДобавитьНаОсновеШаблона(ПараметрыВыполнения) Экспорт // Скопировать из файла шаблона. ПараметрыФормы = Новый Структура; ПараметрыФормы.Вставить("ВыборШаблона", Истина); ПараметрыФормы.Вставить("ТекущаяСтрока", ПредопределенноеЗначение("Справочник.ПапкиФайлов.Шаблоны")); Обработчик = Новый ОписаниеОповещения("ДобавитьНаОсновеШаблонаПослеВыбораШаблона", ЭтотОбъект, ПараметрыВыполнения); РежимОткрытия = РежимОткрытияОкнаФормы.БлокироватьВесьИнтерфейс; ОткрытьФорму("Справочник.Файлы.Форма.ФормаВыбора", ПараметрыФормы, , , , , Обработчик, РежимОткрытия); КонецПроцедуры // Продолжение процедуры (см. выше). Процедура ДобавитьНаОсновеШаблонаПослеВыбораШаблона(Результат, ПараметрыВыполнения) Экспорт Если Результат = Неопределено Тогда ВернутьРезультат(ПараметрыВыполнения.ОбработчикРезультата, Неопределено); Возврат; КонецЕсли; ПараметрыФормы = Новый Структура; ПараметрыФормы.Вставить("РежимСоздания", "ИзШаблона"); ПараметрыФормы.Вставить("ИмяСправочникаХранилищаФайлов", ?(ПараметрыВыполнения.Свойство("ИмяСправочникаХранилищаФайлов"), ПараметрыВыполнения.ИмяСправочникаХранилищаФайлов, РаботаСФайламиСлужебныйВызовСервера.ИмяСправочникаХраненияФайлов(ПараметрыВыполнения.ВладелецФайла))); ОписаниеОповещенияОЗакрытии = ОбработчикЗавершения(ПараметрыВыполнения.ОбработчикРезультата); РаботаСФайламиКлиент.СкопироватьФайл(ПараметрыВыполнения.ВладелецФайла, Результат, ПараметрыФормы, ОписаниеОповещенияОЗакрытии); КонецПроцедуры // Продолжение процедуры (см. выше). Процедура ДобавитьИзФайловойСистемыБезРасширения(ПараметрыВыполнения) // Загрузить из файловой системы без расширения для работы с 1С:Предприятием (веб-клиент). ДиалогВыбора = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие); Если ПараметрыВыполнения.Свойство("ФильтрДиалогаВыбора") Тогда ДиалогВыбора.Фильтр = ПараметрыВыполнения.ФильтрДиалогаВыбора; КонецЕсли; Обработчик = Новый ОписаниеОповещения("ДобавитьИзФайловойСистемыБезРасширенияПослеЗагрузкиФайла", ЭтотОбъект, ПараметрыВыполнения); НачатьПомещениеФайла(Обработчик, , ДиалогВыбора, , ПараметрыВыполнения.ФормаВладелец.УникальныйИдентификатор); КонецПроцедуры // Продолжение процедуры (см. выше). Процедура ДобавитьИзФайловойСистемыБезРасширенияПослеЗагрузкиФайла(Помещен, Адрес, ВыбранноеИмяФайла, ПараметрыВыполнения) Экспорт Если Не Помещен Тогда ВернутьРезультат(ПараметрыВыполнения.ОбработчикРезультата, Неопределено); Возврат; КонецЕсли; Результат = Новый Структура; Результат.Вставить("ФайлДобавлен", Ложь); Результат.Вставить("ФайлСсылка", Неопределено); Результат.Вставить("ТекстОшибки", ""); СтруктураПути = ОбщегоНазначенияКлиентСервер.РазложитьПолноеИмяФайла(ВыбранноеИмяФайла); Если ПустаяСтрока(СтруктураПути.Расширение) Тогда ТекстВопроса = НСтр("ru = 'Укажите файл с расширением.'"); Кнопки = Новый СписокЗначений; Кнопки.Добавить(КодВозвратаДиалога.Повторить, НСтр("ru = 'Выбрать другой файл'")); Кнопки.Добавить(КодВозвратаДиалога.Отмена); Обработчик = Новый ОписаниеОповещения("ДобавитьИзФайловойСистемыБезРасширенияПослеОтветаНаВопросПовторить", ЭтотОбъект, ПараметрыВыполнения); ПоказатьВопрос(Обработчик, ТекстВопроса, Кнопки); Возврат; КонецЕсли; Если ПараметрыВыполнения.Свойство("МаксимальныйРазмер") И ПараметрыВыполнения.МаксимальныйРазмер > 0 Тогда РазмерФайла = ПолучитьИзВременногоХранилища(Адрес).Размер(); Если РазмерФайла > ПараметрыВыполнения.МаксимальныйРазмер*1024*1024 Тогда ТекстОшибки = НСтр("ru = 'Размер файла превышает %1 Мб.'"); Результат.ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ТекстОшибки, ПараметрыВыполнения.МаксимальныйРазмер); ВернутьРезультатПослеПоказаПредупреждения(ПараметрыВыполнения.ОбработчикРезультата, Результат.ТекстОшибки, Неопределено); Возврат; КонецЕсли; КонецЕсли; // Создание файла в ИБ. Попытка Если РаботаСФайламиСлужебныйКлиентПовтИсп.ЭтоСправочникФайлы(ПараметрыВыполнения.ВладелецФайла) Тогда СведенияОФайле = РаботаСФайламиКлиентСервер.СведенияОФайле("ФайлСВерсией"); СведенияОФайле.АдресВременногоХранилищаФайла = Адрес; СведенияОФайле.ИмяБезРасширения = СтруктураПути.ИмяБезРасширения; СведенияОФайле.РасширениеБезТочки = ОбщегоНазначенияКлиентСервер.РасширениеБезТочки(СтруктураПути.Расширение); Результат.ФайлСсылка = РаботаСФайламиСлужебныйВызовСервера.СоздатьФайлСВерсией(ПараметрыВыполнения.ВладелецФайла, СведенияОФайле); Результат.ФайлДобавлен = Истина; Иначе ПараметрыФайла = РаботаСФайламиСлужебныйКлиентСервер.ПараметрыДобавленияФайла(); ПараметрыФайла.Владелец = ПараметрыВыполнения.ВладелецФайла; ПараметрыФайла.ПараметрыФайла = ПараметрыФайла.Владелец; ПараметрыФайла.ИмяБезРасширения = СтруктураПути.ИмяБезРасширения; ПараметрыФайла.РасширениеБезТочки = ОбщегоНазначенияКлиентСервер.РасширениеБезТочки(СтруктураПути.Расширение); Результат.ФайлСсылка = РаботаСФайламиСлужебныйВызовСервера.ДобавитьФайл(ПараметрыФайла,Адрес); Результат.ФайлДобавлен = Истина; КонецЕсли; Исключение Результат.ТекстОшибки = ОшибкаСозданияНовогоФайла(ИнформацияОбОшибке()); КонецПопытки; Если Результат.ТекстОшибки <> "" Тогда ВернутьРезультатПослеПоказаПредупреждения(ПараметрыВыполнения.ОбработчикРезультата, Результат.ТекстОшибки, Неопределено); Возврат; КонецЕсли; ПараметрыОповещения = ПараметрыОповещенияЗаписиФайла(); ПараметрыОповещения.Владелец = ПараметрыВыполнения.ВладелецФайла; ПараметрыОповещения.Файл = Результат.ФайлСсылка; ПараметрыОповещения.ЭтоНовый = Истина; Оповестить("Запись_Файл", ПараметрыОповещения, Результат.ФайлСсылка); ПоказатьОповещениеПользователя( НСтр("ru = 'Создание:'"), ПолучитьНавигационнуюСсылку(Результат.ФайлСсылка), Результат.ФайлСсылка, БиблиотекаКартинок.Информация32); Если ПараметрыВыполнения.НеОткрыватьКарточкуПослеСозданияИзФайла <> Истина Тогда ПараметрыФормы = Новый Структура("КарточкаОткрытаПослеСозданияФайла", Истина); ОписаниеОповещенияОЗакрытии = ОбработчикЗавершения(ПараметрыВыполнения.ОбработчикРезультата); РаботаСФайламиКлиент.ОткрытьФормуФайла(Результат.ФайлСсылка,, ПараметрыФормы, ОписаниеОповещенияОЗакрытии); Иначе ВернутьРезультат(ПараметрыВыполнения.ОбработчикРезультата, Результат); КонецЕсли; КонецПроцедуры // Продолжение процедуры (см. выше). Процедура ДобавитьИзФайловойСистемыБезРасширенияПослеОтветаНаВопросПовторить(Ответ, ПараметрыВыполнения) Экспорт Если Ответ = КодВозвратаДиалога.Повторить Тогда ДобавитьИзФайловойСистемыБезРасширения(ПараметрыВыполнения); Иначе ВернутьРезультат(ПараметрыВыполнения.ОбработчикРезультата, Неопределено); КонецЕсли; КонецПроцедуры //////////////////////////////////////////////////////////////////////////////// // Процедуры и функции для работы с криптографией из формы файла. // Параметры: // Форма - ФормаКлиентскогоПриложения // Процедура ПрочитатьСертификатыПодписей(Форма) Экспорт Если Форма.ЭлектронныеПодписи.Количество() = 0 Тогда Возврат; КонецЕсли; Если Не ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.ЭлектроннаяПодпись") Тогда Возврат; КонецЕсли; Контекст = Новый Структура; Контекст.Вставить("Форма", Форма); Контекст.Вставить("МодульЭлектроннаяПодписьКлиент", ОбщегоНазначенияКлиент.ОбщийМодуль("ЭлектроннаяПодписьКлиент")); Контекст.Вставить("МодульЭлектроннаяПодписьСлужебныйКлиентСервер", ОбщегоНазначенияКлиент.ОбщийМодуль("ЭлектроннаяПодписьСлужебныйКлиентСервер")); Если Контекст.МодульЭлектроннаяПодписьКлиент.ПроверятьЭлектронныеПодписиНаСервере() Тогда Возврат; КонецЕсли; НачатьПодключениеРасширенияРаботыСКриптографией(Новый ОписаниеОповещения( "ПрочитатьСертификатыПодписейПослеПодключенияРасширения", ЭтотОбъект, Контекст)); КонецПроцедуры // Продолжение процедуры ПрочитатьСертификатыПодписей. Процедура ПрочитатьСертификатыПодписейПослеПодключенияРасширения(Подключено, Контекст) Экспорт Если Не Подключено Тогда Возврат; КонецЕсли; Контекст.МодульЭлектроннаяПодписьКлиент.СоздатьМенеджерКриптографии(Новый ОписаниеОповещения( "ПрочитатьСертификатыПодписейПослеСозданияМенеджераКриптографии", ЭтотОбъект, Контекст), "ПолучениеСертификатов", Ложь); КонецПроцедуры // Продолжение процедуры ПрочитатьСертификатыПодписей. Процедура ПрочитатьСертификатыПодписейПослеСозданияМенеджераКриптографии(Результат, Контекст) Экспорт Если ТипЗнч(Результат) <> Тип("МенеджерКриптографии") Тогда Возврат; КонецЕсли; Контекст.Вставить("Индекс", -1); Контекст.Вставить("МенеджерКриптографии", Результат); ПрочитатьСертификатыПодписейЦиклНачало(Контекст); КонецПроцедуры // Продолжение процедуры ПрочитатьСертификатыПодписей. // // Параметры: // Контекст - Структура: // * Форма - ФормаКлиентскогоПриложения // Процедура ПрочитатьСертификатыПодписейЦиклНачало(Контекст) Если Контекст.Форма.ЭлектронныеПодписи.Количество() <= Контекст.Индекс + 1 Тогда Возврат; КонецЕсли; Контекст.Индекс = Контекст.Индекс + 1; Контекст.Вставить("СтрокаТаблицы", Контекст.Форма.ЭлектронныеПодписи[Контекст.Индекс]); Если ЗначениеЗаполнено(Контекст.СтрокаТаблицы.Отпечаток) Тогда ПрочитатьСертификатыПодписейЦиклНачало(Контекст); Возврат; КонецЕсли; // Подпись не была прочитана при записи объекта. Подпись = ПолучитьИзВременногоХранилища(Контекст.СтрокаТаблицы.АдресПодписи); Если Не ЗначениеЗаполнено(Подпись) Тогда ПрочитатьСертификатыПодписейЦиклНачало(Контекст); Возврат; КонецЕсли; Контекст.МенеджерКриптографии.НачатьПолучениеСертификатовИзПодписи(Новый ОписаниеОповещения( "ПрочитатьСертификатыПодписейЦиклПослеПолученияСертификатовИзПодписи", ЭтотОбъект, Контекст, "ПрочитатьСертификатыПодписейЦиклПослеОшибкиПолученияСертификатовИзПодписи", ЭтотОбъект), Подпись); КонецПроцедуры // Продолжение процедуры ПрочитатьСертификатыПодписей. Процедура ПрочитатьСертификатыПодписейЦиклПослеОшибкиПолученияСертификатовИзПодписи(ИнформацияОбОшибке, СтандартнаяОбработка, Контекст) Экспорт СтандартнаяОбработка = Ложь; ПрочитатьСертификатыПодписейЦиклНачало(Контекст); КонецПроцедуры // Продолжение процедуры ПрочитатьСертификатыПодписей. Процедура ПрочитатьСертификатыПодписейЦиклПослеПолученияСертификатовИзПодписи(Сертификаты, Контекст) Экспорт Если Сертификаты.Количество() = 0 Тогда ПрочитатьСертификатыПодписейЦиклНачало(Контекст); Возврат; КонецЕсли; Попытка Если Сертификаты.Количество() = 1 Тогда Сертификат = Сертификаты[0]; // СертификатКриптографии ИначеЕсли Сертификаты.Количество() > 1 Тогда Сертификат = Контекст.МодульЭлектроннаяПодписьСлужебныйКлиентСервер.СертификатыПоПорядкуДоКорневого(Сертификаты)[0]; // СертификатКриптографии КонецЕсли; Исключение ПрочитатьСертификатыПодписейЦиклНачало(Контекст); Возврат; КонецПопытки; Контекст.Вставить("Сертификат", Сертификат); Сертификат.НачатьВыгрузку(Новый ОписаниеОповещения( "ПрочитатьСертификатыПодписейЦиклПослеВыгрузкиСертификата", ЭтотОбъект, Контекст, "ПрочитатьСертификатыПодписейЦиклПослеОшибкиВыгрузкиСертификата", ЭтотОбъект)); КонецПроцедуры // Продолжение процедуры ПрочитатьСертификатыПодписей. Процедура ПрочитатьСертификатыПодписейЦиклПослеОшибкиВыгрузкиСертификата(ИнформацияОбОшибке, СтандартнаяОбработка, Контекст) Экспорт СтандартнаяОбработка = Ложь; ПрочитатьСертификатыПодписейЦиклНачало(Контекст); КонецПроцедуры // Продолжение процедуры ПрочитатьСертификатыПодписей. // // Параметры: // Контекст - Структура: // * Форма - ФормаКлиентскогоПриложения // Процедура ПрочитатьСертификатыПодписейЦиклПослеВыгрузкиСертификата(ДанныеСертификата, Контекст) Экспорт СтрокаТаблицы = Контекст.СтрокаТаблицы; СтрокаТаблицы.Отпечаток = Base64Строка(Контекст.Сертификат.Отпечаток); СтрокаТаблицы.АдресСертификата = ПоместитьВоВременноеХранилище(ДанныеСертификата, Контекст.Форма.УникальныйИдентификатор); СтрокаТаблицы.КомуВыданСертификат = Контекст.МодульЭлектроннаяПодписьКлиент.ПредставлениеСубъекта(Контекст.Сертификат); ПрочитатьСертификатыПодписейЦиклНачало(Контекст); КонецПроцедуры // По окончании Зашифровать нотифицирует. // Параметры: // МассивФайловВРабочемКаталогеДляУдаления - Массив - массив строк - путей к файлам. // ВладелецФайла - ЛюбаяСсылка - владелец файла. // ФайлСсылка - СправочникСсылка.Файлы - файл. // Процедура ИнформироватьОШифровании(МассивФайловВРабочемКаталогеДляУдаления, ВладелецФайла, ФайлСсылка) Экспорт ОповеститьОбИзменении(ФайлСсылка); Оповестить("Запись_Файл", ПараметрыОповещенияЗаписиФайла("ПрисоединенныйФайлЗашифрован"), ВладелецФайла); Оповестить("Запись_Файл", ПараметрыОповещенияЗаписиФайла("ДанныеФайлаИзменены"), ФайлСсылка); // Удаляем из рабочего каталога все версии файла. Для Каждого ПолноеИмяФайла Из МассивФайловВРабочемКаталогеДляУдаления Цикл УдалитьФайлБезПодтверждения(ПолноеИмяФайла); КонецЦикла; Если Не ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.ЭлектроннаяПодпись") Тогда Возврат; КонецЕсли; МодульЭлектроннаяПодписьКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("ЭлектроннаяПодписьКлиент"); МодульЭлектроннаяПодписьКлиент.ИнформироватьОШифрованииОбъекта( СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = 'Файл: %1'"), ФайлСсылка)); КонецПроцедуры // По окончании Расшифровать нотифицирует. // Параметры: // ВладелецФайла - ЛюбаяСсылка - владелец файла. // ФайлСсылка - СправочникСсылка.Файлы - файл. // Процедура ИнформироватьОРасшифровке(ВладелецФайла, ФайлСсылка) Экспорт ОповеститьОбИзменении(ФайлСсылка); Оповестить("Запись_Файл", ПараметрыОповещенияЗаписиФайла("ПрисоединенныйФайлЗашифрован"), ВладелецФайла); Оповестить("Запись_Файл", ПараметрыОповещенияЗаписиФайла("ДанныеФайлаИзменены"), ФайлСсылка); Если Не ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.ЭлектроннаяПодпись") Тогда Возврат; КонецЕсли; МодульЭлектроннаяПодписьКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("ЭлектроннаяПодписьКлиент"); МодульЭлектроннаяПодписьКлиент.ИнформироватьОРасшифровкеОбъекта( СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = 'Файл: %1'"), ФайлСсылка)); КонецПроцедуры //////////////////////////////////////////////////////////////////////////////// // Работа с электронными подписями. // Процедура ПодписатьФайл(ПрисоединенныйФайл, ДанныеФайла, ИдентификаторФормы, ОбработчикЗавершения = Неопределено, ОбработчикПриПолученииПодписи = Неопределено, ПараметрыПодписи = Неопределено) Экспорт ПараметрыВыполнения = Новый Структура; ПараметрыВыполнения.Вставить("ОбработчикЗавершения", ОбработчикЗавершения); ПараметрыВыполнения.Вставить("ПрисоединенныйФайл", ПрисоединенныйФайл); ПараметрыВыполнения.Вставить("ДанныеФайла", ДанныеФайла); ПараметрыВыполнения.Вставить("ИдентификаторФормы", ИдентификаторФормы); ОбработчикПродолжения = Новый ОписаниеОповещения("ПослеДобавленияПодписей", ЭтотОбъект, ПараметрыВыполнения); Если Не ПроверитьВозможностьПодписания(ДанныеФайла, ОбработчикЗавершения, ОбработчикПродолжения, ПараметрыВыполнения) Тогда Возврат; КонецЕсли; ОписаниеДанных = Новый Структура; ОписаниеДанных.Вставить("ПоказатьКомментарий", Истина); ПодписьМассиваФайлов = ТипЗнч(ПрисоединенныйФайл) = Тип("Массив"); Если ПодписьМассиваФайлов И ПрисоединенныйФайл.Количество() > 1 Тогда ОписаниеДанных.Вставить("Операция", НСтр("ru = 'Подписание файлов'")); ОписаниеДанных.Вставить("ЗаголовокДанных", НСтр("ru = 'Файлы'")); НаборДанных = Новый Массив; ИндексФайла = 0; Для Каждого Файл Из ПрисоединенныйФайл Цикл ОписаниеДанныхФайла = Новый Структура; ОписаниеДанныхФайла.Вставить("Представление", Файл); ОписаниеДанныхФайла.Вставить("Данные", ПараметрыВыполнения.ДанныеФайла[ИндексФайла].СсылкаНаДвоичныеДанныеФайла); Если ОбработчикПриПолученииПодписи = Неопределено Тогда ОписаниеДанныхФайла.Вставить("Объект", Файл); Иначе ОписаниеДанныхФайла.Вставить("Объект", ОбработчикПриПолученииПодписи); КонецЕсли; НаборДанных.Добавить(ОписаниеДанныхФайла); ИндексФайла = ИндексФайла + 1; КонецЦикла; ОписаниеДанных.Вставить("НаборДанных", НаборДанных); ОписаниеДанных.Вставить("ПредставлениеНабора", "Файлы (%1)"); Иначе ОписаниеДанных.Вставить("Операция", НСтр("ru = 'Подписание файла'")); ОписаниеДанных.Вставить("ЗаголовокДанных", НСтр("ru = 'Файл'")); Если ПодписьМассиваФайлов Тогда ОписаниеДанных.Вставить("Представление", ПрисоединенныйФайл[0]); ОписаниеДанных.Вставить("Данные", ПараметрыВыполнения.ДанныеФайла[0].СсылкаНаДвоичныеДанныеФайла); Если ОбработчикПриПолученииПодписи = Неопределено Тогда ОписаниеДанных.Вставить("Объект", ПрисоединенныйФайл[0]); Иначе ОписаниеДанных.Вставить("Объект", ОбработчикПриПолученииПодписи); КонецЕсли; Иначе ОписаниеДанных.Вставить("Представление", ПрисоединенныйФайл); ОписаниеДанных.Вставить("Данные", ПараметрыВыполнения.ДанныеФайла.СсылкаНаДвоичныеДанныеФайла); Если ОбработчикПриПолученииПодписи = Неопределено Тогда ОписаниеДанных.Вставить("Объект", ПрисоединенныйФайл); Иначе ОписаниеДанных.Вставить("Объект", ОбработчикПриПолученииПодписи); КонецЕсли; КонецЕсли; КонецЕсли; МодульЭлектроннаяПодписьКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("ЭлектроннаяПодписьКлиент"); ПараметрыПодписания = МодульЭлектроннаяПодписьКлиент.НовыйТипПодписи(); Если ПараметрыПодписи <> Неопределено Тогда ЗаполнитьЗначенияСвойств(ПараметрыПодписания, ПараметрыПодписи); КонецЕсли; МодульЭлектроннаяПодписьКлиент.Подписать(ОписаниеДанных, ИдентификаторФормы, ОбработчикПродолжения, ПараметрыПодписания); КонецПроцедуры // Завершение процедур ПодписатьФайл, ДобавитьПодписьИзФайла. Процедура ПослеДобавленияПодписей(ОписаниеДанных, ПараметрыВыполнения) Экспорт Если ТипЗнч(ОписаниеДанных) <> Тип("Структура") Или Не ОписаниеДанных.Свойство("Успех") Тогда ВыполнитьОбработкуОповещения(ПараметрыВыполнения.ОбработчикЗавершения, Ложь); Возврат; КонецЕсли; Если ОписаниеДанных.Успех Тогда Если ТипЗнч(ПараметрыВыполнения.ПрисоединенныйФайл) = Тип("Массив") Тогда Для Каждого Файл Из ПараметрыВыполнения.ПрисоединенныйФайл Цикл ОповеститьОбИзменении(Файл); Оповестить("Запись_Файл", ПараметрыОповещенияЗаписиФайла(), Файл); КонецЦикла; Иначе ОповеститьОбИзменении(ПараметрыВыполнения.ПрисоединенныйФайл); Оповестить("Запись_Файл", ПараметрыОповещенияЗаписиФайла(), ПараметрыВыполнения.ПрисоединенныйФайл); КонецЕсли; КонецЕсли; Если ПараметрыВыполнения.ОбработчикЗавершения <> Неопределено Тогда ВыполнитьОбработкуОповещения(ПараметрыВыполнения.ОбработчикЗавершения, ОписаниеДанных.Успех); КонецЕсли; КонецПроцедуры // Добавляет электронные подписи к файлу в программе из файлов-подписей на компьютере. Процедура ДобавитьПодписьИзФайла(Файл, ИдентификаторФормы, ОбработчикЗавершения) Экспорт СвойстваФайла = РаботаСФайламиСлужебныйВызовСервера.ДанныеФайлаИДвоичныеДанные(Файл, , ИдентификаторФормы); ДанныеФайла = СвойстваФайла.ДанныеФайла; ПараметрыВыполнения = Новый Структура; ПараметрыВыполнения.Вставить("ОбработчикЗавершения", ОбработчикЗавершения); ПараметрыВыполнения.Вставить("ДанныеФайла", ДанныеФайла); ПараметрыВыполнения.Вставить("ИдентификаторФормы", ИдентификаторФормы); Если Не ПроверитьВозможностьПодписания(ПараметрыВыполнения.ДанныеФайла, ОбработчикЗавершения, ОбработчикЗавершения, ПараметрыВыполнения) Тогда Возврат; КонецЕсли; ОписаниеДанных = Новый Структура; ОписаниеДанных.Вставить("ЗаголовокДанных", НСтр("ru = 'Файл'")); ОписаниеДанных.Вставить("Представление", ДанныеФайла.Ссылка); ОписаниеДанных.Вставить("ПоказатьКомментарий", Истина); ОписаниеДанных.Вставить("Данные", СвойстваФайла.ДвоичныеДанные); ОписаниеДанных.Вставить("Объект", Новый ОписаниеОповещения("ПриПолученииПодписей", ЭтотОбъект, ПараметрыВыполнения)); ОбработчикПродолжения = Новый ОписаниеОповещения("ПослеПодписанияФайла", ЭтотОбъект, ПараметрыВыполнения); МодульЭлектроннаяПодписьКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("ЭлектроннаяПодписьКлиент"); МодульЭлектроннаяПодписьКлиент.ДобавитьПодписьИзФайла(ОписаниеДанных,, ОбработчикПродолжения); КонецПроцедуры // Продолжение процедуры ДобавитьПодписьИзФайла. // Вызывается из подсистемы ЭлектроннаяПодпись после подготовки подписей из файлов для нестандартного // способа добавления подписи в объект. // // Параметры: // Контекст - Структура: // * ДанныеФайла - см. РаботаСФайламиСлужебныйВызовСервера.ДанныеФайла // Процедура ПриПолученииПодписей(Параметры, Контекст) Экспорт РаботаСФайламиСлужебныйВызовСервера.ДобавитьПодписьКФайлу( Контекст.ДанныеФайла.Ссылка, Параметры.ОписаниеДанных.Подписи, Контекст.ИдентификаторФормы); ВыполнитьОбработкуОповещения(Параметры.Оповещение, Новый Структура); КонецПроцедуры // Завершение процедуры ДобавитьПодписьИзФайла. Процедура ПослеПодписанияФайла(ОписаниеДанных, ПараметрыВыполнения) Экспорт Если ТипЗнч(ОписаниеДанных) <> Тип("Структура") Или Не ОписаниеДанных.Свойство("Успех") Тогда ВыполнитьОбработкуОповещения(ПараметрыВыполнения.ОбработчикЗавершения, Ложь); Возврат; КонецЕсли; Если ОписаниеДанных.Успех Тогда ОповеститьОбИзмененииФайла(ПараметрыВыполнения.ДанныеФайла); КонецЕсли; ВернутьРезультат(ПараметрыВыполнения.ОбработчикЗавершения, ОписаниеДанных.Успех); КонецПроцедуры // Для процедур ПослеПодписанияФайла, ПослеПодписанияФайлов. Процедура ОповеститьОбИзмененииФайла(ДанныеФайла) ОповеститьОбИзменении(ДанныеФайла.Ссылка); ОповеститьОбИзменении(ДанныеФайла.ТекущаяВерсия); Оповестить("Запись_Файл", ПараметрыОповещенияЗаписиФайла("ПрисоединенныйФайлПодписан"), ДанныеФайла.Владелец); КонецПроцедуры // Сохраняет файл с электронной подписью. Процедура СохранитьФайлВместеСПодписью(Файл, ИдентификаторФормы) Экспорт Если Не ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.ЭлектроннаяПодпись") Тогда Возврат; КонецЕсли; ДанныеФайла = РаботаСФайламиСлужебныйВызовСервера.ДанныеФайлаДляСохранения(Файл); ПараметрыВыполнения = Новый Структура; ПараметрыВыполнения.Вставить("ДанныеФайла", ДанныеФайла); ПараметрыВыполнения.Вставить("ИдентификаторФормы", ИдентификаторФормы); ОписаниеДанных = Новый Структура; ОписаниеДанных.Вставить("ЗаголовокДанных", НСтр("ru = 'Файл'")); ОписаниеДанных.Вставить("Представление", ПараметрыВыполнения.ДанныеФайла.Ссылка); ОписаниеДанных.Вставить("ПоказатьКомментарий", Истина); ОписаниеДанных.Вставить("Объект", ПараметрыВыполнения.ДанныеФайла.Ссылка); ОписаниеДанных.Вставить("Данные", Новый ОписаниеОповещения("ПриСохраненииДанныхФайла", ЭтотОбъект, ПараметрыВыполнения)); МодульЭлектроннаяПодписьКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("ЭлектроннаяПодписьКлиент"); МодульЭлектроннаяПодписьКлиент.СохранитьДанныеВместеСПодписью(ОписаниеДанных); КонецПроцедуры // Продолжение процедуры СохранитьФайлВместеСПодписями. // Вызывается из подсистемы ЭлектроннаяПодпись после выбора подписей для сохранения. // Процедура ПриСохраненииДанныхФайла(Параметры, Контекст) Экспорт ДополнительныеПараметры = Новый Структура("Оповещение", Параметры.Оповещение); ОбработчикОповещения = Новый ОписаниеОповещения("ПриСохраненииДанныхФайлаВернутьРезультат", ЭтотОбъект, ДополнительныеПараметры); СохранитьКак(ОбработчикОповещения, Контекст.ДанныеФайла, Контекст.ИдентификаторФормы); КонецПроцедуры // Продолжение процедуры СохранитьФайлВместеСПодписями. // Вызывается из подсистемы ЭлектроннаяПодпись после выбора подписей для сохранения. // Процедура ПриСохраненииДанныхФайлаВернутьРезультат(Результат, ДополнительныеПараметры) Экспорт Если ТипЗнч(Результат) = Тип("Строка") Тогда Результат = ?(ЗначениеЗаполнено(Результат), Новый Структура("ПолноеИмяФайла", Результат), Новый Структура); КонецЕсли; ВыполнитьОбработкуОповещения(ДополнительныеПараметры.Оповещение, Результат); КонецПроцедуры Функция ПроверитьВозможностьПодписания(ДанныеФайла, ОбработчикЗавершения, ОбработчикРезультата, ПараметрыВыполнения) Если Не ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.ЭлектроннаяПодпись") Тогда Возврат Ложь; КонецЕсли; Если ТипЗнч(ДанныеФайла) = Тип("Массив") Тогда Предупреждения = Новый Массив; Для Каждого Файл Из ДанныеФайла Цикл Если ЗначениеЗаполнено(Файл.Редактирует) Тогда Предупреждения.Добавить(РаботаСФайламиСлужебныйКлиентСервер.СтрокаСообщенияОНедопустимостиПодписанияЗанятогоФайла(Файл.Ссылка)); Продолжить; КонецЕсли; Если Файл.Зашифрован Тогда Предупреждения.Добавить(РаботаСФайламиСлужебныйКлиентСервер.СтрокаСообщенияОНедопустимостиПодписанияЗашифрованногоФайла(Файл.Ссылка)); Продолжить; КонецЕсли; КонецЦикла; Если Предупреждения.Количество() > 0 Тогда ВернутьРезультатПослеПоказаПредупреждения(ОбработчикРезультата, СтрСоединить(Предупреждения, Символы.ПС), ПараметрыВыполнения); Возврат Ложь; КонецЕсли; Иначе Если ЗначениеЗаполнено(ДанныеФайла.Редактирует) Тогда ТекстПредупреждения = РаботаСФайламиСлужебныйКлиентСервер.СтрокаСообщенияОНедопустимостиПодписанияЗанятогоФайла(); ВернутьРезультатПослеПоказаПредупреждения(ОбработчикРезультата, ТекстПредупреждения, ПараметрыВыполнения); Возврат Ложь; КонецЕсли; Если ДанныеФайла.Зашифрован Тогда ТекстПредупреждения = РаботаСФайламиСлужебныйКлиентСервер.СтрокаСообщенияОНедопустимостиПодписанияЗашифрованногоФайла(); ВернутьРезультатПослеПоказаПредупреждения(ОбработчикЗавершения, ТекстПредупреждения, ПараметрыВыполнения); Возврат Ложь; КонецЕсли; КонецЕсли; Возврат Истина; КонецФункции //////////////////////////////////////////////////////////////////////////////// // Загружает структуру файлов и каталогов с компьютера в программу. // Возвращаемое значение: // Структура: // * ОбработчикРезультата - ОписаниеОповещения - обработчик, которому нужно передать результат импорта. // * Владелец - ОпределяемыйТип.ВладелецПрисоединенныхФайлов - папка или объект-владелец, к которому // добавляются импортированные файлы. // * ГруппаФайлов - ОпределяемыйТип.ПрисоединенныйФайл - группа файлов, в которую добавляются // импортированные файлы. // * ВыбранныеФайлы - СписокЗначений - импортируемые объекты Файл. // * Индикатор - Число - число от 0 до 100 - прогресс выполнения. // * Комментарий - Строка - комментарий. // * ХранитьВерсии - Булево - хранить версии. // * УдалятьФайлыПослеДобавления - Булево - удалять файлы ВыбранныеФайлы после завершения импорта. // * Рекурсивно - Булево - рекурсивно обходить подкаталоги. // * ИдентификаторФормы - УникальныйИдентификатор - идентификатор формы. // * ПсевдоФайловаяСистема - Соответствие - эмуляция файловой системы - для строки (каталога) возвращает массив // строк (подкаталоги и файлы). // * Кодировка - Строка - кодировка для текстовых файлов. // * ДобавленныеФайлы - Массив - добавленные файлы, выходной параметр. // Функция ПараметрыИмпортаФайлов() Экспорт ПараметрыВыполнения = Новый Структура; ПараметрыВыполнения.Вставить("ОбработчикРезультата"); ПараметрыВыполнения.Вставить("Владелец"); ПараметрыВыполнения.Вставить("ГруппаФайлов"); ПараметрыВыполнения.Вставить("ВыбранныеФайлы"); ПараметрыВыполнения.Вставить("Комментарий"); ПараметрыВыполнения.Вставить("ХранитьВерсии"); ПараметрыВыполнения.Вставить("УдалятьФайлыПослеДобавления"); ПараметрыВыполнения.Вставить("Рекурсивно"); ПараметрыВыполнения.Вставить("ИдентификаторФормы"); ПараметрыВыполнения.Вставить("ПсевдоФайловаяСистема", Новый Соответствие); ПараметрыВыполнения.Вставить("Кодировка"); ПараметрыВыполнения.Вставить("ДобавленныеФайлы", Новый Массив); Возврат ПараметрыВыполнения; КонецФункции // Рекурсивная функция импорта файлов - принимает массив файлов (или каталогов) // - если файл, просто добавляет его, если каталог - создает группу и рекурсивно вызывает саму себя. // // Параметры: // ПараметрыВыполнения - Структура: // * ОбработчикРезультата - ОписаниеОповещения // - Структура - обработчик, которому нужно передать результат // импорта. // * Владелец - ЛюбаяСсылка - владелец файла. // * ВыбранныеФайлы - Массив // - СписокЗначений - объекты Файл. // * Индикатор - Число - число от 0 до 100 - прогресс выполнения. // * МассивИменФайловСОшибками - Массив - массив имен файлов с ошибками. // * МассивСтруктурВсехФайлов - Массив - массив структур всех файлов. // * Комментарий - Строка - комментарий. // * ХранитьВерсии - Булево - хранить версии. // * УдалятьФайлыПослеДобавления - Булево - удалять файлы ВыбранныеФайлы после завершения импорта. // * Рекурсивно - Булево - рекурсивно обходить подкаталоги. // * КоличествоСуммарное - Число - количество суммарное импортированных файлов. // * Счетчик - Число - счетчик обработанных файлов (не обязательно файл будет загружен). // * ИдентификаторФормы - УникальныйИдентификатор - идентификатор формы. // * ПсевдоФайловаяСистема - Соответствие - эмуляция файловой системы - для строки (каталога) возвращает массив // строк (подкаталоги и файлы). // * ДобавленныеФайлы - Массив - добавленные файлы, выходной параметр. // * МассивВсехПапок - Массив - массив всех папок. // * Кодировка - Строка - кодировка для текстовых файлов. // Процедура ИмпортФайловРекурсивно(Владелец, ВыбранныеФайлы, ПараметрыВыполнения) СлужебныеПараметры = Новый Структура; Для Каждого КлючИЗначение Из ПараметрыВыполнения Цикл СлужебныеПараметры.Вставить(КлючИЗначение.Ключ, КлючИЗначение.Значение); КонецЦикла; СлужебныеПараметры.ОбработчикРезультата = ПараметрыВыполнения; СлужебныеПараметры.Владелец = Владелец; СлужебныеПараметры.ВыбранныеФайлы = ВыбранныеФайлы; СлужебныеПараметры.Вставить("МассивПапокДляВопросаПапкаУжеСуществует", Новый Массив); ИмпортФайловРекурсивноБезДиалогов(СлужебныеПараметры.Владелец, СлужебныеПараметры.ВыбранныеФайлы, СлужебныеПараметры, Истина); Если СлужебныеПараметры.МассивПапокДляВопросаПапкаУжеСуществует.Количество() = 0 Тогда // Задавать вопрос не требуется. ВернутьРезультат(СлужебныеПараметры.ОбработчикРезультата, Неопределено); Возврат; КонецЕсли; // По мере ответов на вопросы папки из ПараметрыВыполнения.МассивПапокДляВопросаПапкаУжеСуществует // записываются в ПараметрыВыполнения.ВыбранныеФайлы. // Затем рекурсия перезапускается. СлужебныеПараметры.ВыбранныеФайлы = Новый Массив; СлужебныеПараметры.Вставить("ПапкаДляДобавленияВВыбранныеФайлы", Неопределено); ИмпортФайловРекурсивноЗадатьСледующийВопрос(СлужебныеПараметры); КонецПроцедуры // Продолжение процедуры (см. выше). // // Параметры: // ПараметрыВыполнения - Структура: // * ВыбранныеФайлы - Массив // * ПапкаДляДобавленияВВыбранныеФайлы - Файл // * МассивПапокДляВопросаПапкаУжеСуществует - Массив // Процедура ИмпортФайловРекурсивноЗадатьСледующийВопрос(ПараметрыВыполнения) ПараметрыВыполнения.ОбработчикРезультата = ОбработчикЗавершения(ПараметрыВыполнения.ОбработчикРезультата); ПараметрыВыполнения.ПапкаДляДобавленияВВыбранныеФайлы = ПараметрыВыполнения.МассивПапокДляВопросаПапкаУжеСуществует[0]; ПараметрыВыполнения.МассивПапокДляВопросаПапкаУжеСуществует.Удалить(0); ТекстВопроса = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = 'Папка ""%1"" уже существует. |Продолжить импорт папки?'"), ПараметрыВыполнения.ПапкаДляДобавленияВВыбранныеФайлы.Имя); Обработчик = Новый ОписаниеОповещения("ИмпортФайловРекурсивноПослеОтветаНаВопрос", ЭтотОбъект, ПараметрыВыполнения); ПоказатьВопрос(Обработчик, ТекстВопроса, РежимДиалогаВопрос.ДаНет); КонецПроцедуры // Продолжение процедуры (см. выше). // // Параметры: // ПараметрыВыполнения - Структура: // * ВыбранныеФайлы - Массив // Процедура ИмпортФайловРекурсивноПослеОтветаНаВопрос(Ответ, ПараметрыВыполнения) Экспорт Если Ответ <> КодВозвратаДиалога.Нет Тогда ПараметрыВыполнения.ВыбранныеФайлы.Добавить(ПараметрыВыполнения.ПапкаДляДобавленияВВыбранныеФайлы); КонецЕсли; // После ответов на все вопросы рекурсия перезапускается. Если ПараметрыВыполнения.МассивПапокДляВопросаПапкаУжеСуществует.Количество() = 0 Тогда ИмпортФайловРекурсивноБезДиалогов(ПараметрыВыполнения.Владелец, ПараметрыВыполнения.ВыбранныеФайлы, ПараметрыВыполнения, Ложь); // ЗадаватьВопросПапкаУжеСуществует (используется только для первого уровня рекурсии). Если ПараметрыВыполнения.МассивПапокДляВопросаПапкаУжеСуществует.Количество() = 0 Тогда // Вопросов больше не возникло. ВернутьРезультат(ПараметрыВыполнения.ОбработчикРезультата, Неопределено); Возврат; Иначе // Возникли еще вопросы. ПараметрыВыполнения.ВыбранныеФайлы = Новый Массив; КонецЕсли; КонецЕсли; ИмпортФайловРекурсивноЗадатьСледующийВопрос(ПараметрыВыполнения); КонецПроцедуры // Рекурсивная функция импорта файлов - принимает массив файлов (или каталогов) // - если файл, просто добавляет его, если каталог - создает группу и рекурсивно вызывает саму себя. // // Параметры: // Владелец - ЛюбаяСсылка - владелец файла. // ВыбранныеФайлы - Массив - массив объектов Файл. // ПараметрыВыполнения - см. ИмпортФайловРекурсивно.ПараметрыВыполнения // ЗадаватьВопросПапкаУжеСуществует - Булево - Истина только для первого уровня рекурсии. // Процедура ИмпортФайловРекурсивноБезДиалогов(Знач Владелец, Знач ВыбранныеФайлы, Знач ПараметрыВыполнения, Знач ЗадаватьВопросПапкаУжеСуществует) Перем ПерваяПапкаСТакимЖеИменем; Для Каждого ВыбранныйФайл Из ВыбранныеФайлы Цикл Если Не ВыбранныйФайл.Существует() Тогда Запись = Новый Структура; Запись.Вставить("ИмяФайла", ВыбранныйФайл.ПолноеИмя); Запись.Вставить("Ошибка", НСтр("ru = 'Файл отсутствует на компьютере.'")); ПараметрыВыполнения.МассивИменФайловСОшибками.Добавить(Запись); Продолжить; КонецЕсли; Попытка Если ВыбранныйФайл.Расширение = ".lnk" Тогда ВыбранныйФайл = РазыменоватьLnkФайл(ВыбранныйФайл); КонецЕсли; Если ВыбранныйФайл.ЭтоКаталог() Тогда Если ПараметрыВыполнения.Рекурсивно = Истина Тогда НовыйПуть = Строка(ВыбранныйФайл.Путь); НовыйПуть = ОбщегоНазначенияКлиентСервер.ДобавитьКонечныйРазделительПути(НовыйПуть); НовыйПуть = НовыйПуть + Строка(ВыбранныйФайл.Имя); МассивФайлов = НайтиФайлыПсевдо(ПараметрыВыполнения.ПсевдоФайловаяСистема, НовыйПуть); // Создаем группу в справочнике - эквивалент каталога на компьютере. Если МассивФайлов.Количество() <> 0 Тогда ИмяФайла = ВыбранныйФайл.Имя; Если РаботаСФайламиСлужебныйВызовСервера.ЕстьПапкаСТакимИменем(ИмяФайла, ПараметрыВыполнения.ГруппаФайлов, ПерваяПапкаСТакимЖеИменем) Тогда Если ЗадаватьВопросПапкаУжеСуществует Тогда ПараметрыВыполнения.МассивПапокДляВопросаПапкаУжеСуществует.Добавить(ВыбранныйФайл); Продолжить; КонецЕсли; КонецЕсли; ПапкаФайловСсылка = РаботаСФайламиСлужебныйВызовСервера.СоздатьПапкуФайлов(ИмяФайла, Владелец,,ПараметрыВыполнения.ГруппаФайлов); Если РаботаСФайламиСлужебныйКлиентПовтИсп.ЭтоСправочникФайлы(ПапкаФайловСсылка) Тогда // Параметр ЗадаватьВопросПапкаУжеСуществует нужен, чтобы не задавать вопрос на 1 уровне рекурсии, // когда обходятся папки, для которых уже получен положительный ответ. ИмпортФайловРекурсивноБезДиалогов(ПапкаФайловСсылка, МассивФайлов, ПараметрыВыполнения, Истина); Иначе ТекущаяГруппаФайлов = ПараметрыВыполнения.ГруппаФайлов; ПараметрыВыполнения.ГруппаФайлов = ПапкаФайловСсылка; // Параметр ЗадаватьВопросПапкаУжеСуществует нужен, чтобы не задавать вопрос на 1 уровне рекурсии, // когда обходятся папки, для которых уже получен положительный ответ. ИмпортФайловРекурсивноБезДиалогов(Владелец, МассивФайлов, ПараметрыВыполнения, Истина); ПараметрыВыполнения.ГруппаФайлов = ТекущаяГруппаФайлов; КонецЕсли; ПараметрыВыполнения.МассивВсехПапок.Добавить(НовыйПуть); КонецЕсли; КонецЕсли; Продолжить; КонецЕсли; Если Не ПроверитьВозможностьЗагрузкиФайла( ВыбранныйФайл, Ложь, ПараметрыВыполнения.МассивИменФайловСОшибками) Тогда Продолжить; КонецЕсли; // Обновим индикатор прогресса. ПараметрыВыполнения.Счетчик = ПараметрыВыполнения.Счетчик + 1; // Считаем проценты ПараметрыВыполнения.Индикатор = Цел(ПараметрыВыполнения.Счетчик * 100 / ПараметрыВыполнения.КоличествоСуммарное); РазмерВМб = ВыбранныйФайл.Размер() / (1024 * 1024); НадписьПодробнее = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = 'Обрабатывается файл ""%1"" (%2 Мб)...'"), ВыбранныйФайл.Имя, РаботаСФайламиСлужебныйКлиентСервер.ПолучитьСтрокуСРазмеромФайла(РазмерВМб)); ТекстСостояния = НСтр("ru = 'Загрузка файлов с компьютера...'"); Состояние(ТекстСостояния, ПараметрыВыполнения.Индикатор, НадписьПодробнее, БиблиотекаКартинок.Информация32); // Создаем Элемент справочника Файлы. АдресВременногоХранилищаФайла = ""; ПомещаемыеФайлы = Новый Массив; Описание = Новый ОписаниеПередаваемогоФайла(ВыбранныйФайл.ПолноеИмя, ""); ПомещаемыеФайлы.Добавить(Описание); ПомещенныеФайлы = Новый Массив; Если Не ПоместитьФайлы(ПомещаемыеФайлы, ПомещенныеФайлы, , Ложь, ПараметрыВыполнения.ИдентификаторФормы) Тогда ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = 'Не удалось поместить файл во временное хранилище ""%1"".'"), ВыбранныйФайл.ПолноеИмя); КонецЕсли; Если ПомещенныеФайлы.Количество() = 1 Тогда АдресВременногоХранилищаФайла = ПомещенныеФайлы[0].Хранение; КонецЕсли; Если НЕ ОбщиеНастройкиРаботыСФайлами().ИзвлекатьТекстыФайловНаСервере Тогда АдресВременногоХранилищаТекста = ИзвлечьТекстВоВременноеХранилище(ВыбранныйФайл.ПолноеИмя, ПараметрыВыполнения.ИдентификаторФормы, , ПараметрыВыполнения.Кодировка); Иначе АдресВременногоХранилищаТекста = ""; КонецЕсли; // Создаем элемент справочника Файлы. ИмпортироватьФайл(ВыбранныйФайл, Владелец, ПараметрыВыполнения, АдресВременногоХранилищаФайла, АдресВременногоХранилищаТекста); Исключение ИнформацияОбОшибке = ИнформацияОбОшибке(); СообщениеОбОшибке = ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке); ОбщегоНазначенияКлиент.СообщитьПользователю(СообщениеОбОшибке); ЖурналРегистрацииКлиент.ДобавитьСообщениеДляЖурналаРегистрации(СобытиеЖурналаРегистрации(), "Ошибка", ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке),,Истина); Запись = Новый Структура; Запись.Вставить("ИмяФайла", ВыбранныйФайл.ПолноеИмя); Запись.Вставить("Ошибка", СообщениеОбОшибке); ПараметрыВыполнения.МассивИменФайловСОшибками.Добавить(Запись); КонецПопытки; КонецЦикла; КонецПроцедуры // Параметры: // // ПараметрыВыполнения - см. ИмпортФайловРекурсивно.ПараметрыВыполнения // Процедура ИмпортироватьФайл(Знач ВыбранныйФайл, Знач Владелец, Знач ПараметрыВыполнения, Знач АдресВременногоХранилищаФайла, Знач АдресВременногоХранилищаТекста) Если РаботаСФайламиСлужебныйКлиентПовтИсп.ЭтоСправочникФайлы(ПараметрыВыполнения.Владелец) Тогда СведенияОФайле = РаботаСФайламиКлиентСервер.СведенияОФайле("ФайлСВерсией", ВыбранныйФайл); СведенияОФайле.АдресВременногоХранилищаФайла = АдресВременногоХранилищаФайла; СведенияОФайле.АдресВременногоХранилищаТекста = АдресВременногоХранилищаТекста; СведенияОФайле.Комментарий = ПараметрыВыполнения.Комментарий; СведенияОФайле.Кодировка = ПараметрыВыполнения.Кодировка; ФайлСсылка = РаботаСФайламиСлужебныйВызовСервера.СоздатьФайлСВерсией(Владелец, СведенияОФайле); Иначе ПараметрыФайла = РаботаСФайламиСлужебныйКлиентСервер.ПараметрыДобавленияФайла(); ПараметрыФайла.ВладелецФайлов = ПараметрыВыполнения.Владелец; ПараметрыФайла.ИмяБезРасширения = ВыбранныйФайл.ИмяБезРасширения; ПараметрыФайла.РасширениеБезТочки = ОбщегоНазначенияКлиентСервер.РасширениеБезТочки(ВыбранныйФайл.Расширение); ПараметрыФайла.ГруппаФайлов = ПараметрыВыполнения.ГруппаФайлов; ФайлСсылка = РаботаСФайламиСлужебныйВызовСервера.ДобавитьФайл(ПараметрыФайла, АдресВременногоХранилищаФайла, АдресВременногоХранилищаТекста,ПараметрыВыполнения.Комментарий); КонецЕсли; Если ПараметрыВыполнения.Кодировка <> Неопределено Тогда РаботаСФайламиСлужебныйВызовСервера.ЗаписатьКодировкуВерсииФайла(ФайлСсылка, ПараметрыВыполнения.Кодировка); КонецЕсли; УдалитьИзВременногоХранилища(АдресВременногоХранилищаФайла); Если Не ПустаяСтрока(АдресВременногоХранилищаТекста) Тогда УдалитьИзВременногоХранилища(АдресВременногоХранилищаТекста); КонецЕсли; ДобавленныйФайлИПуть = Новый Структура("ФайлСсылка, Путь", ФайлСсылка, ВыбранныйФайл.Путь); ПараметрыВыполнения.ДобавленныеФайлы.Добавить(ДобавленныйФайлИПуть); Запись = Новый Структура; Запись.Вставить("ИмяФайла", ВыбранныйФайл.ПолноеИмя); Запись.Вставить("Файл", ФайлСсылка); ПараметрыВыполнения.МассивСтруктурВсехФайлов.Добавить(Запись); КонецПроцедуры //////////////////////////////////////////////////////////////////////////////// // Прочие служебные процедуры и функции. // При переименовании файла обновляет информацию в рабочем каталоге (имя файла на компьютере и в регистре). // // Параметры: // ТекущаяВерсия - СправочникСсылка.ВерсииФайлов - версия файла. // НовоеИмя - Строка - новое имя файла. // Процедура ОбновитьИнформациюВРабочемКаталоге(ТекущаяВерсия, НовоеИмя) Экспорт ИмяКаталога = РабочийКаталогПользователя(); ПолноеИмяФайла = ""; ВРабочемКаталогеНаЧтение = Истина; ВРабочемКаталогеВладельца = Ложь; ФайлВРабочемКаталоге = ФайлНаходитсяВЛокальномКэшеФайлов(Неопределено, ТекущаяВерсия, ПолноеИмяФайла, ВРабочемКаталогеНаЧтение, ВРабочемКаталогеВладельца); Если Не ФайлВРабочемКаталоге Тогда Возврат; КонецЕсли; Файл = Новый Файл(ПолноеИмяФайла); ТолькоИмя = Файл.Имя; РазмерФайла = Файл.Размер(); ПутьБезИмени = Лев(ПолноеИмяФайла, СтрДлина(ПолноеИмяФайла) - СтрДлина(ТолькоИмя)); НовоеПолноеИмя = ПутьБезИмени + НовоеИмя + Файл.Расширение; ПереместитьФайл(ПолноеИмяФайла, НовоеПолноеИмя); РаботаСФайламиСлужебныйВызовСервера.УдалитьИзРегистра(ТекущаяВерсия); РаботаСФайламиСлужебныйВызовСервера.ЗанестиИнформациюФайлаВРегистр(ТекущаяВерсия, НовоеПолноеИмя, ИмяКаталога, ВРабочемКаталогеНаЧтение, РазмерФайла, ВРабочемКаталогеВладельца); КонецПроцедуры // Перерегистрировать в рабочем каталоге с другим флагом НаЧтение, если там вообще есть такой файл. // // Параметры: // ДанныеФайла - см. РаботаСФайламиСлужебныйВызовСервера.ДанныеФайла // НаЧтение - Булево - файл помещен на чтение. // ВРабочемКаталогеВладельца - Булево - файл в рабочем каталоге владельца (а не в основном рабочем каталоге). // Процедура ПеререгистрироватьФайлВРабочемКаталоге(ДанныеФайла, НаЧтение, ВРабочемКаталогеВладельца) Если ДанныеФайла.Версия.Пустая() Тогда Возврат; КонецЕсли; ПолноеИмяФайла = ""; ВРабочемКаталогеНаЧтение = Истина; ФайлВРабочемКаталоге = ФайлНаходитсяВЛокальномКэшеФайлов(ДанныеФайла, ДанныеФайла.ТекущаяВерсия, ПолноеИмяФайла, ВРабочемКаталогеНаЧтение, ВРабочемКаталогеВладельца); Если Не ФайлВРабочемКаталоге Тогда Возврат; КонецЕсли; ИмяКаталога = РабочийКаталогПользователя(); РаботаСФайламиСлужебныйВызовСервера.ЗанестиИнформациюФайлаВРегистр(ДанныеФайла.ТекущаяВерсия, ПолноеИмяФайла, ИмяКаталога, НаЧтение, 0, ВРабочемКаталогеВладельца); Файл = Новый Файл(ПолноеИмяФайла); Файл.УстановитьТолькоЧтение(НаЧтение); КонецПроцедуры // Функция предназначена для открытия файла соответствующим приложением. // // Параметры: // ДанныеФайла - см. РаботаСФайламиСлужебныйВызовСервера.ДанныеФайла // ИмяОткрываемогоФайла - Строка - полное имя файла. // ИдентификаторВладельца - УникальныйИдентификатор - идентификатор формы-владельца. // Процедура ОткрытьФайлПриложением(ДанныеФайла, ИмяОткрываемогоФайла, ИдентификаторВладельца = Неопределено) Если Не РасширениеРаботыСФайламиПодключено() Тогда Возврат; КонецЕсли; ПерсональныеНастройкиРаботыСФайлами = ПерсональныеНастройкиРаботыСФайлами(); ТекстовыеФайлыСпособОткрытия = ПерсональныеНастройкиРаботыСФайлами.ТекстовыеФайлыСпособОткрытия; Если ТекстовыеФайлыСпособОткрытия = ПредопределенноеЗначение("Перечисление.СпособыОткрытияФайлаНаПросмотр.ВоВстроенномРедакторе") Тогда ТекстовыеФайлыРасширение = ПерсональныеНастройкиРаботыСФайлами.ТекстовыеФайлыРасширение; Если РаботаСФайламиСлужебныйКлиентСервер.РасширениеФайлаВСписке(ТекстовыеФайлыРасширение, ДанныеФайла.Расширение) Тогда ПараметрыФормы = Новый Структура; ПараметрыФормы.Вставить("Файл", ДанныеФайла.Ссылка); ПараметрыФормы.Вставить("ДанныеФайла", ДанныеФайла); ПараметрыФормы.Вставить("ИмяОткрываемогоФайла", ИмяОткрываемогоФайла); ПараметрыФормы.Вставить("ИдентификаторВладельца", ИдентификаторВладельца); ОткрытьФорму("Обработка.РаботаСФайлами.Форма.РедактированиеТекстовогоФайла", ПараметрыФормы, , ДанныеФайла.Ссылка); Возврат; КонецЕсли; КонецЕсли; #Если Не МобильныйКлиент Тогда Если НРег(ДанныеФайла.Расширение) = НРег("grs") Тогда Схема = Новый ГрафическаяСхема; Схема.Прочитать(ИмяОткрываемогоФайла); ЗаголовокФормы = ОбщегоНазначенияКлиентСервер.ПолучитьИмяСРасширением( ДанныеФайла.ПолноеНаименованиеВерсии, ДанныеФайла.Расширение); Схема.Показать(ЗаголовокФормы, ИмяОткрываемогоФайла); Возврат; КонецЕсли; #КонецЕсли Если НРег(ДанныеФайла.Расширение) = НРег("mxl") Тогда ПомещаемыеФайлы = Новый Массив; ПомещаемыеФайлы.Добавить(Новый ОписаниеПередаваемогоФайла(ИмяОткрываемогоФайла)); ПомещенныеФайлы = Новый Массив; Если Не ПоместитьФайлы(ПомещаемыеФайлы, ПомещенныеФайлы, , Ложь) Тогда Возврат; КонецЕсли; ТабличныйДокумент = ПомещенныеФайлы[0].Хранение; ЗаголовокФормы = ОбщегоНазначенияКлиентСервер.ПолучитьИмяСРасширением( ДанныеФайла.ПолноеНаименованиеВерсии, ДанныеФайла.Расширение); ПараметрыОткрытия = Новый Структура; ПараметрыОткрытия.Вставить("ИмяДокумента", ЗаголовокФормы); ПараметрыОткрытия.Вставить("ПутьКФайлу", ИмяОткрываемогоФайла); ПараметрыОткрытия.Вставить("ТабличныйДокумент", ТабличныйДокумент); Если Не ДанныеФайла.НаЧтение Тогда ПараметрыОткрытия.Вставить("ПрисоединенныйФайл", ДанныеФайла.Ссылка); КонецЕсли; ОткрытьФорму("ОбщаяФорма.РедактированиеТабличногоДокумента", ПараметрыОткрытия); Возврат; КонецЕсли; // Открыть Файл ФайловаяСистемаКлиент.ОткрытьФайл(ИмяОткрываемогоФайла); КонецПроцедуры // Возвращает параметры для работы с занятыми файлами. // Возвращает: // Неопределено - если нет редактируемых файлов или работать с ними не надо. // Структуру - структура с передаваемыми параметрами. // Функция ПроверитьЗанятыеФайлыПриЗавершенииРаботы() Если ПользователиКлиент.ЭтоСеансВнешнегоПользователя() Тогда Возврат Неопределено; КонецЕсли; ПерсональныеНастройкиРаботыСФайлами = СтандартныеПодсистемыКлиент.ПараметрКлиента("ПерсональныеНастройкиРаботыСФайлами"); ПоказыватьЗанятыеФайлыПриЗавершенииРаботы = ПерсональныеНастройкиРаботыСФайлами.ПоказыватьЗанятыеФайлыПриЗавершенииРаботы; Если Не ПоказыватьЗанятыеФайлыПриЗавершенииРаботы Тогда Возврат Неопределено; КонецЕсли; КоличествоЗанятыхФайлов = КоличествоЗанятыхФайлов(); Если Не КоличествоЗанятыхФайлов > 0 Тогда Возврат Неопределено; КонецЕсли; ТекущийПользователь = ПользователиКлиент.АвторизованныйПользователь(); ПараметрыПрикладнойФормыПредупреждения = Новый Структура; ПараметрыПрикладнойФормыПредупреждения.Вставить("СообщениеВопрос", НСтр("ru = 'Завершить работу с программой?'")); ПараметрыПрикладнойФормыПредупреждения.Вставить("СообщениеЗаголовок", НСтр("ru = 'Следующие файлы заняты для редактирования:'")); ПараметрыПрикладнойФормыПредупреждения.Вставить("Заголовок", НСтр("ru = 'Завершение работы'")); ПараметрыПрикладнойФормыПредупреждения.Вставить("Редактирует", ТекущийПользователь); ПрикладнаяФормаПредупреждения = "Обработка.РаботаСФайлами.Форма.СписокЗанятыхСВопросом"; Форма = "Обработка.РаботаСФайлами.Форма.РедактируемыеФайлы"; ВозвращаемыеПараметры = Новый Структура; ВозвращаемыеПараметры.Вставить("ПрикладнаяФормаПредупреждения", ПрикладнаяФормаПредупреждения); ВозвращаемыеПараметры.Вставить("ПараметрыПрикладнойФормыПредупреждения", ПараметрыПрикладнойФормыПредупреждения); ВозвращаемыеПараметры.Вставить("Форма", Форма); ВозвращаемыеПараметры.Вставить("ПрикладнаяФормаПредупреждения", ПрикладнаяФормаПредупреждения); ВозвращаемыеПараметры.Вставить("КоличествоЗанятыхФайлов", КоличествоЗанятыхФайлов); Возврат ВозвращаемыеПараметры; КонецФункции // Возвращает значение параметра клиента КоличествоЗанятыхФайлов. // Функция КоличествоЗанятыхФайлов() Возврат СтандартныеПодсистемыКлиент.ПараметрКлиента("КоличествоЗанятыхФайлов"); КонецФункции // Изменяет значение параметр клиента КоличествоЗанятыхФайлов. // Процедура ИзменитьКоличествоЗанятыхФайлов(ЗначениеИзменения = -1) Экспорт СтандартныеПодсистемыКлиент.УстановитьПараметрКлиента( "КоличествоЗанятыхФайлов", КоличествоЗанятыхФайлов() + ЗначениеИзменения); КонецПроцедуры // Возвращаемое значение: // Структура: // * Путь - Строка // * Размер - Число // * Версия - ОпределяемыйТип.ПрисоединенныйФайл // * ДатаПомещенияВРабочийКаталог - Дата // Функция ДанныеФайловВРабочемКаталоге() Возврат Новый Структура("Путь, Размер, Версия, ДатаПомещенияВРабочийКаталог"); КонецФункции // Рекурсивный обход файлов в рабочем каталоге и сбор информации о них. // Параметры: // Путь - Строка - путь рабочего каталога. // МассивФайлов - Массив - массив объектов "Файл". // ТаблицаФайлов - Массив из см. ДанныеФайловВРабочемКаталоге - массив структур файлов. // Процедура ОбходФайловТаблица(Путь, МассивФайлов, ТаблицаФайлов) #Если Не ВебКлиент Тогда Перем Версия; Перем ДатаПомещения; ИмяКаталога = РабочийКаталогПользователя(); Для Каждого ВыбранныйФайл Из МассивФайлов Цикл Если ВыбранныйФайл.ЭтоКаталог() Тогда НовыйПуть = Строка(Путь); НовыйПуть = НовыйПуть + ПолучитьРазделительПути(); НовыйПуть = НовыйПуть + Строка(ВыбранныйФайл.Имя); МассивФайловВКаталоге = НайтиФайлы(НовыйПуть, ПолучитьМаскуВсеФайлы()); Если МассивФайловВКаталоге.Количество() <> 0 Тогда ОбходФайловТаблица(НовыйПуть, МассивФайловВКаталоге, ТаблицаФайлов); КонецЕсли; Продолжить; КонецЕсли; // Временные файлы Word не удаляем из рабочего каталога. Если СтрНачинаетсяС(ВыбранныйФайл.Имя, "~") И ВыбранныйФайл.ПолучитьНевидимость() Тогда Продолжить; КонецЕсли; ОтносительныйПуть = Сред(ВыбранныйФайл.ПолноеИмя, СтрДлина(ИмяКаталога) + 1); // Если не найдем на компьютере, то минимальная дата будет самой старой, // и удалится при очистке из рабочего каталога самых старых файлов. ДатаПомещения = Дата('00010101'); НайденныеСвойства = РаботаСФайламиСлужебныйВызовСервера.НайтиВРегистреПоПути(ОтносительныйПуть); ФайлЕстьВРегистре = НайденныеСвойства.ФайлЕстьВРегистре; Версия = НайденныеСвойства.Файл; ДатаПомещения = ?(ФайлЕстьВРегистре, НайденныеСвойства.ДатаПомещения, ДатаПомещения); Если ФайлЕстьВРегистре Тогда РедактируетТекущийПользователь = РаботаСФайламиСлужебныйВызовСервера.ПолучитьРедактируетТекущийПользователь(Версия); // Если не занят текущим пользователем, можно удалить. Если Не РедактируетТекущийПользователь Тогда Запись = ДанныеФайловВРабочемКаталоге(); Запись.Путь = ОтносительныйПуть; Запись.Размер = ВыбранныйФайл.Размер(); Запись.Версия = Версия; Запись.ДатаПомещенияВРабочийКаталог = ДатаПомещения; ТаблицаФайлов.Добавить(Запись); КонецЕсли; Иначе Запись = ДанныеФайловВРабочемКаталоге(); Запись.Путь = ОтносительныйПуть; Запись.Размер = ВыбранныйФайл.Размер(); Запись.Версия = Версия; Запись.ДатаПомещенияВРабочийКаталог = ДатаПомещения; ТаблицаФайлов.Добавить(Запись); КонецЕсли; КонецЦикла; #КонецЕсли КонецПроцедуры // Получает относительный путь к файлу в рабочем каталоге - если есть в регистре сведений - оттуда, // если нет - сгенерируем и запишем в регистр сведений. // // Параметры: // ДанныеФайла - Структура // // Возвращаемое значение: // Строка // Функция ПолучитьПутьФайлаВРабочемКаталоге(ДанныеФайла) ПутьДляВозврата = ""; ПолноеИмяФайла = ""; ИмяКаталога = РабочийКаталогПользователя(); ПолноеИмяФайла = ДанныеФайла.ПолноеИмяФайлаВРабочемКаталоге; Если ПолноеИмяФайла <> "" Тогда ФайлНаДиске = Новый Файл(ПолноеИмяФайла); Если ФайлНаДиске.Существует() Тогда Возврат ПолноеИмяФайла; КонецЕсли; КонецЕсли; ИмяФайла = ДанныеФайла.ПолноеНаименованиеВерсии; Расширение = ДанныеФайла.Расширение; Если Не ПустаяСтрока(Расширение) Тогда ИмяФайла = ОбщегоНазначенияКлиентСервер.ПолучитьИмяСРасширением(ИмяФайла, Расширение); КонецЕсли; ОбщегоНазначенияСлужебныйКлиент.СократитьИмяФайла(ИмяФайла); ПолноеИмяФайла = ""; Если Не ПустаяСтрока(ИмяФайла) Тогда Если Не ПустаяСтрока(ДанныеФайла.РабочийКаталогВладельца) Тогда ПолноеИмяФайла = ДанныеФайла.РабочийКаталогВладельца + ДанныеФайла.ПолноеНаименованиеВерсии + "." + ДанныеФайла.Расширение; Иначе ПолноеИмяФайла = РаботаСФайламиСлужебныйКлиентСервер.УникальноеИмяСПутем(ИмяКаталога, ИмяФайла); КонецЕсли; КонецЕсли; Если ПустаяСтрока(ИмяФайла) Тогда Возврат ""; КонецЕсли; // Запишем в регистр имя файла. НаЧтение = Истина; ВРабочемКаталогеВладельца = ДанныеФайла.РабочийКаталогВладельца <> ""; РаботаСФайламиСлужебныйВызовСервера.ЗаписатьПолноеИмяФайлаВРегистр(ДанныеФайла.Версия, ПолноеИмяФайла, НаЧтение, ВРабочемКаталогеВладельца); Если ДанныеФайла.РабочийКаталогВладельца = "" Тогда ПутьДляВозврата = ИмяКаталога + ПолноеИмяФайла; Иначе ПутьДляВозврата = ПолноеИмяФайла; КонецЕсли; Возврат ПутьДляВозврата; КонецФункции //////////////////////////////////////////////////////////////////////////////// // ВСПОМОГАТЕЛЬНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ // Возвращаемое значение: // см. РаботаСФайлами.НастройкиРаботыСФайлами // Функция ПерсональныеНастройкиРаботыСФайлами() Экспорт Возврат СтандартныеПодсистемыКлиент.ПараметрыРаботыКлиента().ПерсональныеНастройкиРаботыСФайлами; КонецФункции // Возвращает структуру, содержащую различные персональные настройки. Функция ОбщиеНастройкиРаботыСФайлами() ОбщиеНастройки = СтандартныеПодсистемыКлиент.ПараметрыРаботыКлиента().ОбщиеНастройкиРаботыСФайлами; // Проверка и обновление настроек сохраненных на сервере, // которые вычисляются на клиенте. Возврат ОбщиеНастройки; КонецФункции // Параметры: // ДанныеФайла - см. РаботаСФайламиСлужебныйВызовСервера.ДанныеФайла // ТекущаяВерсия - СправочникСсылка.ВерсииФайлов // ПолноеИмяФайла - Строка - имя файла с путем. // ВРабочемКаталогеНаЧтение - Булево - файл помещен на чтение. // ВРабочемКаталогеВладельца - Булево - файл в рабочем каталоге владельца (а не в основном рабочем каталоге). // // Возвращаемое значение: // Булево // Функция ФайлНаходитсяВЛокальномКэшеФайлов(ДанныеФайла, ТекущаяВерсия, ПолноеИмяФайла, ВРабочемКаталогеНаЧтение, ВРабочемКаталогеВладельца) ПолноеИмяФайла = ""; // Если это активная версия - берем из ДанныеФайла. Если ДанныеФайла <> Неопределено И ДанныеФайла.ТекущаяВерсия = ТекущаяВерсия Тогда ПолноеИмяФайла = ДанныеФайла.ПолноеИмяФайлаВРабочемКаталоге; ВРабочемКаталогеНаЧтение = ДанныеФайла.ВРабочемКаталогеНаЧтение; Иначе ВРабочемКаталогеНаЧтение = Истина; ИмяКаталога = РабочийКаталогПользователя(); ПолноеИмяФайла = РаботаСФайламиСлужебныйВызовСервера.ПолноеИмяФайлаВРабочемКаталоге(ТекущаяВерсия, ИмяКаталога, ВРабочемКаталогеНаЧтение, ВРабочемКаталогеВладельца); КонецЕсли; Если ПолноеИмяФайла <> "" Тогда ФайлНаДиске = Новый Файл(ПолноеИмяФайла); Если ФайлНаДиске.Существует() Тогда Возврат Истина; Иначе ПолноеИмяФайла = ""; РаботаСФайламиСлужебныйВызовСервера.УдалитьИзРегистра(ТекущаяВерсия); КонецЕсли; КонецЕсли; Возврат Ложь; КонецФункции // Выбрать путь к рабочему каталогу. // Параметры: // ИмяКаталога - Строка - прежнее имя каталога. // Заголовок - Строка - заголовок формы выбора пути каталога. // РабочийКаталогВладельца - Строка- рабочий каталог владельца. // // Возвращаемое значение: // Булево - успешно ли выполнена операция. // Функция ВыбратьПутьКРабочемуКаталогу(ИмяКаталога, Заголовок, РабочийКаталогВладельца) Экспорт Режим = РежимДиалогаВыбораФайла.ВыборКаталога; ДиалогОткрытияФайла = Новый ДиалогВыбораФайла(Режим); ДиалогОткрытияФайла.ПолноеИмяФайла = ""; ДиалогОткрытияФайла.Каталог = ИмяКаталога; ДиалогОткрытияФайла.МножественныйВыбор = Ложь; ДиалогОткрытияФайла.Заголовок = Заголовок; Если ДиалогОткрытияФайла.Выбрать() Тогда ИмяКаталога = ДиалогОткрытияФайла.Каталог; ИмяКаталога = ОбщегоНазначенияКлиентСервер.ДобавитьКонечныйРазделительПути(ИмяКаталога); // Создать каталог для файлов Попытка СоздатьКаталог(ИмяКаталога); ИмяКаталогаТестовое = ИмяКаталога + "ПроверкаДоступа\"; СоздатьКаталог(ИмяКаталогаТестовое); УдалитьФайлы(ИмяКаталогаТестовое); Исключение ЖурналРегистрацииКлиент.ДобавитьСообщениеДляЖурналаРегистрации(СобытиеЖурналаРегистрации(), "Предупреждение", ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()),, Истина); // Нет прав на создание каталога, или такой путь отсутствует. ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = 'Неверный путь или отсутствуют права на запись в каталог |""%1"".'"), ИмяКаталога); ПоказатьПредупреждение(, ТекстОшибки); Возврат Ложь; КонецПопытки; Если РабочийКаталогВладельца = Ложь Тогда #Если Не ВебКлиент Тогда МассивФайловВКаталоге = НайтиФайлы(ИмяКаталога, ПолучитьМаскуВсеФайлы()); Если МассивФайловВКаталоге.Количество() <> 0 Тогда ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = 'В выбранном рабочем каталоге |""%1"" |уже есть файлы. | |Выберите другой каталог.'"), ИмяКаталога); ПоказатьПредупреждение(, ТекстОшибки); Возврат Ложь; КонецЕсли; #КонецЕсли КонецЕсли; Возврат Истина; КонецЕсли; Возврат Ложь; КонецФункции // Перерегистрировать В рабочем каталоге с другим флагом НаЧтение. // Параметры: // ТекущаяВерсия - СправочникСсылка.ВерсииФайлов - версия файла. // ПолноеИмяФайла - Строка - полное имя файла. // НаЧтение - Булево - файл помещен на чтение. // ВРабочемКаталогеВладельца - Булево - файл в рабочем каталоге владельца (а не в основном рабочем каталоге). // Процедура ПеререгистрироватьВРабочемКаталоге(ТекущаяВерсия, ПолноеИмяФайла, НаЧтение, ВРабочемКаталогеВладельца) ИмяКаталога = РабочийКаталогПользователя(); РаботаСФайламиСлужебныйВызовСервера.ЗанестиИнформациюФайлаВРегистр(ТекущаяВерсия, ПолноеИмяФайла, ИмяКаталога, НаЧтение, 0, ВРабочемКаталогеВладельца); Файл = Новый Файл(ПолноеИмяФайла); Файл.УстановитьТолькоЧтение(НаЧтение); КонецПроцедуры // Обход Файлов рекурсивный - для определения размера файлов. // Параметры: // МассивФайлов - Массив - массив объектов "Файл". // МассивСлишкомБольшихФайлов - Массив - массив файлов. // Рекурсивно - Булево - рекурсивно обходить подкаталоги. // КоличествоСуммарное - Число - количество суммарное импортированных файлов. // ПсевдоФайловаяСистема - Соответствие - эмуляция файловой системы - для строки (каталога) возвращает массив строк // (подкаталоги и файлы). // Процедура НайтиСлишкомБольшиеФайлы( МассивФайлов, МассивСлишкомБольшихФайлов, Рекурсивно, КоличествоСуммарное, Знач ПсевдоФайловаяСистема) МаксРазмерФайла = ОбщиеНастройкиРаботыСФайлами().МаксимальныйРазмерФайла; Для Каждого ВыбранныйФайл Из МассивФайлов Цикл Если ВыбранныйФайл.Существует() Тогда Если ВыбранныйФайл.Расширение = ".lnk" Тогда ВыбранныйФайл = РазыменоватьLnkФайл(ВыбранныйФайл); КонецЕсли; Если ВыбранныйФайл.ЭтоКаталог() Тогда Если Рекурсивно Тогда НовыйПуть = Строка(ВыбранныйФайл.Путь); НовыйПуть = ОбщегоНазначенияКлиентСервер.ДобавитьКонечныйРазделительПути(НовыйПуть); НовыйПуть = НовыйПуть + Строка(ВыбранныйФайл.Имя); МассивФайловВКаталоге = НайтиФайлыПсевдо(ПсевдоФайловаяСистема, НовыйПуть); // Рекурсия Если МассивФайловВКаталоге.Количество() <> 0 Тогда НайтиСлишкомБольшиеФайлы(МассивФайловВКаталоге, МассивСлишкомБольшихФайлов, Рекурсивно, КоличествоСуммарное, ПсевдоФайловаяСистема); КонецЕсли; КонецЕсли; Продолжить; КонецЕсли; КоличествоСуммарное = КоличествоСуммарное + 1; // Размер файла слишком большой. Если ВыбранныйФайл.Размер() > МаксРазмерФайла Тогда МассивСлишкомБольшихФайлов.Добавить(ВыбранныйФайл.ПолноеИмя); Продолжить; КонецЕсли; КонецЕсли; КонецЦикла; КонецПроцедуры // Возвращает массив файлов, эмулируя работу НайтиФайлы - но не по файловой системе, а по Соответствию // если ПсевдоФайловаяСистема пуста - работает с файловой системой. // Функция НайтиФайлыПсевдо(Знач ПсевдоФайловаяСистема, Путь) Если ПсевдоФайловаяСистема.Количество() = 0 Тогда Файлы = НайтиФайлы(Путь, ПолучитьМаскуВсеФайлы()); Возврат Файлы; КонецЕсли; Файлы = Новый Массив; ЗначениеНайденное = ПсевдоФайловаяСистема.Получить(Строка(Путь)); Если ЗначениеНайденное <> Неопределено Тогда Для Каждого ИмяФайла Из ЗначениеНайденное Цикл ФайлИзСписка = Новый Файл(ИмяФайла); Файлы.Добавить(ФайлИзСписка); КонецЦикла; КонецЕсли; Возврат Файлы; КонецФункции // Разыменовать lnk файл // Параметры: // ВыбранныйФайл - Файл - объект типа Файл. // // Возвращаемое значение: // Строка - на что ссылается lnk файл. // Функция РазыменоватьLnkФайл(ВыбранныйФайл) #Если Не ВебКлиент И НЕ МобильныйКлиент Тогда ПриложениеShell = Новый COMОбъект("shell.application"); ПолныйПуть = ПриложениеShell.NameSpace(ВыбранныйФайл.Путь);// Полный (только) путь на lnk-файл. ИмяФайла = ПолныйПуть.items().item(ВыбранныйФайл.Имя); // только имя lnk-файла Ссылка = ИмяФайла.GetLink(); Возврат Новый Файл(Ссылка.path); #КонецЕсли Возврат ВыбранныйФайл; КонецФункции //////////////////////////////////////////////////////////////////////////////// // Сравнение версий и файлов. // Сравнивает 2 файла (txt doc doc odt mxl) с помощью MS Office, OpenOffice, программно для табличных документов. // Процедура СравнитьФайлы(ИдентификаторФормы, ПервыйФайл, ВторойФайл, Расширение, ВладелецВерсии = Неопределено) Экспорт СпособСравненияВерсийФайлов = Неопределено; РасширениеПоддерживается = ( Расширение = "txt" Или Расширение = "md" Или Расширение = "doc" Или Расширение = "docx" Или Расширение = "rtf" Или Расширение = "htm" Или Расширение = "html" Или Расширение = "mxl" Или Расширение = "odt"); Если Не РасширениеПоддерживается Тогда ТекстПредупреждения = НСтр("ru = 'Сравнение файлов возможно только для следующих типов: | Текстовый документ (.txt, .md) | Документ формата RTF (.rtf) | Документ Microsoft Word (.doc, .docx) | Документ HTML (.html, .htm) | Табличный документ (.mxl) | Текстовый документ OpenDocument (.odt)'"); ПоказатьПредупреждение(, ТекстПредупреждения); Возврат; КонецЕсли; Если Расширение = "odt" Тогда СпособСравненияВерсийФайлов = "OpenOfficeOrgWriter"; ИначеЕсли Расширение = "htm" ИЛИ Расширение = "html" Тогда СпособСравненияВерсийФайлов = "MicrosoftOfficeWord"; ИначеЕсли Расширение = "mxl" Тогда СпособСравненияВерсийФайлов = "СравнениеТабличныхДокументов"; КонецЕсли; ПараметрыВыполнения = Новый Структура; ПараметрыВыполнения.Вставить("СпособСравненияВерсийФайлов", СпособСравненияВерсийФайлов); ПараметрыВыполнения.Вставить("ТекущийШаг", "Шаг1ВыборСпособаСравненияВерсий"); ПараметрыВыполнения.Вставить("ДанныеФайла1", Неопределено); ПараметрыВыполнения.Вставить("ДанныеФайла2", Неопределено); ПараметрыВыполнения.Вставить("Результат1", Неопределено); ПараметрыВыполнения.Вставить("Результат2", Неопределено); ПараметрыВыполнения.Вставить("ПолноеИмяФайла1", ""); ПараметрыВыполнения.Вставить("ПолноеИмяФайла2", ""); ПараметрыВыполнения.Вставить("УникальныйИдентификатор", ИдентификаторФормы); ПараметрыВыполнения.Вставить("Ссылка1", ПервыйФайл); ПараметрыВыполнения.Вставить("Ссылка2", ВторойФайл); ПараметрыВыполнения.Вставить("ВладелецВерсии", ВладелецВерсии); СравнитьФайлыСлужебный(ПараметрыВыполнения); КонецПроцедуры Процедура СравнитьФайлыСлужебный(ПараметрыВыполнения) Если ПараметрыВыполнения.ТекущийШаг = "Шаг1ВыборСпособаСравненияВерсий" Тогда Если ПараметрыВыполнения.СпособСравненияВерсийФайлов = Неопределено Тогда ПерсональныеНастройки = ПерсональныеНастройкиРаботыСФайлами(); ПараметрыВыполнения.СпособСравненияВерсийФайлов = ПерсональныеНастройки.СпособСравненияВерсийФайлов; Если ПараметрыВыполнения.СпособСравненияВерсийФайлов = Неопределено Тогда Обработчик = Новый ОписаниеОповещения("СравнитьФайлыОбработкаРезультата", ЭтотОбъект, ПараметрыВыполнения); ОткрытьФорму("Обработка.РаботаСФайлами.Форма.ВыборСпособаСравненияВерсий",, ЭтотОбъект,,,, Обработчик); Возврат; КонецЕсли; КонецЕсли; ПараметрыВыполнения.ТекущийШаг = "Шаг2ПолучитьДанныеФайлов"; КонецЕсли; Если ПараметрыВыполнения.ТекущийШаг = "Шаг2ПолучитьДанныеФайлов" Тогда Если ПараметрыВыполнения.Свойство("ВладелецВерсии") И ЗначениеЗаполнено(ПараметрыВыполнения.ВладелецВерсии) Тогда ПараметрыВыполнения.ДанныеФайла1 = РаботаСФайламиСлужебныйВызовСервера.ДанныеФайлаДляОткрытия( ПараметрыВыполнения.ВладелецВерсии, ПараметрыВыполнения.Ссылка1, ПараметрыВыполнения.УникальныйИдентификатор); ПараметрыВыполнения.ДанныеФайла2 = РаботаСФайламиСлужебныйВызовСервера.ДанныеФайлаДляОткрытия( ПараметрыВыполнения.ВладелецВерсии, ПараметрыВыполнения.Ссылка2, ПараметрыВыполнения.УникальныйИдентификатор); Иначе ПараметрыВыполнения.ДанныеФайла1 = РаботаСФайламиСлужебныйВызовСервера.ДанныеФайлаДляОткрытия( ПараметрыВыполнения.Ссылка1, Неопределено, ПараметрыВыполнения.УникальныйИдентификатор); ПараметрыВыполнения.ДанныеФайла2 = РаботаСФайламиСлужебныйВызовСервера.ДанныеФайлаДляОткрытия( ПараметрыВыполнения.Ссылка2, Неопределено, ПараметрыВыполнения.УникальныйИдентификатор); КонецЕсли; ПараметрыВыполнения.ТекущийШаг = "Шаг3ПолучитьПервыйФайл"; КонецЕсли; Если ПараметрыВыполнения.ТекущийШаг = "Шаг3ПолучитьПервыйФайл" Тогда Обработчик = Новый ОписаниеОповещения("СравнитьФайлыОбработкаРезультата", ЭтотОбъект, ПараметрыВыполнения); ПолучитьФайлВерсииВРабочийКаталог(Обработчик, ПараметрыВыполнения.ДанныеФайла1, ПараметрыВыполнения.ПолноеИмяФайла1); Возврат; КонецЕсли; Если ПараметрыВыполнения.ТекущийШаг = "Шаг4ПолучитьВторойФайл" Тогда Обработчик = Новый ОписаниеОповещения("СравнитьФайлыОбработкаРезультата", ЭтотОбъект, ПараметрыВыполнения); ПолучитьФайлВерсииВРабочийКаталог(Обработчик, ПараметрыВыполнения.ДанныеФайла2, ПараметрыВыполнения.ПолноеИмяФайла2); Возврат; КонецЕсли; Если ПараметрыВыполнения.ТекущийШаг = "Шаг5СравнитьФайлы" Тогда Если Не ПараметрыВыполнения.Результат1 Или Не ПараметрыВыполнения.Результат2 Тогда Возврат; КонецЕсли; ШаблонЗаголовкаФайла = НСтр("ru = '%1 (версия № %2)'"); ДанныеПервогоФайла = ПараметрыВыполнения.ДанныеФайла1; // см. РаботаСФайламиСлужебныйВызовСервера.ДанныеФайла ИмяФайла1 = ОбщегоНазначенияКлиентСервер.ПолучитьИмяСРасширением(ДанныеПервогоФайла.ПолноеНаименованиеВерсии, ДанныеПервогоФайла.Расширение); ЗаголовокФайла1 = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ШаблонЗаголовкаФайла, ИмяФайла1, ПараметрыВыполнения.ДанныеФайла1.НомерВерсии); ДанныеВторогоФайла = ПараметрыВыполнения.ДанныеФайла2; // см. РаботаСФайламиСлужебныйВызовСервера.ДанныеФайла ИмяФайла2 = ОбщегоНазначенияКлиентСервер.ПолучитьИмяСРасширением(ДанныеВторогоФайла.ПолноеНаименованиеВерсии, ДанныеВторогоФайла.Расширение); ЗаголовокФайла2 = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ШаблонЗаголовкаФайла, ИмяФайла2, ПараметрыВыполнения.ДанныеФайла2.НомерВерсии); Если ПараметрыВыполнения.ДанныеФайла1.НомерВерсии < ПараметрыВыполнения.ДанныеФайла2.НомерВерсии Тогда ПолноеИмяФайлаСлева = ПараметрыВыполнения.ПолноеИмяФайла1; ЗаголовокФайлаСлева = ЗаголовокФайла1; ПолноеИмяФайлаСправа = ПараметрыВыполнения.ПолноеИмяФайла2; ЗаголовокФайлаСправа = ЗаголовокФайла2; Иначе ПолноеИмяФайлаСлева = ПараметрыВыполнения.ПолноеИмяФайла2; ЗаголовокФайлаСлева = ЗаголовокФайла2; ПолноеИмяФайлаСправа = ПараметрыВыполнения.ПолноеИмяФайла1; ЗаголовокФайлаСправа = ЗаголовокФайла1; КонецЕсли; ВыполнитьСравнениеФайлов(ПолноеИмяФайлаСлева, ПолноеИмяФайлаСправа, ПараметрыВыполнения.СпособСравненияВерсийФайлов, ЗаголовокФайлаСлева, ЗаголовокФайлаСправа); КонецЕсли; КонецПроцедуры Процедура СравнитьФайлыОбработкаРезультата(Результат, ПараметрыВыполнения) Экспорт Если ПараметрыВыполнения.ТекущийШаг = "Шаг1ВыборСпособаСравненияВерсий" Тогда Если Результат <> КодВозвратаДиалога.ОК Тогда Возврат; КонецЕсли; ПерсональныеНастройки = ПерсональныеНастройкиРаботыСФайлами(); ПараметрыВыполнения.СпособСравненияВерсийФайлов = ПерсональныеНастройки.СпособСравненияВерсийФайлов; Если ПараметрыВыполнения.СпособСравненияВерсийФайлов = Неопределено Тогда Возврат; КонецЕсли; ПараметрыВыполнения.ТекущийШаг = "Шаг2ПолучитьДанныеФайлов"; ИначеЕсли ПараметрыВыполнения.ТекущийШаг = "Шаг3ПолучитьПервыйФайл" Тогда ПараметрыВыполнения.Результат1 = Результат.ФайлПолучен; ПараметрыВыполнения.ПолноеИмяФайла1 = Результат.ПолноеИмяФайла; ПараметрыВыполнения.ТекущийШаг = "Шаг4ПолучитьВторойФайл"; ИначеЕсли ПараметрыВыполнения.ТекущийШаг = "Шаг4ПолучитьВторойФайл" Тогда ПараметрыВыполнения.Результат2 = Результат.ФайлПолучен; ПараметрыВыполнения.ПолноеИмяФайла2 = Результат.ПолноеИмяФайла; ПараметрыВыполнения.ТекущийШаг = "Шаг5СравнитьФайлы"; КонецЕсли; СравнитьФайлыСлужебный(ПараметрыВыполнения); КонецПроцедуры Процедура ВыполнитьСравнениеФайлов(ПутьКФайлу1, ПутьКФайлу2, СпособСравненияВерсийФайлов, ЗаголовокЛевый = "", ЗаголовокПравый = "") Экспорт Попытка Если СпособСравненияВерсийФайлов = "MicrosoftOfficeWord" Тогда СравнитьФайлыMicrosoftWord(ПутьКФайлу1, ПутьКФайлу2); ИначеЕсли СпособСравненияВерсийФайлов = "OpenOfficeOrgWriter" Тогда СравнитьФайлыOpenOfficeOrgWriter(ПутьКФайлу1, ПутьКФайлу2); ИначеЕсли СпособСравненияВерсийФайлов = "СравнениеТабличныхДокументов" Тогда СравнитьТабличныеДокументы(ПутьКФайлу1, ПутьКФайлу2, ЗаголовокЛевый, ЗаголовокПравый); КонецЕсли; Исключение СообщениеОбОшибке = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = 'Не удалось сравнить файлы по причине: %1'"), ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке())); ЖурналРегистрацииКлиент.ДобавитьСообщениеДляЖурналаРегистрации( НСтр("ru = 'Файлы.Сравнение файлов'", ОбщегоНазначенияКлиент.КодОсновногоЯзыка()), "Ошибка", СообщениеОбОшибке, , Истина); ВызватьИсключение СообщениеОбОшибке; КонецПопытки; КонецПроцедуры Процедура СравнитьФайлыOpenOfficeOrgWriter(Знач ПутьКФайлу1, Знач ПутьКФайлу2) #Если Не ВебКлиент И НЕ МобильныйКлиент Тогда // Снимем readonly - иначе не сработает. Файл1 = Новый Файл(ПутьКФайлу1); Файл1.УстановитьТолькоЧтение(Ложь); Файл2 = Новый Файл(ПутьКФайлу2); Файл2.УстановитьТолькоЧтение(Ложь); // Открыть OpenOffice Попытка ОбъектServiceManager = Новый COMОбъект("com.sun.star.ServiceManager"); ОбъектDesktop = ОбъектServiceManager.createInstance("com.sun.star.frame.Desktop"); ОбъектDispatcherHelper = ОбъектServiceManager.createInstance("com.sun.star.frame.DispatchHelper"); Исключение ЖурналРегистрацииКлиент.ДобавитьСообщениеДляЖурналаРегистрации( НСтр("ru = 'Файлы.Сравнение файлов'", ОбщегоНазначенияКлиент.КодОсновногоЯзыка()), "Ошибка", ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()),, Истина); ВызватьИсключение ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке()) + Символы.ПС + НСтр("ru = 'Установите (переустановите) приложение OpenOffice.org Writer.'"); КонецПопытки; // Параметры открытия: отключение исполнения макросов. ПараметрыДокумента = Новый COMSafeArray("VT_VARIANT", 1); РежимЗапуска = ПрисвоитьЗначениеСвойству(ОбъектServiceManager, "MacroExecutionMode", 0); // const short NEVER_EXECUTE = 0 ПараметрыДокумента.SetValue(0, РежимЗапуска); // Открыть документ OpenOffice. ОбъектDesktop.loadComponentFromURL(ПреобразоватьВURL(ПутьКФайлу2), "_blank", 0, ПараметрыДокумента); ТекущееОкно = ОбъектDesktop.getCurrentFrame(); // Установить показ изменений. ПараметрыСравнения = Новый COMSafeArray("VT_VARIANT", 1); ПараметрыСравнения.SetValue(0, ПрисвоитьЗначениеСвойству(ОбъектServiceManager, "ShowTrackedChanges", Истина)); ОбъектDispatcherHelper.executeDispatch(ТекущееОкно, ".uno:ShowTrackedChanges", "", 0, ПараметрыСравнения); // Сравнить с документом. ПараметрыВызова = Новый COMSafeArray("VT_VARIANT", 1); ПараметрыВызова.SetValue(0, ПрисвоитьЗначениеСвойству(ОбъектServiceManager, "URL", ПреобразоватьВURL(ПутьКФайлу1))); ОбъектDispatcherHelper.executeDispatch(ТекущееОкно, ".uno:CompareDocuments", "", 0, ПараметрыВызова); #КонецЕсли КонецПроцедуры Процедура СравнитьФайлыMicrosoftWord(ПутьКФайлу1, ПутьКФайлу2) #Если Не ВебКлиент И НЕ МобильныйКлиент Тогда Попытка ОбъектWord = Новый COMОбъект("Word.Application"); Исключение ЖурналРегистрацииКлиент.ДобавитьСообщениеДляЖурналаРегистрации( НСтр("ru = 'Файлы.Сравнение файлов'", ОбщегоНазначенияКлиент.КодОсновногоЯзыка()), "Ошибка", ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()),, Истина); ВызватьИсключение ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке()) + Символы.ПС + НСтр("ru = 'Установите (переустановите) приложение Microsoft Word.'"); КонецПопытки; ОбъектWord.Visible = 0; ОбъектWord.WordBasic.DisableAutoMacros(1); Документ = ОбъектWord.Documents.Open(ПутьКФайлу1); Попытка ОбъектWord.ActiveWindow.ActivePane.View.Type = 1; // wdNormalView = 1 Документ.Merge(ПутьКФайлу2, 2, 0, 0); // MergeTarget:=wdMergeTargetSelected, DetectFormatChanges:=False, UseFormattingFrom:=wdFormattingFromCurrent Исключение ЖурналРегистрацииКлиент.ДобавитьСообщениеДляЖурналаРегистрации( НСтр("ru = 'Файлы.Сравнение файлов'", ОбщегоНазначенияКлиент.КодОсновногоЯзыка()), "Ошибка", ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()),, Истина); ВызватьИсключение ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке()); КонецПопытки; ОбъектWord.Visible = 1; ОбъектWord.Activate(); Документ.Close(); #КонецЕсли КонецПроцедуры Процедура СравнитьТабличныеДокументы(ПутьКФайлу1, ПутьКФайлу2, ЗаголовокЛевый, ЗаголовокПравый) ПомещаемыеФайлы = Новый Массив; ПомещаемыеФайлы.Добавить(Новый ОписаниеПередаваемогоФайла(ПутьКФайлу1)); ПомещаемыеФайлы.Добавить(Новый ОписаниеПередаваемогоФайла(ПутьКФайлу2)); ПомещенныеФайлы = Новый Массив; Если Не ПоместитьФайлы(ПомещаемыеФайлы, ПомещенныеФайлы, , Ложь) Тогда Возврат; КонецЕсли; ТабличныйДокументЛевый = ПомещенныеФайлы[0].Хранение; ТабличныйДокументПравый = ПомещенныеФайлы[1].Хранение; СравниваемыеДокументы = Новый Структура("Левый, Правый", ТабличныйДокументЛевый, ТабличныйДокументПравый); АдресТабличныхДокументов = ПоместитьВоВременноеХранилище(СравниваемыеДокументы, Неопределено); ПараметрыОткрытияФормы = Новый Структура; ПараметрыОткрытияФормы.Вставить("АдресТабличныхДокументов", АдресТабличныхДокументов); ПараметрыОткрытияФормы.Вставить("ЗаголовокЛевый", ЗаголовокЛевый); ПараметрыОткрытияФормы.Вставить("ЗаголовокПравый", ЗаголовокПравый); ПараметрыОткрытияФормы.Вставить("Заголовок", СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = 'Сравнение %1 с %2'"), ЗаголовокЛевый, ЗаголовокПравый)); ОткрытьФорму("ОбщаяФорма.СравнениеТабличныхДокументов", ПараметрыОткрытияФормы, ЭтотОбъект); КонецПроцедуры // Функция преобразует Windows имя файла в URL OpenOffice. Функция ПреобразоватьВURL(ИмяФайла) Возврат "file:///" + СтрЗаменить(ИмяФайла, "\", "/"); КонецФункции // Создание структуры для параметров OpenOffice. Функция ПрисвоитьЗначениеСвойству(Объект, ИмяСвойства, ЗначениеСвойства) Свойства = Объект.Bridge_GetStruct("com.sun.star.beans.PropertyValue"); Свойства.Name = ИмяСвойства; Свойства.Value = ЗначениеСвойства; Возврат Свойства; КонецФункции // Возвращает каталог данных пользователя внутри стандартного каталога данных приложения. // Этот каталог может использоваться для хранения файлов, захваченных текущим пользователем. // Для работы метода на веб-клиенте необходимо предварительно подключить расширение для работы с 1С:Предприятием. // Функция КаталогДанныхПользователя() #Если ВебКлиент Или МобильныйКлиент Тогда Возврат РабочийКаталогДанныхПользователя(); #Иначе Если Не ОбщегоНазначенияКлиент.ЭтоWindowsКлиент() Тогда Возврат РабочийКаталогДанныхПользователя(); Иначе Оболочка = Новый COMОбъект("WScript.Shell"); КаталогДанныхПользователя = Оболочка.ExpandEnvironmentStrings("%APPDATA%"); Возврат ОбщегоНазначенияКлиентСервер.ДобавитьКонечныйРазделительПути(КаталогДанныхПользователя); КонецЕсли; #КонецЕсли КонецФункции // Открывает форму перетаскивания. Процедура ОткрытьФормуПеретаскиванияИзвне(ПапкаДляДобавления, МассивИменФайлов) Экспорт ПараметрыФормы = Новый Структура; ПараметрыФормы.Вставить("ПапкаДляДобавления", ПапкаДляДобавления); ПараметрыФормы.Вставить("МассивИменФайлов", МассивИменФайлов); ОткрытьФорму("Справочник.Файлы.Форма.ФормаПеретаскивания", ПараметрыФормы); КонецПроцедуры //////////////////////////////////////////////////////////////////////////////// // Служебные процедуры и функции для асинхронных методов. // // Общее описание параметров: // Обработчик - ОписаниеОповещения, Неопределено, Структура - Процедура-обработчик асинхронного метода. // * Неопределено - Обработка не требуется. // * ОписаниеОповещения - Описание процедуры-обработчика. // В редких случаях может потребоваться прерывать выполнение кода только тогда, // когда необходимо показать асинхронный диалог (в циклах например). // В таких случаях в Обработчик передается Структура параметров вызывающего кода // с обязательным ключом АсинхронныйДиалог, // который используется при прерывании кода и открытии асинхронного диалога: // * Структура - Структура параметров вызывающего кода. // ** АсинхронныйДиалог - Структура - // *** Открыт - Булево - Истина если диалог был открыт. // *** ИмяПроцедуры - Строка - Имя процедуры обработчика вызывающего кода. // *** Модуль - ОбщийМодуль, ФормаКлиентскогоПриложения - Модуль обработчика вызывающего кода. // В этом случае ОписаниеОповещения формируется из ключей "ИмяПроцедуры" и "Модуль". // Внимание. Не все асинхронные процедуры поддерживают передачу типа Структура. Читайте состав типов. // // Результат - Произвольный - Результат, который необходимо вернуть в Обработчик. // // Показывает окно предупреждение, а после его закрытия вызывает обработчик с заданным результатом. Процедура ВернутьРезультатПослеПоказаПредупреждения(Обработчик, ТекстПредупреждения, Результат) Если Обработчик <> Неопределено Тогда ПараметрыОбработчика = Новый Структура; ПараметрыОбработчика.Вставить("Обработчик", ОбработчикЗавершения(Обработчик)); ПараметрыОбработчика.Вставить("Результат", Результат); Обработчик = Новый ОписаниеОповещения("ВернутьРезультатПослеЗакрытияПростогоДиалога", ЭтотОбъект, ПараметрыОбработчика); ПоказатьПредупреждение(Обработчик, ТекстПредупреждения); Иначе ПоказатьПредупреждение(, ТекстПредупреждения); КонецЕсли; КонецПроцедуры // Показывает окно просмотра значения, а после его закрытия вызывает обработчик с заданным результатом. Процедура ВернутьРезультатПослеПоказаЗначения(Обработчик, Значение, Результат) Если Обработчик <> Неопределено Тогда ПараметрыОбработчика = Новый Структура; ПараметрыОбработчика.Вставить("Обработчик", ОбработчикЗавершения(Обработчик)); ПараметрыОбработчика.Вставить("Результат", Результат); Обработчик = Новый ОписаниеОповещения("ВернутьРезультатПослеЗакрытияПростогоДиалога", ЭтотОбъект, ПараметрыОбработчика); ПоказатьЗначение(Обработчик, Значение); Иначе ПоказатьЗначение(, Значение); КонецЕсли; КонецПроцедуры // Продолжение процедуры (см. выше). Процедура ВернутьРезультатПослеЗакрытияПростогоДиалога(Структура) Экспорт Если ТипЗнч(Структура.Обработчик) = Тип("ОписаниеОповещения") Тогда ВыполнитьОбработкуОповещения(Структура.Обработчик, Структура.Результат); КонецЕсли; КонецПроцедуры // Возвращает результат прямого вызова, когда не было открыто диалогов. Процедура ВернутьРезультат(Обработчик, Результат) Экспорт Обработчик = ПодготовитьОбработчикДляПрямогоВызова(Обработчик, Результат); Если ТипЗнч(Обработчик) = Тип("ОписаниеОповещения") Тогда ВыполнитьОбработкуОповещения(Обработчик, Результат); КонецЕсли; КонецПроцедуры // Записывает информацию, необходимую для подготовки обработчика асинхронного диалога. Процедура ЗарегистрироватьОбработчикЗавершения(ПараметрыВыполнения, ОбработчикЗавершения) Экспорт АсинхронныйДиалог = Новый Структура; АсинхронныйДиалог.Вставить("Модуль", ОбработчикЗавершения.Модуль); АсинхронныйДиалог.Вставить("ИмяПроцедуры", ОбработчикЗавершения.ИмяПроцедуры); АсинхронныйДиалог.Вставить("Открыт", Ложь); АсинхронныйДиалог.Вставить("РезультатКогдаНеОткрыт", Неопределено); ПараметрыВыполнения.Вставить("АсинхронныйДиалог", АсинхронныйДиалог); КонецПроцедуры // Подготовка обработчика асинхронного диалога. Функция ОбработчикЗавершения(ОбработчикИлиСтруктура) Обработчик = Неопределено; Если ТипЗнч(ОбработчикИлиСтруктура) = Тип("Структура") Тогда УстановитьПризнакБлокирующейФормы(ОбработчикИлиСтруктура, Истина); АсинхронныйДиалог = Неопределено; Если ОбработчикИлиСтруктура.Свойство("АсинхронныйДиалог", АсинхронныйДиалог) Тогда Обработчик = Новый ОписаниеОповещения(АсинхронныйДиалог.ИмяПроцедуры, АсинхронныйДиалог.Модуль, ОбработчикИлиСтруктура); КонецЕсли; Иначе Обработчик = ОбработчикИлиСтруктура; КонецЕсли; Возврат Обработчик; КонецФункции Процедура УстановитьПризнакБлокирующейФормы(ПараметрыВыполнения, Значение) Экспорт // Рекурсивная регистрация всех обработчиков вызывающего кода. Если ПараметрыВыполнения.Свойство("ОбработчикРезультата") Тогда ПараметрыВыполнения.ОбработчикРезультата = ОбработчикЗавершения(ПараметрыВыполнения.ОбработчикРезультата); КонецЕсли; АсинхронныйДиалог = Неопределено; Если ПараметрыВыполнения.Свойство("АсинхронныйДиалог", АсинхронныйДиалог) Тогда АсинхронныйДиалог.Открыт = Значение; КонецЕсли; КонецПроцедуры Функция БлокирующаяФормаОткрыта(ПараметрыВыполнения) Экспорт АсинхронныйДиалог = Неопределено; Если ПараметрыВыполнения.Свойство("АсинхронныйДиалог", АсинхронныйДиалог) Тогда Возврат АсинхронныйДиалог.Открыт; КонецЕсли; Возврат Ложь; КонецФункции // Подготовка обработчика прямого вызова без открытия диалога. Функция ПодготовитьОбработчикДляПрямогоВызова(ОбработчикИлиСтруктура, Результат) Если ТипЗнч(ОбработчикИлиСтруктура) = Тип("Структура") Тогда Если ОбработчикИлиСтруктура.Свойство("АсинхронныйДиалог") Тогда ОбработчикИлиСтруктура.АсинхронныйДиалог.РезультатКогдаНеОткрыт = Результат; КонецЕсли; Возврат Неопределено; // Обработчик не был подготовлен для диалога => Вызывающий код не остановился. Иначе Возврат ОбработчикИлиСтруктура; КонецЕсли; КонецФункции //////////////////////////////////////////////////////////////////////////////// // Выполняет пакет неинтерактивных действий с файлом. // Если файл не существует, то действия не будут пропущены. // // Можно получить следующие свойства: Имя, ИмяБезРасширения, ПолноеИмя, Путь, Расширение, Существует, // ВремяИзменения, УниверсальноеВремяИзменения, ТолькоЧтение, Невидимость, Размер, ЭтоКаталог, ЭтоФайл. // // Можно установить следующие свойства: ВремяИзменения, УниверсальноеВремяИзменения, ТолькоЧтение, Невидимость. // Можно выполнить действия с файлом: Удалить. // // Параметры: // Оповещение - ОписаниеОповещения - оповещение, которое выполняется после выполнения // действий с файлом. В качестве результата возвращается Структура со свойствами: // * ОписаниеОшибки - Строка - текст ошибки, если одно из действий выполнить не удалось. // * Результаты - Массив - содержит результат по каждому действию в виде структуры: // * Файл - Файл - инициализированный объект файл. // - Неопределено - ошибка инициализации файла. // * Существует - Булево - Ложь, если файл не существует. // // ДействияСФайлом - Массив - содержащий структуры с именем действия и параметрами действия: // * Действие - Строка - ПолучитьСвойства, УстановитьСвойства, Удалить, СкопироватьИзИсточника, // СоздатьКаталог, Получить, Поместить. // * Файл - Строка - полное имя файла на компьютере. // - Файл - инициализированный объект Файл. // * Свойства - см. свойства которые можно получить или установить. // * Источник - Строка - полное имя файла на компьютере из которого нужно создать копию. // * Адрес - Строка - адрес двоичных данных файла, например, адрес временного хранилища. // * ЗаголовокОшибки - Строка - текст к которому нужно добавить перевод строки и представление ошибки. // Процедура ОбработатьФайл(Оповещение, ДействияСФайлом, ИдентификаторФормы = Неопределено) Контекст = Новый Структура; Контекст.Вставить("Оповещение", Оповещение); Контекст.Вставить("ДействияСФайлом", ДействияСФайлом); Контекст.Вставить("ИдентификаторФормы", ИдентификаторФормы); Контекст.Вставить("РезультатДействий", Новый Структура); Контекст.РезультатДействий.Вставить("ОписаниеОшибки", ""); Контекст.РезультатДействий.Вставить("Результаты", Новый Массив); Контекст.Вставить("Индекс", -1); ОбработатьФайлЦиклНачало(Контекст); КонецПроцедуры // Продолжение процедуры ОбработатьФайл. // // Параметры: // Контекст - Структура: // * РезультатДействий - Структура: // ** Результаты - Массив // Процедура ОбработатьФайлЦиклНачало(Контекст) Если Контекст.Индекс + 1 >= Контекст.ДействияСФайлом.Количество() Тогда ВыполнитьОбработкуОповещения(Контекст.Оповещение, Контекст.РезультатДействий); Возврат; КонецЕсли; Контекст.Индекс = Контекст.Индекс + 1; Контекст.Вставить("ОписаниеДействия", Контекст.ДействияСФайлом[Контекст.Индекс]); Контекст.Вставить("Результат", Новый Структура); Контекст.Результат.Вставить("Файл", Неопределено); Контекст.Результат.Вставить("Существует", Ложь); Контекст.РезультатДействий.Результаты.Добавить(Контекст.Результат); Контекст.Вставить("СвойстваДляПолучения", Новый Структура); Контекст.Вставить("СвойстваДляУстановки", Новый Структура); Действие = Контекст.ОписаниеДействия.Действие; Файл = Контекст.ОписаниеДействия.Файл; ПолноеИмяФайла = ?(ТипЗнч(Файл) = Тип("Файл"), Файл.ПолноеИмя, Файл); Если Действие = "Удалить" Тогда НачатьУдалениеФайлов(Новый ОписаниеОповещения( "ОбработатьФайлПослеУдаленияФайлов", ЭтотОбъект, Контекст, "ОбработатьФайлПослеОшибки", ЭтотОбъект), ПолноеИмяФайла); Возврат; ИначеЕсли Действие = "СкопироватьИзИсточника" Тогда НачатьКопированиеФайла(Новый ОписаниеОповещения( "ОбработатьФайлПослеКопированияФайла", ЭтотОбъект, Контекст, "ОбработатьФайлПослеОшибки", ЭтотОбъект), Контекст.ОписаниеДействия.Источник, ПолноеИмяФайла); Возврат; ИначеЕсли Действие = "СоздатьКаталог" Тогда НачатьСозданиеКаталога(Новый ОписаниеОповещения( "ОбработатьФайлПослеСозданияКаталога", ЭтотОбъект, Контекст, "ОбработатьФайлПослеОшибки", ЭтотОбъект), ПолноеИмяФайла); Возврат; ИначеЕсли Действие = "Получить" Тогда ОписаниеФайла = Новый ОписаниеПередаваемогоФайла(ПолноеИмяФайла, Контекст.ОписаниеДействия.Адрес); ПолучаемыеФайлы = Новый Массив; ПолучаемыеФайлы.Добавить(ОписаниеФайла); НачатьПолучениеФайлов(Новый ОписаниеОповещения( "ОбработатьФайлПослеПолученияФайлов", ЭтотОбъект, Контекст, "ОбработатьФайлПослеОшибки", ЭтотОбъект), ПолучаемыеФайлы, , Ложь); Возврат; ИначеЕсли Действие = "Поместить" Тогда ОписаниеФайла = Новый ОписаниеПередаваемогоФайла(ПолноеИмяФайла); ПомещаемыеФайлы = Новый Массив; ПомещаемыеФайлы.Добавить(ОписаниеФайла); НачатьПомещениеФайлов(Новый ОписаниеОповещения( "ОбработатьФайлПослеПомещенияФайлов", ЭтотОбъект, Контекст, "ОбработатьФайлПослеОшибки", ЭтотОбъект), ПомещаемыеФайлы, , Ложь, Контекст.ИдентификаторФормы); Возврат; ИначеЕсли Действие = "ПолучитьСвойства" Тогда Контекст.Вставить("СвойстваДляПолучения", Контекст.ОписаниеДействия.Свойства); ИначеЕсли Действие = "УстановитьСвойства" Тогда Контекст.Вставить("СвойстваДляУстановки", Контекст.ОписаниеДействия.Свойства); КонецЕсли; Контекст.Вставить("Файл", ?(ТипЗнч(Файл) = Тип("Файл"), Файл, Новый Файл(Файл))); Контекст.Результат.Вставить("Файл", Контекст.Файл); ЗаполнитьЗначенияСвойств(Контекст.СвойстваДляПолучения, Контекст.Файл); Контекст.Файл.НачатьПроверкуСуществования(Новый ОписаниеОповещения( "ОбработатьФайлПослеПроверкиСуществования", ЭтотОбъект, Контекст, "ОбработатьФайлПослеОшибки", ЭтотОбъект)); КонецПроцедуры // Продолжение процедуры ОбработатьФайл. Процедура ОбработатьФайлПослеОшибки(ИнформацияОбОшибке, СтандартнаяОбработка, Контекст) Экспорт СтандартнаяОбработка = Ложь; Если ТипЗнч(ИнформацияОбОшибке) = Тип("ИнформацияОбОшибке") Тогда Контекст.РезультатДействий.ОписаниеОшибки = ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке); Иначе Контекст.РезультатДействий.ОписаниеОшибки = ИнформацияОбОшибке; КонецЕсли; Если Контекст.ОписаниеДействия.Свойство("ЗаголовокОшибки") Тогда Контекст.РезультатДействий.ОписаниеОшибки = Контекст.ОписаниеДействия.ЗаголовокОшибки + Символы.ПС + Контекст.РезультатДействий.ОписаниеОшибки; КонецЕсли; ВыполнитьОбработкуОповещения(Контекст.Оповещение, Контекст.РезультатДействий); КонецПроцедуры // Продолжение процедуры ОбработатьФайл. Процедура ОбработатьФайлПослеУдаленияФайлов(Контекст) Экспорт ОбработатьФайлЦиклНачало(Контекст); КонецПроцедуры // Продолжение процедуры ОбработатьФайл. Процедура ОбработатьФайлПослеКопированияФайла(СкопированныйФайл, Контекст) Экспорт ОбработатьФайлЦиклНачало(Контекст); КонецПроцедуры // Продолжение процедуры ОбработатьФайл. Процедура ОбработатьФайлПослеСозданияКаталога(ИмяКаталога, Контекст) Экспорт ОбработатьФайлЦиклНачало(Контекст); КонецПроцедуры // Продолжение процедуры ОбработатьФайл. Процедура ОбработатьФайлПослеПолученияФайлов(ПолученныеФайлы, Контекст) Экспорт Если ТипЗнч(ПолученныеФайлы) <> Тип("Массив") Или ПолученныеФайлы.Количество() = 0 Тогда ОбработатьФайлПослеОшибки(НСтр("ru = 'Получение файла было отменено.'"), Неопределено, Контекст); Возврат; КонецЕсли; ОбработатьФайлЦиклНачало(Контекст); КонецПроцедуры // Продолжение процедуры ОбработатьФайл. Процедура ОбработатьФайлПослеПомещенияФайлов(ПомещенныеФайлы, Контекст) Экспорт Если ТипЗнч(ПомещенныеФайлы) <> Тип("Массив") Или ПомещенныеФайлы.Количество() = 0 Тогда ОбработатьФайлПослеОшибки(НСтр("ru = 'Помещение файла было отменено.'"), Неопределено, Контекст); Возврат; КонецЕсли; Контекст.ОписаниеДействия.Вставить("Адрес", ПомещенныеФайлы[0].Хранение); ОбработатьФайлЦиклНачало(Контекст); КонецПроцедуры // Продолжение процедуры ОбработатьФайл. // // Параметры: // Существует - Булево // Контекст- Структура: // * Результат - Структура // Процедура ОбработатьФайлПослеПроверкиСуществования(Существует, Контекст) Экспорт Контекст.Результат.Вставить("Существует", Существует); Если Не Контекст.Результат.Существует Тогда ОбработатьФайлЦиклНачало(Контекст); Возврат; КонецЕсли; Если Контекст.СвойстваДляПолучения.Количество() = 0 Тогда ОбработатьФайлПослеПроверкиЭтоФайл(Null, Контекст); ИначеЕсли Контекст.СвойстваДляПолучения.Свойство("ВремяИзменения") Тогда Контекст.Файл.НачатьПолучениеВремениИзменения(Новый ОписаниеОповещения( "ОбработатьФайлПослеПолученияВремениИзменения", ЭтотОбъект, Контекст, "ОбработатьФайлПослеОшибки", ЭтотОбъект)); Иначе ОбработатьФайлПослеПолученияВремениИзменения(Null, Контекст); КонецЕсли; КонецПроцедуры // Продолжение процедуры ОбработатьФайл. Процедура ОбработатьФайлПослеПолученияВремениИзменения(ВремяИзменения, Контекст) Экспорт Если ВремяИзменения <> Null Тогда Контекст.СвойстваДляПолучения.ВремяИзменения = ВремяИзменения; КонецЕсли; Если Контекст.СвойстваДляПолучения.Свойство("УниверсальноеВремяИзменения") Тогда Контекст.Файл.НачатьПолучениеУниверсальногоВремениИзменения(Новый ОписаниеОповещения( "ОбработатьФайлПослеПолученияУниверсальногоВремениИзменения", ЭтотОбъект, Контекст, "ОбработатьФайлПослеОшибки", ЭтотОбъект)); Иначе ОбработатьФайлПослеПолученияУниверсальногоВремениИзменения(Null, Контекст); КонецЕсли; КонецПроцедуры // Продолжение процедуры ОбработатьФайл. Процедура ОбработатьФайлПослеПолученияУниверсальногоВремениИзменения(УниверсальноеВремяИзменения, Контекст) Экспорт Если УниверсальноеВремяИзменения <> Null Тогда Контекст.СвойстваДляПолучения.УниверсальноеВремяИзменения = УниверсальноеВремяИзменения; КонецЕсли; Если Контекст.СвойстваДляПолучения.Свойство("ТолькоЧтение") Тогда Контекст.Файл.НачатьПолучениеТолькоЧтения(Новый ОписаниеОповещения( "ОбработатьФайлПослеПолученияТолькоЧтения", ЭтотОбъект, Контекст, "ОбработатьФайлПослеОшибки", ЭтотОбъект)); Иначе ОбработатьФайлПослеПолученияТолькоЧтения(Null, Контекст); КонецЕсли; КонецПроцедуры // Продолжение процедуры ОбработатьФайл. Процедура ОбработатьФайлПослеПолученияТолькоЧтения(ТолькоЧтение, Контекст) Экспорт Если ТолькоЧтение <> Null Тогда Контекст.СвойстваДляПолучения.ТолькоЧтение = ТолькоЧтение; КонецЕсли; Если Контекст.СвойстваДляПолучения.Свойство("Невидимость") Тогда Контекст.Файл.НачатьПолучениеНевидимости(Новый ОписаниеОповещения( "ОбработатьФайлПослеПолученияНевидимости", ЭтотОбъект, Контекст, "ОбработатьФайлПослеОшибки", ЭтотОбъект)); Иначе ОбработатьФайлПослеПолученияНевидимости(Null, Контекст); КонецЕсли; КонецПроцедуры // Продолжение процедуры ОбработатьФайл. // // Параметры: // Невидимость - Булево // Контекст - Структура: // * Файл - Файл // * СвойстваДляПолучения - Структура: // ** Размер - Число // ** ЭтоКаталог - Булево // Процедура ОбработатьФайлПослеПолученияНевидимости(Невидимость, Контекст) Экспорт Если Невидимость <> Null Тогда Контекст.СвойстваДляПолучения.Невидимость = Невидимость; КонецЕсли; Если Контекст.СвойстваДляПолучения.Свойство("Размер") Тогда Контекст.Файл.НачатьПолучениеРазмера(Новый ОписаниеОповещения( "ОбработатьФайлПослеПолученияРазмера", ЭтотОбъект, Контекст, "ОбработатьФайлПослеОшибки", ЭтотОбъект)); Иначе ОбработатьФайлПослеПолученияРазмера(Null, Контекст); КонецЕсли; КонецПроцедуры // Продолжение процедуры ОбработатьФайл. Процедура ОбработатьФайлПослеПолученияРазмера(Размер, Контекст) Экспорт Если Размер <> Null Тогда Контекст.СвойстваДляПолучения.Размер = Размер; КонецЕсли; Если Контекст.СвойстваДляПолучения.Свойство("ЭтоКаталог") Тогда Контекст.Файл.НачатьПроверкуЭтоКаталог(Новый ОписаниеОповещения( "ОбработатьФайлПослеПроверкиЭтоКаталог", ЭтотОбъект, Контекст, "ОбработатьФайлПослеОшибки", ЭтотОбъект)); Иначе ОбработатьФайлПослеПроверкиЭтоКаталог(Null, Контекст); КонецЕсли; КонецПроцедуры // Продолжение процедуры ОбработатьФайл. Процедура ОбработатьФайлПослеПроверкиЭтоКаталог(ЭтоКаталог, Контекст) Экспорт Если ЭтоКаталог <> Null Тогда Контекст.СвойстваДляПолучения.ЭтоКаталог = ЭтоКаталог; КонецЕсли; Если Контекст.СвойстваДляПолучения.Свойство("ЭтоФайл") Тогда Контекст.Файл.НачатьПроверкуЭтоФайл(Новый ОписаниеОповещения( "ОбработатьФайлПослеПроверкиЭтоФайл", ЭтотОбъект, Контекст, "ОбработатьФайлПослеОшибки", ЭтотОбъект)); Иначе ОбработатьФайлПослеПроверкиЭтоФайл(Null, Контекст); КонецЕсли; КонецПроцедуры // Продолжение процедуры ОбработатьФайл. Процедура ОбработатьФайлПослеПроверкиЭтоФайл(ЭтоФайл, Контекст) Экспорт Если ЭтоФайл <> Null Тогда Контекст.СвойстваДляПолучения.ЭтоФайл = ЭтоФайл; КонецЕсли; Если Контекст.СвойстваДляУстановки.Количество() = 0 Тогда ОбработатьФайлПослеУстановкиНевидимости(Контекст); ИначеЕсли Контекст.СвойстваДляУстановки.Свойство("ВремяИзменения") Тогда Контекст.Файл.НачатьУстановкуВремениИзменения(Новый ОписаниеОповещения( "ОбработатьФайлПослеУстановкиВремениИзменения", ЭтотОбъект, Контекст, "ОбработатьФайлПослеОшибки", ЭтотОбъект), Контекст.СвойстваДляУстановки.ВремяИзменения); Иначе ОбработатьФайлПослеУстановкиВремениИзменения(Контекст); КонецЕсли; КонецПроцедуры // Продолжение процедуры ОбработатьФайл. Процедура ОбработатьФайлПослеУстановкиВремениИзменения(Контекст) Экспорт Если Контекст.СвойстваДляУстановки.Свойство("УниверсальноеВремяИзменения") Тогда Контекст.Файл.НачатьУстановкуУниверсальногоВремениИзменения(Новый ОписаниеОповещения( "ОбработатьФайлПослеУстановкиУниверсальногоВремениИзменения", ЭтотОбъект, Контекст, "ОбработатьФайлПослеОшибки", ЭтотОбъект), Контекст.СвойстваДляУстановки.УниверсальноеВремяИзменения); Иначе ОбработатьФайлПослеУстановкиУниверсальногоВремениИзменения(Контекст); КонецЕсли; КонецПроцедуры // Продолжение процедуры ОбработатьФайл. Процедура ОбработатьФайлПослеУстановкиУниверсальногоВремениИзменения(Контекст) Экспорт Если Контекст.СвойстваДляУстановки.Свойство("ТолькоЧтение") Тогда Контекст.Файл.НачатьУстановкуТолькоЧтения(Новый ОписаниеОповещения( "ОбработатьФайлПослеУстановкиТолькоЧтения", ЭтотОбъект, Контекст, "ОбработатьФайлПослеОшибки", ЭтотОбъект), Контекст.СвойстваДляУстановки.ТолькоЧтение); Иначе ОбработатьФайлПослеУстановкиТолькоЧтения(Контекст); КонецЕсли; КонецПроцедуры // Продолжение процедуры ОбработатьФайл. Процедура ОбработатьФайлПослеУстановкиТолькоЧтения(Контекст) Экспорт Если Контекст.СвойстваДляУстановки.Свойство("Невидимость") Тогда Контекст.Файл.НачатьУстановкуНевидимости(Новый ОписаниеОповещения( "ОбработатьФайлПослеУстановкиНевидимости", ЭтотОбъект, Контекст, "ОбработатьФайлПослеОшибки", ЭтотОбъект), Контекст.СвойстваДляУстановки.Невидимость); Иначе ОбработатьФайлПослеУстановкиНевидимости(Контекст); КонецЕсли; КонецПроцедуры // Продолжение процедуры ОбработатьФайл. Процедура ОбработатьФайлПослеУстановкиНевидимости(Контекст) Экспорт ОбработатьФайлЦиклНачало(Контекст); КонецПроцедуры // Загружает файл с клиента во временное хранилище на сервере. Не работает без расширения для работы с 1С:Предприятием. Функция ПоместитьФайлСДискаВоВременноеХранилище(ПолноеИмяФайла, АдресФайла = "", УникальныйИдентификатор = Неопределено) Если Не РасширениеРаботыСФайламиПодключено() Тогда Возврат Неопределено; КонецЕсли; ЧтоЗагрузить = Новый Массив; ЧтоЗагрузить.Добавить(Новый ОписаниеПередаваемогоФайла(ПолноеИмяФайла, АдресФайла)); РезультатЗагрузки = Новый Массив; ФайлЗагружен = ПоместитьФайлы(ЧтоЗагрузить, РезультатЗагрузки, , Ложь, УникальныйИдентификатор); Если Не ФайлЗагружен Или РезультатЗагрузки.Количество() = 0 Тогда Возврат Неопределено; КонецЕсли; Возврат РезультатЗагрузки[0].Хранение; КонецФункции //////////////////////////////////////////////////////////////////////////////// // Процедуры и функция для работы со сканером. Процедура ПроинициализироватьКомпоненту(ОповещениеВозврата, ПредложитьУстановить = Ложь) Экспорт Если Не ДоступноСканирование() Тогда РезультатПодключенияКомпоненты = ОбщегоНазначенияСлужебныйКлиент.РезультатПодключенияКомпоненты(); РезультатПодключенияКомпоненты.Подключено = Ложь; РезультатПодключенияКомпоненты.ОписаниеОшибки = НСтр("ru = 'Сканирование возможно в программах для операционных систем Microsoft Windows x86 и х64'"); ВыполнитьОбработкуОповещения(ОповещениеВозврата, РезультатПодключенияКомпоненты); Возврат; КонецЕсли; ПараметрыПодключения = ОбщегоНазначенияКлиент.ПараметрыПодключенияКомпоненты(); ПараметрыПодключения.ТекстПояснения = НСтр("ru = 'Для продолжения требуется подключить внешнюю компоненту сканирования.'"); ПараметрыПодключения.ПредложитьУстановить = ПредложитьУстановить; ОписаниеКомпоненты = РаботаСФайламиСлужебныйКлиентСервер.ОписаниеКомпоненты(); ОбщегоНазначенияКлиент.ПодключитьКомпонентуИзМакета(ОповещениеВозврата, ОписаниеКомпоненты.ИмяОбъекта, ОписаниеКомпоненты.ПолноеИмяМакета, ПараметрыПодключения); КонецПроцедуры Функция ДоступноСканирование(ЭтоПроверкаНастроек = Ложь) Экспорт Если ЭтоПроверкаНастроек Тогда #Если МобильныйКлиент Тогда Возврат СредстваМультимедиа.ПоддерживаетсяФотоснимок(); #ИначеЕсли ВебКлиент Тогда Возврат Ложь; #Иначе Возврат ОбщегоНазначенияКлиент.ЭтоWindowsКлиент(); #КонецЕсли Иначе #Если МобильныйКлиент ИЛИ ВебКлиент Тогда Возврат Ложь; #Иначе Возврат ОбщегоНазначенияКлиент.ЭтоWindowsКлиент(); #КонецЕсли КонецЕсли; КонецФункции // Возвращает устройства сканирования (массив строк). Функция ПолучитьУстройства(Форма, ПодключаемыйМодуль) Экспорт Устройства = ПодключенныеУстройства(Форма, ПодключаемыйМодуль); Возврат Устройства; КонецФункции //////////////////////////////////////////////////////////////////////////////// // Вспомогательные процедуры для поддержки асинхронной модели. // Функция КлиентПоддерживаетСинхронныеВызовы() #Если ВебКлиент Тогда // В Chrome и Firefox синхронные методы не поддерживаются. СистемнаяИнформация = Новый СистемнаяИнформация; ИнформацияПрограммыМассив = СтрРазделить(СистемнаяИнформация.ИнформацияПрограммыПросмотра, " ", Ложь); Для Каждого ИнформацияПрограммы Из ИнформацияПрограммыМассив Цикл Если СтрНайти(ИнформацияПрограммы, "Chrome") > 0 ИЛИ СтрНайти(ИнформацияПрограммы, "Firefox") > 0 Тогда Возврат Ложь; КонецЕсли; КонецЦикла; #КонецЕсли Возврат Истина; КонецФункции //////////////////////////////////////////////////////////////////////////////// // Обработка событий общих форм работы с файлами. // Выбрать режим открытия файла и начать редактирование. // Варианты "Редактировать", "Отмена". // // Параметры: // ДанныеФайла - см. РаботаСФайламиСлужебныйВызовСервера.ДанныеФайла // Процедура ВыбратьРежимИРедактироватьФайл(ОбработчикРезультата, ДанныеФайла, ДоступностьКомандыРедактировать) Экспорт ПерсональныеНастройки = ПерсональныеНастройкиРаботыСФайлами(); РезультатОткрыть = ?(ДанныеФайла.ФайлРедактируетТекущийПользователь И ДоступностьКомандыРедактировать, "Редактировать", ПерсональныеНастройки.ВариантОткрытияФайла); СпособОткрытия = ПерсональныеНастройки.ТекстовыеФайлыСпособОткрытия; Если СпособОткрытия = ПредопределенноеЗначение("Перечисление.СпособыОткрытияФайлаНаПросмотр.ВоВстроенномРедакторе") Тогда РасширениеВСписке = РаботаСФайламиСлужебныйКлиентСервер.РасширениеФайлаВСписке( ПерсональныеНастройки.ТекстовыеФайлыРасширение, ДанныеФайла.Расширение); Если РасширениеВСписке Тогда ВернутьРезультат(ОбработчикРезультата, РезультатОткрыть); Возврат; КонецЕсли; КонецЕсли; СпособОткрытия = ПерсональныеНастройки.ГрафическиеСхемыСпособОткрытия; Если СпособОткрытия = ПредопределенноеЗначение("Перечисление.СпособыОткрытияФайлаНаПросмотр.ВоВстроенномРедакторе") Тогда РасширениеВСписке = РаботаСФайламиСлужебныйКлиентСервер.РасширениеФайлаВСписке( ПерсональныеНастройки.ГрафическиеСхемыРасширение, ДанныеФайла.Расширение); Если РасширениеВСписке Тогда ВернутьРезультат(ОбработчикРезультата, РезультатОткрыть); Возврат; КонецЕсли; КонецЕсли; // Если уже занят для редактирования, то не спрашивать - сразу открывать. Если Не ЗначениеЗаполнено(ДанныеФайла.Редактирует) И ПерсональныеНастройки.СпрашиватьРежимРедактированияПриОткрытииФайла = Истина И ДоступностьКомандыРедактировать Тогда ПараметрыВыполнения = Новый Структура; ПараметрыВыполнения.Вставить("ОбработчикРезультата", ОбработчикРезультата); Обработчик = Новый ОписаниеОповещения("ВыбратьРежимИРедактироватьФайлЗавершение", ЭтотОбъект, ПараметрыВыполнения); ОткрытьФорму("Обработка.РаботаСФайлами.Форма.ФормаВыбораРежимаОткрытия", , , , , , Обработчик, РежимОткрытияОкнаФормы.БлокироватьВесьИнтерфейс); Возврат; КонецЕсли; ВернутьРезультат(ОбработчикРезультата, РезультатОткрыть); КонецПроцедуры Процедура ВыбратьРежимИРедактироватьФайлЗавершение(Результат, ПараметрыВыполнения) Экспорт РезультатОткрыть = "Открыть"; РезультатРедактировать = "Редактировать"; РезультатОтмена = "Отмена"; Если ТипЗнч(Результат) <> Тип("Структура") Тогда ВернутьРезультат(ПараметрыВыполнения.ОбработчикРезультата, РезультатОтмена); Возврат; КонецЕсли; Если Результат.КакОткрывать = 1 Тогда ВернутьРезультат(ПараметрыВыполнения.ОбработчикРезультата, РезультатРедактировать); Возврат; КонецЕсли; ВернутьРезультат(ПараметрыВыполнения.ОбработчикРезультата, РезультатОткрыть); КонецПроцедуры // Доступны файловые команды, есть хотя бы одна строка в списке и выделена не группировка. // // Параметры: // Элементы - ЭлементыФормы: // * Список - ТаблицаФормы // // Возвращаемое значение: // Булево // Функция ФайловыеКомандыДоступны(Элементы) Экспорт ФайлСсылка = Элементы.Список.ТекущаяСтрока; Если ФайлСсылка = Неопределено Тогда Возврат Ложь; КонецЕсли; Если ТипЗнч(Элементы.Список.ТекущаяСтрока) = Тип("СтрокаГруппировкиДинамическогоСписка") Тогда Возврат Ложь; КонецЕсли; Возврат Истина; КонецФункции /////////////////////////////////////////////////////////////////////////////////// // Печать табличного или офисного документа со штампом электронной подписи. Процедура ПечатьФайлаСоШтампом(Документ, НаименованиеФайла) Экспорт НаименованиеДокумента = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = '%1 (со штампом)'"), НаименованиеФайла); Если ТипЗнч(Документ) = Тип("ТабличныйДокумент") Тогда Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.Печать") Тогда МодульУправлениеПечатьюКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("УправлениеПечатьюКлиент"); ИдентификаторПечатнойФормы = "ПрисоединенныйФайл"; Документ.Защита = Ложь; КоллекцияПечатныхФорм = МодульУправлениеПечатьюКлиент.НоваяКоллекцияПечатныхФорм(ИдентификаторПечатнойФормы); ПечатнаяФорма = МодульУправлениеПечатьюКлиент.ОписаниеПечатнойФормы(КоллекцияПечатныхФорм, ИдентификаторПечатнойФормы); ПечатнаяФорма.СинонимМакета = НаименованиеДокумента; ПечатнаяФорма.ТабличныйДокумент = Документ; МодульУправлениеПечатьюКлиент.ПечатьДокументов(КоллекцияПечатныхФорм); Иначе Документ.Напечатать(РежимИспользованияДиалогаПечати.Использовать); КонецЕсли; Иначе ФайловаяСистемаКлиент.ОткрытьФайл(Документ, , НаименованиеДокумента+".docx"); КонецЕсли; КонецПроцедуры // Обратная совместимость. Открытие файла без владельца по адресу на временное хранилище. // Продолжение процедуры ОткрытьФайл. Процедура ОткрытьФайлРасширениеПредложено(РасширениеРаботыСФайламиПодключено, ДополнительныеПараметры) Экспорт ДанныеФайла = ДополнительныеПараметры.ДанныеФайла; ДляРедактирования = ДополнительныеПараметры.ДляРедактирования; Если РасширениеРаботыСФайламиПодключено Тогда РабочийКаталогПользователя = РабочийКаталогПользователя(); ПолноеИмяФайлаНаКлиенте = РабочийКаталогПользователя + ДанныеФайла.ОтносительныйПуть + ДанныеФайла.ИмяФайла; ФайлНаДиске = Новый Файл(ПолноеИмяФайлаНаКлиенте); ДополнительныеПараметры.Вставить("ДляРедактирования", ДляРедактирования); ДополнительныеПараметры.Вставить("РабочийКаталогПользователя", РабочийКаталогПользователя); ДополнительныеПараметры.Вставить("ФайлНаДиске", ФайлНаДиске); ДополнительныеПараметры.Вставить("ПолноеИмяФайлаНаКлиенте", ПолноеИмяФайлаНаКлиенте); Если ЗначениеЗаполнено(ДанныеФайла.Редактирует) И ДляРедактирования И ФайлНаДиске.Существует() Тогда ФайлНаДиске.УстановитьТолькоЧтение(Ложь); ПолучитьФайл = Ложь; ИначеЕсли ФайлНаДиске.Существует() Тогда ОписаниеОповещения = Новый ОписаниеОповещения("ОткрытьФайлДиалогПоказан", ЭтотОбъект, ДополнительныеПараметры); ПоказатьДиалогНужноПолучитьФайлССервера(ОписаниеОповещения, ПолноеИмяФайлаНаКлиенте, ДанныеФайла, ДляРедактирования); Возврат; Иначе ПолучитьФайл = Истина; КонецЕсли; ОткрытьФайлДиалогПоказан(ПолучитьФайл, ДополнительныеПараметры); Иначе ОписаниеОповещения = Новый ОписаниеОповещения("ОткрытьФайлНапоминаниеПоказано", ЭтотОбъект, ДополнительныеПараметры); ВывестиНапоминаниеПриРедактировании(ОписаниеОповещения); КонецЕсли; КонецПроцедуры // Продолжение процедуры ОткрытьФайл. Процедура ОткрытьФайлНапоминаниеПоказано(РезультатНапоминания, ДополнительныеПараметры) Экспорт Если РезультатНапоминания = КодВозвратаДиалога.Отмена Или РезультатНапоминания = Неопределено Тогда Возврат; КонецЕсли; ДанныеФайла = ДополнительныеПараметры.ДанныеФайла; ПолучитьФайл(ДанныеФайла.СсылкаНаДвоичныеДанныеФайла, ДанныеФайла.ИмяФайла, Истина); КонецПроцедуры // Продолжение процедуры ОткрытьФайл. Процедура ОткрытьФайлДиалогПоказан(ПолучитьФайл, ДополнительныеПараметры) Экспорт Если ПолучитьФайл = Неопределено Тогда Возврат; КонецЕсли; ДанныеФайла = ДополнительныеПараметры.ДанныеФайла; ДляРедактирования = ДополнительныеПараметры.ДляРедактирования; РабочийКаталогПользователя = ДополнительныеПараметры.РабочийКаталогПользователя; ФайлНаДиске = ДополнительныеПараметры.ФайлНаДиске; ПолноеИмяФайлаНаКлиенте = ДополнительныеПараметры.ПолноеИмяФайлаНаКлиенте; ФайлМожноОткрывать = Истина; Если ПолучитьФайл Тогда ПолноеИмяФайлаНаКлиенте = ""; ФайлМожноОткрывать = ПолучитьФайлВРабочийКаталог( ДанныеФайла.СсылкаНаДвоичныеДанныеФайла, ДанныеФайла.ОтносительныйПуть, ДанныеФайла.ДатаМодификацииУниверсальная, ДанныеФайла.ИмяФайла, РабочийКаталогПользователя, ПолноеИмяФайлаНаКлиенте); КонецЕсли; Если ФайлМожноОткрывать Тогда Если ДляРедактирования Тогда ФайлНаДиске.УстановитьТолькоЧтение(Ложь); Иначе ФайлНаДиске.УстановитьТолькоЧтение(Истина); КонецЕсли; УникальныйИдентификатор = ?(ДополнительныеПараметры.Свойство("УникальныйИдентификатор"), ДополнительныеПараметры.УникальныйИдентификатор, Неопределено); ОткрытьФайлПриложением(ДанныеФайла, ПолноеИмяФайлаНаКлиенте, УникальныйИдентификатор); КонецЕсли; КонецПроцедуры Функция ПолучитьФайлВРабочийКаталог(Знач АдресДвоичныхДанныхФайла, Знач ОтносительныйПуть, Знач ДатаМодификацииУниверсальная, Знач ИмяФайла, Знач РабочийКаталогПользователя, ПолноеИмяФайлаНаКлиенте) Если РабочийКаталогПользователя = Неопределено ИЛИ ПустаяСтрока(РабочийКаталогПользователя) Тогда Возврат Ложь; КонецЕсли; КаталогСохранения = РабочийКаталогПользователя + ОтносительныйПуть; Попытка СоздатьКаталог(КаталогСохранения); Исключение СообщениеОбОшибке = ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке()); СообщениеОбОшибке = НСтр("ru = 'Ошибка создания каталога на компьютере:'") + " " + СообщениеОбОшибке; ОбщегоНазначенияКлиент.СообщитьПользователю(СообщениеОбОшибке); Возврат Ложь; КонецПопытки; Файл = Новый Файл(КаталогСохранения + ИмяФайла); Если Файл.Существует() Тогда Попытка Файл.УстановитьТолькоЧтение(Ложь); УдалитьФайлы(КаталогСохранения + ИмяФайла); Исключение ЖурналРегистрацииКлиент.ДобавитьСообщениеДляЖурналаРегистрации(СобытиеЖурналаРегистрации(), "Предупреждение", ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()),, Истина); КонецПопытки; КонецЕсли; ПолучаемыйФайл = Новый ОписаниеПередаваемогоФайла(КаталогСохранения + ИмяФайла, АдресДвоичныхДанныхФайла); ПолучаемыеФайлы = Новый Массив; ПолучаемыеФайлы.Добавить(ПолучаемыйФайл); ПолученныеФайлы = Новый Массив; Если ПолучитьФайлы(ПолучаемыеФайлы, ПолученныеФайлы, , Ложь) Тогда ПолноеИмяФайлаНаКлиенте = ПолученныеФайлы[0].ПолноеИмя; УстановитьУниверсальноеВремяИзменения(ПолноеИмяФайлаНаКлиенте, ДатаМодификацииУниверсальная); Возврат Истина; КонецЕсли; Возврат Ложь; КонецФункции // Параметры: // ДанныеФайла - см. РаботаСФайламиСлужебныйВызовСервера.ДанныеФайла // Процедура ПоказатьДиалогНужноПолучитьФайлССервера(ОбработчикРезультата, Знач ИмяФайлаСПутем, Знач ДанныеФайла, Знач ДляРедактирования) СтандартныеДанныеФайла = Новый Структура; СтандартныеДанныеФайла.Вставить("ДатаМодификацииУниверсальная", ДанныеФайла.ДатаМодификацииУниверсальная); СтандартныеДанныеФайла.Вставить("Размер", ДанныеФайла.Размер); СтандартныеДанныеФайла.Вставить("ВРабочемКаталогеНаЧтение", НЕ ДляРедактирования); СтандартныеДанныеФайла.Вставить("Редактирует", ДанныеФайла.Редактирует); // Выяснено, что Файл в рабочем каталоге есть. // Проверка даты изменения и принятие решения, что делать дальше. Параметры = Новый Структура; Параметры.Вставить("ОбработчикРезультата", ОбработчикРезультата); Параметры.Вставить("ИмяФайлаСПутем", ИмяФайлаСПутем); ОписаниеОповещения = Новый ОписаниеОповещения("ПоказатьДиалогНужноПолучитьФайлССервераДействиеОпределено", ЭтотОбъект, Параметры); ДействиеПриОткрытииФайлаВРабочемКаталоге(ОписаниеОповещения, ИмяФайлаСПутем, СтандартныеДанныеФайла); КонецПроцедуры // Продолжение процедуры ПоказатьДиалогНужноПолучитьФайлССервера. Процедура ПоказатьДиалогНужноПолучитьФайлССервераДействиеОпределено(Действие, ДополнительныеПараметры) Экспорт ИмяФайлаСПутем = ДополнительныеПараметры.ИмяФайлаСПутем; Если Действие = "ВзятьИзХранилищаИОткрыть" Тогда Файл = Новый Файл(ИмяФайлаСПутем); Попытка Файл.УстановитьТолькоЧтение(Ложь); УдалитьФайлы(ИмяФайлаСПутем); Исключение ЖурналРегистрацииКлиент.ДобавитьСообщениеДляЖурналаРегистрации(СобытиеЖурналаРегистрации(), "Предупреждение", ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()),, Истина); Результат = Неопределено; КонецПопытки; Результат = Истина; ИначеЕсли Действие = "ОткрытьСуществующий" Тогда Результат = Ложь; Иначе // Действие = "Отмена". Результат = Неопределено; КонецЕсли; ВыполнитьОбработкуОповещения(ДополнительныеПараметры.ОбработчикРезультата, Результат); КонецПроцедуры Функция ГотовностьКСканированию(Форма, ПодключаемыйМодуль) Экспорт ЕстьУстройства = ЕстьУстройства(Форма, ПодключаемыйМодуль); Если ЕстьУстройства Тогда Попытка ПодключенныеУстройства(Форма, ПодключаемыйМодуль); Возврат Истина; Исключение Возврат Ложь; КонецПопытки; КонецЕсли; Возврат Ложь; КонецФункции Функция ПодключенныеУстройства(Форма, ПодключаемыйМодуль) ЗаписатьЖурналСканирования("ПолучитьУстройства.Старт"); Попытка Устройства = ПодключаемыйМодуль.ПолучитьУстройства(); ПодключенныеУстройства = СтрРазделить(Устройства, Символы.ПС, Ложь); ЗаписатьЖурналСканирования("ПолучитьУстройства.Результат", СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку("ПолучитьУстройства() = %1", СтрСоединить(ПодключенныеУстройства, "|"))); Исключение ПодключенныеУстройства = Новый Массив; ПредставлениеОшибки = ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); ЗаписатьЖурналСканирования("ПолучитьУстройства", ПредставлениеОшибки, Истина); ПоказатьОшибкуСканирования(ПодключаемыйМодуль, Форма, НСтр("ru='Не удалось получить список устройств'"), ПредставлениеОшибки); КонецПопытки; Возврат ПодключенныеУстройства; КонецФункции // Возвращает настройку сканера по имени. // // Параметры: // ПодключаемыйМодуль - компонента сканирования // ИмяУстройства - Строка - имя сканера. // ИмяНастройки - Строка - имя настройки, // например "XRESOLUTION", или "PIXELTYPE", или "ROTATION", или "SUPPORTEDSIZES". // // Возвращаемое значение: // Число - значение настройки сканера. // Функция НастройкаСканера(Форма, ПодключаемыйМодуль, ИмяУстройства, ИмяНастройки) Экспорт Если Не ДоступноСканирование(Истина) Тогда Возврат -1; КонецЕсли; Попытка ЗаписатьЖурналСканирования("ПолучитьНастройку.Старт", СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку("ПолучитьНастройку(%1, %2)", ИмяУстройства, ИмяНастройки)); ЗначениеНастройки = ПодключаемыйМодуль.ПолучитьНастройку(ИмяУстройства, ИмяНастройки); ЗаписатьЖурналСканирования("ПолучитьНастройку.Результат", СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку("ПолучитьНастройку(%1, %2) = %3", ИмяУстройства, ИмяНастройки, ЗначениеНастройки)); Возврат ЗначениеНастройки; Исключение ПредставлениеОшибки = ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); ЗаписатьЖурналСканирования("ПолучитьНастройку", ПредставлениеОшибки, Истина); ПоказатьОшибкуСканирования(ПодключаемыйМодуль, Форма, НСтр("ru='Не удалось получить настройки устройства.'"), ПредставлениеОшибки); Возврат -1; КонецПопытки; КонецФункции Функция ЕстьУстройства(Форма, ПодключаемыйМодуль, ПоказыватьОшибку = Истина) Экспорт ЗаписатьЖурналСканирования("ЕстьУстройства.Старт"); Попытка ЕстьУстройства = ПодключаемыйМодуль.ЕстьУстройства(); ЗаписатьЖурналСканирования("ЕстьУстройства.Результат", СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку("ЕстьУстройства() = %1", ЕстьУстройства)); Исключение ПредставлениеОшибки = ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); ЗаписатьЖурналСканирования("ЕстьУстройства", ПредставлениеОшибки, Истина); Если ПоказыватьОшибку Тогда ПоказатьОшибкуСканирования(ПодключаемыйМодуль, Форма, НСтр("ru='Не удалось проверить наличие устройств'"), ПредставлениеОшибки); КонецЕсли; ЕстьУстройства = Ложь; КонецПопытки; Возврат ЕстьУстройства; КонецФункции Процедура НачатьСканирование(Форма, ПодключаемыйМодуль, ПараметрыСканирования) Экспорт ПараметрСжатие = ?(ВРег(ФорматКартинки) = "JPG", ПараметрыСканирования.КачествоJPG, ПараметрыСканирования.СжатиеTIFF); ТекстСобытия = "НачатьСканирование" + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку("(%1, %2, %3, %4, %5, %6, %7, %8, %9)", ПараметрыСканирования.ПоказыватьДиалог, ПараметрыСканирования.ВыбранноеУстройство, ПараметрыСканирования.ФорматКартинки, ПараметрыСканирования.Разрешение, ПараметрыСканирования.Цветность, ПараметрыСканирования.Поворот, ПараметрыСканирования.РазмерБумаги, ПараметрСжатие, ПараметрыСканирования.ДвустороннееСканирование); ЗаписатьЖурналСканирования("НачатьСканирование.Старт", ТекстСобытия); Попытка ПодключаемыйМодуль.НачатьСканирование( ПараметрыСканирования.ПоказыватьДиалог, ПараметрыСканирования.ВыбранноеУстройство, ПараметрыСканирования.ФорматКартинки, ПараметрыСканирования.Разрешение, ПараметрыСканирования.Цветность, ПараметрыСканирования.Поворот, ПараметрыСканирования.РазмерБумаги, ПараметрСжатие, ПараметрыСканирования.ДвустороннееСканирование); ЗаписатьЖурналСканирования("НачатьСканирование.Результат", ТекстСобытия); Исключение ПредставлениеОшибки = ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); ЗаписатьЖурналСканирования("НачатьСканирование", ПредставлениеОшибки, Истина); ПоказатьОшибкуСканирования(ПодключаемыйМодуль, Форма, НСтр("ru='Не удалось отсканировать документ'"), ПредставлениеОшибки); КонецПопытки; КонецПроцедуры Процедура ВключитьЛогированиеКомпоненты(ПодключаемыйМодуль, ОповещениеПродолжения, Знач Перезапуск = Ложь) Экспорт ИдентификаторКлиента = ИдентификаторКлиента(); ПараметрыЛогирования = РаботаСФайламиСлужебныйВызовСервера.ПараметрыЛогирования(ИдентификаторКлиента); Если Не Перезапуск Тогда Перезапуск = ПараметрыЛогирования.ДатаНачалаЛогированияСканирования = Дата(1,1,1); КонецЕсли; ИмяЛогФайла = ПараметрыЛогирования.ИмяЛогФайла; Если Перезапуск И ИмяЛогФайла <> Неопределено Тогда УстановитьИмяЛогФайла(ПодключаемыйМодуль, ""); ФайлЛога = Новый Файл(ИмяЛогФайла); Если ФайлЛога.Существует() Тогда УдалитьФайлы(ИмяЛогФайла); КонецЕсли; КонецЕсли; КаталогЖурналаСканирования = ПараметрыЛогирования.КаталогЖурналаСканирования; ИспользоватьКаталогЖурналаСканирования = ПараметрыЛогирования.ИспользоватьКаталогЖурналаСканирования; Контекст = Новый Структура; Контекст.Вставить("ПодключаемыйМодуль", ПодключаемыйМодуль); Контекст.Вставить("ОповещениеПродолжения", ОповещениеПродолжения); ОповещениеПослеСозданияВременногоКаталогаДляПодключенияЛогФайлов = Новый ОписаниеОповещения("ОповещениеПослеСозданияВременногоКаталогаДляПодключенияЛогФайлов", ЭтотОбъект, Контекст); Если ИспользоватьКаталогЖурналаСканирования И КаталогЖурналаСканирования <> Неопределено Тогда Контекст = Новый Структура; Контекст.Вставить("ОповещениеПослеСозданияВременногоКаталогаДляПодключенияЛогФайлов", ОповещениеПослеСозданияВременногоКаталогаДляПодключенияЛогФайлов); Контекст.Вставить("КаталогЖурналаСканирования", КаталогЖурналаСканирования); Контекст.Вставить("ИдентификаторКлиента", ИдентификаторКлиента); ОповещениеРезультатаПроверки = Новый ОписаниеОповещения("ПослеПроверкиДоступностиКаталогаЖурналаСканирования", ЭтотОбъект, Контекст); ПроверитьДоступностьКаталога(ОповещениеРезультатаПроверки, КаталогЖурналаСканирования); ИначеЕсли Перезапуск И Не ЗначениеЗаполнено(ИмяЛогФайла) Тогда ФайловаяСистемаКлиент.СоздатьВременныйКаталог(ОповещениеПослеСозданияВременногоКаталогаДляПодключенияЛогФайлов); ИначеЕсли Перезапуск Тогда Контекст = Новый Структура; Контекст.Вставить("ИмяЛогФайла", ИмяЛогФайла); Контекст.Вставить("ОповещениеПослеСозданияВременногоКаталогаДляПодключенияЛогФайлов", ОповещениеПослеСозданияВременногоКаталогаДляПодключенияЛогФайлов); ОповещениеРезультатаПроверки = Новый ОписаниеОповещения("ПослеПроверкиДоступностиКаталогаЛогФайла", ЭтотОбъект, Контекст); ФайлЛога = Новый Файл(ИмяЛогФайла); ПроверитьДоступностьКаталога(ОповещениеРезультатаПроверки, ФайлЛога.Путь); Иначе ВыполнитьОбработкуОповещения(ОповещениеПродолжения); КонецЕсли; КонецПроцедуры Процедура ПослеПроверкиДоступностиКаталогаЛогФайла(Результат, ВнешнийКонтекст) Экспорт Оповещение = ВнешнийКонтекст.ОповещениеПослеСозданияВременногоКаталогаДляПодключенияЛогФайлов; ПодключаемыйМодуль = Оповещение.ДополнительныеПараметры.ПодключаемыйМодуль; Если Не Результат.Успешно Тогда ФайловаяСистемаКлиент.СоздатьВременныйКаталог(Оповещение); Иначе УстановитьИмяЛогФайла(ПодключаемыйМодуль, ВнешнийКонтекст.ИмяЛогФайла); Если Оповещение.ДополнительныеПараметры.ОповещениеПродолжения <> Неопределено Тогда ВыполнитьОбработкуОповещения(Оповещение.ДополнительныеПараметры.ОповещениеПродолжения); КонецЕсли; КонецЕсли; КонецПроцедуры Процедура ПослеПроверкиДоступностиКаталогаЖурналаСканирования(Результат, ВнешнийКонтекст) Экспорт Если Не Результат.Успешно Тогда РаботаСФайламиСлужебныйВызовСервера.СброситьПараметрыКаталогаЖурналаЛогирования(ВнешнийКонтекст.ИдентификаторКлиента); ЗаписатьЖурналСканирования("ФайлКомпоненты", СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru='Каталог журнала сканирования недоступен %1. Использование каталога отменено.'"), ВнешнийКонтекст.КаталогЖурналаСканирования), Истина); НастройкиСканирования = Новый Структура; НастройкиСканирования.Вставить("КаталогЖурналаСканирования", ""); НастройкиСканирования.Вставить("ИспользоватьКаталогЖурналаСканирования", Ложь); Оповестить("НастройкиСканирования", НастройкиСканирования); ФайловаяСистемаКлиент.СоздатьВременныйКаталог(ВнешнийКонтекст.ОповещениеПослеСозданияВременногоКаталогаДляПодключенияЛогФайлов); Иначе ВыполнитьОбработкуОповещения(ВнешнийКонтекст.ОповещениеПослеСозданияВременногоКаталогаДляПодключенияЛогФайлов, ВнешнийКонтекст.КаталогЖурналаСканирования); КонецЕсли; КонецПроцедуры Процедура УстановитьИмяЛогФайла(ПодключаемыйМодуль, ИмяЛогФайла) ЗаписатьЖурналСканирования("LogFilePath.УстановкаЗначения", СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку("LogFilePath = %1", ИмяЛогФайла)); Попытка ПодключаемыйМодуль.LogFilePath = ИмяЛогФайла; ЗаписатьЖурналСканирования("LogFilePath.ЗначениеУстановлено"); Исключение ПредставлениеОшибки = ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); ЗаписатьЖурналСканирования("LogFilePath", ПредставлениеОшибки, Истина); КонецПопытки; КонецПроцедуры Процедура ОповещениеПослеСозданияВременногоКаталогаДляПодключенияЛогФайлов(КаталогЖурналаСканирования, Контекст) Экспорт ИмяЛогФайла = КаталогЖурналаСканирования + ПолучитьРазделительПути() + "ImageScan.log"; ПодключаемыйМодуль = Контекст.ПодключаемыйМодуль; УстановитьИмяЛогФайла(ПодключаемыйМодуль, ИмяЛогФайла); РаботаСФайламиСлужебныйВызовСервера.УстановитьПараметрыНачалаЛогирования(ИмяЛогФайла); Если Контекст.ОповещениеПродолжения <> Неопределено Тогда ВыполнитьОбработкуОповещения(Контекст.ОповещениеПродолжения); КонецЕсли; КонецПроцедуры Процедура ЗаписатьЖурналСканирования(Событие, Комментарий = "", ЭтоОшибка = Ложь) Экспорт ЖурналРегистрацииКлиент.ДобавитьСообщениеДляЖурналаРегистрации( НСтр("ru='Сканирование изображений'", ОбщегоНазначенияКлиент.КодОсновногоЯзыка()) + "." + Событие, ?(ЭтоОшибка, "Ошибка", "Информация"), Комментарий,, Истина); КонецПроцедуры Процедура ПоказатьОшибкуСканирования(ПодключаемыйМодуль, Форма, Заголовок, ПодробноеПредставлениеОшибки, ТекстОшибки = "", РежимТребуетсяПомощь = Ложь) Экспорт ПараметрыОткрытияФормы = Новый Структура("Заголовок, ПодробноеПредставлениеОшибки", Заголовок, ПодробноеПредставлениеОшибки); ПараметрыОткрытияФормы.Вставить("ТекстОшибки", ТекстОшибки); ПараметрыОткрытияФормы.Вставить("ИмяУстройстваСканирования", Форма.ИмяУстройстваСканирования); Контекст = Новый Структура("РежимТребуетсяПомощь", РежимТребуетсяПомощь); ПослеЗакрытияФормыОшибки = Новый ОписаниеОповещения("ПослеЗакрытияФормыОшибки", Форма, Контекст); ОткрытьФорму("Обработка.Сканирование.Форма.ОшибкаСканирования", ПараметрыОткрытияФормы, Форма,,,, ПослеЗакрытияФормыОшибки); КонецПроцедуры Функция БылаОшибкаСканирования() Экспорт ПараметрыЗаданияСканирования = ОбщегоНазначенияВызовСервера.ХранилищеОбщихНастроекЗагрузить("КомпонентаСканирования", "ПараметрыЗаданияСканирования", Неопределено); Возврат ПараметрыЗаданияСканирования <> Неопределено; КонецФункции Процедура УдалитьОшибкуСканирования(ПодключаемыйМодуль, ОповещениеЗавершения = Неопределено, ОчиститьЖурналКомпоненты = Истина) Экспорт ОбщегоНазначенияВызовСервера.ХранилищеОбщихНастроекСохранить("КомпонентаСканирования", "ПараметрыЗаданияСканирования", Неопределено); ВключитьЛогированиеКомпоненты(ПодключаемыйМодуль, ОповещениеЗавершения, ОчиститьЖурналКомпоненты); КонецПроцедуры Процедура ПолучитьТехническуюИнформацию(ПодробноеПредставлениеОшибки, ОповещениеПослеПолученияТехническойИнформации) Экспорт Режим = РежимДиалогаВыбораФайла.Сохранение; ДиалогОткрытияФайла = Новый ДиалогВыбораФайла(Режим); ДиалогОткрытияФайла.ПолноеИмяФайла = НСтр("ru='Техническая информация'"); Фильтр = НСтр("ru = 'Отчет о проблеме'") + "(*.zip)|*.zip"; ДиалогОткрытияФайла.Фильтр = Фильтр; ДиалогОткрытияФайла.МножественныйВыбор = Ложь; ДиалогОткрытияФайла.Заголовок = НСтр("ru='Сохранение технической информации о проблеме'"); Если Не ДиалогОткрытияФайла.Выбрать() Тогда Возврат; КонецЕсли; МассивФайлов = ДиалогОткрытияФайла.ВыбранныеФайлы; Если МассивФайлов.Количество() = 0 Тогда Возврат; КонецЕсли; Контекст = Новый Структура(); Контекст.Вставить("ПодробноеПредставлениеОшибки", ПодробноеПредставлениеОшибки); Контекст.Вставить("ОповещениеПослеПолученияТехническойИнформации", ОповещениеПослеПолученияТехническойИнформации); Контекст.Вставить("ИмяФайла", МассивФайлов[0]); ОповещениеПослеСозданияВременногоКаталогаДляЛогФайлов = Новый ОписаниеОповещения("ПослеСозданияВременногоКаталогаДляЛогФайлов", ЭтотОбъект, Контекст); ФайловаяСистемаКлиент.СоздатьВременныйКаталог(ОповещениеПослеСозданияВременногоКаталогаДляЛогФайлов); КонецПроцедуры Процедура ПослеСозданияВременногоКаталогаДляЛогФайлов(ИмяКаталога, Контекст) Экспорт #Если Не ВебКлиент Тогда ПодробноеПредставлениеОшибки = Контекст.ПодробноеПредставлениеОшибки; ОповещениеПослеПолученияТехническойИнформации = Контекст.ОповещениеПослеПолученияТехническойИнформации; ИмяФайла = Контекст.ИмяФайла; КаталогВременныхФайлов = ИмяКаталога + ПолучитьРазделительПути(); ТехническаяИнформация = РаботаСФайламиСлужебныйВызовСервера.ТехническаяИнформация(); ФайлыДляУдаления = Новый Массив; ЗаписьZIP = Новый ЗаписьZipФайла(ИмяФайла); ИмяЛогФайла = ТехническаяИнформация.ИмяЛогФайла; Если ИмяЛогФайла = Неопределено Тогда ЗаписатьЖурналСканирования("ФайлКомпоненты", НСтр("ru='Не задано имя файла журнала компоненты сканирования.'"), Истина); Иначе ЛогФайл = Новый Файл(ИмяЛогФайла); ИмяЛогФайлаДляСохранения = ""; Если ЛогФайл.Существует() Тогда ИмяЛогФайлаДляСохранения = КаталогВременныхФайлов + "ImageScan.log"; ПереместитьФайл(ИмяЛогФайла, ИмяЛогФайлаДляСохранения); ЗаписьZIP.Добавить(ИмяЛогФайлаДляСохранения); Иначе ЗаписатьЖурналСканирования("ФайлКомпоненты", СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru='Файл журнала компоненты сканирования не существует. %1'"), ИмяЛогФайла), Истина); КонецЕсли; КонецЕсли; КонтекстИсходящий = Новый Структура; Контекст.Вставить("ЗаписьZIP", ЗаписьZIP); Контекст.Вставить("ФайлыДляУдаления", ФайлыДляУдаления); Контекст.Вставить("ПодробноеПредставлениеОшибки", ПодробноеПредставлениеОшибки); Контекст.Вставить("ОповещениеПослеПолученияТехническойИнформации", ОповещениеПослеПолученияТехническойИнформации); Контекст.Вставить("КаталогВременныхФайлов", КаталогВременныхФайлов); Контекст.Вставить("ТехническаяИнформация", ТехническаяИнформация); Текст = НСтр("ru = 'Информация о компьютере:'") + Символы.ПС; СисИнфо = Новый СистемнаяИнформация; ПрограммаПросмотра = СисИнфо.ИнформацияПрограммыПросмотра; Если Не ПустаяСтрока(ПрограммаПросмотра) Тогда ПрограммаПросмотра = Символы.ПС + НСтр("ru = 'Программа просмотра:'") + " " + ПрограммаПросмотра; КонецЕсли; Текст = Текст + НСтр("ru = 'Операционная система:'") + " " + СисИнфо.ВерсияОС + Символы.ПС + НСтр("ru = 'Версия приложения:'") + " " + СисИнфо.ВерсияПриложения + Символы.ПС + НСтр("ru = 'Тип платформы:'") + " " + СисИнфо.ТипПлатформы + ПрограммаПросмотра + Символы.ПС; Контекст.Вставить("ТекстСводнойИнформации", Текст); ОписаниеОповещения = Новый ОписаниеОповещения("СводнаяИнформацияПослеПолученияКомпоненты", ЭтотОбъект, Контекст); ПроинициализироватьКомпоненту(ОписаниеОповещения, Истина); #КонецЕсли КонецПроцедуры Процедура СводнаяИнформацияПослеПолученияКомпоненты(РезультатИнициализации, Контекст) Экспорт #Если Не ВебКлиент Тогда ТекстСводнойИнформации = Контекст.ТекстСводнойИнформации; ТехническаяИнформация = Контекст.ТехническаяИнформация; ФайлыДляУдаления = Контекст.ФайлыДляУдаления; ЗаписьZIP = Контекст.ЗаписьZIP; ИнформацияОКомпоненте = ""; ПодключаемыйМодуль = Неопределено; Если РезультатИнициализации.Подключено Тогда Попытка ПодключаемыйМодуль = РезультатИнициализации.ПодключаемыйМодуль; ВерсияКомпоненты = ПодключаемыйМодуль.Версия(); ИнформацияОКомпоненте = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = 'Версия компоненты %1: %2'"), "ImageScan", ВерсияКомпоненты); Исключение ЗаписатьЖурналСканирования("Версия", ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()), Истина); КонецПопытки; Иначе Возврат; КонецЕсли; ТекстСводнойИнформации = ТекстСводнойИнформации + Символы.ПС + ИнформацияОКомпоненте + Символы.ПС + Символы.ПС + НСтр("ru='Техническая информация'") + ":" + Символы.ПС + Контекст.ПодробноеПредставлениеОшибки + Символы.ПС + Символы.ПС; Если ОбщегоНазначенияКлиент.ИнформационнаяБазаФайловая() Тогда РежимРаботы = ?(ОбщегоНазначенияКлиент.КлиентПодключенЧерезВебСервер(), НСтр("ru = 'Файловый через веб'"), НСтр("ru = 'Файловый'")); Иначе РежимРаботы = НСтр("ru = 'Клиент-серверный'"); КонецЕсли; ТекстСводнойИнформации = ТекстСводнойИнформации + НСтр("ru = 'Режим работы информационной базы'")+ " - " + РежимРаботы; ИмяФайлаСводнойИнформации = Контекст.КаталогВременныхФайлов + "СводнаяИнформация.txt"; ТекстСводнойИнформации = ТекстСводнойИнформации + Символы.ПС +ТехническаяИнформация.ТехническаяИнформацияОВерсияхПодсистемИРасширениях + Символы.ПС; СводнаяИнформация = ПолучитьДвоичныеДанныеИзСтроки(ТекстСводнойИнформации); СводнаяИнформация.Записать(ИмяФайлаСводнойИнформации); ФайлыДляУдаления.Добавить(ИмяФайлаСводнойИнформации); ЗаписьZIP.Добавить(ИмяФайлаСводнойИнформации); ИмяФайлаЖурнала = Контекст.КаталогВременныхФайлов + "ЖурналРегистрации.xml"; ЖурналРегистрации = ТехническаяИнформация.ЖурналРегистрации; // ДвоичныеДанные ЖурналРегистрации.Записать(ИмяФайлаЖурнала); // АПК:287 ФайлыДляУдаления.Добавить(ИмяФайлаЖурнала); ЗаписьZIP.Добавить(ИмяФайлаЖурнала); КонтекстЗавершения = Новый Структура; КонтекстЗавершения.Вставить("ИмяФайлаСводнойИнформации", ИмяФайлаСводнойИнформации); КонтекстЗавершения.Вставить("ФайлыДляУдаления", Контекст.ФайлыДляУдаления); КонтекстЗавершения.Вставить("ОповещениеПослеПолученияТехническойИнформации", Контекст.ОповещениеПослеПолученияТехническойИнформации); ЗаписьZIP.Записать(); Для Каждого ФайлДляУдаления Из ФайлыДляУдаления Цикл УдалитьФайлы(ФайлДляУдаления); КонецЦикла; ОповещениеЗавершения = Новый ОписаниеОповещения("СводнаяИнформацияПослеПолученияКомпонентыИУдаленияОшибкиСканирования", ЭтотОбъект, Контекст); УдалитьОшибкуСканирования(ПодключаемыйМодуль, ОповещениеЗавершения); #КонецЕсли КонецПроцедуры Процедура СводнаяИнформацияПослеПолученияКомпонентыИУдаленияОшибкиСканирования(Результат, Контекст) Экспорт Если Контекст.ОповещениеПослеПолученияТехническойИнформации <> Неопределено Тогда ВыполнитьОбработкуОповещения(Контекст.ОповещениеПослеПолученияТехническойИнформации); КонецЕсли; КонецПроцедуры #Область УдалениеДанныхФайловИВерсий Процедура УдалитьДанные(ОбработчикЗавершения, ФайлИлиВерсия, УникальныйИдентификатор) Экспорт Если Не ЗначениеЗаполнено(ФайлИлиВерсия) Тогда Возврат; КонецЕсли; Контекст = Новый Структура; Контекст.Вставить("ФайлИлиВерсия", ФайлИлиВерсия); Контекст.Вставить("ОбработчикЗавершения", ОбработчикЗавершения); Контекст.Вставить("УникальныйИдентификатор", УникальныйИдентификатор); Если ТипЗнч(ФайлИлиВерсия) <> Тип("СправочникСсылка.ВерсииФайлов") Тогда ТекстВопроса = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Удалить файл %1 без возможности восстановления?'"), Строка(ФайлИлиВерсия)); ТекстЗаголовка = НСтр("ru = 'Удаление файла'"); Иначе ТекстВопроса = НСтр("ru = 'Удалить версию файла без возможности восстановления?'"); ТекстЗаголовка = НСтр("ru = 'Удаление версии файла'"); КонецЕсли; ПоказатьВопрос(Новый ОписаниеОповещения("УдалитьДанныеПослеОтветаНаВопрос", ЭтотОбъект, Контекст), ТекстВопроса, РежимДиалогаВопрос.ДаНет,, КодВозвратаДиалога.Нет, ТекстЗаголовка, КодВозвратаДиалога.Нет); КонецПроцедуры Процедура УдалитьДанныеПослеОтветаНаВопрос(Ответ, Контекст) Экспорт Если Ответ <> КодВозвратаДиалога.Да Тогда Возврат; КонецЕсли; Результат = РаботаСФайламиСлужебныйВызовСервера.РезультатУдаленияФайлов( ОбщегоНазначенияКлиентСервер.ЗначениеВМассиве(Контекст.ФайлИлиВерсия), Контекст.УникальныйИдентификатор); Результат = Результат[Контекст.ФайлИлиВерсия]; Если Результат.Файлы.Количество() > 0 Тогда Результат.Вставить("ИндексУдаляемогоФайла", 0); Результат.Вставить("ОбработчикЗавершения", Контекст.ОбработчикЗавершения); НачатьУдалениеФайлаИзКеша(Результат); Иначе ОповеститьОбУдаленииДанных(Контекст.ОбработчикЗавершения, Результат.ТекстПредупреждения); КонецЕсли; КонецПроцедуры Процедура НачатьУдалениеФайлаИзКеша(Контекст) Оповещение = Новый ОписаниеОповещения("ПослеУдаленияФайлаИзКеша", ЭтотОбъект, Контекст); УдалитьФайлИзРабочегоКаталога(Оповещение, Контекст.Файлы[Контекст.ИндексУдаляемогоФайла], Истина); КонецПроцедуры Процедура ПослеУдаленияФайлаИзКеша(РезультатУдаления, Контекст) Экспорт Если Контекст.ИндексУдаляемогоФайла < Контекст.Файлы.Количество() - 1 Тогда Контекст.ИндексУдаляемогоФайла = Контекст.ИндексУдаляемогоФайла + 1; НачатьУдалениеФайлаИзКеша(Контекст); Возврат; КонецЕсли; ОповеститьОбУдаленииДанных(Контекст.ОбработчикЗавершения, Контекст.ТекстПредупреждения) КонецПроцедуры Процедура ОповеститьОбУдаленииДанных(ОбработчикЗавершения, ТекстПредупреждения) Оповестить("Запись_Файл", ПараметрыОповещенияЗаписиФайла()); Если Не ПустаяСтрока(ТекстПредупреждения) Тогда ПоказатьПредупреждение(ОбработчикЗавершения, ТекстПредупреждения); ИначеЕсли ОбработчикЗавершения <> Неопределено Тогда ВыполнитьОбработкуОповещения(ОбработчикЗавершения); КонецЕсли; КонецПроцедуры Процедура ИзменитьОтборПоПометкеУдаления(Область, КнопкаКоманды) Экспорт КнопкаКоманды.Пометка = Не КнопкаКоманды.Пометка; ОбщегоНазначенияКлиентСервер.ИзменитьЭлементыОтбора(Область, "ПометкаУдаления", "СкрыватьПометкуУдаленияПоУмолчанию", Ложь, ВидСравненияКомпоновкиДанных.Равно, Не КнопкаКоманды.Пометка, РежимОтображенияЭлементаНастройкиКомпоновкиДанных.Недоступный); КонецПроцедуры Процедура УдалитьДанныеФайлов(ОбработчикЗавершения, ФайлыИлиВерсии, УникальныйИдентификатор) Экспорт Если ФайлыИлиВерсии.Количество() = 0 Тогда ВыполнитьОбработкуОповещения(ОбработчикЗавершения, Неопределено); КонецЕсли; Контекст = Новый Структура; Контекст.Вставить("ФайлыИлиВерсии", ФайлыИлиВерсии); Контекст.Вставить("ОбработчикЗавершения", ОбработчикЗавершения); Контекст.Вставить("УникальныйИдентификатор", УникальныйИдентификатор); ФайлИлиВерсия = ФайлыИлиВерсии[0]; Если ФайлыИлиВерсии.Количество() = 1 Тогда ТекстВопроса = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Удалить файл %1 без возможности восстановления?'"), Строка(ФайлИлиВерсия)); ТекстЗаголовка = НСтр("ru = 'Удаление файла'"); Иначе ТекстВопроса = НСтр("ru = 'Удалить файлы без возможности восстановления?'"); ТекстЗаголовка = НСтр("ru = 'Удаление файлов'"); КонецЕсли; ПоказатьВопрос(Новый ОписаниеОповещения("УдалитьДанныеФайловПослеОтветаНаВопрос", ЭтотОбъект, Контекст), ТекстВопроса, РежимДиалогаВопрос.ДаНет,, КодВозвратаДиалога.Нет, ТекстЗаголовка, КодВозвратаДиалога.Нет); КонецПроцедуры Процедура УдалитьДанныеФайловПослеОтветаНаВопрос(Ответ, Контекст) Экспорт Если Ответ <> КодВозвратаДиалога.Да Тогда Возврат; КонецЕсли; РезультатыУдаления = РаботаСФайламиСлужебныйВызовСервера.РезультатУдаленияФайлов( Контекст.ФайлыИлиВерсии, Контекст.УникальныйИдентификатор); Предупреждения = Новый Соответствие; Результат = Новый Структура("Файлы,ИндексУдаляемогоФайла,ОбработчикЗавершения,ТекстПредупреждения", Новый Массив, 0); Для Каждого РезультатУдаления Из РезультатыУдаления Цикл Если РезультатУдаления.Значение.Файлы.Количество() > 0 Тогда ОбщегоНазначенияКлиентСервер.ДополнитьМассив(Результат.Файлы, РезультатУдаления.Значение.Файлы); Иначе Предупреждения.Вставить(РезультатУдаления.Ключ, РезультатУдаления.Значение.ТекстПредупреждения); КонецЕсли; КонецЦикла; Если Результат.Файлы.Количество() > 0 Тогда Результат.Вставить("ИндексУдаляемогоФайла", 0); Результат.Вставить("ОбработчикЗавершения", Контекст.ОбработчикЗавершения); НачатьУдалениеФайлаИзКеша(Результат); КонецЕсли; Если Предупреждения.Количество() > 0 Тогда ТекстПредупреждения = ""; Для Каждого Предупреждение Из Предупреждения Цикл ТекстПредупреждения = ?(ТекстПредупреждения = "", "", Символы.ПС) + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru='%1: %2'"), Предупреждение.Ключ, Предупреждение.Значение); КонецЦикла; ОповеститьОбУдаленииДанных(Контекст.ОбработчикЗавершения, ТекстПредупреждения); КонецЕсли; КонецПроцедуры #КонецОбласти Процедура ПроверитьДоступностьКаталогаПослеСоздания(ИмяКаталогаТестовое, Контекст) Экспорт Оповещение = Новый ОписаниеОповещения("ПроверитьДоступностьКаталогаПослеУдаления", ЭтотОбъект, Контекст, "ПроверитьДоступностьКаталогаОшибкаУдаления", ЭтотОбъект); НачатьУдалениеФайлов(Оповещение, ИмяКаталогаТестовое); КонецПроцедуры Функция РезультатПроверкиДоступностиКаталога() Результат = Новый Структура; Результат.Вставить("Успешно", Ложь); Результат.Вставить("Добавление", Ложь); Результат.Вставить("Удаление", Ложь); Результат.Вставить("ИнформацияОбОшибке"); Возврат Результат; КонецФункции Процедура ПроверитьДоступностьКаталогаПослеУдаления(Контекст) Экспорт Результат = РезультатПроверкиДоступностиКаталога(); Результат.Успешно = Истина; Результат.Добавление = Истина; Результат.Удаление = Истина; ВыполнитьОбработкуОповещения(Контекст.ОповещениеРезультата, Результат); КонецПроцедуры Процедура ПроверитьДоступностьКаталогаОшибкаСоздания(ИнформацияОбОшибке, СтандартнаяОбработка, Контекст) Экспорт Результат = РезультатПроверкиДоступностиКаталога(); Результат.ИнформацияОбОшибке = ИнформацияОбОшибке; СтандартнаяОбработка = Ложь; ВыполнитьОбработкуОповещения(Контекст.ОповещениеРезультата, Результат); КонецПроцедуры Процедура ПроверитьДоступностьКаталогаОшибкаУдаления(ИнформацияОбОшибке, СтандартнаяОбработка, Контекст) Экспорт Результат = РезультатПроверкиДоступностиКаталога(); Результат.Добавление = Истина; Результат.ИнформацияОбОшибке = ИнформацияОбОшибке; СтандартнаяОбработка = Ложь; ВыполнитьОбработкуОповещения(Контекст.ОповещениеРезультата, Результат); КонецПроцедуры #КонецОбласти