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