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