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