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