Настройки новостей / Настройки показа новостей / Модуль формы

файл
///////////////////////////////////////////////////////////////////////////////////////////////////////
// Copyright (c) 2023, ООО 1С-Софт
// Все права защищены. Эта программа и сопроводительные материалы предоставляются 
// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0)
// Текст лицензии доступен по ссылке:
// https://creativecommons.org/licenses/by/4.0/legalcode
///////////////////////////////////////////////////////////////////////////////////////////////////////

#Область ОписаниеПеременных

&НаКлиенте
Перем КартинкиСпособовОповещений;

&НаКлиенте
Перем СпособыОповещений;

#КонецОбласти

#Область ОбработчикиСобытийФормы

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)

	ТипСтруктура      = Тип("Структура");
	ТипСписокЗначений = Тип("СписокЗначений");

	// В конфигурации есть общие реквизиты с разделением и включена ФО РаботаВМоделиСервиса.
	Если (ОбщегоНазначения.РазделениеВключено())
			// Зашли в конфигурацию под пользователем без разделения (АдминистраторСистемы или фоновое задание (пустой пользователь)).
			И (ИнтернетПоддержкаПользователей.СеансЗапущенБезРазделителей()) Тогда
		Отказ = Истина;
		СтандартнаяОбработка = Ложь;
		Возврат;
	КонецЕсли;

	Если Параметры.ТекущийПользователь.Пустая()
			ИЛИ (ПравоДоступа("СохранениеДанныхПользователя", Метаданные) = Ложь) Тогда
		ЭтотОбъект.ТекущийПользователь = Пользователи.ТекущийПользователь();
	Иначе
		ЭтотОбъект.ТекущийПользователь = Параметры.ТекущийПользователь;
	КонецЕсли;

	// Настроить видимость кнопки ЛентыНовостейКомандаНастроитьОтборы.
	// По-умолчанию (если не настроено в регистре) - скрыта.
	// Если это администратор (ПолныеПрава) настраивает права другим пользователям, то показывать кнопку.
	Если ОбработкаНовостейПовтИсп.ЕстьРольПолныеПрава() Тогда
		Элементы.ЛентыНовостейКомандаНастроитьОтборы.Видимость = Истина;
		Элементы.ЛентыНовостейМенюКомандаНастроитьОтборы.Видимость = Истина;
	Иначе
		Запись = РегистрыСведений.НастройкиПользователейБИП.СоздатьМенеджерЗаписи();
		Запись.Пользователь = ЭтотОбъект.ТекущийПользователь;
		Запись.Прочитать();
		Если Запись.Выбран() Тогда
			Элементы.ЛентыНовостейКомандаНастроитьОтборы.Видимость = Запись.РазрешенаНастройкаОтборов;
			Элементы.ЛентыНовостейМенюКомандаНастроитьОтборы.Видимость = Запись.РазрешенаНастройкаОтборов;
		Иначе
			Элементы.ЛентыНовостейКомандаНастроитьОтборы.Видимость = Ложь;
			Элементы.ЛентыНовостейМенюКомандаНастроитьОтборы.Видимость = Ложь;
		КонецЕсли;
	КонецЕсли;

	ИмяПользователяИБ = "";
	Если ЭтотОбъект.ТекущийПользователь <> Пользователи.ТекущийПользователь() Тогда
		ИмяПользователяИБ = ОбработкаНовостейПовтИсп.ПолучитьИмяПользователяИБ(ЭтотОбъект.ТекущийПользователь);
	КонецЕсли;

	// Здесь возможно получение настроек для другого (не текущего) пользователя.
	// Поэтому используется чтение напрямую, а не ОбработкаНовостейСлужебный.ПолучитьНастройкиПоказаНовостейНастроенныеАдминистратором.
	НастройкиПоказаНовостейНастроенныеАдминистратором = ХранилищаНастроек.НастройкиНовостей.Загрузить(
		"НастройкиПоказаНовостейНастроенныеАдминистратором",
		,
		,
		ИмяПользователяИБ); // ИмяПользователя

	Если ТипЗнч(НастройкиПоказаНовостейНастроенныеАдминистратором) = ТипСтруктура Тогда
		НастройкиПоказаНовостейНастроенныеАдминистраторомЭталон = Новый Структура;
			НастройкиПоказаНовостейНастроенныеАдминистраторомЭталон.Вставить("СписокНовостей_ИнтервалАвтообновления", 360);
		ЗаполнитьЗначенияСвойств(НастройкиПоказаНовостейНастроенныеАдминистраторомЭталон, НастройкиПоказаНовостейНастроенныеАдминистратором);
		ЭтотОбъект.СписокНовостей_ИнтервалАвтообновления = НастройкиПоказаНовостейНастроенныеАдминистраторомЭталон.СписокНовостей_ИнтервалАвтообновления;
		Если (ЭтотОбъект.СписокНовостей_ИнтервалАвтообновления < 1)
				ИЛИ (ЭтотОбъект.СписокНовостей_ИнтервалАвтообновления > 999999) Тогда
			ЭтотОбъект.СписокНовостей_ИнтервалАвтообновления = 360;
		КонецЕсли;
	КонецЕсли;
	Если ЭтотОбъект.СписокНовостей_ИнтервалАвтообновления % (60*24*7) = 0 Тогда // 1 раз в неделю
		ЭтотОбъект.СписокНовостей_ИнтервалАвтообновления_Представление = НСтр("ru='Список новостей обновляется еженедельно'");
	ИначеЕсли ЭтотОбъект.СписокНовостей_ИнтервалАвтообновления % (60*24) = 0 Тогда // 1 раз в день
		ЭтотОбъект.СписокНовостей_ИнтервалАвтообновления_Представление = НСтр("ru='Список новостей обновляется ежедневно'");
	ИначеЕсли ЭтотОбъект.СписокНовостей_ИнтервалАвтообновления % 60 = 0 Тогда // Кратно часу
		Если ЭтотОбъект.СписокНовостей_ИнтервалАвтообновления = 60 Тогда
			ЭтотОбъект.СписокНовостей_ИнтервалАвтообновления_Представление = НСтр("ru='Список новостей обновляется ежечасно'");
		Иначе
			ЭтотОбъект.СписокНовостей_ИнтервалАвтообновления_Представление = НСтр("ru='Список новостей обновляется каждые несколько часов'");
		КонецЕсли;
	Иначе
		ЭтотОбъект.СписокНовостей_ИнтервалАвтообновления_Представление =
			СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
				НСтр("ru='Список новостей обновляется каждые %1 минут'"),
				ЭтотОбъект.СписокНовостей_ИнтервалАвтообновления);
	КонецЕсли;
	Элементы.СписокНовостей_ИнтервалАвтообновления_Представление.Подсказка = ""
		+ ЭтотОбъект.СписокНовостей_ИнтервалАвтообновления + " " + НСтр("ru = 'минут'");

	// Здесь возможно получение настроек для другого (не текущего) пользователя.
	НастройкиПоказаНовостей = ХранилищаНастроек.НастройкиНовостей.Загрузить(
		"НастройкиПоказаНовостей",
		,
		,
		ИмяПользователяИБ); // ИмяПользователя

	ЭтотОбъект.ОтборНовостей_ТолькоАктивные    = НастройкиПоказаНовостей.ОтборНовостей_ТолькоАктивные;
	ЭтотОбъект.Форма_РазмещениеПанелей         = НастройкиПоказаНовостей.Форма_РазмещениеПанелей;
	ЭтотОбъект.ОтображаемыеНовости_Вариант     = НастройкиПоказаНовостей.ОтображаемыеНовости_Вариант;
	ЭтотОбъект.ОтображаемыеНовости_Количество  = НастройкиПоказаНовостей.ОтображаемыеНовости_Количество;
	ЭтотОбъект.ОтображаемыеНовости_ПериодЧасов = НастройкиПоказаНовостей.ОтображаемыеНовости_ПериодЧасов;

	// 1. Заполнить список лент новостей с отборами.

	// 1.1. Заполнить основной список лент новостей (колонки: ЛентаНовостей, ОбязательныйКанал).
	// 1.2. Здесь же: заполнить выделенность (колонка Пометка).
	// Ленты новостей формируются по такому принципу:
	// - берутся все ленты новостей, не помеченные на удаление;
	// - берутся ленты новостей, по умолчанию НЕвидимые для всех с исключением по текущему пользователю (для него - видимы);
	// - берутся ленты новостей, по умолчанию видимые для всех и текущего пользователя нет в исключениях.
	// Далее, в них галочкой (показывать) отмечаются:
	// - все "обязательные" ленты новостей;
	// - все остальные, кроме явно отключенных в настройке отбора "КлючНастроек".

	// В ОтборыПоЛентамНовостейПользовательские будет гарантированно правильная таблица значений - за это отвечает
	//  модуль менеджера ХранилищаНастроек.НастройкиНовостей.
	// Здесь возможно получение настроек для другого (не текущего) пользователя.
	лкОтборыПоЛентамНовостейПользовательские = ХранилищаНастроек.НастройкиНовостей.Загрузить(
		"ОтборыПоЛентамНовостейПользовательские", // КлючОбъекта
		ЭтотОбъект.КлючНастроек, // КлючНастроек
		,
		ИмяПользователяИБ); // ИмяПользователя

	лкОтборыПоЛентамНовостейГлобальные = ХранилищаНастроек.НастройкиНовостей.Загрузить(
		"ОтборыПоЛентамНовостейНастроенныеАдминистратором", // КлючОбъекта
		"", // КлючНастроек, для этого ключа объекта не заполняется
		,
		""); // ИмяПользователя

	// Здесь возможно получение настроек для другого (не текущего) пользователя.
	ЛентыНовостейВсеНастройки = ХранилищаНастроек.НастройкиНовостей.Загрузить(
		"ЛентыНовостейВсеНастройки", // КлючОбъекта
		ЭтотОбъект.КлючНастроек, // КлючНастроек
		,
		ИмяПользователяИБ); // ИмяПользователя

	// Здесь возможно получение настроек для другого (не текущего) пользователя.
	ТаблицаВидимостиЛентНовостей = ХранилищаНастроек.НастройкиНовостей.Загрузить(
		"ВидимостьЛентНовостей", // КлючОбъекта
		"", // КлючНастроек, для этого ключа объекта не заполняется
		,
		ИмяПользователяИБ); // ИмяПользователя

	ЭтотОбъект.ЛентыНовостей.Очистить();
	Для каждого ТекущаяЛентаНовостей Из ТаблицаВидимостиЛентНовостей Цикл
		Если ТекущаяЛентаНовостей.Видимость = Истина Тогда
			НайденнаяНастройка = Неопределено;
			Для Каждого ТекущаяНастройка Из ЛентыНовостейВсеНастройки Цикл
				Если ТекущаяНастройка.ЛентаНовостей = ТекущаяЛентаНовостей.ЛентаНовостей Тогда
					НайденнаяНастройка = ТекущаяНастройка;
					Прервать;
				КонецЕсли;
			КонецЦикла;

			// Пометка - искать в Настройках.
			СпособОповещения = Перечисления.СпособыОповещенияПользователяОНовостях.ПоУмолчанию;
			Пометка          = Ложь;
			Если (НайденнаяНастройка <> Неопределено) Тогда
				Пометка = (НайденнаяНастройка.ПодпискаПринудительно = "Подписан")
						ИЛИ (НайденнаяНастройка.ПодпискаСамостоятельно = "Подписан");
				// {При добавлении способов оповещения исправлять здесь}.
				Если НЕ Пометка Тогда
					СпособОповещения = Перечисления.СпособыОповещенияПользователяОНовостях.Отключено;
				Иначе
					СпособОповещения = НайденнаяНастройка.СпособОповещения;
				КонецЕсли;
			КонецЕсли;

			НоваяСтрока = ЭтотОбъект.ЛентыНовостей.Добавить();
				НоваяСтрока.ЛентаНовостей                = ТекущаяЛентаНовостей.ЛентаНовостей;
				НоваяСтрока.Пометка                      = Пометка;
				НоваяСтрока.ПредставлениеОтборовКратко   = ""; // Заполнится потом
				НоваяСтрока.ПредставлениеОтборовПодробно = ""; // Заполнится потом
				НоваяСтрока.КоличествоВсехОтборов        = 0; // Заполнится потом
				НоваяСтрока.КоличествоДоступныхОтборов   = 0; // Заполнится потом
				// НоваяСтрока.ТаблицаКатегорийДляНастройкиОтборов - Заполнится потом.
				НоваяСтрока.ОбязательныйКанал            = ТекущаяЛентаНовостей.ОбязательныйКанал;
				НоваяСтрока.СпособОповещения             = СпособОповещения;
				НоваяСтрока.СпособОповещенияИконка       = ПолучитьКартинкуСпособаОповещения(
					НоваяСтрока.СпособОповещения,
					НоваяСтрока.ОбязательныйКанал);
		КонецЕсли;
	КонецЦикла;
	ЭтотОбъект.ЛентыНовостей.Сортировать("ЛентаНовостей");

	// Дозаполнить способом оповещения.
	// Здесь возможно получение настроек для другого (не текущего) пользователя.
	ЛентыНовостейВсеНастройки = ХранилищаНастроек.НастройкиНовостей.Загрузить(
		"ЛентыНовостейВсеНастройки", // КлючОбъекта
		, // По всем лентам новостей
		,
		ИмяПользователяИБ); // ИмяПользователя

	Для Каждого ТекущаяЛентаНовостей Из ЭтотОбъект.ЛентыНовостей Цикл
		Для Каждого ТекущаяНастройкаЛентыНовостей Из ЛентыНовостейВсеНастройки Цикл
			Если ТекущаяЛентаНовостей.ЛентаНовостей = ТекущаяНастройкаЛентыНовостей.ЛентаНовостей Тогда
				Если НЕ ТекущаяЛентаНовостей.ОбязательныйКанал Тогда // Запрещено изменять способ оповещения для обязательного канала.
					ТекущаяЛентаНовостей.СпособОповещения = ТекущаяЛентаНовостей.СпособОповещения;
				КонецЕсли;
			КонецЕсли;
		КонецЦикла;
	КонецЦикла;

	// Загрузить отборы по лентам новостей в ЭтотОбъект.ОтборыПоЛентамНовостейПользовательские.
	// 2.1. Заполнить глобальные отборы (реквизит-таблица ОтборыПоЛентамНовостейГлобальные).

	ЭтотОбъект.ОтборыПоЛентамНовостейГлобальные.Очистить();
	ВременнаяТаблица = лкОтборыПоЛентамНовостейГлобальные.Скопировать(, "ЛентаНовостей, КатегорияНовостей");
	ВременнаяТаблица.Свернуть("ЛентаНовостей, КатегорияНовостей");
	ЭтотОбъект.ОтборыПоЛентамНовостейГлобальные.Загрузить(ВременнаяТаблица.Скопировать());
	ЭтотОбъект.ОтборыПоЛентамНовостейГлобальные.Сортировать("ЛентаНовостей");
	Для каждого ТекущийОтборПоЛентамНовостейГлобальный Из ЭтотОбъект.ОтборыПоЛентамНовостейГлобальные Цикл
		НайденныеЗначенияОтборов = лкОтборыПоЛентамНовостейГлобальные.НайтиСтроки(
			Новый Структура("ЛентаНовостей, КатегорияНовостей",
				ТекущийОтборПоЛентамНовостейГлобальный.ЛентаНовостей,
				ТекущийОтборПоЛентамНовостейГлобальный.КатегорияНовостей));
		Если НайденныеЗначенияОтборов.Количество() > 0 Тогда
			Для каждого ТекущееЗначенияОтбора Из НайденныеЗначенияОтборов Цикл
				ТекущийОтборПоЛентамНовостейГлобальный.СписокЗначенийОтборов.Добавить(ТекущееЗначенияОтбора.ЗначениеКатегорииНовостей);
			КонецЦикла;
		КонецЕсли;
	КонецЦикла;

	// 2.2. Заполнить пользовательские отборы (реквизит-таблица ОтборыПоЛентамНовостейПользовательские).
	ЭтотОбъект.ОтборыПоЛентамНовостейПользовательские.Очистить();
	ВременнаяТаблица = лкОтборыПоЛентамНовостейПользовательские.Скопировать(, "ЛентаНовостей, КатегорияНовостей");
	ВременнаяТаблица.Свернуть("ЛентаНовостей, КатегорияНовостей");
	ЭтотОбъект.ОтборыПоЛентамНовостейПользовательские.Загрузить(ВременнаяТаблица.Скопировать());
	ЭтотОбъект.ОтборыПоЛентамНовостейПользовательские.Сортировать("ЛентаНовостей");
	Для каждого ТекущийОтборПоЛентамНовостей Из ЭтотОбъект.ОтборыПоЛентамНовостейПользовательские Цикл
		НайденныеЗначенияОтборов = лкОтборыПоЛентамНовостейПользовательские.НайтиСтроки(
			Новый Структура("ЛентаНовостей, КатегорияНовостей",
				ТекущийОтборПоЛентамНовостей.ЛентаНовостей,
				ТекущийОтборПоЛентамНовостей.КатегорияНовостей));
		Если НайденныеЗначенияОтборов.Количество() > 0 Тогда
			Для каждого ТекущееЗначенияОтбора Из НайденныеЗначенияОтборов Цикл
				ТекущийОтборПоЛентамНовостей.СписокЗначенийОтборов.Добавить(ТекущееЗначенияОтбора.ЗначениеКатегорииНовостей);
			КонецЦикла;
		КонецЕсли;
	КонецЦикла;

	// 3.1. Заполнить доступные отборы по категориям в реквизите-таблице ЛентыНовостей (таблица ЛентыНовостей, колонки КоличествоВсехОтборов, КоличествоДоступныхОтборов, ТаблицаКатегорийДляНастройкиОтборов).
	//  Колонки ПредставлениеОтборовКратко и ПредставлениеОтборовПодробно заполняются процедурой ОбновитьНадписиОтборовДляЛентыНовостей.

	// Список доступных для отбора категорий новостей по каждой ленте новостей.
	Запрос = Новый Запрос;
	Запрос.Текст = "
		|ВЫБРАТЬ
		|	Спр.Ссылка КАК ЛентаНовостей,
		|	Спр.ДоступныеКатегорииНовостей.(
		|		КатегорияНовостей КАК КатегорияНовостей,
		|		КатегорияНовостей.ЗаполняетсяАвтоматически КАК ЗаполняетсяАвтоматически,
		|		РазрешеноНастраиватьПользователям КАК РазрешеноНастраиватьПользователям
		|	) КАК ДоступныеКатегорииНовостей
		|ИЗ
		|	Справочник.ЛентыНовостей КАК Спр
		|";

	Результат = Запрос.Выполнить();
	Если НЕ Результат.Пустой() Тогда
		Выборка = Результат.Выбрать(ОбходРезультатаЗапроса.Прямой);
		Пока Выборка.Следующий() Цикл
			НайденныеСтроки = ЭтотОбъект.ЛентыНовостей.НайтиСтроки(Новый Структура("ЛентаНовостей", Выборка.ЛентаНовостей));
			Если НайденныеСтроки.Количество() >= 1 Тогда
				НайденныеСтроки[0].ТаблицаКатегорийДляНастройкиОтборов.Очистить();
				Если НЕ Выборка.ДоступныеКатегорииНовостей.Пустой() Тогда
					ВыборкаКатегорийНовостей = Выборка.ДоступныеКатегорииНовостей.Выбрать(ОбходРезультатаЗапроса.Прямой);
					Пока ВыборкаКатегорийНовостей.Следующий() Цикл
						НоваяСтрока = НайденныеСтроки[0].ТаблицаКатегорийДляНастройкиОтборов.Добавить();
						НоваяСтрока.КатегорияНовостей                 = ВыборкаКатегорийНовостей.КатегорияНовостей;
						НоваяСтрока.РазрешеноНастраиватьПользователям = ВыборкаКатегорийНовостей.РазрешеноНастраиватьПользователям;
						НоваяСтрока.ЗаполняетсяАвтоматически          = ВыборкаКатегорийНовостей.ЗаполняетсяАвтоматически;
						Если НоваяСтрока.ЗаполняетсяАвтоматически = Истина Тогда
							лкЗначениеАвтоматическогоЗаполнения =
								ОбработкаНовостейПовтИсп.ПолучитьЗначениеПредопределеннойКатегории(НоваяСтрока.КатегорияНовостей);
							Если ТипЗнч(лкЗначениеАвтоматическогоЗаполнения) = ТипСписокЗначений Тогда
								// Взять последнее значение.
								Если лкЗначениеАвтоматическогоЗаполнения.Количество() > 0 Тогда
									лкЗначениеАвтоматическогоЗаполнения = лкЗначениеАвтоматическогоЗаполнения.Получить(лкЗначениеАвтоматическогоЗаполнения.Количество() - 1).Значение;
								Иначе
									// Не может возвращаться пустой список значений.
									лкЗначениеАвтоматическогоЗаполнения = "";
								КонецЕсли;
							КонецЕсли;
							НоваяСтрока.ЗначениеАвтоматическогоЗаполнения = лкЗначениеАвтоматическогоЗаполнения;
						Иначе
							НоваяСтрока.ЗначениеАвтоматическогоЗаполнения = "";
						КонецЕсли;
					КонецЦикла;
				КонецЕсли;
				// Количество всех отборов - количество всех строк табличной части ЛентаНовостей.ДоступныеКатегорииНовостей.
				НайденныеСтроки[0].КоличествоВсехОтборов = НайденныеСтроки[0].ТаблицаКатегорийДляНастройкиОтборов.Количество(); // Всех отборов, включая запрещенных администратором для настройки и заполняемых автоматически
				// Количество доступных отборов - количество всех строк табличной части ЛентаНовостей.ДоступныеКатегорииНовостей минус
				//   запрещенные для отбора (РазрешеноНастраиватьПользователям = ЛОЖЬ) минус заполняемые автоматически (ЗаполняетсяАвтоматически = ИСТИНА).
				НайденныеРазрешенныеОтборы = НайденныеСтроки[0].ТаблицаКатегорийДляНастройкиОтборов.НайтиСтроки(
					Новый Структура("РазрешеноНастраиватьПользователям, ЗаполняетсяАвтоматически",
						Истина,
						Ложь));
				НайденныеСтроки[0].КоличествоДоступныхОтборов = НайденныеРазрешенныеОтборы.Количество();
			КонецЕсли;
		КонецЦикла;
	Иначе
		Для каждого ТекущаяЛентаНовостей Из ЭтотОбъект.ЛентыНовостей Цикл
			ТекущаяЛентаНовостей.ТаблицаКатегорийДляНастройкиОтборов.Очистить();
			ТекущаяЛентаНовостей.КоличествоВсехОтборов      = 0;
			ТекущаяЛентаНовостей.КоличествоДоступныхОтборов = 0;
		КонецЦикла;
	КонецЕсли;

	// Обновить надписи отборов для лент новостей.
	ОбновитьНадписиОтборовДляЛентыНовостей();

	// Должно совпадать с Процедура ОтображаемыеНовости_ВариантПриИзменении(Элемент).
	Если ЭтотОбъект.ОтображаемыеНовости_Вариант = "Все" Тогда
		Элементы.СтраницыКоличествоОтображаемыхНовостей.ТекущаяСтраница = Элементы.СтраницаКоличествоОтображаемыхНовостейВсе;
	ИначеЕсли ЭтотОбъект.ОтображаемыеНовости_Вариант = "Количество" Тогда
		Элементы.СтраницыКоличествоОтображаемыхНовостей.ТекущаяСтраница = Элементы.СтраницаКоличествоОтображаемыхНовостейКоличество;
	Иначе
		Элементы.СтраницыКоличествоОтображаемыхНовостей.ТекущаяСтраница = Элементы.СтраницаКоличествоОтображаемыхНовостейПериод;
	КонецЕсли;

	БылиИзмененияОтборов = Ложь;

	Если ЭтотОбъект.ТекущийПользователь <> Пользователи.ТекущийПользователь() Тогда
		ЭтотОбъект.Заголовок =
			СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
				НСтр("ru='Настройки отображения новостей (%1)'"),
				ЭтотОбъект.ТекущийПользователь);
	КонецЕсли;

	УстановитьУсловноеОформление();

	Если ОбщегоНазначения.ЭтоВебКлиент() Тогда
		Элементы.ЛентыНовостейКонтекстноеМенюКомандаЭкспортироватьСписокЛентНовостейВФайлФорматаOPML.Видимость = Ложь;
	КонецЕсли;

	// {При добавлении способов оповещения исправлять здесь}.
	КартинкиСпособовОповещений = Новый Соответствие;
		КартинкиСпособовОповещений.Вставить(
			Истина,
			БиблиотекаКартинок.НовостиОповещенияВключеныВсегда);
		КартинкиСпособовОповещений.Вставить(
			Перечисления.СпособыОповещенияПользователяОНовостях.ПоУмолчанию,
			БиблиотекаКартинок.НовостиОповещенияВключены);
		КартинкиСпособовОповещений.Вставить(
			Перечисления.СпособыОповещенияПользователяОНовостях.СистемаВзаимодействия,
			БиблиотекаКартинок.НовостиОповещенияСистемаВзаимодействия);
		КартинкиСпособовОповещений.Вставить(
			Перечисления.СпособыОповещенияПользователяОНовостях.Отключено,
			БиблиотекаКартинок.НовостиОповещенияОтключены);

	СпособыОповещений = Новый Соответствие;
		СпособыОповещений.Вставить("ПустаяСсылка", Перечисления.СпособыОповещенияПользователяОНовостях.ПустаяСсылка());
		СпособыОповещений.Вставить("ПоУмолчанию" , Перечисления.СпособыОповещенияПользователяОНовостях.ПоУмолчанию);
		СпособыОповещений.Вставить("Отключено"   , Перечисления.СпособыОповещенияПользователяОНовостях.Отключено);

	Если Параметры.Страница = "СтраницаЛентыНовостей" Тогда
		Элементы.ГруппаСтраницы.ТекущаяСтраница = Элементы.СтраницаЛентыНовостей;
		Для Каждого ТекущаяСтрока Из ЛентыНовостей Цикл
			Если ТекущаяСтрока.ЛентаНовостей = Параметры.ЛентаНовостей Тогда
				Элементы.ЛентыНовостей.ТекущаяСтрока = ТекущаяСтрока.ПолучитьИдентификатор();
				Прервать;
			КонецЕсли;
		КонецЦикла;
	КонецЕсли;

	ДанныеДляПередачиНаКлиента = Новый Структура;
		ДанныеДляПередачиНаКлиента.Вставить("КартинкиСпособовОповещений"    , КартинкиСпособовОповещений);
		ДанныеДляПередачиНаКлиента.Вставить("СпособыОповещений"             , СпособыОповещений);
		ДанныеДляПередачиНаКлиента.Вставить("СпособыОповещений_ПустаяСсылка", Перечисления.СпособыОповещенияПользователяОНовостях.ПустаяСсылка());

КонецПроцедуры

&НаКлиенте
Процедура ПриОткрытии(Отказ)

	#Если МобильныйКлиент Тогда
		Отказ = Истина;
	#КонецЕсли

	КартинкиСпособовОповещений     = ДанныеДляПередачиНаКлиента.КартинкиСпособовОповещений;
	СпособыОповещений              = ДанныеДляПередачиНаКлиента.СпособыОповещений;
	СпособыОповещений_ПустаяСсылка = ДанныеДляПередачиНаКлиента.СпособыОповещений_ПустаяСсылка;
	ДанныеДляПередачиНаКлиента = Неопределено;

	Элементы.ЛентыНовостейСпособОповещения.СписокВыбора.Очистить();
	Для Каждого ТекущийСпособОповещения Из СпособыОповещений Цикл
		Если ТекущийСпособОповещения.Значение <> СпособыОповещений_ПустаяСсылка Тогда
			Элементы.ЛентыНовостейСпособОповещения.СписокВыбора.Добавить(ТекущийСпособОповещения.Значение);
		КонецЕсли;
	КонецЦикла;

КонецПроцедуры

#КонецОбласти

#Область ОбработчикиСобытийЭлементовШапкиФормы

&НаКлиенте
Процедура ОтображаемыеНовости_ВариантПриИзменении(Элемент)

	// Должно совпадать с Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка).
	Если ЭтотОбъект.ОтображаемыеНовости_Вариант = "Все" Тогда
		Элементы.СтраницыКоличествоОтображаемыхНовостей.ТекущаяСтраница = Элементы.СтраницаКоличествоОтображаемыхНовостейВсе;
	ИначеЕсли ЭтотОбъект.ОтображаемыеНовости_Вариант = "Количество" Тогда
		Элементы.СтраницыКоличествоОтображаемыхНовостей.ТекущаяСтраница = Элементы.СтраницаКоличествоОтображаемыхНовостейКоличество;
	Иначе
		Элементы.СтраницыКоличествоОтображаемыхНовостей.ТекущаяСтраница = Элементы.СтраницаКоличествоОтображаемыхНовостейПериод;
	КонецЕсли;

КонецПроцедуры

#КонецОбласти

#Область ОбработчикиСобытийЭлементовТаблицыФормы_ЛентыНовостей

&НаКлиенте
Процедура ЛентыНовостейПометкаПриИзменении(Элемент)

	ЛентыНовостейПриАктивизацииСтроки(Элемент);

КонецПроцедуры

&НаКлиенте
Процедура ЛентыНовостейПриАктивизацииСтроки(Элемент)

	ТекущиеДанные = Элементы.ЛентыНовостей.ТекущиеДанные;
	Если ТекущиеДанные = Неопределено Тогда
		Элементы.ЛентыНовостейКомандаНастроитьОтборы.Доступность     = Ложь;
		Элементы.ЛентыНовостейМенюКомандаНастроитьОтборы.Доступность = Ложь;
		Возврат;
	КонецЕсли;

	Если ТекущиеДанные.Пометка
			И ТекущиеДанные.КоличествоДоступныхОтборов > 0 Тогда
		Элементы.ЛентыНовостейКомандаНастроитьОтборы.Доступность     = Истина;
		Элементы.ЛентыНовостейМенюКомандаНастроитьОтборы.Доступность = Истина;
	Иначе
		Элементы.ЛентыНовостейКомандаНастроитьОтборы.Доступность     = Ложь;
		Элементы.ЛентыНовостейМенюКомандаНастроитьОтборы.Доступность = Ложь;
	КонецЕсли;

	Если НЕ ТекущиеДанные.Пометка Тогда // Отключили ленту новостей = отключили по ней оповещения.
		ТекущиеДанные.СпособОповещения = СпособыОповещений.Получить("Отключено");
		ТекущиеДанные.СпособОповещенияИконка = ПолучитьКартинкуСпособаОповещенияНаКлиенте(
			ТекущиеДанные.СпособОповещения,
			ТекущиеДанные.ОбязательныйКанал);
	КонецЕсли;

КонецПроцедуры

&НаКлиенте
Процедура ЛентыНовостейВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка)

	Если Поле.Имя = "ЛентыНовостейПредставлениеОтборовКратко" Тогда
		СтандартнаяОбработка = Ложь; // Чтобы строка не переходила в режим редактирования
		КомандаНастроитьОтборы(Неопределено);
	КонецЕсли;

КонецПроцедуры

&НаКлиенте
Процедура ЛентыНовостейПредставлениеОтборовКраткоНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)

	СтандартнаяОбработка = Ложь;
	КомандаНастроитьОтборы(Неопределено);

КонецПроцедуры

&НаКлиенте
Процедура ЛентыНовостейСпособОповещенияПриИзменении(Элемент)

	ТекущиеДанные = Элементы.ЛентыНовостей.ТекущиеДанные;
	Если ТекущиеДанные = Неопределено Тогда
		Возврат;
	КонецЕсли;

	Если ТекущиеДанные.СпособОповещения.Пустая() Тогда
		ТекущиеДанные.СпособОповещения = СпособыОповещений.Получить("ПоУмолчанию");
	КонецЕсли;

	ТекущиеДанные.СпособОповещенияИконка = ПолучитьКартинкуСпособаОповещенияНаКлиенте(
		ТекущиеДанные.СпособОповещения,
		ТекущиеДанные.ОбязательныйКанал);

КонецПроцедуры

#КонецОбласти

#Область ОбработчикиКомандФормы

&НаКлиенте
Процедура КомандаОК(Команда)

	// Данные для передачи владельцу.
	Результат = ПодготовитьСтруктуруДляВозвратаПоОКИСохранитьНастройки();

	Отказ = Ложь;
	ИнтеграцияПодсистемБИПКлиент.ПослеЗаписиПользовательскихНастроек(Результат, Отказ);
	ОбработкаНовостейКлиентПереопределяемый.ПослеЗаписиПользовательскихНастроек(Результат, Отказ);
	Если Отказ <> Истина Тогда
		ЭтотОбъект.Закрыть(Результат);
	Иначе
		// Разработчик, который установил Отказ = Истина, должен и вывести сообщение о том, почему форма не закрывается.
	КонецЕсли;

КонецПроцедуры

&НаКлиенте
Процедура КомандаНастроитьОтборы(Команда)

	ТипСтруктура = Тип("Структура");

	// Открыть форму настройки отборов.
	ПараметрыФормы = ПолучитьПараметрыДляОткрытияФормыНастройкиОтборовПоВыбраннойЛентеНовостей(Элементы.ЛентыНовостей.ТекущаяСтрока);
	// Настраивать отборы только для ленты новостей, которая включена для закачивания.
	Если ТипЗнч(ПараметрыФормы) = ТипСтруктура Тогда
		ПараметрыФормыЭталон = Новый Структура;
			ПараметрыФормыЭталон.Вставить("Пометка"                   , Ложь);
			ПараметрыФормыЭталон.Вставить("КоличествоДоступныхОтборов", 0);
		ЗаполнитьЗначенияСвойств(ПараметрыФормыЭталон, ПараметрыФормы);
		Если ПараметрыФормыЭталон.Пометка = Истина Тогда
			Если ПараметрыФормыЭталон.КоличествоДоступныхОтборов > 0 Тогда
				ОписаниеОповещенияНастройкиОтборов = Новый ОписаниеОповещения(
					"ПослеНастройкиОтборовПоЛентеНовостей",
					ЭтотОбъект,
					Неопределено);
				ОткрытьФорму(
					"ХранилищеНастроек.НастройкиНовостей.Форма.ФормаНастройкиОтборовПоЛенте", // ИмяФормы
					ПараметрыФормы, // Параметры
					ЭтотОбъект, // Владелец
					"", // Уникальность
					, // Окно
					, // НавигационнаяСсылка
					ОписаниеОповещенияНастройкиОтборов, // ОписаниеОповещенияОЗакрытии
					РежимОткрытияОкнаФормы.БлокироватьОкноВладельца); // РежимОткрытияОкна
			КонецЕсли;
		Иначе
			ПоказатьПредупреждение(
				, // ОписаниеОповещенияОЗавершении
				НСтр("ru='Вначале включите получение новостей по этой ленте.'"),
				0,
				НСтр("ru='Предупреждение'"));
		КонецЕсли;
	КонецЕсли;

КонецПроцедуры

&НаКлиенте
Процедура КомандаВключитьВсе(Команда)

	Для каждого ТекущаяСтрока Из ЭтотОбъект.ЛентыНовостей Цикл
		ТекущаяСтрока.Пометка = Истина;
	КонецЦикла;

КонецПроцедуры

&НаКлиенте
Процедура КомандаВыключитьВсе(Команда)

	Для каждого ТекущаяСтрока Из ЭтотОбъект.ЛентыНовостей Цикл
		Если ТекущаяСтрока.ОбязательныйКанал = Ложь Тогда
			ТекущаяСтрока.Пометка = Ложь;
		КонецЕсли;
	КонецЦикла;

КонецПроцедуры

&НаКлиенте
Процедура КомандаЭкспортироватьСписокЛентНовостейВФайлФорматаOPML(Команда)

	#Если НЕ ВебКлиент Тогда

		СписокЛентНовостей = Новый СписокЗначений;
		Для каждого ТекущаяЛентаНовостей Из ЭтотОбъект.ЛентыНовостей Цикл
			СписокЛентНовостей.Добавить(ТекущаяЛентаНовостей.ЛентаНовостей, , ТекущаяЛентаНовостей.Пометка);
		КонецЦикла;

		ОткрытьФорму(
			"ХранилищеНастроек.НастройкиНовостей.Форма.ФормаЭкспортаСпискаЛентНовостейВOPML",
			Новый Структура("ЛентыНовостей",
				СписокЛентНовостей),
			ЭтотОбъект,
			"",
			,
			,
			,
			РежимОткрытияОкнаФормы.БлокироватьОкноВладельца);

	#КонецЕсли

КонецПроцедуры

#КонецОбласти

#Область СлужебныеПроцедурыИФункции

&НаСервере
Функция ПодготовитьСтруктуруДляВозвратаПоОКИСохранитьНастройки()

	// Параметры будут сохраняться в хранилище настроек а также возвращаться в виде структуры,
	//  чтобы вызывающая форма (список новостей) могла сразу "перерисовать" список новостей, не считывая заново настройки из базы данных.

	// Сохранять:
	// - список отключенных лент новостей;
	// - пользовательские отборы по лентам новостей;
	// - подписка (в отличие от "список отключенных лент новостей", здесь будет полный список лент новостей кроме обязательных,
	//     чтобы обновить список в основной форме);
	// - способы оповещений.

	// Подготовить структуру для возврата и таблицы для сохранения в настройках.
	// Сохранять отборы по всем лентам новостей, даже по отключенным.
	// Добавить необходимые колонки в лкТаблицаОтборовПоЛентамНовостей.
	лкТаблицаОтборовПоЛентамНовостей = ХранилищаНастроек.НастройкиНовостей.ПровестиВалидациюНастроек(
		Неопределено, // Никакие настройки не передаются. Будет создана пустая таблица с колонками по-умолчанию.
		"ОтборыПоЛентамНовостейПользовательские",
		ЭтотОбъект.КлючНастроек); // КлючНастроек

	СпособыОповещений = Новый Соответствие;
	СостояниеПодписки = Новый Соответствие;
	лкОтборыПоЛентамНовостейПользовательские = Новый Соответствие;
	Для каждого ТекущаяЛентаНовостей Из ЭтотОбъект.ЛентыНовостей Цикл
		НайденныеОтборыПоКатегориям = ЭтотОбъект.ОтборыПоЛентамНовостейПользовательские.НайтиСтроки(
			Новый Структура("ЛентаНовостей",
				ТекущаяЛентаНовостей.ЛентаНовостей));
		лкОтборыПоТекущейЛентеНовостей = Новый Соответствие;
		Для каждого ТекущийОтбор Из НайденныеОтборыПоКатегориям Цикл
			лкОтборыПоТекущейЛентеНовостей.Вставить(ТекущийОтбор.КатегорияНовостей, ТекущийОтбор.СписокЗначенийОтборов);
			Для каждого ТекущееЗначениеОтбора Из ТекущийОтбор.СписокЗначенийОтборов Цикл
				НоваяСтрока = лкТаблицаОтборовПоЛентамНовостей.Добавить();
				НоваяСтрока.ЛентаНовостей             = ТекущаяЛентаНовостей.ЛентаНовостей;
				НоваяСтрока.КатегорияНовостей         = ТекущийОтбор.КатегорияНовостей;
				НоваяСтрока.ЗначениеКатегорииНовостей = ТекущееЗначениеОтбора.Значение;
			КонецЦикла;
		КонецЦикла;
		лкОтборыПоЛентамНовостейПользовательские.Вставить(ТекущаяЛентаНовостей.ЛентаНовостей, лкОтборыПоТекущейЛентеНовостей);
		Если НЕ ТекущаяЛентаНовостей.ОбязательныйКанал Тогда
			// Для обязательных каналов не имеет смысла запоминать состояние способа оповещения и подписки, т.к. он всегда "ПоУмолчанию".
			СостояниеПодписки.Вставить(ТекущаяЛентаНовостей.ЛентаНовостей, ТекущаяЛентаНовостей.Пометка);
			СпособыОповещений.Вставить(ТекущаяЛентаНовостей.ЛентаНовостей, ТекущаяЛентаНовостей.СпособОповещения);
			НастройкиОповещения = Новый Структура;
				НастройкиОповещения.Вставить("КодЛентыНовостей", ""); // Здесь это поле необязательно для заполнения.
				НастройкиОповещения.Вставить("ЛентаНовостей"   , ТекущаяЛентаНовостей.ЛентаНовостей);
				НастройкиОповещения.Вставить("СпособОповещения", ТекущаяЛентаНовостей.СпособОповещения);
			ОбработкаНовостей.ИзменитьПользовательскиеСпособыОповещенияЛентНовостей(
				ТекущаяЛентаНовостей.ЛентаНовостей,
				НастройкиОповещения,
				ЭтотОбъект.ТекущийПользователь);
		КонецЕсли;
	КонецЦикла;

	МассивОтключенныхЛентНовостей = Новый Массив;
	Для каждого ТекущаяЛентаНовостей Из ЭтотОбъект.ЛентыНовостей Цикл
		Если (ТекущаяЛентаНовостей.Пометка = Ложь) И (ТекущаяЛентаНовостей.ОбязательныйКанал <> Истина) Тогда
			МассивОтключенныхЛентНовостей.Добавить(ТекущаяЛентаНовостей.ЛентаНовостей);
		КонецЕсли;
	КонецЦикла;

	ИмяПользователяИБ = "";
	Если ЭтотОбъект.ТекущийПользователь <> Пользователи.ТекущийПользователь() Тогда
		ИмяПользователяИБ = ОбработкаНовостейПовтИсп.ПолучитьИмяПользователяИБ(ЭтотОбъект.ТекущийПользователь);
	КонецЕсли;

	// Непосредственно сохранение настроек.
	// Здесь возможна запись настроек для другого (не текущего) пользователя.
	ХранилищаНастроек.НастройкиНовостей.Сохранить(
		"ОтборыПоЛентамНовостейПользовательские", // КлючОбъекта
		ЭтотОбъект.КлючНастроек, // КлючНастроек
		лкТаблицаОтборовПоЛентамНовостей, // Настройки
		, // ОписаниеНастроек
		ИмяПользователяИБ); // ИмяПользователя

	// Здесь возможна запись настроек для другого (не текущего) пользователя.
	ХранилищаНастроек.НастройкиНовостей.Сохранить(
		"ОтключенныеЛентыНовостей", // КлючОбъекта
		ЭтотОбъект.КлючНастроек, // КлючНастроек
		МассивОтключенныхЛентНовостей, // Настройки
		, // ОписаниеНастроек
		ИмяПользователяИБ); // ИмяПользователя

	// После изменения настройки видимости лент новостей (административные, пользовательские и т.п.) необходимо очистить кэш,
	//  чтобы ОбработкаНовостейПовтИсп.ПолучитьОтключенныеЛентыНовостей выдавала правильный результат.
	// Здесь может измениться: пользовательская видимость ленты новостей.
	ОбновитьПовторноИспользуемыеЗначения();

	// Сохранить другие настройки видимости.
	СтруктураНастроек = Новый Структура;
		СтруктураНастроек.Вставить("ОтборНовостей_ТолькоАктивные",    ЭтотОбъект.ОтборНовостей_ТолькоАктивные);
		СтруктураНастроек.Вставить("Форма_РазмещениеПанелей",         ЭтотОбъект.Форма_РазмещениеПанелей);
		СтруктураНастроек.Вставить("ОтображаемыеНовости_Вариант",     ЭтотОбъект.ОтображаемыеНовости_Вариант);
		СтруктураНастроек.Вставить("ОтображаемыеНовости_Количество",  ЭтотОбъект.ОтображаемыеНовости_Количество);
		СтруктураНастроек.Вставить("ОтображаемыеНовости_ПериодЧасов", ЭтотОбъект.ОтображаемыеНовости_ПериодЧасов); // 7 дней = 168 часов.

	// Здесь возможна запись настроек для другого (не текущего) пользователя.
	ХранилищаНастроек.НастройкиНовостей.Сохранить(
		"НастройкиПоказаНовостей", // КлючОбъекта
		"", // КлючНастроек
		СтруктураНастроек, // Настройки
		, // ОписаниеНастроек
		ИмяПользователяИБ); // ИмяПользователя

	// Результат - нужен для того, чтобы вызывающая форма перерисовалась, не вызывая заново ХранилищаНастроек.НастройкиНовостей.Загрузить.
	Результат = Новый Структура;
		Результат.Вставить("ОтборыПоЛентамНовостейПользовательские", лкОтборыПоЛентамНовостейПользовательские);
		Результат.Вставить("ОтключенныеЛентыНовостей"              , МассивОтключенныхЛентНовостей);
		Результат.Вставить("НастройкиПоказаНовостей"               , СтруктураНастроек);
		Результат.Вставить("СпособыОповещений"                     , СпособыОповещений);
		Результат.Вставить("СостояниеПодписки"                     , СостояниеПодписки);

	// Для оптимизации, чтобы лишний раз не вызывать пересчет регистров, запускать этот процесс только в случае,
	//  если были реальные изменения отборов.
	Если ЭтотОбъект.БылиИзмененияОтборов = Истина Тогда
		// Удалить неправильные отборы, которые могут помешать проверке общих и пользовательских отборов.
		// В разделенном сеансе будут пересчитаны только пользовательские отборы и общие для области данных.
		ОбработкаНовостейСлужебный.ОптимизироватьОтборыПоНовостям(Неопределено);

		// Рассчитать заново регистр "РассчитанныеОтборыПоНовостям_Пользовательские" для отборов
		//  по новостям, настроенных пользователем.
		ОбработкаНовостейСлужебный.ПересчитатьОтборыПоНовостям_Пользовательские(ЭтотОбъект.ТекущийПользователь, Неопределено); // По текущему пользователю
	КонецЕсли;

	Возврат Результат;

КонецФункции

// Подготовить структуру параметров для открытия формы настройки отборов.
//
&НаСервере
Функция ПолучитьПараметрыДляОткрытияФормыНастройкиОтборовПоВыбраннойЛентеНовостей(Знач ИдентификаторСтроки)

	Результат = Неопределено;

	Если ИдентификаторСтроки <> Неопределено Тогда
		ДанныеСтроки = ЭтотОбъект.ЛентыНовостей.НайтиПоИдентификатору(ИдентификаторСтроки);
		Если ДанныеСтроки <> Неопределено Тогда
			// Все пользовательские отборы
			НайденныеСтроки = ЭтотОбъект.ОтборыПоЛентамНовостейПользовательские.НайтиСтроки(Новый Структура("ЛентаНовостей", ДанныеСтроки.ЛентаНовостей));
			ТаблицаЗначенийПользовательскихОтборов = ЭтотОбъект.ОтборыПоЛентамНовостейПользовательские.Выгрузить(НайденныеСтроки);
			// Все отборы, настроенные администратором
			НайденныеСтроки = ЭтотОбъект.ОтборыПоЛентамНовостейГлобальные.НайтиСтроки(Новый Структура("ЛентаНовостей", ДанныеСтроки.ЛентаНовостей));
			ТаблицаЗначенийГлобальныхОтборов = ЭтотОбъект.ОтборыПоЛентамНовостейГлобальные.Выгрузить(НайденныеСтроки);
			//  Структура параметров
			Результат = Новый Структура;
			Результат.Вставить("ЛентаНовостей", ДанныеСтроки.ЛентаНовостей);
			Результат.Вставить("АдресХранилищаТаблицыЗначенийПользовательскихОтборов", ПоместитьВоВременноеХранилище(ТаблицаЗначенийПользовательскихОтборов));
			Результат.Вставить("АдресХранилищаТаблицыЗначенийГлобальныхОтборов", ПоместитьВоВременноеХранилище(ТаблицаЗначенийГлобальныхОтборов));
			Результат.Вставить("Пометка", ДанныеСтроки.Пометка);
			Результат.Вставить("КоличествоВсехОтборов", ДанныеСтроки.КоличествоВсехОтборов);
			Результат.Вставить("КоличествоДоступныхОтборов", ДанныеСтроки.КоличествоДоступныхОтборов);
			Результат.Вставить("ТекущийПользователь", ЭтотОбъект.ТекущийПользователь);
		КонецЕсли;
	КонецЕсли;

	Возврат Результат;

КонецФункции

// Функция сравнивает две таблицы отборов.
//
// Параметры:
//  ПредыдущиеОтборы - Таблица значений - таблица со значениями предыдущих отборов,
//                     должны быть колонки ЛентаНовостей, КатегорияНовостей, СписокЗначенийОтборов;
//  ТекущиеОтборы    - Таблица значений - таблица со значениями текущих отборов,
//                     должны быть колонки ЛентаНовостей, КатегорияНовостей, СписокЗначенийОтборов.
//
// Возвращаемое значение:
//   Булево - Истина (ели таблицы разные), Ложь (если таблицы одинаковые).
//
&НаСервере
Функция БылиИзмененияВОтборахПоЛентамНовостей(ПредыдущиеОтборы, ТекущиеОтборы)

	Результат = Ложь;

	Если ПредыдущиеОтборы.Количество() <> ТекущиеОтборы.Количество() Тогда
		Результат = Истина;
	Иначе
		ПредыдущиеОтборы.Сортировать("ЛентаНовостей, КатегорияНовостей");
		ТекущиеОтборы.Сортировать("ЛентаНовостей, КатегорияНовостей");
		Для С1=0 По ПредыдущиеОтборы.Количество()-1 Цикл
			Если ПредыдущиеОтборы[С1].ЛентаНовостей <> ТекущиеОтборы[С1].ЛентаНовостей
					ИЛИ ПредыдущиеОтборы[С1].КатегорияНовостей <> ТекущиеОтборы[С1].КатегорияНовостей Тогда
				Результат = Истина;
				Прервать;
			Иначе
				Если ПредыдущиеОтборы[С1].СписокЗначенийОтборов.Количество() <> ТекущиеОтборы[С1].СписокЗначенийОтборов.Количество() Тогда
					Результат = Истина;
					Прервать;
				Иначе
					ПредыдущиеОтборы[С1].СписокЗначенийОтборов.СортироватьПоЗначению();
					ТекущиеОтборы[С1].СписокЗначенийОтборов.СортироватьПоЗначению();
					Для С2=0 По ПредыдущиеОтборы[С1].СписокЗначенийОтборов.Количество()-1 Цикл
						Если ПредыдущиеОтборы[С1].СписокЗначенийОтборов[С2].Значение <> ТекущиеОтборы[С1].СписокЗначенийОтборов[С2].Значение Тогда
							Результат = Истина;
							Прервать;
						КонецЕсли;
					КонецЦикла;
				КонецЕсли;
			КонецЕсли;
		КонецЦикла;
	КонецЕсли;

	Возврат Результат;

КонецФункции

// Загрузить параметры из формы настройки отборов по ленте новостей, если там нажали ОК.
//
// Параметры:
//  СтруктураНастроек - Структура.
//
&НаСервере
Процедура ЗагрузитьПараметрыИзФормыНастройкиОтборовПоВыбраннойЛентеНовостей(Знач СтруктураНастроек)

	Перем ЛентаНовостей, АдресХранилищаТаблицыЗначенийПользовательскихОтборов, ТаблицаЗначенийОтборов;

	ТипСтруктура = Тип("Структура");

	ПредыдущиеОтборыПоЛентамНовостейПользовательские = ЭтотОбъект.ОтборыПоЛентамНовостейПользовательские.Выгрузить();

	СтруктураНастроекЭталон = Новый Структура;
		СтруктураНастроекЭталон.Вставить("ЛентаНовостей"                                       , Неопределено);
		СтруктураНастроекЭталон.Вставить("АдресХранилищаТаблицыЗначенийПользовательскихОтборов", Неопределено);

	Если ТипЗнч(СтруктураНастроек) = ТипСтруктура Тогда
		ЗаполнитьЗначенияСвойств(СтруктураНастроекЭталон, СтруктураНастроек);
	КонецЕсли;

	Если ТипЗнч(СтруктураНастроек) = ТипСтруктура Тогда
		Если СтруктураНастроекЭталон.АдресХранилищаТаблицыЗначенийПользовательскихОтборов <> Неопределено Тогда
			ТаблицаЗначенийОтборов = ПолучитьИзВременногоХранилища(СтруктураНастроекЭталон.АдресХранилищаТаблицыЗначенийПользовательскихОтборов);
		Иначе
			ТаблицаЗначенийОтборов = Новый ТаблицаЗначений;
		КонецЕсли;
		// В таблице "ОтборыПоЛентамНовостейПользовательские" удалить все строки со значением ЛентаНовостей,
		//  чтобы перенести их заново из ТаблицаЗначенийОтборов.
		НайденныеСтроки = ЭтотОбъект.ОтборыПоЛентамНовостейПользовательские.НайтиСтроки(
			Новый Структура("ЛентаНовостей", СтруктураНастроекЭталон.ЛентаНовостей));
		Для каждого УдаляемаяСтрока Из НайденныеСтроки Цикл
			ЭтотОбъект.ОтборыПоЛентамНовостейПользовательские.Удалить(УдаляемаяСтрока);
		КонецЦикла;
		// Загрузить данные из ТаблицаЗначенийОтборов
		Для каждого ТекущаяСтрока Из ТаблицаЗначенийОтборов Цикл
			НоваяСтрока = ЭтотОбъект.ОтборыПоЛентамНовостейПользовательские.Добавить();
			НоваяСтрока.ЛентаНовостей         = СтруктураНастроекЭталон.ЛентаНовостей;
			НоваяСтрока.КатегорияНовостей     = ТекущаяСтрока.КатегорияНовостей;
			НоваяСтрока.СписокЗначенийОтборов = ТекущаяСтрока.СписокЗначенийОтборов.Скопировать();
		КонецЦикла;
	КонецЕсли;

	ОбновитьНадписиОтборовДляЛентыНовостей(Неопределено); // Обновить надписи для всех лент новостей

	// Для оптимизации, чтобы лишний раз не вызывать пересчет регистров, запускать этот процесс
	//  только в случае, если были реальные изменения отборов.
	ЭтотОбъект.БылиИзмененияОтборов = БылиИзмененияВОтборахПоЛентамНовостей(ПредыдущиеОтборыПоЛентамНовостейПользовательские, ЭтотОбъект.ОтборыПоЛентамНовостейПользовательские.Выгрузить());

КонецПроцедуры

// Для колонки "Настройка отборов" выводит надпись в зависимости от установленных отборов.
//
// Параметры:
//  ЛентаНовостей - СправочникСсылка.ЛентыНовостей.
//
&НаСервере
Процедура ОбновитьНадписиОтборовДляЛентыНовостей(Знач лкЛентаНовостей = Неопределено)

	Для каждого ТекущаяСтрока Из ЭтотОбъект.ЛентыНовостей Цикл
		Если (ТекущаяСтрока.ЛентаНовостей = лкЛентаНовостей) ИЛИ (лкЛентаНовостей = Неопределено) Тогда
			// Информация по отборам.
			Если (ТекущаяСтрока.КоличествоВсехОтборов = 0) Тогда
				ПредставлениеВсехОтборовКратко   = "";
				ПредставлениеВсехОтборовПодробно = НСтр("ru='По этой ленте отборы не настраиваются'");
			Иначе
				ПредставлениеВсехОтборовКратко               = "";
				ПредставлениеВсехОтборовПодробно             = "";
				ПредставлениеПользовательскихОтборов         = "";
				ПредставлениеАвтоматическиЗаполняемыхОтборов = "";
				ПредставлениеАдминистративныхОтборов         = "";

				лкТаблицаКатегорийДляНастройкиОтборов = ТекущаяСтрока.ТаблицаКатегорийДляНастройкиОтборов.Выгрузить();
				лкТаблицаКатегорийДляНастройкиОтборов.Сортировать("ЗаполняетсяАвтоматически, РазрешеноНастраиватьПользователям Убыв, КатегорияНовостей");

				Для каждого ТекущееЗначениеКатегории Из лкТаблицаКатегорийДляНастройкиОтборов Цикл

					ПредставлениеОтбораПоКатегории = "";

					// Должна быть или одна строка, или ни одной.
					МассивСтрокАдминистративныхОтборов = ЭтотОбъект.ОтборыПоЛентамНовостейГлобальные.НайтиСтроки(
						Новый Структура("ЛентаНовостей, КатегорияНовостей",
							ТекущаяСтрока.ЛентаНовостей,
							ТекущееЗначениеКатегории.КатегорияНовостей));
					Если МассивСтрокАдминистративныхОтборов.Количество() > 0 Тогда
						МассивАдминистративныхОтборов = МассивСтрокАдминистративныхОтборов[0].СписокЗначенийОтборов.ВыгрузитьЗначения();
					Иначе
						МассивАдминистративныхОтборов = Новый Массив;
					КонецЕсли;

					// Должна быть или одна строка, или ни одной.
					МассивСтрокПользовательскихОтборов = ЭтотОбъект.ОтборыПоЛентамНовостейПользовательские.НайтиСтроки(
						Новый Структура("ЛентаНовостей, КатегорияНовостей",
							ТекущаяСтрока.ЛентаНовостей,
							ТекущееЗначениеКатегории.КатегорияНовостей));
					Если МассивСтрокПользовательскихОтборов.Количество() > 0 Тогда
						МассивПользовательскихОтборов = МассивСтрокПользовательскихОтборов[0].СписокЗначенийОтборов.ВыгрузитьЗначения();
					Иначе
						МассивПользовательскихОтборов = Новый Массив;
					КонецЕсли;

					Если ТекущееЗначениеКатегории.ЗаполняетсяАвтоматически = Истина Тогда
						ПредставлениеОтбораПоКатегории = "  " + ТекущееЗначениеКатегории.КатегорияНовостей + ": "
							+ ТекущееЗначениеКатегории.ЗначениеАвтоматическогоЗаполнения;
						Если НЕ ПустаяСтрока(ПредставлениеОтбораПоКатегории) Тогда
							ПредставлениеАвтоматическиЗаполняемыхОтборов = ПредставлениеАвтоматическиЗаполняемыхОтборов
								+ ПредставлениеОтбораПоКатегории + Символы.ПС;
						КонецЕсли;
					Иначе
						Если ТекущееЗначениеКатегории.РазрешеноНастраиватьПользователям = Истина Тогда
							// Список отборов, настроенных пользователем.
							// Если нет глобальных отборов, то не проверять правильность ввода пользовательских отборов.
							Если МассивАдминистративныхОтборов.Количество() = 0 Тогда
								МассивПравильныхПользовательскихОтборов = МассивПользовательскихОтборов;
							Иначе // Есть отборы, настроенные администратором,
								//  то необходимо проверить, что пользовательские отборы из подмножества административных отборов.
								МассивПравильныхПользовательскихОтборов = Новый Массив;
								Для каждого ТекущееЗначениеПользовательскогоОтбора Из МассивПользовательскихОтборов Цикл
									Если МассивАдминистративныхОтборов.Найти(ТекущееЗначениеПользовательскогоОтбора) <> Неопределено Тогда
										МассивПравильныхПользовательскихОтборов.Добавить(ТекущееЗначениеПользовательскогоОтбора);
									КонецЕсли;
								КонецЦикла;
							КонецЕсли;
							// Формировать представление отборов на основании правильного списка значений.
							Если МассивПравильныхПользовательскихОтборов.Количество() = 0 Тогда // Отбор отключен, хотя строка есть. Вывести только административные отборы
								Если МассивАдминистративныхОтборов.Количество() = 0 Тогда
									ПредставлениеОтбораПоКатегории = "";
								Иначе
									// Администратор настроил свои отборы - вывести их.
									Если МассивАдминистративныхОтборов.Количество() = 1 Тогда // Отбор по одному значению
										ПредставлениеОтбораПоКатегории = "  " + ТекущееЗначениеКатегории.КатегорияНовостей + ": "
											+ МассивАдминистративныхОтборов[0];
									Иначе // Отбор по условию В(...)
										СписокДляПредставления = Новый СписокЗначений;
										СписокДляПредставления.ЗагрузитьЗначения(МассивАдминистративныхОтборов);
										ПредставлениеОтбораПоКатегории = "  " + ТекущееЗначениеКатегории.КатегорияНовостей + ": "
											+ СписокДляПредставления + ""; // Список значений автоматически преобразуется в список с разделителем ";"
									КонецЕсли;
								КонецЕсли;
							ИначеЕсли МассивПравильныхПользовательскихОтборов.Количество() = 1 Тогда // Отбор по одному значению
								ПредставлениеОтбораПоКатегории = "  " + ТекущееЗначениеКатегории.КатегорияНовостей + ": "
									+ МассивПравильныхПользовательскихОтборов[0];
							Иначе // Отбор по условию В(...)
								СписокДляПредставления = Новый СписокЗначений;
								СписокДляПредставления.ЗагрузитьЗначения(МассивПравильныхПользовательскихОтборов);
								ПредставлениеОтбораПоКатегории = "  " + ТекущееЗначениеКатегории.КатегорияНовостей + ": "
									+ СписокДляПредставления + ""; // Список значений автоматически преобразуется в список с разделителем ";"
							КонецЕсли;
							Если НЕ ПустаяСтрока(ПредставлениеОтбораПоКатегории) Тогда
								ПредставлениеПользовательскихОтборов = ПредставлениеПользовательскихОтборов
									+ ПредставлениеОтбораПоКатегории + Символы.ПС;
							КонецЕсли;
						Иначе // Пользователю запрещено настраивать отбор по этой категории
							Если МассивАдминистративныхОтборов.Количество() = 0 Тогда
								// Администратор не настроил свои отборы, просто запретил пользователю настраивать свои - не отбирать
								//  по этой категории.
							Иначе
								// Администратор настроил свои отборы - вывести их.
								Если МассивАдминистративныхОтборов.Количество() = 1 Тогда // Отбор по одному значению
									ПредставлениеОтбораПоКатегории = "  " + ТекущееЗначениеКатегории.КатегорияНовостей + ": "
										+ МассивАдминистративныхОтборов[0];
								Иначе // Отбор по условию В(...)
									СписокДляПредставления = Новый СписокЗначений;
									СписокДляПредставления.ЗагрузитьЗначения(МассивАдминистративныхОтборов);
									ПредставлениеОтбораПоКатегории = "  " + ТекущееЗначениеКатегории.КатегорияНовостей + ": "
										+ СписокДляПредставления + ""; // Список значений автоматически преобразуется в список с разделителем ";"
								КонецЕсли;
							КонецЕсли;
							Если НЕ ПустаяСтрока(ПредставлениеОтбораПоКатегории) Тогда
								ПредставлениеАдминистративныхОтборов = ПредставлениеАдминистративныхОтборов
									+ ПредставлениеОтбораПоКатегории + Символы.ПС;
							КонецЕсли;
						КонецЕсли;
					КонецЕсли;
				КонецЦикла;

				ПредставлениеВсехОтборовПодробно = ПредставлениеВсехОтборовПодробно

					+ ?(ПустаяСтрока(ПредставлениеПользовательскихОтборов),
							НСтр("ru='Нет отборов, разрешенных для настройки пользователем'")
								+ Символы.ПС,
							СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
								НСтр("ru='Отборы, настроенные пользователем (можно изменить):
									|%1'")
									+ Символы.ПС,
								ПредставлениеПользовательскихОтборов));

				ПредставлениеВсехОтборовПодробно = ПредставлениеВсехОтборовПодробно
					+ ?(ПустаяСтрока(ПредставлениеАдминистративныхОтборов),
							"",
							СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
								НСтр("ru='Отборы, настроенные администратором (нельзя изменить):
									|%1'")
									+ Символы.ПС,
								ПредставлениеАдминистративныхОтборов));

				ПредставлениеВсехОтборовПодробно = ПредставлениеВсехОтборовПодробно
					+ ?(ПустаяСтрока(ПредставлениеАвтоматическиЗаполняемыхОтборов),
							"",
							СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
								НСтр("ru='Автоматически заполняемые отборы (нельзя изменить):
									|%1'")
									+ Символы.ПС,
								ПредставлениеАвтоматическиЗаполняемыхОтборов));

				Если ПустаяСтрока(ПредставлениеВсехОтборовПодробно) Тогда
					ПредставлениеВсехОтборовКратко   = НСтр("ru='Отборы не настроены'");
					ПредставлениеВсехОтборовПодробно = НСтр("ru='Отборы не настроены'");
				Иначе
					ПредставлениеВсехОтборовКратко   = НСтр("ru='Настроен детальный отбор'");
				КонецЕсли;

			КонецЕсли;

			// Информация по обязательности ленты новостей.
			Если ТекущаяСтрока.ОбязательныйКанал = Истина Тогда
				ПредставлениеВсехОтборовПодробно = 
					СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
						НСтр("ru='По этой ленте нельзя отключить получение новостей (так настроено администратором)
							|%1'")
							+ Символы.ПС,
						ПредставлениеВсехОтборовПодробно);
			КонецЕсли;
			ПредставлениеВсехОтборовПодробно = СтрЗаменить(ПредставлениеВсехОтборовПодробно, Символы.ПС + Символы.ПС, Символы.ПС);

			ТекущаяСтрока.ПредставлениеОтборовПодробно = ПредставлениеВсехОтборовПодробно;
			ТекущаяСтрока.ПредставлениеОтборовКратко   = ПредставлениеВсехОтборовКратко;
		КонецЕсли;
	КонецЦикла;

КонецПроцедуры

// Процедура устанавливает условное оформление в форме.
//
&НаСервере
Процедура УстановитьУсловноеОформление()

	УсловноеОформление.Элементы.Очистить();
	// 1. Только просмотр: Нельзя отключить новости или менять способ оповещения в ленте новостей, помеченной как "Обязательная".
		Элемент = УсловноеОформление.Элементы.Добавить();

		// Оформляемые поля
		ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
			ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ЛентыНовостейПометка.Имя);
		ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
			ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ЛентыНовостейСпособОповещения.Имя);

		// Отбор
		ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
			ОтборЭлемента.ЛевоеЗначение  = Новый ПолеКомпоновкиДанных("ЛентыНовостей.ОбязательныйКанал");
			ОтборЭлемента.ВидСравнения   = ВидСравненияКомпоновкиДанных.Равно;
			ОтборЭлемента.ПравоеЗначение = Истина;

		// Оформление
		Элемент.Оформление.УстановитьЗначениеПараметра("ТолькоПросмотр", Истина);
		Элемент.Оформление.УстановитьЗначениеПараметра("ЦветТекста"    , ЦветаСтиля.ЦветНедоступногоТекста);

		// Использование
		Элемент.Использование = Истина;

	// 2. Не показывать гиперссылку настройки отборов для отключенной ленты новостей.
		Элемент = УсловноеОформление.Элементы.Добавить();

		// Оформляемые поля
		ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
			ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ЛентыНовостейПредставлениеОтборовКратко.Имя);

		// Отбор
		ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
			ОтборЭлемента.ЛевоеЗначение  = Новый ПолеКомпоновкиДанных("ЛентыНовостей.Пометка");
			ОтборЭлемента.ВидСравнения   = ВидСравненияКомпоновкиДанных.Равно;
			ОтборЭлемента.ПравоеЗначение = Ложь;

		// Оформление
		Элемент.Оформление.УстановитьЗначениеПараметра("Отображать", Ложь);
		Элемент.Оформление.УстановитьЗначениеПараметра("Текст"     , "");

		// Использование
		Элемент.Использование = Истина;

	// 3. Заполняется автоматически: колонка КатегорияНовостей.
		Элемент = УсловноеОформление.Элементы.Добавить();

		// Оформляемые поля
		ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
			ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ЛентыНовостейПредставлениеОтборовКратко.Имя);

		// Отбор
		ГруппаОтбора = Элемент.Отбор.Элементы.Добавить(Тип("ГруппаЭлементовОтбораКомпоновкиДанных"));
			ГруппаОтбора.ТипГруппы = ТипГруппыЭлементовОтбораКомпоновкиДанных.ГруппаИ;

			ОтборЭлемента = ГруппаОтбора.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
				ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("ЛентыНовостей.КоличествоДоступныхОтборов");
				ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Меньше;
				ОтборЭлемента.ПравоеЗначение = 1;

			ОтборЭлемента = ГруппаОтбора.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
				ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("ЛентыНовостей.Пометка");
				ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
				ОтборЭлемента.ПравоеЗначение = Истина;

		// Оформление
		Элемент.Оформление.УстановитьЗначениеПараметра("ТолькоПросмотр", Истина);
		Элемент.Оформление.УстановитьЗначениеПараметра("ЦветТекста"    , ЦветаСтиля.ЦветНедоступногоТекста);
		Элемент.Оформление.УстановитьЗначениеПараметра("Текст"         , "");
		Элемент.Оформление.УстановитьЗначениеПараметра("Шрифт"         , Новый Шрифт(Элементы.ЛентыНовостей.Шрифт, , , , Истина));

		// Использование
		Элемент.Использование = Истина;

	// 4. Только просмотр: Нельзя изменить способ оповещения в отключенной ленте новостей.
		Элемент = УсловноеОформление.Элементы.Добавить();

		// Оформляемые поля
		ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
			ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ЛентыНовостейСпособОповещения.Имя);

		// Отбор
		ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
			ОтборЭлемента.ЛевоеЗначение  = Новый ПолеКомпоновкиДанных("ЛентыНовостей.Пометка");
			ОтборЭлемента.ВидСравнения   = ВидСравненияКомпоновкиДанных.Равно;
			ОтборЭлемента.ПравоеЗначение = Ложь;

		// Оформление
		Элемент.Оформление.УстановитьЗначениеПараметра("ТолькоПросмотр", Истина);
		Элемент.Оформление.УстановитьЗначениеПараметра("ЦветТекста"    , ЦветаСтиля.ЦветНедоступногоТекста);

		// Использование
		Элемент.Использование = Истина;

КонецПроцедуры

&НаКлиенте
Процедура ПослеНастройкиОтборовПоЛентеНовостей(РезультатЗакрытия, ДополнительныеПараметры) Экспорт

	ТипСтруктура = Тип("Структура");

	Если ТипЗнч(РезультатЗакрытия) = ТипСтруктура Тогда // Нажали ОК, в противном случае вернется или Неопределено (нажали Esc), или КодВозвратаДиалога.Отмена.
		ЗагрузитьПараметрыИзФормыНастройкиОтборовПоВыбраннойЛентеНовостей(РезультатЗакрытия);
	КонецЕсли;

КонецПроцедуры

// Возвращает картинку, соответствующую способу оповещения ленты новостей.
//
// Параметры:
//  СпособОповещения  - ПеречислениеСсылка.СпособыОповещенияПользователяОНовостях;
//  ОбязательныйКанал - Булево - признак обязательного канала.
//
// Возвращаемое значение:
//   Картинка - картинка, соответствующая способу оповещения.
//
&НаСервереБезКонтекста
Функция ПолучитьКартинкуСпособаОповещения(СпособОповещения, ОбязательныйКанал)

	Если ОбязательныйКанал = Истина Тогда
		Результат = БиблиотекаКартинок.НовостиОповещенияВключеныВсегда;
	Иначе
		Результат = БиблиотекаКартинок.НовостиОповещенияВключены;
		// {При добавлении способов оповещения исправлять здесь}.
		Если СпособОповещения = Перечисления.СпособыОповещенияПользователяОНовостях.Отключено Тогда
			Результат = БиблиотекаКартинок.НовостиОповещенияОтключены;
		ИначеЕсли СпособОповещения = Перечисления.СпособыОповещенияПользователяОНовостях.СистемаВзаимодействия Тогда
			Результат = БиблиотекаКартинок.НовостиОповещенияСистемаВзаимодействия;
		КонецЕсли;
	КонецЕсли;

	Возврат Результат;

КонецФункции

// Возвращает картинку, соответствующую способу оповещения ленты новостей.
//
// Параметры:
//  СпособОповещения  - ПеречислениеСсылка.СпособыОповещенияПользователяОНовостях;
//  ОбязательныйКанал - Булево - признак обязательного канала.
//
// Возвращаемое значение:
//   Картинка - картинка, соответствующая способу оповещения.
//
&НаКлиенте
Функция ПолучитьКартинкуСпособаОповещенияНаКлиенте(СпособОповещения, ОбязательныйКанал)

	Если ОбязательныйКанал = Истина Тогда
		Результат = КартинкиСпособовОповещений.Получить(Истина);
	Иначе
		Результат = КартинкиСпособовОповещений.Получить(СпособОповещения);
	КонецЕсли;

	Возврат Результат;

КонецФункции

#КонецОбласти

Связанные материалы